List<TargetedApexImage> allTargetedImages = moduleSplit.getApexConfig().get().getImageList();
/** * 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(); }
.hasFile("base/root/apex_manifest.json") .withContent("manifest".getBytes(UTF_8)); assertThat(bundle).hasFile("base/apex.pb").withContent(apexConfig.toByteArray());
@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); }
@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"); }
private static void validateTargeting(ImmutableSet<String> allImages, ApexImages targeting) { ImmutableSet<String> targetedImages = targeting.getImageList().stream().map(TargetedApexImage::getPath).collect(toImmutableSet()); ImmutableSet<String> untargetedImages = Sets.difference(allImages, targetedImages).immutableCopy(); if (!untargetedImages.isEmpty()) { throw ValidationException.builder() .withMessage("Found APEX image files that are not targeted: %s", untargetedImages) .build(); } ImmutableSet<String> missingTargetedImages = Sets.difference(targetedImages, allImages).immutableCopy(); if (!missingTargetedImages.isEmpty()) { throw ValidationException.builder() .withMessage("Targeted APEX image files are missing: %s", missingTargetedImages) .build(); } } }
@Test public void generateTargetingForApexImages_createsAllTargeting() throws Exception { ImmutableSet<String> abis = Arrays.stream(AbiName.values()).map(AbiName::getPlatformName).collect(toImmutableSet()); Set<String> abiPairs = Sets.cartesianProduct(abis, abis).stream() .map(pair -> Joiner.on('.').join(pair)) .collect(toImmutableSet()); Collection<ZipPath> allAbiFiles = Sets.union(abis, abiPairs).stream() .map(abi -> ZipPath.create(abi + ".img")) .collect(toImmutableList()); checkState(allAbiFiles.size() > 1); // Otherwise this test is useless. ApexImages apexImages = generator.generateTargetingForApexImages(allAbiFiles); List<TargetedApexImage> images = apexImages.getImageList(); assertThat(images).hasSize(allAbiFiles.size()); }
public BundleModuleBuilder setApexConfig(ApexImages apexConfig) { addFile("apex.pb", apexConfig.toByteArray()); return this; }
/** Builds APEX images proto from a collection of targeted images. */ public static ApexImages apexImages(TargetedApexImage... targetedApexImages) { return ApexImages.newBuilder().addAllImage(Lists.newArrayList(targetedApexImages)).build(); }
@Override void addToModule(BundleModule.Builder module, InputStream inputStream) throws IOException { module.setApexConfig(ApexImages.parseFrom(inputStream)); } };
@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); }
@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); }