private static Abi checkAbiName(String token, String forFileOrDirectory) { Optional<AbiName> abiName = AbiName.fromPlatformName(token); if (!abiName.isPresent()) { Optional<AbiName> abiNameLowerCase = AbiName.fromPlatformName(token.toLowerCase()); if (abiNameLowerCase.isPresent()) { throw ValidationException.builder() .withMessage( "Expecting ABI name in file or directory '%s', but found '%s' " + "which is not recognized. Did you mean '%s'?", forFileOrDirectory, token, Ascii.toLowerCase(token)) .build(); } throw ValidationException.builder() .withMessage( "Expecting ABI name in file or directory '%s', but found '%s' " + "which is not recognized.", forFileOrDirectory, token) .build(); } return Abi.newBuilder().setAlias(abiName.get().toProto()).build(); } }
private static MultiAbi multiAbi(AbiAlias... aliases) { return MultiAbi.newBuilder() .addAllAbi( Arrays.stream(aliases) .map(alias -> Abi.newBuilder().setAlias(alias).build()) .collect(toImmutableList())) .build(); } }
@Test public void nativeLibrariesPresent_abiTargetingIsPresent() throws Exception { Path moduleWithAbi = new ZipBuilder() .addFileWithContent(ZipPath.create("lib/x86/libfast.so"), "native data".getBytes(UTF_8)) .addFileWithContent( ZipPath.create("lib/x86/libfaster.so"), "native data".getBytes(UTF_8)) .addFileWithProtoContent( ZipPath.create("manifest/AndroidManifest.xml"), androidManifest(PKG_NAME)) .writeTo(tmpDir.resolve("base.zip")); BuildBundleCommand.builder() .setOutputPath(bundlePath) .setModulesPaths(ImmutableList.of(moduleWithAbi)) .build() .execute(); ZipFile bundle = new ZipFile(bundlePath.toFile()); assertThat(bundle).hasFile("base/native.pb"); NativeLibraries actualTargeting = NativeLibraries.parseFrom(bundle.getInputStream(new ZipEntry("base/native.pb"))); NativeLibraries expectedTargeting = NativeLibraries.newBuilder() .addDirectory( TargetedNativeDirectory.newBuilder() .setPath("lib/x86") .setTargeting( NativeDirectoryTargeting.newBuilder() .setAbi(Abi.newBuilder().setAlias(X86)))) .build(); Truth.assertThat(actualTargeting).isEqualTo(expectedTargeting); }
@Test public void notPossibleToTargetMultipleDimensions() { String fakeAssetPath = "testModule/assets/secret.txt"; ModuleSplit.Builder builder = ModuleSplit.builder() .setModuleName(BundleModuleName.create("testModule")) .setEntries(ImmutableList.of(InMemoryModuleEntry.ofFile(fakeAssetPath, DUMMY_CONTENT))) .setVariantTargeting(lPlusVariantTargeting()) .setApkTargeting( ApkTargeting.newBuilder() .setAbiTargeting( AbiTargeting.newBuilder().addValue(Abi.newBuilder().setAlias(AbiAlias.X86))) .setScreenDensityTargeting( ScreenDensityTargeting.newBuilder() .addValue( ScreenDensity.newBuilder().setDensityAlias(DensityAlias.HDPI))) .build()); assertThrows(IllegalStateException.class, () -> builder.build()); }
/** Builds Abi proto from its alias. */ public static Abi toAbi(AbiAlias alias) { return Abi.newBuilder().setAlias(alias).build(); }
@Test public void toAbi_validAbi_succeeds() { Abi expectedAbi = Abi.newBuilder().setAlias(X86).build(); assertThat(TargetingUtils.toAbi("x86")).isEqualTo(expectedAbi); }