// 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;
//Base Paths
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 testRec = Utils.osPathJoin(basePath, "samples");
public static final String verySimple_Path = Utils.osPathJoin(testRec, "VerySimple");
public static final String srcOneGrvDep = Utils.osPathJoin(testRec, "testable-jar", "build", "dependencies");
//Source and output Files
public static final String verySimple_Jar = Utils.osPathJoin(verySimple_Path, "very.jar");
public static final String verySimple_Jar_xml = Utils.osPathJoin(testPath, "verySimple_jar.xml");
public static final String jarOne = Utils.osPathJoin(testRec, "testable-jar", "build", "libs", "testable-jar.jar");
public static final String tempJarFile_txt = Utils.osPathJoin(testPath, "tempJarFile_txt.txt");
public static final String tempJarFile_Scarf_0 = Utils.osPathJoin(testPath, "tempJarFile_Scarf_0.xml");
public static final String tempJarFile_Default_0 = Utils.osPathJoin(testPath, "tempJarFile_Default_0.json");
public static final String tempJarFile_Scarf_1 = Utils.osPathJoin(testPath, "tempJarFile_Scarf_1.xml");
public static final String tempJarFile_Scarf_Steam_1 = Utils.osPathJoin(testPath, "tempJarFile_Scarf_Steam_1.xml");
public static final String tempJarFile_Default_Stream_0 = Utils.osPathJoin(testPath, "tempJarFile_Default_Stream_0.json");
public static final String tempJarFile_Scarf_2 = Utils.osPathJoin(testPath, "tempJarFile_Scarf_2.xml");
// 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_VerySimple_Scarf() {
G.reset();
String fileOut = verySimple_Jar_xml;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.JAR)
+ makeArg(argsIdentifier.SOURCE, verySimple_Jar)
+
// makeArg(argsIdentifier.DEPENDENCY, srcOneGrvDep) +
makeArg(argsIdentifier.FORMATOUT, Listing.ScarfXML)
+ makeArg(argsIdentifier.OUT, fileOut)
+ makeArg(argsIdentifier.STREAM)
+ makeArg(argsIdentifier.ANDROID, "/InvalidPath/")
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.TIMEMEASURE)
+ makeArg(argsIdentifier.NOEXIT)
+ 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_VerySimple_Scarf()
public void main_TestableJar() {
G.reset();
String fileOut = tempJarFile_txt;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.JAR)
+ makeArg(argsIdentifier.FORMATOUT, Listing.Legacy)
+ makeArg(argsIdentifier.SOURCE, jarOne)
+ makeArg(argsIdentifier.ANDROID, "/InvalidPath/")
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.DEPENDENCY, srcOneGrvDep)
+ 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_TestableJar()
public void main_TestableJar_Scarf() {
G.reset();
String fileOut = tempJarFile_Scarf_0;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.JAR)
+ makeArg(argsIdentifier.SOURCE, jarOne)
+ makeArg(argsIdentifier.DEPENDENCY, srcOneGrvDep)
+ makeArg(argsIdentifier.FORMATOUT, Listing.ScarfXML)
+ makeArg(argsIdentifier.OUT, fileOut)
+ makeArg(argsIdentifier.ANDROID, "/InvalidPath/")
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.TIMEMEASURE)
+ makeArg(argsIdentifier.NOEXIT)
+ makeArg(argsIdentifier.PRETTY);
try {
EntryPoint.main(args.split(" "));
AnalyzerReport.deserialize(new File(fileOut));
print(fileOut);
} catch (Exception e) {
e.printStackTrace();
assertNull(e);
}
}
}
main_TestableJar_Scarf()
public void main_TestableJar_Scarf_Heuristics() {
G.reset();
String fileOut = tempJarFile_Scarf_0;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.JAR)
+ makeArg(argsIdentifier.SOURCE, jarOne)
+ makeArg(argsIdentifier.DEPENDENCY, srcOneGrvDep)
+ makeArg(argsIdentifier.FORMATOUT, Listing.ScarfXML)
+ makeArg(argsIdentifier.OUT, fileOut)
+ makeArg(argsIdentifier.TIMEMEASURE)
+ makeArg(argsIdentifier.ANDROID, "/InvalidPath/")
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.NOEXIT)
+ makeArg(argsIdentifier.HEURISTICS)
+ makeArg(argsIdentifier.PRETTY);
try {
EntryPoint.main(args.split(" "));
AnalyzerReport report = AnalyzerReport.deserialize(new File(fileOut));
assertNotNull(report.getHeuristics());
assertFalse(report.getBugInstance().isEmpty());
print(fileOut);
} catch (Exception e) {
e.printStackTrace();
assertNull(e);
}
}
}
main_TestableJar_Scarf_Heuristics()
public void main_TestableJar_Default() {
G.reset();
String fileOut = tempJarFile_Default_0;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.JAR)
+ makeArg(argsIdentifier.SOURCE, jarOne)
+ makeArg(argsIdentifier.DEPENDENCY, srcOneGrvDep)
+ makeArg(argsIdentifier.FORMATOUT, Listing.Default)
+ makeArg(argsIdentifier.OUT, fileOut)
+ makeArg(argsIdentifier.ANDROID, "/InvalidPath/")
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.TIMEMEASURE)
+ makeArg(argsIdentifier.NOEXIT)
+ 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_TestableJar_Default()
public void main_TestableJar_Default_SpecifyJavaHome() {
G.reset();
String fileOut = tempJarFile_Default_0;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.JAR)
+ makeArg(argsIdentifier.SOURCE, jarOne)
+ makeArg(argsIdentifier.DEPENDENCY, srcOneGrvDep)
+ makeArg(argsIdentifier.FORMATOUT, Listing.Default)
+ makeArg(argsIdentifier.ANDROID, "/InvalidPath/")
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.OUT, fileOut)
+ makeArg(argsIdentifier.TIMEMEASURE)
+ makeArg(argsIdentifier.NOEXIT)
+ 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_TestableJar_Default_SpecifyJavaHome()
public void main_TestableJar_Default_Heuristics() {
G.reset();
String fileOut = tempJarFile_Default_0;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.JAR)
+ makeArg(argsIdentifier.SOURCE, jarOne)
+ makeArg(argsIdentifier.DEPENDENCY, srcOneGrvDep)
+ makeArg(argsIdentifier.FORMATOUT, Listing.Default)
+ makeArg(argsIdentifier.OUT, fileOut)
+ makeArg(argsIdentifier.HEURISTICS)
+ makeArg(argsIdentifier.ANDROID, "/InvalidPath/")
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.NOEXIT)
+ makeArg(argsIdentifier.TIMEMEASURE)
+ makeArg(argsIdentifier.PRETTY);
try {
EntryPoint.main(args.split(" "));
Report report = Report.deserialize(new File(fileOut));
assertNotNull(report.getHeuristics());
assertFalse(report.getIssues().isEmpty());
print(fileOut);
} catch (Exception e) {
e.printStackTrace();
assertNull(e);
}
}
}
main_TestableJar_Default_Heuristics()
public void main_TestableJar_Scarf_Args() {
G.reset();
String fileOut = tempJarFile_Scarf_1;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.JAR)
+ makeArg(argsIdentifier.SOURCE, jarOne)
+ makeArg(argsIdentifier.DEPENDENCY, srcOneGrvDep)
+ makeArg(argsIdentifier.FORMATOUT, Listing.ScarfXML)
+ makeArg(argsIdentifier.OUT, fileOut)
+ makeArg(argsIdentifier.ANDROID, "/InvalidPath/")
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.TIMEMEASURE)
+ makeArg(argsIdentifier.NOEXIT)
+ makeArg(argsIdentifier.PRETTY)
+ makeArg(argsIdentifier.SCONFIG, scarfArgs);
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_TestableJar_Scarf_Args()
public void main_TestableJar_Scarf_Stream() {
G.reset();
String fileOut = tempJarFile_Scarf_Steam_1;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.JAR)
+ makeArg(argsIdentifier.SOURCE, jarOne)
+ makeArg(argsIdentifier.DEPENDENCY, srcOneGrvDep)
+ makeArg(argsIdentifier.FORMATOUT, Listing.ScarfXML)
+ makeArg(argsIdentifier.OUT, fileOut)
+ makeArg(argsIdentifier.STREAM)
+ makeArg(argsIdentifier.ANDROID, "/InvalidPath/")
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.TIMEMEASURE)
+ makeArg(argsIdentifier.NOEXIT)
+ 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_TestableJar_Scarf_Stream()
public void main_TestableJar_Default_Stream() {
G.reset();
String fileOut = tempJarFile_Default_Stream_0;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.JAR)
+ makeArg(argsIdentifier.SOURCE, jarOne)
+ makeArg(argsIdentifier.DEPENDENCY, srcOneGrvDep)
+ makeArg(argsIdentifier.FORMATOUT, Listing.Default)
+ makeArg(argsIdentifier.OUT, fileOut)
+ makeArg(argsIdentifier.STREAM)
+ makeArg(argsIdentifier.ANDROID, "/InvalidPath/")
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.TIMEMEASURE)
+ makeArg(argsIdentifier.NOEXIT)
+ 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_TestableJar_Default_Stream()
public void main_TestableJar_ScarfTimeStamp() {
G.reset();
String fileOut = tempJarFile_Scarf_2;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.JAR)
+ makeArg(argsIdentifier.SOURCE, jarOne)
+ makeArg(argsIdentifier.DEPENDENCY, srcOneGrvDep)
+ makeArg(argsIdentifier.FORMATOUT, Listing.ScarfXML)
+ makeArg(argsIdentifier.OUT, fileOut)
+ makeArg(argsIdentifier.ANDROID, "/InvalidPath/")
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.TIMESTAMP)
+ makeArg(argsIdentifier.NOEXIT)
+ 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_TestableJar_ScarfTimeStamp()
public void main_TestableJar_ScarfTimeStamp_UsingClassPaths() {
G.reset();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.JAR)
+ makeArg(argsIdentifier.SOURCE, jarOne)
+ makeArg(argsIdentifier.DEPENDENCY, srcOneGrvDep)
+ makeArg(argsIdentifier.FORMATOUT, Listing.ScarfXML)
+ makeArg(argsIdentifier.OUT, tempJarFile_Scarf_2)
+ makeArg(argsIdentifier.TIMESTAMP)
+ makeArg(argsIdentifier.ANDROID, "/InvalidPath/")
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.NOEXIT)
+ makeArg(argsIdentifier.PRETTY);
try {
EntryPoint.main(args.split(" "));
List<String> results =
Files.readAllLines(Paths.get(tempJarFile_Scarf_2), StandardCharsets.UTF_8);
assertTrue(results.size() >= 10);
AnalyzerReport.deserialize(new File(tempJarFile_Scarf_2));
print(tempJarFile_Scarf_2);
} catch (Exception e) {
e.printStackTrace();
assertNull(e);
}
}
}
main_TestableJar_ScarfTimeStamp_UsingClassPaths()
public void main_TestableJar_Default_WithHeuristics() {
G.reset();
String fileOut = tempJarFile_Default_0;
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.JAR)
+ makeArg(argsIdentifier.SOURCE, jarOne)
+ makeArg(argsIdentifier.DEPENDENCY, srcOneGrvDep)
+ makeArg(argsIdentifier.FORMATOUT, Listing.Default)
+ makeArg(argsIdentifier.OUT, fileOut)
+ makeArg(argsIdentifier.TIMEMEASURE)
+ makeArg(argsIdentifier.ANDROID, "/InvalidPath/")
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.NOEXIT)
+ makeArg(argsIdentifier.PRETTY)
+ makeArg(argsIdentifier.HEURISTICS);
try {
EntryPoint.main(args.split(" "));
Report report = Report.deserialize(new File(fileOut));
assertNotNull(report.getHeuristics());
assertFalse(report.getIssues().isEmpty());
print(fileOut);
} catch (Exception e) {
e.printStackTrace();
assertNull(e);
}
}
}
main_TestableJar_Default_WithHeuristics()
public void main_TestableJar_Default_WithClassPath() {
G.reset();
String fileOut = tempJarFile_Default_0;
String deps = srcOneGrvDep;
deps = ":" + deps + ":" + deps + ":";
new File(fileOut).delete();
if (isLinux) {
String args =
makeArg(argsIdentifier.FORMAT, EngineType.JAR)
+ makeArg(argsIdentifier.SOURCE, jarOne)
+ makeArg(argsIdentifier.DEPENDENCY, deps)
+ makeArg(argsIdentifier.FORMATOUT, Listing.Default)
+ makeArg(argsIdentifier.OUT, fileOut)
+ makeArg(argsIdentifier.TIMEMEASURE)
+ makeArg(argsIdentifier.ANDROID, "/InvalidPath/")
+ makeArg(argsIdentifier.JAVA, java_home)
+ makeArg(argsIdentifier.NOEXIT)
+ makeArg(argsIdentifier.HEURISTICS)
+ makeArg(argsIdentifier.PRETTY);
try {
EntryPoint.main(args.split(" "));
Report report = Report.deserialize(new File(fileOut));
assertNotNull(report.getHeuristics());
assertFalse(report.getIssues().isEmpty());
print(fileOut);
} catch (Exception e) {
e.printStackTrace();
assertNull(e);
}
}
}
main_TestableJar_Default_WithClassPath()