/** * Generates APEX targeting based on the names of the APEX image files. * * @param apexImageFiles names of all files under apex/, including the "apex/" prefix. * @return Targeting for all APEX image files. */ public ApexImages generateTargetingForApexImages(Collection<ZipPath> apexImageFiles) { ImmutableMap<ZipPath, MultiAbi> targetingByPath = Maps.toMap(apexImageFiles, path -> buildMultiAbi(path.getFileName().toString())); ApexImages.Builder apexImages = ApexImages.newBuilder(); ImmutableSet<MultiAbi> allTargeting = ImmutableSet.copyOf(targetingByPath.values()); targetingByPath.forEach( (imagePath, targeting) -> apexImages.addImage( TargetedApexImage.newBuilder() .setPath(imagePath.toString()) .setTargeting(buildApexTargetingWithAlternatives(targeting, allTargeting)))); return apexImages.build(); }
@Test public void validateModule_missingTargetedImageFile_throws() throws Exception { ApexImages apexConfig = APEX_CONFIG .toBuilder() .addImage(TargetedApexImage.newBuilder().setPath("apex/x86_64.x86.img")) .build(); BundleModule apexModule = new BundleModuleBuilder("apexTestModule") .setManifest(androidManifest(PKG_NAME)) .setApexConfig(apexConfig) .addFile("root/apex_manifest.json") .addFile("apex/x86_64.img") .addFile("apex/x86.img") .addFile("apex/armeabi-v7a.img") .addFile("apex/arm64-v8a.img") // x86_64.x86 missing. .build(); ValidationException exception = assertThrows( ValidationException.class, () -> new ApexBundleValidator().validateModule(apexModule)); assertThat(exception).hasMessageThat().contains("Targeted APEX image files are missing"); }
@Test public void validateModule_imageFilesTargetSameSetOfAbis_throws() throws Exception { ApexImages apexConfig = ApexImages.newBuilder() .addImage(TargetedApexImage.newBuilder().setPath("apex/x86_64.x86.img")) .addImage(TargetedApexImage.newBuilder().setPath("apex/x86.armeabi-v7a.x86_64.img")) .addImage(TargetedApexImage.newBuilder().setPath("apex/x86_64.x86.armeabi-v7a.img")) .build(); BundleModule apexModule = new BundleModuleBuilder("apexTestModule") .setManifest(androidManifest(PKG_NAME)) .setApexConfig(apexConfig) .addFile("root/apex_manifest.json") .addFile("apex/x86_64.x86.img") .addFile("apex/x86.armeabi-v7a.x86_64.img") .addFile("apex/x86_64.x86.armeabi-v7a.img") .build(); ValidationException exception = assertThrows( ValidationException.class, () -> new ApexBundleValidator().validateModule(apexModule)); assertThat(exception) .hasMessageThat() .contains("Every APEX image file must target a unique set of architectures"); }
@Test public void validateModule_singleton64BitAbiAnd64With32Missing_throws() throws Exception { ApexImages apexConfig = ApexImages.newBuilder() .addImage(TargetedApexImage.newBuilder().setPath("apex/x86_64.img")) .addImage(TargetedApexImage.newBuilder().setPath("apex/x86.img")) .addImage(TargetedApexImage.newBuilder().setPath("apex/armeabi-v7a.img")) .addImage(TargetedApexImage.newBuilder().setPath("apex/x86_64.x86.img")) .addImage(TargetedApexImage.newBuilder().setPath("apex/x86_64.armeabi-v7a.img")) .build(); BundleModule apexModule = new BundleModuleBuilder("apexTestModule") .setManifest(androidManifest(PKG_NAME)) .setApexConfig(apexConfig) .addFile("root/apex_manifest.json") .addFile("apex/x86_64.img") .addFile("apex/x86.img") .addFile("apex/armeabi-v7a.img") // Both arm64-v8a and arm64-v8a.armeabi-v7a are missing. .addFile("apex/x86_64.x86.img") .addFile("apex/x86_64.armeabi-v7a.img") .build(); ValidationException exception = assertThrows( ValidationException.class, () -> new ApexBundleValidator().validateModule(apexModule)); assertThat(exception).hasMessageThat().contains("APEX bundle must contain one of"); }
@Test public void validateModule_singletonAbiMissing_throws() throws Exception { ApexImages apexConfig = ApexImages.newBuilder() .addImage(TargetedApexImage.newBuilder().setPath("apex/x86_64.img")) .addImage(TargetedApexImage.newBuilder().setPath("apex/x86.img")) .addImage(TargetedApexImage.newBuilder().setPath("apex/arm64-v8a.img")) .addImage(TargetedApexImage.newBuilder().setPath("apex/x86_64.x86.img")) .addImage(TargetedApexImage.newBuilder().setPath("apex/x86_64.armeabi-v7a.img")) .build(); BundleModule apexModule = new BundleModuleBuilder("apexTestModule") .setManifest(androidManifest(PKG_NAME)) .setApexConfig(apexConfig) .addFile("root/apex_manifest.json") .addFile("apex/x86_64.img") .addFile("apex/x86.img") .addFile("apex/arm64-v8a.img") // armeabi-v7a is missing. .addFile("apex/x86_64.x86.img") .addFile("apex/x86_64.armeabi-v7a.img") .build(); ValidationException exception = assertThrows( ValidationException.class, () -> new ApexBundleValidator().validateModule(apexModule)); assertThat(exception).hasMessageThat().contains("APEX bundle must contain one of"); }
@Test public void validateModule_singleton64BitAbiMissing_doesNotThrow() throws Exception { ApexImages apexConfig = ApexImages.newBuilder() .addImage(TargetedApexImage.newBuilder().setPath("apex/x86_64.img")) .addImage(TargetedApexImage.newBuilder().setPath("apex/x86.img")) .addImage(TargetedApexImage.newBuilder().setPath("apex/armeabi-v7a.img")) .addImage(TargetedApexImage.newBuilder().setPath("apex/x86_64.x86.img")) .addImage(TargetedApexImage.newBuilder().setPath("apex/arm64-v8a.armeabi-v7a.img")) .build(); BundleModule apexModule = new BundleModuleBuilder("apexTestModule") .setManifest(androidManifest(PKG_NAME)) .setApexConfig(apexConfig) .addFile("root/apex_manifest.json") .addFile("apex/x86_64.img") .addFile("apex/x86.img") .addFile("apex/armeabi-v7a.img") // arm64-v8a is missing (but arm64-v8a.armeabi-v7a is present). .addFile("apex/x86_64.x86.img") .addFile("apex/arm64-v8a.armeabi-v7a.img") .build(); new ApexBundleValidator().validateModule(apexModule); }
/** Builds APEX targeted image from the image file path and its multi-Abi targeting. */ public static TargetedApexImage targetedApexImage(String path, MultiAbiTargeting targeting) { ApexImageTargeting apexImageTargeting = ApexImageTargeting.newBuilder().setMultiAbi(targeting).build(); return TargetedApexImage.newBuilder().setPath(path).setTargeting(apexImageTargeting).build(); }
@Test public void correctApexProtoFile_parsedAndReturned() throws Exception { ApexImages apexConfig = ApexImages.newBuilder() .addImage(TargetedApexImage.newBuilder().setPath("apex/x86.img")) .build(); BundleModule bundleModule = createMinimalModuleBuilder() .addEntry(InMemoryModuleEntry.ofFile("apex.pb", apexConfig.toByteArray())) .build(); assertThat(bundleModule.getApexConfig()).hasValue(apexConfig); }
/** Builds APEX targeted image from the image file path and its targeting. */ public static TargetedApexImage targetedApexImage(String path, ApexImageTargeting targeting) { return TargetedApexImage.newBuilder().setPath(path).setTargeting(targeting).build(); }
@Test public void apexImages() { TargetedApexImage firstTargeting = TargetedApexImage.newBuilder().setPath("path1").build(); TargetedApexImage secondTargeting = TargetedApexImage.newBuilder().setPath("path2").build(); ApexImages apexImages = TargetingUtils.apexImages(firstTargeting, secondTargeting); assertThat(apexImages.getImageList()).containsExactly(firstTargeting, secondTargeting); }