// Custom Imports
List <String> addedJars = %jars *.jar
//*/
%maven junit:junit:4.12
%maven org.apache.commons:commons-io:1.3.2
%maven commons-io:commons-io:2.7
// CryptoGuard imports
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertNotNull;
import static util.Utils.makeArg;
import frontEnd.Interface.outputRouting.ExceptionHandler;
import frontEnd.Interface.ArgumentsCheck;
import frontEnd.MessagingSystem.routing.Listing;
import frontEnd.MessagingSystem.routing.EnvironmentInformation;
import frontEnd.MessagingSystem.routing.structure.Default.Report;
import frontEnd.MessagingSystem.routing.structure.Scarf.AnalyzerReport;
import frontEnd.MessagingSystem.routing.structure.Scarf.BugInstance;
import frontEnd.Interface.EntryPoint;
import rule.engine.EngineType;
import frontEnd.argsIdentifier;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import soot.G;
import util.Utils;
import org.apache.commons.io.FileUtils;
import java.util.Scanner;
import org.apache.commons.io.filefilter.WildcardFileFilter;
// region String Statics
public static final Boolean isLinux = !System.getProperty("os.name").contains("Windows");
public static final String basePath = System.getProperty("user.dir").replace("/Notebook", "");
public static final String scarfArgs = Utils.osPathJoin(basePath, "src", "main", "resources", "Scarf", "sample.properties");
public static final String testRec = Utils.osPathJoin(basePath, "samples");
public static final String testPath = Utils.osPathJoin(System.getProperty("user.dir"), "tmp");
FileUtils.deleteDirectory(new File (testPath));
new File(testPath).mkdirs();
public static final String tempFileOutApk = Utils.osPathJoin(testPath, "app-debug.txt");
public static final String tempFileOutApk_CSV = Utils.osPathJoin(testPath, "app-debug.csv");
public static final String tempFileOutApk_Steam = Utils.osPathJoin(testPath, "app-debug_Stream.txt");
public static final String tempFileOutApk_CSVStream = Utils.osPathJoin(testPath, "app-debug_Stream.csv");
public static final String tempFileOutApk_Scarf = Utils.osPathJoin(testPath, "app-debug.xml");
public static final String tempFileOutApk_Scarf_XArgs = Utils.osPathJoin(testPath, "app-debug_XArgs.xml");
public static final String tempFileOutApk_Scarf_Steam = Utils.osPathJoin(testPath, "app-debug_Stream.xml");
public static final String tempFileOutApk_Default = Utils.osPathJoin(testPath, "app-debug.json");
public static final String tempFileOutApk_Default_Steam = Utils.osPathJoin(testPath, "app-debug_Stream.json");
public static final String pathToAPK = Utils.osPathJoin(testRec, "app-debug.apk");
// Utililties
String cur_user = System.getProperty("user.name");
String java_home = "/home/" + cur_user + "/.sdkman/candidates/java/8*.0.25*";
String java7_home = "/home/" + cur_user + "/.sdkman/candidates/java/7*";
String android_home = "/home/" + cur_user + "/.sdkman/candidates/android/current";
//Retrieving a specific path from a wild card based list
public static String getFileFromWildCard(String path) {
String[] split = path.split("/");
StringBuilder build = new StringBuilder();
for (int itr = 0;itr < split.length - 1;itr ++)
build.append(split[itr]).append("/");
String[] files = new File(build.toString()).list(new WildcardFileFilter(split[split.length-1]));
if (files.length > 0)
return build.toString() + files[files.length - 1];
else
return null;
}
java_home = getFileFromWildCard(java_home);
java7_home = getFileFromWildCard(java7_home);
public static void print(String file) {
try {
Scanner reader = new Scanner(new File(file));
while (reader.hasNextLine()) System.out.println(reader.nextLine());
} catch (FileNotFoundException e) {
}
}
public void main_TestableApk_Legacy() {
G.reset();
String fileOut = tempFileOutApk;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.APK)
+ makeArg(argsIdentifier.SOURCE, pathToAPK)
+ makeArg(argsIdentifier.FORMATOUT, Listing.Legacy)
+ makeArg(argsIdentifier.ANDROID, android_home)
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.NOEXIT)
+ makeArg(argsIdentifier.OUT, fileOut);
try {
EntryPoint.main(args.split(" "));
List<String> results = Files.readAllLines(Paths.get(fileOut), StandardCharsets.UTF_8);
assertTrue(results.size() >= 10);
print(fileOut);
} catch (Exception e) {
e.printStackTrace();
assertNull(e);
}
}
}
main_TestableApk_Legacy()
public void main_TestableApk_Legacy_Stream() {
G.reset();
String fileOut = tempFileOutApk_Steam;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.APK)
+ makeArg(argsIdentifier.SOURCE, pathToAPK)
+ makeArg(argsIdentifier.FORMATOUT, Listing.Legacy)
+ makeArg(argsIdentifier.OUT, fileOut)
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.ANDROID, android_home)
+ makeArg(argsIdentifier.NOEXIT)
+ makeArg(argsIdentifier.STREAM);
try {
EntryPoint.main(args.split(" "));
List<String> results = Files.readAllLines(Paths.get(fileOut), StandardCharsets.UTF_8);
assertTrue(results.size() >= 10);
print(fileOut);
} catch (Exception e) {
e.printStackTrace();
assertNull(e);
}
}
}
main_TestableApk_Legacy_Stream()
public void main_TestableApk_CSV() {
G.reset();
String fileOut = tempFileOutApk_CSV;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.APK)
+ makeArg(argsIdentifier.SOURCE, pathToAPK)
+ makeArg(argsIdentifier.FORMATOUT, Listing.CSVDefault)
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.ANDROID, android_home)
+ makeArg(argsIdentifier.NOEXIT)
+ makeArg(argsIdentifier.OUT, fileOut);
try {
EntryPoint.main(args.split(" "));
List<String> results = Files.readAllLines(Paths.get(fileOut), StandardCharsets.UTF_8);
assertTrue(results.size() >= 10);
print(fileOut);
} catch (Exception e) {
e.printStackTrace();
assertNull(e);
}
}
}
main_TestableApk_CSV()
public void main_TestableApk_CSV() {
G.reset();
String fileOut = tempFileOutApk_CSV;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.APK)
+ makeArg(argsIdentifier.SOURCE, pathToAPK)
+ makeArg(argsIdentifier.FORMATOUT, Listing.CSVDefault)
+ makeArg(argsIdentifier.NOEXIT)
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.ANDROID, android_home)
+ makeArg(argsIdentifier.OUT, fileOut);
try {
EntryPoint.main(args.split(" "));
List<String> results = Files.readAllLines(Paths.get(fileOut), StandardCharsets.UTF_8);
assertTrue(results.size() >= 10);
print(fileOut);
} catch (Exception e) {
e.printStackTrace();
assertNull(e);
}
}
}
main_TestableApk_CSV()
public void main_TestableApk_Scarf() {
G.reset();
String fileOut = tempFileOutApk_Scarf;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.APK)
+ makeArg(argsIdentifier.SOURCE, pathToAPK)
+ makeArg(argsIdentifier.OUT, fileOut)
+ makeArg(argsIdentifier.NOEXIT)
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.ANDROID, android_home)
+ makeArg(argsIdentifier.FORMATOUT, Listing.ScarfXML)
+ makeArg(argsIdentifier.PRETTY);
try {
EntryPoint.main(args.split(" "));
AnalyzerReport report = AnalyzerReport.deserialize(new File(fileOut));
assertFalse(report.getBugInstance().isEmpty());
report
.getBugInstance()
.forEach(
bug -> {
bug.getlocation()
.forEach(
location -> {
if (location.getStartLine() != null)
assertTrue(location.getStartLine() != 0);
if (location.getEndLine() != null)
assertTrue(location.getEndLine() != 0);
if (location.getStartColumn() != null)
assertTrue(location.getStartColumn() != 0);
if (location.getEndColumn() != null)
assertTrue(location.getEndColumn() != 0);
});
});
print(fileOut);
} catch (Exception e) {
e.printStackTrace();
assertNull(e);
}
}
}
main_TestableApk_Scarf()
public void main_TestableApk_Scarf_SpecifyAndroidHome() {
G.reset();
String fileOut = tempFileOutApk_Scarf;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.APK)
+ makeArg(argsIdentifier.SOURCE, pathToAPK)
+ makeArg(argsIdentifier.OUT, fileOut)
+ makeArg(argsIdentifier.ANDROID, android_home)
+ makeArg(argsIdentifier.NOEXIT)
+ makeArg(argsIdentifier.FORMATOUT, Listing.ScarfXML)
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.PRETTY);
try {
EntryPoint.main(args.split(" "));
AnalyzerReport report = AnalyzerReport.deserialize(new File(fileOut));
assertFalse(report.getBugInstance().isEmpty());
print(fileOut);
} catch (Exception e) {
e.printStackTrace();
assertNull(e);
}
}
}
main_TestableApk_Scarf_SpecifyAndroidHome()
public void main_TestableApk_Scarf_SpecifyHome() {
G.reset();
String fileOut = tempFileOutApk_Scarf;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.APK)
+ makeArg(argsIdentifier.SOURCE, pathToAPK)
+ makeArg(argsIdentifier.OUT, fileOut)
+ makeArg(argsIdentifier.ANDROID, android_home)
+ makeArg(argsIdentifier.NOEXIT)
+ makeArg(argsIdentifier.FORMATOUT, Listing.ScarfXML)
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.PRETTY);
try {
EntryPoint.main(args.split(" "));
AnalyzerReport report = AnalyzerReport.deserialize(new File(fileOut));
assertFalse(report.getBugInstance().isEmpty());
print(fileOut);
} catch (Exception e) {
e.printStackTrace();
assertNull(e);
}
}
}
main_TestableApk_Scarf_SpecifyHome()
public void main_TestableApk_Scarf_Stream() {
G.reset();
String fileOut = tempFileOutApk_Scarf_Steam;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.APK)
+ makeArg(argsIdentifier.SOURCE, pathToAPK)
+ makeArg(argsIdentifier.OUT, fileOut)
+ makeArg(argsIdentifier.NOEXIT)
+ makeArg(argsIdentifier.FORMATOUT, Listing.ScarfXML)
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.ANDROID, android_home)
+ makeArg(argsIdentifier.PRETTY)
+ makeArg(argsIdentifier.STREAM);
try {
EntryPoint.main(args.split(" "));
AnalyzerReport report = AnalyzerReport.deserialize(new File(fileOut));
assertFalse(report.getBugInstance().isEmpty());
report
.getBugInstance()
.forEach(
bug -> {
bug.getlocation()
.forEach(
location -> {
if (location.getStartLine() != null)
assertTrue(location.getStartLine() != 0);
if (location.getEndLine() != null)
assertTrue(location.getEndLine() != 0);
if (location.getStartColumn() != null)
assertTrue(location.getStartColumn() != 0);
if (location.getEndColumn() != null)
assertTrue(location.getEndColumn() != 0);
});
});
print(fileOut);
} catch (Exception e) {
e.printStackTrace();
assertNull(e);
}
}
}
main_TestableApk_Scarf_Stream()
public void main_TestableApk_Default() {
G.reset();
String fileOut = tempFileOutApk_Default;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.APK)
+ makeArg(argsIdentifier.SOURCE, pathToAPK)
+ makeArg(argsIdentifier.OUT, fileOut)
+ makeArg(argsIdentifier.FORMATOUT, Listing.Default)
+ makeArg(argsIdentifier.NOEXIT)
+ makeArg(argsIdentifier.VERYVERBOSE)
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.ANDROID, android_home)
+ makeArg(argsIdentifier.PRETTY);
try {
EntryPoint.main(args.split(" "));
Report report = Report.deserialize(new File(fileOut));
assertFalse(report.getIssues().isEmpty());
print(fileOut);
} catch (Exception e) {
e.printStackTrace();
assertNull(e);
}
}
}
main_TestableApk_Default()
public void main_TestableApk_Default_Stream() {
G.reset();
String fileOut = tempFileOutApk_Scarf_Steam;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.APK)
+ makeArg(argsIdentifier.SOURCE, pathToAPK)
+ makeArg(argsIdentifier.OUT, fileOut)
+ makeArg(argsIdentifier.FORMATOUT, Listing.ScarfXML)
+ makeArg(argsIdentifier.NOEXIT)
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.ANDROID, android_home)
+ makeArg(argsIdentifier.PRETTY)
+ makeArg(argsIdentifier.STREAM);
try {
EntryPoint.main(args.split(" "));
AnalyzerReport report = AnalyzerReport.deserialize(new File(fileOut));
assertFalse(report.getBugInstance().isEmpty());
print(fileOut);
} catch (Exception e) {
e.printStackTrace();
assertNull(e);
}
}
}
main_TestableApk_Default_Stream()