14ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williamspackage com.xtremelabs.robolectric.util; 24ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams 3147cdda64f4a372a27599ae1f902bd7be90bee5cPhil Goodwinimport com.xtremelabs.robolectric.RobolectricConfig; 4147cdda64f4a372a27599ae1f902bd7be90bee5cPhil Goodwin 54ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williamsimport java.io.File; 628dc94ecb7ac94834b97e3f6be778b3f2bb734fdJesse Toth & Tim Labeeuwimport java.io.FileInputStream; 74ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williamsimport java.util.Collection; 87e5cf376e4804434595efd685f894d5661ea9246Chris Van Vrankenimport java.util.Map; 928dc94ecb7ac94834b97e3f6be778b3f2bb734fdJesse Toth & Tim Labeeuwimport java.util.Properties; 104ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams 114ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williamsimport static org.junit.Assert.assertTrue; 124ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams 134ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williamspublic abstract class TestUtil { 144ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams public static File testDirLocation; 154ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams 164ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams public static void assertEquals(Collection<?> expected, Collection<?> actual) { 174ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams org.junit.Assert.assertEquals(stringify(expected), stringify(actual)); 184ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams } 194ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams 204ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams public static String stringify(Collection<?> collection) { 214ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams StringBuilder buf = new StringBuilder(); 224ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams for (Object o : collection) { 234ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams if (buf.length() > 0) buf.append("\n"); 244ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams buf.append(o); 254ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams } 264ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams return buf.toString(); 274ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams } 284ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams 294ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams public static <T> void assertInstanceOf(Class<? extends T> expectedClass, T object) { 304ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams Class actualClass = object.getClass(); 314ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams assertTrue(expectedClass + " should be assignable from " + actualClass, 324ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams expectedClass.isAssignableFrom(actualClass)); 334ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams } 344ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams 354ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams public static File file(String... pathParts) { 364ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams return file(new File("."), pathParts); 374ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams } 384ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams 394ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams public static File file(File f, String... pathParts) { 404ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams for (String pathPart : pathParts) { 414ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams f = new File(f, pathPart); 424ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams } 434ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams return f; 444ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams } 454ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams 464ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams public static File resourcesBaseDir() { 474ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams if (testDirLocation == null) { 484ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams File testDir = file("src", "test", "resources"); 49a6ff2c2b15018092af3a28697b521d1ca5e789f0Christian Williams & Phil Goodwin if (hasTestManifest(testDir)) return testDirLocation = testDir; 504ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams 514ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams File roboTestDir = file("robolectric", "src", "test", "resources"); 52a6ff2c2b15018092af3a28697b521d1ca5e789f0Christian Williams & Phil Goodwin if (hasTestManifest(roboTestDir)) return testDirLocation = roboTestDir; 534ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams 543015d6b2e3a136ae6c013ba0d3f6c45c2e1ddf31Chris Van Vranken File submoduleDir = file("submodules", "robolectric", "src", "test", "resources"); 553015d6b2e3a136ae6c013ba0d3f6c45c2e1ddf31Chris Van Vranken if (hasTestManifest(submoduleDir)) return testDirLocation = submoduleDir; 563015d6b2e3a136ae6c013ba0d3f6c45c2e1ddf31Chris Van Vranken 57b236352b9344e79f4f6d2efe4b7c5393bc9fe9c5Chris Van Vranken //required for robolectric-sqlite to find resources to test against 58b381ee39223f4b835daac148d7e135d061860914Chris Van Vranken File roboSiblingTestDir = file(new File(new File(".").getAbsolutePath()).getParentFile().getParentFile(),"robolectric", "src", "test", "resources"); 59b381ee39223f4b835daac148d7e135d061860914Chris Van Vranken if (hasTestManifest(roboSiblingTestDir)) return testDirLocation = roboSiblingTestDir; 60b381ee39223f4b835daac148d7e135d061860914Chris Van Vranken 614ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams throw new RuntimeException("can't find your TestAndroidManifest.xml in " 62b381ee39223f4b835daac148d7e135d061860914Chris Van Vranken + testDir.getAbsolutePath() + " or " + roboTestDir.getAbsolutePath() + "\n or " + roboSiblingTestDir.getAbsolutePath()); 634ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams } else { 644ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams return testDirLocation; 654ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams } 664ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams } 674ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams 68a6ff2c2b15018092af3a28697b521d1ca5e789f0Christian Williams & Phil Goodwin private static boolean hasTestManifest(File testDir) { 69a6ff2c2b15018092af3a28697b521d1ca5e789f0Christian Williams & Phil Goodwin return new File(testDir, "TestAndroidManifest.xml").isFile(); 70a6ff2c2b15018092af3a28697b521d1ca5e789f0Christian Williams & Phil Goodwin } 71a6ff2c2b15018092af3a28697b521d1ca5e789f0Christian Williams & Phil Goodwin 724ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams public static File resourceFile(String... pathParts) { 734ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams return file(resourcesBaseDir(), pathParts); 744ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams } 75147cdda64f4a372a27599ae1f902bd7be90bee5cPhil Goodwin 76147cdda64f4a372a27599ae1f902bd7be90bee5cPhil Goodwin public static RobolectricConfig newConfig(String androidManifestFile) { 77147cdda64f4a372a27599ae1f902bd7be90bee5cPhil Goodwin return new RobolectricConfig(resourceFile(androidManifestFile), null, null); 78147cdda64f4a372a27599ae1f902bd7be90bee5cPhil Goodwin } 7928dc94ecb7ac94834b97e3f6be778b3f2bb734fdJesse Toth & Tim Labeeuw 80f2906888dbe454d6b607e123cc5fdfebd190372bJesse Toth & Tim Labeeuw public static File getSystemResourceDir(String... paths) throws Exception { 817e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken 827e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken Map<String,String> env = System.getenv(); 837e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken String sdkDir; 847e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken if (env.containsKey("ANDROID_HOME")) { 857e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken sdkDir = env.get("ANDROID_HOME"); 867e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken } else { 877e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken Properties localProperties = new Properties(); 887e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken localProperties.load(new FileInputStream(new File("local.properties"))); 897e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken PropertiesHelper.doSubstitutions(localProperties); 907e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken sdkDir = localProperties.getProperty("sdk.dir"); 917e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken } 927e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken 937e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken return file(new File(sdkDir, "platforms/android-10/data/res/"), paths); 9428dc94ecb7ac94834b97e3f6be778b3f2bb734fdJesse Toth & Tim Labeeuw } 954ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams} 96