Home | History | Annotate | Download | only in manifest
      1 package org.robolectric.manifest;
      2 
      3 import static org.assertj.core.api.Assertions.assertThat;
      4 import static org.robolectric.util.TestUtil.resourceFile;
      5 
      6 import android.Manifest;
      7 import android.content.Intent;
      8 import android.os.Build.VERSION_CODES;
      9 import com.google.common.base.Charsets;
     10 import com.google.common.io.Files;
     11 import java.io.File;
     12 import java.io.IOException;
     13 import java.lang.reflect.Field;
     14 import java.util.ArrayList;
     15 import java.util.Arrays;
     16 import java.util.Collections;
     17 import java.util.List;
     18 import java.util.Map;
     19 import org.junit.Rule;
     20 import org.junit.Test;
     21 import org.junit.rules.TemporaryFolder;
     22 import org.junit.runner.RunWith;
     23 import org.junit.runners.JUnit4;
     24 import org.robolectric.annotation.Config;
     25 import org.robolectric.res.Fs;
     26 
     27 @RunWith(JUnit4.class)
     28 public class AndroidManifestTest {
     29   @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder();
     30 
     31   @Test
     32   public void parseManifest_shouldReadContentProviders() throws Exception {
     33     AndroidManifest config = newConfig("TestAndroidManifestWithContentProviders.xml");
     34 
     35     assertThat(config.getContentProviders().get(0).getName())
     36         .isEqualTo("org.robolectric.tester.FullyQualifiedClassName");
     37     assertThat(config.getContentProviders().get(0).getAuthorities()).isEqualTo("org.robolectric.authority1");
     38 
     39     assertThat(config.getContentProviders().get(1).getName())
     40         .isEqualTo("org.robolectric.tester.PartiallyQualifiedClassName");
     41     assertThat(config.getContentProviders().get(1).getAuthorities()).isEqualTo("org.robolectric.authority2");
     42   }
     43 
     44   @Test
     45   public void parseManifest_shouldReadPermissions() throws Exception {
     46     AndroidManifest config = newConfig("TestAndroidManifestWithPermissions.xml");
     47 
     48     assertThat(config.getPermissions().keySet())
     49         .contains("some_permission",
     50             "permission_with_literal_label",
     51             "permission_with_minimal_fields");
     52     PermissionItemData permissionItemData = config.getPermissions().get("some_permission");
     53     assertThat(permissionItemData.getMetaData().getValueMap()).containsEntry("meta_data_name", "meta_data_value");
     54     assertThat(permissionItemData.getName()).isEqualTo("some_permission");
     55     assertThat(permissionItemData.getPermissionGroup()).isEqualTo("my_permission_group");
     56     assertThat(permissionItemData.getDescription()).isEqualTo("@string/test_permission_description");
     57     assertThat(permissionItemData.getProtectionLevel()).isEqualTo("dangerous");
     58   }
     59 
     60   @Test
     61   public void parseManifest_shouldReadPermissionGroups() throws Exception {
     62     AndroidManifest config = newConfig("TestAndroidManifestWithPermissions.xml");
     63 
     64     assertThat(config.getPermissionGroups().keySet())
     65         .contains("permission_group");
     66     PermissionGroupItemData permissionGroupItemData = config.getPermissionGroups().get("permission_group");
     67     assertThat(permissionGroupItemData.getName()).isEqualTo("permission_group");
     68     assertThat(permissionGroupItemData.getDescription()).isEqualTo("@string/test_permission_description");
     69   }
     70 
     71   @Test
     72   public void parseManifest_shouldReadBroadcastReceivers() throws Exception {
     73     AndroidManifest config = newConfig("TestAndroidManifestWithReceivers.xml");
     74     assertThat(config.getBroadcastReceivers()).hasSize(8);
     75 
     76     assertThat(config.getBroadcastReceivers().get(0).getName())
     77         .isEqualTo("org.robolectric.ConfigTestReceiver.InnerReceiver");
     78     assertThat(config.getBroadcastReceivers().get(0).getActions()).contains("org.robolectric.ACTION1", "org.robolectric.ACTION2");
     79 
     80     assertThat(config.getBroadcastReceivers().get(1).getName())
     81         .isEqualTo("org.robolectric.fakes.ConfigTestReceiver");
     82     assertThat(config.getBroadcastReceivers().get(1).getActions()).contains("org.robolectric.ACTION_SUPERSET_PACKAGE");
     83 
     84     assertThat(config.getBroadcastReceivers().get(2).getName())
     85         .isEqualTo("org.robolectric.ConfigTestReceiver");
     86     assertThat(config.getBroadcastReceivers().get(2).getActions()).contains("org.robolectric.ACTION_SUBSET_PACKAGE");
     87 
     88     assertThat(config.getBroadcastReceivers().get(3).getName())
     89         .isEqualTo("org.robolectric.DotConfigTestReceiver");
     90     assertThat(config.getBroadcastReceivers().get(3).getActions()).contains("org.robolectric.ACTION_DOT_PACKAGE");
     91 
     92     assertThat(config.getBroadcastReceivers().get(4).getName())
     93         .isEqualTo("org.robolectric.test.ConfigTestReceiver");
     94     assertThat(config.getBroadcastReceivers().get(4).getActions()).contains("org.robolectric.ACTION_DOT_SUBPACKAGE");
     95 
     96     assertThat(config.getBroadcastReceivers().get(5).getName()).isEqualTo("com.foo.Receiver");
     97     assertThat(config.getBroadcastReceivers().get(5).getActions()).contains("org.robolectric.ACTION_DIFFERENT_PACKAGE");
     98     assertThat(config.getBroadcastReceivers().get(5).getIntentFilters()).hasSize(1);
     99     IntentFilterData filter = config.getBroadcastReceivers().get(5).getIntentFilters().get(0);
    100     assertThat(filter.getActions()).containsExactly("org.robolectric.ACTION_DIFFERENT_PACKAGE");
    101 
    102     assertThat(config.getBroadcastReceivers().get(6).getName())
    103         .isEqualTo("com.bar.ReceiverWithoutIntentFilter");
    104     assertThat(config.getBroadcastReceivers().get(6).getActions()).isEmpty();
    105 
    106     assertThat(config.getBroadcastReceivers().get(7).getName())
    107         .isEqualTo("org.robolectric.ConfigTestReceiverPermissionsAndActions");
    108     assertThat(config.getBroadcastReceivers().get(7).getActions()).contains("org.robolectric.ACTION_RECEIVER_PERMISSION_PACKAGE");
    109   }
    110 
    111   @Test
    112   public void parseManifest_shouldReadServices() throws Exception {
    113     AndroidManifest config = newConfig("TestAndroidManifestWithServices.xml");
    114     assertThat(config.getServices()).hasSize(2);
    115 
    116     assertThat(config.getServices().get(0).getClassName()).isEqualTo("com.foo.Service");
    117     assertThat(config.getServices().get(0).getActions()).contains("org.robolectric.ACTION_DIFFERENT_PACKAGE");
    118     assertThat(config.getServices().get(0).getIntentFilters()).isNotEmpty();
    119     assertThat(config.getServices().get(0).getIntentFilters().get(0).getMimeTypes()).containsExactly("image/jpeg");
    120 
    121     assertThat(config.getServices().get(1).getClassName()).isEqualTo("com.bar.ServiceWithoutIntentFilter");
    122     assertThat(config.getServices().get(1).getActions()).isEmpty();
    123     assertThat(config.getServices().get(1).getIntentFilters()).isEmpty();
    124 
    125     assertThat(config.getServiceData("com.foo.Service").getClassName()).isEqualTo("com.foo.Service");
    126     assertThat(config.getServiceData("com.bar.ServiceWithoutIntentFilter").getClassName()).isEqualTo("com.bar.ServiceWithoutIntentFilter");
    127     assertThat(config.getServiceData("com.foo.Service").getPermission())
    128         .isEqualTo("com.foo.Permission");
    129   }
    130 
    131   @Test
    132   public void testManifestWithNoApplicationElement() throws Exception {
    133     AndroidManifest config = newConfig("TestAndroidManifestNoApplicationElement.xml");
    134     assertThat(config.getPackageName()).isEqualTo("org.robolectric");
    135   }
    136 
    137   @Test
    138   public void parseManifest_shouldReadBroadcastReceiversWithMetaData() throws Exception {
    139     AndroidManifest config = newConfig("TestAndroidManifestWithReceivers.xml");
    140 
    141     assertThat(config.getBroadcastReceivers().get(4).getName())
    142         .isEqualTo("org.robolectric.test.ConfigTestReceiver");
    143     assertThat(config.getBroadcastReceivers().get(4).getActions())
    144         .contains("org.robolectric.ACTION_DOT_SUBPACKAGE");
    145 
    146     Map<String, Object> meta = config.getBroadcastReceivers().get(4).getMetaData().getValueMap();
    147     Object metaValue = meta.get("org.robolectric.metaName1");
    148     assertThat(metaValue).isEqualTo("metaValue1");
    149 
    150     metaValue = meta.get("org.robolectric.metaName2");
    151     assertThat(metaValue).isEqualTo("metaValue2");
    152 
    153     metaValue = meta.get("org.robolectric.metaFalse");
    154     assertThat(metaValue).isEqualTo("false");
    155 
    156     metaValue = meta.get("org.robolectric.metaTrue");
    157     assertThat(metaValue).isEqualTo("true");
    158 
    159     metaValue = meta.get("org.robolectric.metaInt");
    160     assertThat(metaValue).isEqualTo("123");
    161 
    162     metaValue = meta.get("org.robolectric.metaFloat");
    163     assertThat(metaValue).isEqualTo("1.23");
    164 
    165     metaValue = meta.get("org.robolectric.metaColor");
    166     assertThat(metaValue).isEqualTo("#FFFFFF");
    167 
    168     metaValue = meta.get("org.robolectric.metaBooleanFromRes");
    169     assertThat(metaValue).isEqualTo("@bool/false_bool_value");
    170 
    171     metaValue = meta.get("org.robolectric.metaIntFromRes");
    172     assertThat(metaValue).isEqualTo("@integer/test_integer1");
    173 
    174     metaValue = meta.get("org.robolectric.metaColorFromRes");
    175     assertThat(metaValue).isEqualTo("@color/clear");
    176 
    177     metaValue = meta.get("org.robolectric.metaStringFromRes");
    178     assertThat(metaValue).isEqualTo("@string/app_name");
    179 
    180     metaValue = meta.get("org.robolectric.metaStringOfIntFromRes");
    181     assertThat(metaValue).isEqualTo("@string/str_int");
    182 
    183     metaValue = meta.get("org.robolectric.metaStringRes");
    184     assertThat(metaValue).isEqualTo("@string/app_name");
    185   }
    186 
    187   @Test
    188   public void shouldReadBroadcastReceiverPermissions() throws Exception {
    189     AndroidManifest config = newConfig("TestAndroidManifestWithReceivers.xml");
    190 
    191     assertThat(config.getBroadcastReceivers().get(7).getName())
    192         .isEqualTo("org.robolectric.ConfigTestReceiverPermissionsAndActions");
    193     assertThat(config.getBroadcastReceivers().get(7).getActions())
    194         .contains("org.robolectric.ACTION_RECEIVER_PERMISSION_PACKAGE");
    195 
    196     assertThat(config.getBroadcastReceivers().get(7).getPermission())
    197         .isEqualTo("org.robolectric.CUSTOM_PERM");
    198   }
    199 
    200   @Test
    201   public void shouldReadTargetSdkVersionFromAndroidManifestOrDefaultToMin() throws Exception {
    202     assertThat(
    203             newConfigWith(
    204                     "targetsdk42minsdk6.xml",
    205                     "android:targetSdkVersion=\"42\" android:minSdkVersion=\"7\"")
    206                 .getTargetSdkVersion())
    207         .isEqualTo(42);
    208     assertThat(newConfigWith("minsdk7.xml", "android:minSdkVersion=\"7\"").getTargetSdkVersion())
    209         .isEqualTo(7);
    210     assertThat(newConfigWith("noattributes.xml", "").getTargetSdkVersion())
    211         .isEqualTo(VERSION_CODES.JELLY_BEAN);
    212   }
    213 
    214   @Test
    215   public void shouldReadMinSdkVersionFromAndroidManifestOrDefaultToJellyBean() throws Exception {
    216     assertThat(newConfigWith("minsdk17.xml", "android:minSdkVersion=\"17\"").getMinSdkVersion())
    217         .isEqualTo(17);
    218     assertThat(newConfigWith("noattributes.xml", "").getMinSdkVersion())
    219         .isEqualTo(VERSION_CODES.JELLY_BEAN);
    220   }
    221 
    222   /**
    223    * For Android O preview, apps are encouraged to use targetSdkVersion="O".
    224    *
    225    * @see <a href="http://google.com">https://developer.android.com/preview/migration.html</a>
    226    */
    227   @Test
    228   public void shouldReadTargetSDKVersionOPreview() throws Exception {
    229     assertThat(
    230             newConfigWith("TestAndroidManifestForPreview.xml", "android:targetSdkVersion=\"O\"")
    231                 .getTargetSdkVersion())
    232         .isEqualTo(26);
    233   }
    234 
    235   @Test
    236   public void shouldReadProcessFromAndroidManifest() throws Exception {
    237     assertThat(newConfig("TestAndroidManifestWithProcess.xml").getProcessName())
    238         .isEqualTo("robolectricprocess");
    239   }
    240 
    241   @Test
    242   public void shouldReturnPackageNameWhenNoProcessIsSpecifiedInTheManifest() {
    243     assertThat(newConfig("TestAndroidManifestWithNoProcess.xml").getProcessName())
    244         .isEqualTo("org.robolectric");
    245   }
    246 
    247   @Test
    248   @Config(manifest = "TestAndroidManifestWithAppMetaData.xml")
    249   public void shouldReturnApplicationMetaData() throws Exception {
    250     Map<String, Object> meta =
    251         newConfig("TestAndroidManifestWithAppMetaData.xml").getApplicationMetaData();
    252 
    253     Object metaValue = meta.get("org.robolectric.metaName1");
    254     assertThat(metaValue).isEqualTo("metaValue1");
    255 
    256     metaValue = meta.get("org.robolectric.metaName2");
    257     assertThat(metaValue).isEqualTo("metaValue2");
    258 
    259     metaValue = meta.get("org.robolectric.metaFalse");
    260     assertThat(metaValue).isEqualTo("false");
    261 
    262     metaValue = meta.get("org.robolectric.metaTrue");
    263     assertThat(metaValue).isEqualTo("true");
    264 
    265     metaValue = meta.get("org.robolectric.metaInt");
    266     assertThat(metaValue).isEqualTo("123");
    267 
    268     metaValue = meta.get("org.robolectric.metaFloat");
    269     assertThat(metaValue).isEqualTo("1.23");
    270 
    271     metaValue = meta.get("org.robolectric.metaColor");
    272     assertThat(metaValue).isEqualTo("#FFFFFF");
    273 
    274     metaValue = meta.get("org.robolectric.metaBooleanFromRes");
    275     assertThat(metaValue).isEqualTo("@bool/false_bool_value");
    276 
    277     metaValue = meta.get("org.robolectric.metaIntFromRes");
    278     assertThat(metaValue).isEqualTo("@integer/test_integer1");
    279 
    280     metaValue = meta.get("org.robolectric.metaColorFromRes");
    281     assertThat(metaValue).isEqualTo("@color/clear");
    282 
    283     metaValue = meta.get("org.robolectric.metaStringFromRes");
    284     assertThat(metaValue).isEqualTo("@string/app_name");
    285 
    286     metaValue = meta.get("org.robolectric.metaStringOfIntFromRes");
    287     assertThat(metaValue).isEqualTo("@string/str_int");
    288 
    289     metaValue = meta.get("org.robolectric.metaStringRes");
    290     assertThat(metaValue).isEqualTo("@string/app_name");
    291   }
    292 
    293   @Test
    294   public void shouldTolerateMissingRFile() throws Exception {
    295     AndroidManifest appManifest = new AndroidManifest(resourceFile("TestAndroidManifestWithNoRFile.xml"), resourceFile("res"), resourceFile("assets"));
    296     assertThat(appManifest.getPackageName()).isEqualTo("org.no.resources.for.me");
    297     assertThat(appManifest.getRClass()).isNull();
    298   }
    299 
    300   @Test
    301   public void whenNullManifestFile_getRClass_shouldComeFromPackageName() throws Exception {
    302     AndroidManifest appManifest = new AndroidManifest(null, resourceFile("res"), resourceFile("assets"), "org.robolectric.lib1");
    303     assertThat(appManifest.getRClass()).isEqualTo(org.robolectric.lib1.R.class);
    304     assertThat(appManifest.getPackageName()).isEqualTo("org.robolectric.lib1");
    305   }
    306 
    307   @Test
    308   public void whenMissingManifestFile_getRClass_shouldComeFromPackageName() throws Exception {
    309     AndroidManifest appManifest = new AndroidManifest(resourceFile("none.xml"), resourceFile("res"), resourceFile("assets"), "org.robolectric.lib1");
    310     assertThat(appManifest.getRClass()).isEqualTo(org.robolectric.lib1.R.class);
    311     assertThat(appManifest.getPackageName()).isEqualTo("org.robolectric.lib1");
    312   }
    313 
    314   @Test
    315   public void whenMissingManifestFile_getPackageName_shouldBeDefault() throws Exception {
    316     AndroidManifest appManifest = new AndroidManifest(null, resourceFile("res"), resourceFile("assets"), null);
    317     assertThat(appManifest.getPackageName()).isEqualTo("org.robolectric.default");
    318     assertThat(appManifest.getRClass()).isEqualTo(null);
    319   }
    320 
    321   @Test
    322   public void shouldRead1IntentFilter() {
    323     AndroidManifest appManifest = newConfig("TestAndroidManifestForActivitiesWithIntentFilter.xml");
    324     appManifest.getMinSdkVersion(); // Force parsing
    325 
    326     ActivityData activityData = appManifest.getActivityData("org.robolectric.shadows.TestActivity");
    327     final List<IntentFilterData> ifd = activityData.getIntentFilters();
    328     assertThat(ifd).isNotNull();
    329     assertThat(ifd.size()).isEqualTo(1);
    330 
    331     final IntentFilterData data = ifd.get(0);
    332     assertThat(data.getActions().size()).isEqualTo(1);
    333     assertThat(data.getActions().get(0)).isEqualTo(Intent.ACTION_MAIN);
    334     assertThat(data.getCategories().size()).isEqualTo(1);
    335     assertThat(data.getCategories().get(0)).isEqualTo(Intent.CATEGORY_LAUNCHER);
    336   }
    337 
    338   @Test
    339   public void shouldReadMultipleIntentFilters() {
    340     AndroidManifest appManifest = newConfig("TestAndroidManifestForActivitiesWithMultipleIntentFilters.xml");
    341     appManifest.getMinSdkVersion(); // Force parsing
    342 
    343     ActivityData activityData = appManifest.getActivityData("org.robolectric.shadows.TestActivity");
    344     final List<IntentFilterData> ifd = activityData.getIntentFilters();
    345     assertThat(ifd).isNotNull();
    346     assertThat(ifd.size()).isEqualTo(2);
    347 
    348     IntentFilterData data = ifd.get(0);
    349     assertThat(data.getActions().size()).isEqualTo(1);
    350     assertThat(data.getActions().get(0)).isEqualTo(Intent.ACTION_MAIN);
    351     assertThat(data.getCategories().size()).isEqualTo(1);
    352     assertThat(data.getCategories().get(0)).isEqualTo(Intent.CATEGORY_LAUNCHER);
    353 
    354     data = ifd.get(1);
    355     assertThat(data.getActions().size()).isEqualTo(3);
    356     assertThat(data.getActions().get(0)).isEqualTo(Intent.ACTION_VIEW);
    357     assertThat(data.getActions().get(1)).isEqualTo(Intent.ACTION_EDIT);
    358     assertThat(data.getActions().get(2)).isEqualTo(Intent.ACTION_PICK);
    359 
    360     assertThat(data.getCategories().size()).isEqualTo(3);
    361     assertThat(data.getCategories().get(0)).isEqualTo(Intent.CATEGORY_DEFAULT);
    362     assertThat(data.getCategories().get(1)).isEqualTo(Intent.CATEGORY_ALTERNATIVE);
    363     assertThat(data.getCategories().get(2)).isEqualTo(Intent.CATEGORY_SELECTED_ALTERNATIVE);
    364   }
    365 
    366   @Test
    367   public void shouldReadTaskAffinity() {
    368     AndroidManifest appManifest = newConfig("TestAndroidManifestForActivitiesWithTaskAffinity.xml");
    369     assertThat(appManifest.getTargetSdkVersion()).isEqualTo(16);
    370 
    371     ActivityData activityData = appManifest.getActivityData("org.robolectric.shadows.TestTaskAffinityActivity");
    372     assertThat(activityData).isNotNull();
    373     assertThat(activityData.getTaskAffinity()).isEqualTo("org.robolectric.shadows.TestTaskAffinity");
    374   }
    375 
    376   @Test
    377   public void shouldReadPermissions() throws Exception {
    378     AndroidManifest config = newConfig("TestAndroidManifestWithPermissions.xml");
    379 
    380     assertThat(config.getUsedPermissions()).hasSize(3);
    381     assertThat(config.getUsedPermissions().get(0)).isEqualTo(Manifest.permission.INTERNET);
    382     assertThat(config.getUsedPermissions().get(1)).isEqualTo(Manifest.permission.SYSTEM_ALERT_WINDOW);
    383     assertThat(config.getUsedPermissions().get(2)).isEqualTo(Manifest.permission.GET_TASKS);
    384   }
    385 
    386   @Test
    387   public void shouldReadPartiallyQualifiedActivities() throws Exception {
    388     AndroidManifest config = newConfig("TestAndroidManifestForActivities.xml");
    389     assertThat(config.getActivityDatas()).hasSize(2);
    390     assertThat(config.getActivityDatas()).containsKey("org.robolectric.shadows.TestActivity");
    391     assertThat(config.getActivityDatas()).containsKey("org.robolectric.shadows.TestActivity2");
    392   }
    393 
    394   @Test
    395   public void shouldReadActivityAliases() throws Exception {
    396     AndroidManifest config = newConfig("TestAndroidManifestForActivityAliases.xml");
    397     assertThat(config.getActivityDatas()).hasSize(2);
    398     assertThat(config.getActivityDatas()).containsKey("org.robolectric.shadows.TestActivity");
    399     assertThat(config.getActivityDatas()).containsKey("org.robolectric.shadows.TestActivityAlias");
    400   }
    401 
    402   @Test
    403   public void shouldReadIntentFilterWithData() {
    404     AndroidManifest appManifest = newConfig("TestAndroidManifestForActivitiesWithIntentFilterWithData.xml");
    405     appManifest.getMinSdkVersion(); // Force parsing
    406 
    407     ActivityData activityData = appManifest.getActivityData("org.robolectric.shadows.TestActivity");
    408     final List<IntentFilterData> ifd = activityData.getIntentFilters();
    409     assertThat(ifd).isNotNull();
    410     assertThat(ifd.size()).isEqualTo(1);
    411 
    412     final IntentFilterData intentFilterData = ifd.get(0);
    413     assertThat(intentFilterData.getActions().size()).isEqualTo(1);
    414     assertThat(intentFilterData.getActions().get(0)).isEqualTo(Intent.ACTION_VIEW);
    415     assertThat(intentFilterData.getCategories().size()).isEqualTo(1);
    416     assertThat(intentFilterData.getCategories().get(0)).isEqualTo(Intent.CATEGORY_DEFAULT);
    417 
    418     assertThat(intentFilterData.getSchemes().size()).isEqualTo(3);
    419     assertThat(intentFilterData.getAuthorities().size()).isEqualTo(3);
    420     assertThat(intentFilterData.getMimeTypes().size()).isEqualTo(3);
    421     assertThat(intentFilterData.getPaths().size()).isEqualTo(1);
    422     assertThat(intentFilterData.getPathPatterns().size()).isEqualTo(1);
    423     assertThat(intentFilterData.getPathPrefixes().size()).isEqualTo(1);
    424 
    425 
    426     assertThat(intentFilterData.getSchemes().get(0)).isEqualTo("content");
    427     assertThat(intentFilterData.getPaths().get(0)).isEqualTo("/testPath/test.jpeg");
    428     assertThat(intentFilterData.getMimeTypes().get(0)).isEqualTo("video/mpeg");
    429     assertThat(intentFilterData.getAuthorities().get(0).getHost()).isEqualTo("testhost1.com");
    430     assertThat(intentFilterData.getAuthorities().get(0).getPort()).isEqualTo("1");
    431 
    432     assertThat(intentFilterData.getSchemes().get(1)).isEqualTo("http");
    433     assertThat(intentFilterData.getPathPrefixes().get(0)).isEqualTo("/testPrefix");
    434     assertThat(intentFilterData.getMimeTypes().get(1)).isEqualTo("image/jpeg");
    435     assertThat(intentFilterData.getAuthorities().get(1).getHost()).isEqualTo("testhost2.com");
    436     assertThat(intentFilterData.getAuthorities().get(1).getPort()).isEqualTo("2");
    437 
    438     assertThat(intentFilterData.getSchemes().get(2)).isEqualTo("https");
    439     assertThat(intentFilterData.getPathPatterns().get(0)).isEqualTo("/.*testPattern");
    440     assertThat(intentFilterData.getMimeTypes().get(2)).isEqualTo("image/*");
    441     assertThat(intentFilterData.getAuthorities().get(2).getHost()).isEqualTo("testhost3.com");
    442     assertThat(intentFilterData.getAuthorities().get(2).getPort()).isEqualTo("3");
    443   }
    444 
    445   @Test
    446   public void shouldHaveStableHashCode() throws Exception {
    447     AndroidManifest manifest = newConfig("TestAndroidManifestWithContentProviders.xml");
    448     int hashCode1 = manifest.hashCode();
    449     manifest.getServices();
    450     int hashCode2 = manifest.hashCode();
    451     assertThat(hashCode2).isEqualTo(hashCode1);
    452   }
    453 
    454   @Test
    455   public void shouldReadApplicationAttrsFromAndroidManifest() throws Exception {
    456     AndroidManifest config = newConfig("TestAndroidManifestWithFlags.xml");
    457     assertThat(config.getApplicationAttributes().get("android:allowBackup")).isEqualTo("true");
    458   }
    459 
    460   @Test
    461   public void allFieldsShouldBePrimitivesOrJavaLangOrRobolectric() throws Exception {
    462     List<Field> wrongFields = new ArrayList<>();
    463     for (Field field : AndroidManifest.class.getDeclaredFields()) {
    464       Class<?> type = field.getType();
    465       if (type.isPrimitive()) continue;
    466 
    467       String packageName = type.getPackage().getName();
    468       if (packageName.startsWith("java.")
    469           || packageName.equals("org.robolectric.res")
    470           || packageName.equals("org.robolectric.manifest")
    471           ) continue;
    472 
    473       wrongFields.add(field);
    474     }
    475 
    476     assertThat(wrongFields).isEmpty();
    477   }
    478 
    479   @Test
    480   public void activitiesWithoutIntentFiltersNotExportedByDefault() throws Exception {
    481     AndroidManifest config = newConfig("TestAndroidManifestForActivities.xml");
    482     ActivityData activityData = config.getActivityData("org.robolectric.shadows.TestActivity");
    483     assertThat(activityData.isExported()).isFalse();
    484   }
    485 
    486   @Test
    487   public void activitiesWithIntentFiltersExportedByDefault() throws Exception {
    488     AndroidManifest config = newConfig("TestAndroidManifestForActivitiesWithIntentFilter.xml");
    489     ActivityData activityData = config.getActivityData("org.robolectric.shadows.TestActivity");
    490     assertThat(activityData.isExported()).isTrue();
    491   }
    492 
    493   @Test
    494   public void servicesWithoutIntentFiltersNotExportedByDefault() throws Exception {
    495     AndroidManifest config = newConfig("TestAndroidManifestWithServices.xml");
    496     ServiceData serviceData = config.getServiceData("com.bar.ServiceWithoutIntentFilter");
    497     assertThat(serviceData.isExported()).isFalse();
    498   }
    499 
    500   @Test
    501   public void servicesWithIntentFiltersExportedByDefault() throws Exception {
    502     AndroidManifest config = newConfig("TestAndroidManifestWithServices.xml");
    503     ServiceData serviceData = config.getServiceData("com.foo.Service");
    504     assertThat(serviceData.isExported()).isTrue();
    505   }
    506 
    507   @Test
    508   public void receiversWithoutIntentFiltersNotExportedByDefault() throws Exception {
    509     AndroidManifest config = newConfig("TestAndroidManifestWithReceivers.xml");
    510     BroadcastReceiverData receiverData =
    511         config.getBroadcastReceiver("com.bar.ReceiverWithoutIntentFilter");
    512     assertThat(receiverData).isNotNull();
    513     assertThat(receiverData.isExported()).isFalse();
    514   }
    515 
    516   @Test
    517   public void receiversWithIntentFiltersExportedByDefault() throws Exception {
    518     AndroidManifest config = newConfig("TestAndroidManifestWithReceivers.xml");
    519     BroadcastReceiverData receiverData = config.getBroadcastReceiver("com.foo.Receiver");
    520     assertThat(receiverData).isNotNull();
    521     assertThat(receiverData.isExported()).isTrue();
    522   }
    523 
    524   @Test
    525   public void getTransitiveManifests() throws Exception {
    526     AndroidManifest lib1 = new AndroidManifest(resourceFile("lib1/AndroidManifest.xml"), null, null);
    527     AndroidManifest lib2 = new AndroidManifest(resourceFile("lib2/AndroidManifest.xml"), null, null,
    528         Collections.singletonList(lib1), null);
    529     AndroidManifest app = new AndroidManifest(
    530         resourceFile("TestAndroidManifestWithReceivers.xml"), null, null,
    531         Arrays.asList(lib1, lib2), null);
    532     assertThat(app.getAllManifests()).containsExactly(app, lib1, lib2);
    533   }
    534 
    535   /////////////////////////////
    536 
    537   private AndroidManifest newConfigWith(String fileName, String usesSdkAttrs) throws IOException {
    538     String contents = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
    539         "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
    540         "          package=\"org.robolectric\">\n" +
    541         "    <uses-sdk " + usesSdkAttrs + "/>\n" +
    542         "</manifest>\n";
    543     File f = temporaryFolder.newFile(fileName);
    544     Files.write(contents, f, Charsets.UTF_8);
    545     return new AndroidManifest(Fs.newFile(f), null, null);
    546   }
    547 
    548   private static AndroidManifest newConfig(String androidManifestFile) {
    549     return new AndroidManifest(resourceFile(androidManifestFile), null, null);
    550   }
    551 }
    552