package de.rub.syssec.saaf.application.manifest.parser; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.util.Collection; import org.apache.log4j.PropertyConfigurator; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import de.rub.syssec.saaf.analysis.steps.metadata.DOMManifestParser; import de.rub.syssec.saaf.analysis.steps.metadata.ManifestParser; import de.rub.syssec.saaf.analysis.steps.metadata.ManifestParserException; import de.rub.syssec.saaf.analysis.steps.metadata.SimplePermissionChecker; import de.rub.syssec.saaf.db.datasources.XMLPermissionDatasource; import de.rub.syssec.saaf.model.application.manifest.ActivityInterface; import de.rub.syssec.saaf.model.application.manifest.ManifestInterface; import de.rub.syssec.saaf.model.application.manifest.ReceiverInterface; import de.rub.syssec.saaf.model.application.manifest.ServiceInterface; public class DOMManifestParserTest { private File testfile; private File testdir; private ManifestParser parser; @BeforeClass public static void setupBeforeClass() throws Exception{ PropertyConfigurator.configure("conf/log4j.properties"); } @Before public void setUp() throws Exception { this.parser = new DOMManifestParser(new SimplePermissionChecker(new XMLPermissionDatasource("conf/permissions.xml","conf/schema/permissions.xsd"))); setupTestDir(); } @After public void tearDown() throws Exception { this.parser = null; this.testfile.delete(); testdir.delete(); } private void setupTestFile(String filename) throws FileNotFoundException, IOException { BufferedInputStream in = new BufferedInputStream(this.getClass().getResourceAsStream(filename)); BufferedReader br = new BufferedReader(new InputStreamReader(in)); testfile = new File(testdir.getAbsolutePath() + System.getProperty("file.separator")+ filename); testfile.createNewFile(); PrintStream out = new PrintStream(new BufferedOutputStream(new FileOutputStream(testfile))); String s = br.readLine(); while(s != null) { out.println(s); out.flush(); s = br.readLine(); } br.close(); in.close(); out.close(); } private void setupTestDir() throws Exception { //set up a SAAF analysis directory structure testdir = new File(System.getProperty("java.io.tmpdir") + System.getProperty("file.separator")+ System.currentTimeMillis()); testdir.mkdir(); } @Test public void testAnalyzeFileNoActivites() throws Exception { setupTestFile("TestNoActivityAndroidManifest.xml"); ManifestInterface info = parser.parse(testfile); assertTrue("No activities defined. Still ManifestInfo claims there are.", info.hasNoActivities()); } @Test public void testNotNull() throws Exception { setupTestFile("TestAndroidManifest.xml"); ManifestInterface manifest = parser.parse(testfile); assertNotNull("The result of analyzeFile may not be null", manifest); } @Test(expected=ManifestParserException.class) public void testNonExisiting() throws Exception { testfile = new File("GibtsGarnichtAndroidManifest.xml"); ManifestInterface manifest = parser.parse(testfile); assertNotNull("The result of analyzeFile may not be null", manifest); } @Test public void testActivities() throws Exception { setupTestFile("TestAndroidManifest.xml"); ManifestInterface manifest = parser.parse(testfile); assertEquals("Analysis claims no activities were defined!", 9, manifest.getNumberOfActivities()); assertEquals("Wrong number of activties",9,manifest.getActivities().size()); } @Test public void testActivtyIntentFilters() throws Exception { setupTestFile("TestActivityManifest.xml"); ManifestInterface manifest = parser.parse(testfile); Collection<ActivityInterface> activties = manifest.getActivities(); for(ActivityInterface a : activties) { assertNotNull("Intent-Filters not correct",a.getIntentFilters()); //our test file contains an activity with one intent-filter assertFalse("List of Intent-Filters empty",a.getIntentFilters().isEmpty()); } } @Test public void testServiceIntentFilters() throws Exception { setupTestFile("TestServiceManifest.xml"); ManifestInterface manifest = parser.parse(testfile); Collection<ServiceInterface> services = manifest.getServices(); for(ServiceInterface service : services) { assertNotNull("Intent-Filters not correct",service.getIntentFilters()); //our test file contains an activity with one intent-filter assertFalse("List of Intent-Filters empty",service.getIntentFilters().isEmpty()); } } @Test public void testReceiverIntentFilters() throws Exception { setupTestFile("TestReceiverManifest.xml"); ManifestInterface manifest = parser.parse(testfile); Collection<ReceiverInterface> receivers = manifest.getReceivers(); for(ReceiverInterface receiver : receivers) { assertNotNull("Intent-Filters not correct",receiver.getIntentFilters()); //our test file contains an activity with one intent-filter assertFalse("List of Intent-Filters empty",receiver.getIntentFilters().isEmpty()); } } @Test public void testServices() throws Exception { setupTestFile("TestAndroidManifest.xml"); ManifestInterface manifest = parser.parse(testfile); assertEquals("Analysis claims no services were defined",1, manifest.getNumberOfServices()); } @Test public void testReceivers() throws Exception { setupTestFile("TestAndroidManifest.xml"); ManifestInterface manifest = parser.parse(testfile); assertEquals("Analysis claims no receivers were defined",1, manifest.getNumberOfReceivers()); } //assertFalse("Analysis claims the result to be aggregated",info.isAggregated()); //assertEquals("The number of analyzed manifests must be 1", 1, info.getNumberOfAnalyzedManifests()); @Test public void testPermissions() throws Exception { setupTestFile("TestAndroidManifest.xml"); ManifestInterface manifest = parser.parse(testfile); assertEquals("Number of requested permissions is not correct", 110, manifest.getNumberOfPermissions()); } @Test public void testAppDebuggable() throws Exception{ setupTestFile("TestApplicationAndroidManifest.xml"); ManifestInterface manifest = parser.parse(testfile); assertTrue("Application.isDebuggable was not set correctly",manifest.isAppDebuggable()); } @Test public void testAppLabel() throws Exception{ setupTestFile("TestApplicationAndroidManifest.xml"); ManifestInterface manifest = parser.parse(testfile); assertEquals("Application.isDebuggable was not set correctly","TestApp",manifest.getAppLabel()); } @Test public void testMainActivity() throws Exception{ setupTestFile("TestActivityManifest.xml"); ManifestInterface manifest = parser.parse(testfile); ActivityInterface a = manifest.getDefaultActivity(); assertNotNull("Default Activity was not set!",a); assertTrue("A default activity must have the entrypoint flag set",a.isEntryPoint()); } @Test public void testNoMainActivity() throws Exception{ setupTestFile("TestNoActivityAndroidManifest.xml"); ManifestInterface manifest = parser.parse(testfile); ActivityInterface a = manifest.getDefaultActivity(); org.junit.Assert.assertNull("When there is no activity there cannot be a default activity!",a); } }