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