package com.bumptech.glide.module; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Bundle; import com.bumptech.glide.GlideBuilder; import com.bumptech.glide.Registry; import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) @Config(manifest = Config.NONE, sdk = 18) @SuppressWarnings("deprecation") public class ManifestParserTest { private static final String MODULE_VALUE = "GlideModule"; @Mock Context context; private ManifestParser parser; private ApplicationInfo applicationInfo; @Before public void setUp() throws PackageManager.NameNotFoundException { MockitoAnnotations.initMocks(this); applicationInfo = new ApplicationInfo(); applicationInfo.metaData = new Bundle(); String packageName = "com.bumptech.test"; when(context.getPackageName()).thenReturn(packageName); PackageManager pm = mock(PackageManager.class); when(pm.getApplicationInfo(eq(packageName), eq(PackageManager.GET_META_DATA))) .thenReturn(applicationInfo); when(context.getPackageManager()).thenReturn(pm); parser = new ManifestParser(context); } @Test public void testParse_returnsEmptyListIfNoModulesListed() { assertThat(parser.parse()).isEmpty(); } @Test public void testParse_withSingleValidModuleName_returnsListContainingModule() { addModuleToManifest(TestModule1.class); List<GlideModule> modules = parser.parse(); assertThat(modules).hasSize(1); assertThat(modules.get(0)).isInstanceOf(TestModule1.class); } @Test public void testParse_withMultipleValidModuleNames_returnsListContainingModules() { addModuleToManifest(TestModule1.class); addModuleToManifest(TestModule2.class); List<GlideModule> modules = parser.parse(); assertThat(modules).hasSize(2); assertThat(modules).contains(new TestModule1()); assertThat(modules).contains(new TestModule2()); } @Test public void testParse_withValidModuleName_ignoresMetadataWithoutGlideModuleValue() { applicationInfo.metaData.putString(TestModule1.class.getName(), MODULE_VALUE + "test"); assertThat(parser.parse()).isEmpty(); } @Test(expected = RuntimeException.class) public void testThrows_whenModuleNameNotFound() { addToManifest("fakeClassName"); parser.parse(); } @Test(expected = RuntimeException.class) public void testThrows_whenClassInManifestIsNotAModule() { addModuleToManifest(InvalidClass.class); parser.parse(); } @Test(expected = RuntimeException.class) public void testThrows_whenPackageNameNotFound() { when(context.getPackageName()).thenReturn("fakePackageName"); parser.parse(); } private void addModuleToManifest(Class<?> moduleClass) { addToManifest(moduleClass.getName()); } private void addToManifest(String key) { applicationInfo.metaData.putString(key, MODULE_VALUE); } public static class InvalidClass { } public static class TestModule1 implements GlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { } @Override public void registerComponents(Context context, Registry registry) { } @Override public boolean equals(Object o) { return o instanceof TestModule1; } @Override public int hashCode() { return super.hashCode(); } } public static class TestModule2 implements GlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { } @Override public void registerComponents(Context context, Registry registry) { } @Override public boolean equals(Object o) { return o instanceof TestModule2; } @Override public int hashCode() { return super.hashCode(); } } }