From 337f597caa7ca6b1698ed52662c501047546f135 Mon Sep 17 00:00:00 2001 From: Googler Date: Wed, 2 Oct 2024 12:40:02 -0700 Subject: [PATCH] BEGIN_PUBLIC Migrate bazel/src/tools/android/java/com/google/devtools/build/android to rules_android END_PUBLIC RELNOTES: Moved all Bazel Android tool and action code to rules_android. PiperOrigin-RevId: 681554358 Change-Id: I54cdea4f803062feb5f6e0164064839c09db1d39 --- .bazelci/postsubmit.yml | 20 - .bazelci/presubmit.yml | 20 - src/BUILD | 3 - .../com/google/devtools/build/singlejar/BUILD | 3 + .../build/android/AaptCommandBuilderTest.java | 302 ---- .../build/android/AarGeneratorActionTest.java | 764 -------- ...ndroidDataBindingProcessingActionTest.java | 113 -- .../build/android/AndroidDataBuilder.java | 186 -- .../build/android/AndroidDataMergerTest.java | 1569 ----------------- ...roidDataSerializerAndDeserializerTest.java | 364 ---- .../build/android/AndroidDataWriterTest.java | 368 ---- .../build/android/AndroidManifestTest.java | 131 -- .../android/AndroidOptionsUtilsTest.java | 70 - .../AndroidResourceClassWriterTest.java | 635 ------- .../android/AndroidResourceOutputsTest.java | 69 - ...tributeResourcesAndroidDataMergerTest.java | 584 ------ .../com/google/devtools/build/android/BUILD | 376 ---- .../build/android/ClassPathsSubject.java | 183 -- .../build/android/ConvertersTest.java | 149 -- .../build/android/DataResourceXmlTest.java | 1413 --------------- .../build/android/DataSourceTest.java | 74 - .../build/android/DataValueFileTest.java | 102 -- .../DensitySpecificManifestProcessorTest.java | 258 --- .../DensitySpecificResourceFilterTest.java | 288 --- .../android/DependencyAndroidDataTest.java | 134 -- .../android/ManifestMergerActionTest.java | 405 ----- .../android/ParsedAndroidDataBuilder.java | 281 --- .../android/ParsedAndroidDataSubject.java | 107 -- .../build/android/ParsedAndroidDataTest.java | 688 -------- .../devtools/build/android/PathsSubject.java | 158 -- .../android/PlaceholderRTxtWriterTest.java | 83 - .../android/RClassGeneratorActionTest.java | 580 ------ .../android/SerializedAndroidDataTest.java | 112 -- .../devtools/build/android/TestOptions.java | 31 - .../android/UnvalidatedAndroidDataTest.java | 100 -- .../UnvalidatedAndroidDirectoriesTest.java | 81 - .../UnwrittenMergedAndroidDataSubject.java | 63 - .../build/android/ZipFilterActionTest.java | 333 ---- .../devtools/build/android/desugar/BUILD | 17 - .../build/android/desugar/dependencies/BUILD | 30 - .../dependencies/MetadataCollectorTest.java | 126 -- .../build/android/dexer/AllTests.java | 21 - .../google/devtools/build/android/dexer/BUILD | 87 - .../android/dexer/DexFileSplitterTest.java | 359 ---- .../android/dexer/NoAndroidSdkStubTest.java | 29 - .../android/dexer/test_main_dex_list.txt | 2 - .../android/dexer/testdata/AnotherClass.java | 20 - .../android/dexer/testdata/SomeClass.java | 20 - .../build/android/dexer/testresource.txt | 1 - .../devtools/build/android/idlclass/BUILD | 26 - .../build/android/idlclass/IdlClassTest.java | 170 -- .../devtools/build/android/junctions/BUILD | 31 - .../junctions/NoopJunctionCreatorTest.java | 49 - .../junctions/WindowsJunctionCreatorTest.java | 186 -- .../devtools/build/android/r8/AllTests.java | 21 - .../google/devtools/build/android/r8/BUILD | 124 -- .../android/r8/CompatDexBuilderTest.java | 144 -- .../build/android/r8/CompatDxTest.java | 227 --- .../build/android/r8/DescriptorUtilsTest.java | 86 - .../build/android/r8/DexingKeyR8Test.java | 55 - .../android/r8/NoAndroidSdkStubTest.java | 29 - .../android/r8/desugar/DesugarBasicTest.java | 295 ---- .../r8/desugar/DesugarInfoCollector.java | 132 -- .../build/android/r8/desugar/basic/A.java | 17 - .../build/android/r8/desugar/basic/B.java | 17 - .../build/android/r8/desugar/basic/C.java | 17 - .../build/android/r8/desugar/basic/I.java | 21 - .../build/android/r8/desugar/basic/J.java | 22 - .../build/android/r8/desugar/basic/K.java | 21 - .../android/r8/desugar/basic/TestClass.java | 31 - .../r8/testdata/arithmetic/Arithmetic.java | 175 -- .../android/r8/testdata/barray/BArray.java | 76 - .../android/r8/testdata/lambda/Lambda.java | 30 - .../android/r8/testdata/naming001/A.java | 37 - .../android/r8/testdata/naming001/B.java | 23 - .../android/r8/testdata/naming001/C.java | 27 - .../android/r8/testdata/naming001/D.java | 37 - .../android/r8/testdata/naming001/E.java | 26 - .../android/r8/testdata/naming001/F.java | 26 - .../android/r8/testdata/naming001/G.java | 31 - .../android/r8/testdata/naming001/H.java | 23 - .../android/r8/testdata/naming001/I.java | 25 - .../android/r8/testdata/naming001/J.java | 47 - .../android/r8/testdata/naming001/K.java | 45 - .../android/r8/testdata/naming001/L.java | 29 - .../r8/testdata/naming001/Reflect.java | 68 - .../r8/testdata/naming001/Reflect2.java | 51 - .../r8/testdata/twosimpleclasses/Class1.java | 22 - .../r8/testdata/twosimpleclasses/Class2.java | 22 - .../devtools/build/android/resources/BUILD | 28 - .../resources/RClassGeneratorTest.java | 835 --------- .../build/android/resources/android/R.java | 27 - .../databinding/res/layout/lib1_layout.xml | 19 - .../databinding/res2/layout/lib2_layout.xml | 19 - .../build/android/testing/manifestmerge/BUILD | 23 - .../brokenManifest/AndroidManifest.xml | 10 - .../AndroidManifest.xml | 107 -- .../expected/AndroidManifest.xml | 102 -- .../mergeeOne/AndroidManifest.xml | 64 - .../mergeeTwo/AndroidManifest.xml | 26 - .../manifestmerge/merger/AndroidManifest.xml | 44 - .../google/devtools/build/android/xml/BUILD | 45 - .../android/xml/IdXmlResourceValueTest.java | 77 - .../build/android/xml/ProtoXmlUtilsTest.java | 103 -- .../xml/SimpleXmlResourceValueTest.java | 128 -- .../build/android/ziputils/AllTests.java | 24 - .../devtools/build/android/ziputils/BUILD | 29 - .../android/ziputils/BufferedFileTest.java | 222 --- .../ziputils/CentralDirectoryTest.java | 121 -- .../android/ziputils/DataDescriptorTest.java | 134 -- .../ziputils/EndOfCentralDirectoryTest.java | 132 -- .../android/ziputils/FakeFileSystem.java | 300 ---- .../build/android/ziputils/FileSystem.java | 78 - .../android/ziputils/LocalFileHeaderTest.java | 137 -- .../build/android/ziputils/ScanUtilTest.java | 106 -- .../android/ziputils/SplitZipFiltersTest.java | 63 - .../build/android/ziputils/SplitZipTest.java | 580 ------ .../build/android/ziputils/SplitterTest.java | 361 ---- .../build/android/ziputils/ViewTest.java | 156 -- .../android/ziputils/ZipFileBuilder.java | 175 -- .../build/android/ziputils/ZipInTest.java | 595 ------- .../build/android/ziputils/ZipOutTest.java | 52 - .../build/android/Aapt2OptimizeAction.java | 72 - .../android/Aapt2ResourcePackagingAction.java | 444 ----- .../android/Aapt2ResourceShrinkingAction.java | 100 -- .../build/android/AaptCommandBuilder.java | 288 --- .../build/android/AarGeneratorAction.java | 304 ---- .../build/android/AbstractBusyBoxAction.java | 91 - .../android/AndroidAssetMergingAction.java | 156 -- .../AndroidCompiledDataDeserializer.java | 1054 ----------- .../AndroidCompiledResourceMergingAction.java | 235 --- .../AndroidDataBindingProcessingAction.java | 138 -- .../android/AndroidDataDeserializer.java | 37 - .../build/android/AndroidDataMerger.java | 404 ----- .../build/android/AndroidDataPathWalker.java | 26 - .../build/android/AndroidDataSerializer.java | 117 -- .../build/android/AndroidDataWriter.java | 638 ------- .../android/AndroidDataWritingVisitor.java | 180 -- .../android/AndroidFrameworkAttrIdJar.java | 66 - .../AndroidFrameworkAttrIdProvider.java | 32 - .../build/android/AndroidManifest.java | 144 -- .../android/AndroidManifestProcessor.java | 389 ---- .../build/android/AndroidOptionsUtils.java | 128 -- .../AndroidParsedDataDeserializer.java | 147 -- .../android/AndroidResourceClassWriter.java | 141 -- .../build/android/AndroidResourceMerger.java | 235 --- .../build/android/AndroidResourceOutputs.java | 474 ----- .../android/AndroidResourceParsingAction.java | 84 - .../android/AndroidResourceProcessor.java | 430 ----- .../android/AndroidResourceSymbolSink.java | 61 - .../com/google/devtools/build/android/BUILD | 183 +- .../google/devtools/build/android/BUILD.tools | 33 - .../devtools/build/android/CommandHelper.java | 48 - ...mpatShellQuotedParamsFilePreProcessor.java | 167 -- .../CompileLibraryResourcesAction.java | 120 -- .../ConvertResourceZipToApkAction.java | 99 -- .../devtools/build/android/Converters.java | 379 ---- .../devtools/build/android/DataAsset.java | 26 - .../devtools/build/android/DataKey.java | 53 - .../devtools/build/android/DataResource.java | 47 - .../build/android/DataResourceXml.java | 481 ----- .../devtools/build/android/DataSource.java | 167 -- .../build/android/DataSourceTable.java | 133 -- .../devtools/build/android/DataValue.java | 52 - .../devtools/build/android/DataValueFile.java | 204 --- .../build/android/DataValueFileWithIds.java | 88 - .../android/DensityFilteredAndroidData.java | 24 - .../DensitySpecificManifestProcessor.java | 187 -- .../DensitySpecificResourceFilter.java | 339 ---- .../build/android/DependencyAndroidData.java | 165 -- .../build/android/DependencyInfo.java | 57 - .../android/DependencySymbolFileProvider.java | 92 - .../android/DeserializationException.java | 46 - .../build/android/ExecutorServiceCloser.java | 129 -- .../build/android/FailedFutureAggregator.java | 77 - .../build/android/FullyQualifiedName.java | 752 -------- .../GenerateDatabindingBaseClassesAction.java | 129 -- .../build/android/InMemoryProfiler.java | 71 - .../build/android/KeyValueConsumers.java | 44 - .../build/android/LoggingProfiler.java | 54 - .../build/android/ManifestContainer.java | 21 - .../build/android/ManifestMergerAction.java | 225 --- .../devtools/build/android/MergeConflict.java | 143 -- .../build/android/MergeConflictExempter.java | 19 - .../build/android/MergedAndroidData.java | 59 - .../build/android/OptionsBaseWithResidue.java | 38 - .../build/android/ParsedAndroidData.java | 639 ------- .../PlaceholderIdFieldInitializerBuilder.java | 391 ---- .../build/android/PlaceholderRTxtWriter.java | 94 - .../devtools/build/android/Profiler.java | 37 - .../build/android/RClassGeneratorAction.java | 190 -- .../com/google/devtools/build/android/README | 1 - .../build/android/RelativeAssetPath.java | 130 -- .../devtools/build/android/ResourceName.java | 66 - .../android/ResourceProcessorBusyBox.java | 279 --- .../ResourceProcessorCommonOptions.java | 25 - .../build/android/ResourceShrinkerAction.java | 275 --- .../devtools/build/android/ResourcesZip.java | 308 ---- .../android/ScopedTemporaryDirectory.java | 108 -- .../build/android/SerializedAndroidData.java | 143 -- .../devtools/build/android/TriState.java | 25 - .../build/android/UnvalidatedAndroidData.java | 162 -- .../UnvalidatedAndroidDirectories.java | 110 -- .../android/UnwrittenMergedAndroidData.java | 162 -- .../devtools/build/android/UserException.java | 31 - .../ValidateAndLinkResourcesAction.java | 255 --- .../build/android/XmlResourceValue.java | 71 - .../build/android/XmlResourceValues.java | 455 ----- .../build/android/ZipFilterAction.java | 261 --- .../build/android/ZipFilterEntryFilter.java | 90 - .../android/aapt2/Aapt2ConfigOptions.java | 120 -- .../build/android/aapt2/Aapt2Exception.java | 27 - .../android/aapt2/CompiledResources.java | 117 -- .../android/aapt2/PackagedResources.java | 67 - .../build/android/aapt2/ProtoApk.java | 736 -------- .../aapt2/ProtoResourceUsageAnalyzer.java | 432 ----- .../build/android/aapt2/ResourceCompiler.java | 471 ----- .../build/android/aapt2/ResourceLinker.java | 743 -------- .../android/aapt2/SdkToolAttributeWriter.java | 110 -- .../build/android/aapt2/StaticLibrary.java | 138 -- .../devtools/build/android/desugar/BUILD | 35 - .../build/android/desugar/BUILD.tools | 9 - .../build/android/desugar/dependencies/BUILD | 30 - .../dependencies/MetadataCollector.java | 137 -- .../devtools/build/android/desugar/io/BUILD | 32 - .../build/android/desugar/io/BitFlags.java | 51 - .../desugar/io/BootClassPathDigest.java | 72 - .../desugar/io/ClassFileBatchProvider.java | 26 - .../desugar/io/CoreLibraryRewriter.java | 213 --- .../io/DirectoryInputFileProvider.java | 81 - .../io/DirectoryOutputFileProvider.java | 60 - .../build/android/desugar/io/FieldInfo.java | 31 - .../io/FileBasedTypeReferenceClosure.java | 56 - .../io/FileBasedTypeReferenceNode.java | 58 - .../desugar/io/FileContentProvider.java | 154 -- .../android/desugar/io/HeaderClassLoader.java | 234 --- .../android/desugar/io/IndexedInputs.java | 93 - .../android/desugar/io/InputFileProvider.java | 69 - .../build/android/desugar/io/JarDigest.java | 73 - .../build/android/desugar/io/JarItem.java | 74 - .../desugar/io/MapBasedClassFileProvider.java | 61 - .../desugar/io/OutputFileProvider.java | 47 - .../desugar/io/ResourceBasedClassFiles.java | 38 - .../desugar/io/ThrowingClassLoader.java | 27 - .../desugar/io/ZipInputFileProvider.java | 64 - .../desugar/io/ZipOutputFileProvider.java | 99 -- .../build/android/desugar/langmodel/BUILD | 42 - .../langmodel/ClassAttributeRecord.java | 91 - .../desugar/langmodel/ClassAttributes.java | 110 -- .../desugar/langmodel/ClassMemberKey.java | 75 - .../desugar/langmodel/ClassMemberRecord.java | 156 -- .../langmodel/ClassMemberTrackReason.java | 98 - .../desugar/langmodel/ClassMemberUse.java | 64 - .../langmodel/ClassMemberUseCounter.java | 46 - .../android/desugar/langmodel/ClassName.java | 363 ---- .../desugar/langmodel/DependencyGraph.java | 47 - .../langmodel/DesugarMethodAttribute.java | 76 - .../desugar/langmodel/FieldInstrVisitor.java | 29 - .../android/desugar/langmodel/FieldKey.java | 113 -- .../desugar/langmodel/LangModelConstants.java | 25 - .../desugar/langmodel/LangModelHelper.java | 412 ----- .../desugar/langmodel/MemberUseKind.java | 66 - .../desugar/langmodel/MethodDeclInfo.java | 245 --- .../desugar/langmodel/MethodDeclVisitor.java | 31 - .../desugar/langmodel/MethodInstrVisitor.java | 37 - .../langmodel/MethodInvocationSite.java | 134 -- .../android/desugar/langmodel/MethodKey.java | 213 --- .../langmodel/SwitchableTypeMapper.java | 80 - .../desugar/langmodel/TypeMappable.java | 32 - .../android/desugar/langmodel/TypeMapper.java | 83 - .../langmodel/desugar_method_attr.proto | 47 - .../devtools/build/android/desugar/scan/BUILD | 47 - .../build/android/desugar/scan/BUILD.tools | 8 - .../android/desugar/scan/KeepReference.java | 53 - .../android/desugar/scan/KeepScanner.java | 274 --- .../desugar/scan/PrefixReferenceScanner.java | 412 ----- .../build/android/dexer/AsyncZipOut.java | 123 -- .../google/devtools/build/android/dexer/BUILD | 67 +- .../devtools/build/android/dexer/BUILD.tools | 23 - .../build/android/dexer/DexFileSplitter.java | 386 ---- .../build/android/dexer/DexLimitTracker.java | 116 -- .../build/android/dexer/NoAndroidSdkStub.java | 15 - .../android/dexer/ZipEntryComparator.java | 60 - .../build/android/dexer/ZipEntryContent.java | 39 - .../android/dexer/ZipEntryPredicates.java | 65 - .../devtools/build/android/idlclass/BUILD | 42 +- .../build/android/idlclass/BUILD.tools | 9 - .../build/android/idlclass/IdlClass.java | 169 -- .../android/idlclass/IdlClassOptions.java | 65 - .../devtools/build/android/junctions/BUILD | 43 - .../android/junctions/JunctionCreator.java | 46 - .../junctions/NoopJunctionCreator.java | 30 - .../junctions/WindowsJunctionCreator.java | 80 - .../google/devtools/build/android/proto/BUILD | 35 - .../build/android/proto/Configuration.proto | 206 --- .../build/android/proto/Resources.proto | 639 ------- .../android/proto/ResourcesInternal.proto | 52 - .../android/proto/serialize_format.proto | 97 - .../google/devtools/build/android/r8/BUILD | 139 +- .../devtools/build/android/r8/BUILD.tools | 70 - .../build/android/r8/CompatDexBuilder.java | 443 ----- .../devtools/build/android/r8/CompatDx.java | 700 -------- .../android/r8/CompatDxCompilationError.java | 24 - .../android/r8/CompatDxUnimplemented.java | 24 - .../android/r8/CompatOptionsConverters.java | 68 - .../devtools/build/android/r8/Constants.java | 21 - .../build/android/r8/CoreLibraryDesugar.java | 203 --- .../build/android/r8/DependencyCollector.java | 77 - .../build/android/r8/DescriptorUtils.java | 93 - .../devtools/build/android/r8/Desugar.java | 632 ------- .../build/android/r8/DexFileMerger.java | 414 ----- .../devtools/build/android/r8/FileUtils.java | 95 - .../build/android/r8/NoAndroidSdkStub.java | 15 - .../build/android/r8/NoWriteCollectors.java | 41 - .../devtools/build/android/r8/R8Utils.java | 22 - .../devtools/build/android/r8/ZipUtils.java | 120 -- .../OrderedClassFileResourceProvider.java | 60 - .../android/r8/desugar/OutputConsumer.java | 365 ---- .../devtools/build/android/resources/BUILD | 28 +- .../android/resources/FieldInitializer.java | 48 - .../android/resources/FieldInitializers.java | 119 -- .../resources/IntArrayFieldInitializer.java | 322 ---- .../resources/IntFieldInitializer.java | 149 -- .../resources/JavaIdentifierValidator.java | 116 -- .../build/android/resources/Provenance.java | 31 - .../android/resources/RClassGenerator.java | 341 ---- .../build/android/resources/RPackageId.java | 52 - .../android/resources/RSourceGenerator.java | 96 - .../android/resources/ResourceSymbols.java | 240 --- .../android/resources/ResourceTypeEnum.java | 29 - .../build/android/resources/Visibility.java | 66 - .../android/xml/ArrayXmlResourceValue.java | 280 --- .../android/xml/AttrXmlResourceValue.java | 833 --------- .../build/android/xml/IdXmlResourceValue.java | 188 -- .../android/xml/MacroXmlResourceValue.java | 163 -- .../build/android/xml/Namespaces.java | 176 -- .../android/xml/PluralXmlResourceValue.java | 220 --- .../build/android/xml/ProtoXmlUtils.java | 136 -- .../android/xml/PublicXmlResourceValue.java | 197 --- .../build/android/xml/ResourcesAttribute.java | 205 --- .../android/xml/SimpleXmlResourceValue.java | 380 ---- .../android/xml/StyleXmlResourceValue.java | 247 --- .../xml/StyleableXmlResourceValue.java | 281 --- .../devtools/build/android/ziputils/BUILD | 46 +- .../build/android/ziputils/BUILD.tools | 17 - .../build/android/ziputils/BufferedFile.java | 162 -- .../android/ziputils/CentralDirectory.java | 164 -- .../android/ziputils/DataDescriptor.java | 160 -- .../build/android/ziputils/DexMapper.java | 116 -- .../build/android/ziputils/DexReducer.java | 132 -- .../android/ziputils/DirectoryEntry.java | 303 ---- .../build/android/ziputils/DosTime.java | 76 - .../ziputils/EndOfCentralDirectory.java | 181 -- .../build/android/ziputils/EntryHandler.java | 41 - .../android/ziputils/LocalFileHeader.java | 254 --- .../devtools/build/android/ziputils/README | 19 - .../build/android/ziputils/ScanUtil.java | 103 -- .../build/android/ziputils/SplitZip.java | 549 ------ .../android/ziputils/SplitZipFilters.java | 43 - .../build/android/ziputils/Splitter.java | 135 -- .../android/ziputils/UnsignedShorts.java | 53 - .../devtools/build/android/ziputils/View.java | 268 --- .../build/android/ziputils/ZipIn.java | 711 -------- .../build/android/ziputils/ZipOut.java | 233 --- tools/android/runtime_deps/BUILD.bazel | 2 - 365 files changed, 9 insertions(+), 58378 deletions(-) delete mode 100644 src/test/java/com/google/devtools/build/android/AaptCommandBuilderTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/AarGeneratorActionTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/AndroidDataBindingProcessingActionTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/AndroidDataBuilder.java delete mode 100644 src/test/java/com/google/devtools/build/android/AndroidDataMergerTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/AndroidDataSerializerAndDeserializerTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/AndroidDataWriterTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/AndroidManifestTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/AndroidOptionsUtilsTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/AndroidResourceClassWriterTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/AndroidResourceOutputsTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/AttributeResourcesAndroidDataMergerTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/BUILD delete mode 100644 src/test/java/com/google/devtools/build/android/ClassPathsSubject.java delete mode 100644 src/test/java/com/google/devtools/build/android/ConvertersTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/DataResourceXmlTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/DataSourceTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/DataValueFileTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/DensitySpecificManifestProcessorTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/DensitySpecificResourceFilterTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/DependencyAndroidDataTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/ManifestMergerActionTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/ParsedAndroidDataBuilder.java delete mode 100644 src/test/java/com/google/devtools/build/android/ParsedAndroidDataSubject.java delete mode 100644 src/test/java/com/google/devtools/build/android/ParsedAndroidDataTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/PathsSubject.java delete mode 100644 src/test/java/com/google/devtools/build/android/PlaceholderRTxtWriterTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/RClassGeneratorActionTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/SerializedAndroidDataTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/TestOptions.java delete mode 100644 src/test/java/com/google/devtools/build/android/UnvalidatedAndroidDataTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/UnvalidatedAndroidDirectoriesTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/UnwrittenMergedAndroidDataSubject.java delete mode 100644 src/test/java/com/google/devtools/build/android/ZipFilterActionTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/desugar/BUILD delete mode 100644 src/test/java/com/google/devtools/build/android/desugar/dependencies/BUILD delete mode 100644 src/test/java/com/google/devtools/build/android/desugar/dependencies/MetadataCollectorTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/dexer/AllTests.java delete mode 100644 src/test/java/com/google/devtools/build/android/dexer/BUILD delete mode 100644 src/test/java/com/google/devtools/build/android/dexer/DexFileSplitterTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/dexer/NoAndroidSdkStubTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/dexer/test_main_dex_list.txt delete mode 100644 src/test/java/com/google/devtools/build/android/dexer/testdata/AnotherClass.java delete mode 100644 src/test/java/com/google/devtools/build/android/dexer/testdata/SomeClass.java delete mode 100644 src/test/java/com/google/devtools/build/android/dexer/testresource.txt delete mode 100644 src/test/java/com/google/devtools/build/android/idlclass/BUILD delete mode 100644 src/test/java/com/google/devtools/build/android/idlclass/IdlClassTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/junctions/BUILD delete mode 100644 src/test/java/com/google/devtools/build/android/junctions/NoopJunctionCreatorTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/junctions/WindowsJunctionCreatorTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/AllTests.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/BUILD delete mode 100644 src/test/java/com/google/devtools/build/android/r8/CompatDexBuilderTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/CompatDxTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/DescriptorUtilsTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/DexingKeyR8Test.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/NoAndroidSdkStubTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/desugar/DesugarBasicTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/desugar/DesugarInfoCollector.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/desugar/basic/A.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/desugar/basic/B.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/desugar/basic/C.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/desugar/basic/I.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/desugar/basic/J.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/desugar/basic/K.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/desugar/basic/TestClass.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/testdata/arithmetic/Arithmetic.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/testdata/barray/BArray.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/testdata/lambda/Lambda.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/testdata/naming001/A.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/testdata/naming001/B.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/testdata/naming001/C.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/testdata/naming001/D.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/testdata/naming001/E.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/testdata/naming001/F.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/testdata/naming001/G.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/testdata/naming001/H.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/testdata/naming001/I.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/testdata/naming001/J.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/testdata/naming001/K.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/testdata/naming001/L.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/testdata/naming001/Reflect.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/testdata/naming001/Reflect2.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/testdata/twosimpleclasses/Class1.java delete mode 100644 src/test/java/com/google/devtools/build/android/r8/testdata/twosimpleclasses/Class2.java delete mode 100644 src/test/java/com/google/devtools/build/android/resources/BUILD delete mode 100644 src/test/java/com/google/devtools/build/android/resources/RClassGeneratorTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/resources/android/R.java delete mode 100644 src/test/java/com/google/devtools/build/android/testing/databinding/res/layout/lib1_layout.xml delete mode 100644 src/test/java/com/google/devtools/build/android/testing/databinding/res2/layout/lib2_layout.xml delete mode 100644 src/test/java/com/google/devtools/build/android/testing/manifestmerge/BUILD delete mode 100644 src/test/java/com/google/devtools/build/android/testing/manifestmerge/brokenManifest/AndroidManifest.xml delete mode 100644 src/test/java/com/google/devtools/build/android/testing/manifestmerge/expected-merged-permissions/AndroidManifest.xml delete mode 100644 src/test/java/com/google/devtools/build/android/testing/manifestmerge/expected/AndroidManifest.xml delete mode 100644 src/test/java/com/google/devtools/build/android/testing/manifestmerge/mergeeOne/AndroidManifest.xml delete mode 100644 src/test/java/com/google/devtools/build/android/testing/manifestmerge/mergeeTwo/AndroidManifest.xml delete mode 100644 src/test/java/com/google/devtools/build/android/testing/manifestmerge/merger/AndroidManifest.xml delete mode 100644 src/test/java/com/google/devtools/build/android/xml/BUILD delete mode 100644 src/test/java/com/google/devtools/build/android/xml/IdXmlResourceValueTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/xml/ProtoXmlUtilsTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/xml/SimpleXmlResourceValueTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/ziputils/AllTests.java delete mode 100644 src/test/java/com/google/devtools/build/android/ziputils/BUILD delete mode 100644 src/test/java/com/google/devtools/build/android/ziputils/BufferedFileTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/ziputils/CentralDirectoryTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/ziputils/DataDescriptorTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/ziputils/EndOfCentralDirectoryTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/ziputils/FakeFileSystem.java delete mode 100644 src/test/java/com/google/devtools/build/android/ziputils/FileSystem.java delete mode 100644 src/test/java/com/google/devtools/build/android/ziputils/LocalFileHeaderTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/ziputils/ScanUtilTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/ziputils/SplitZipFiltersTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/ziputils/SplitZipTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/ziputils/SplitterTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/ziputils/ViewTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/ziputils/ZipFileBuilder.java delete mode 100644 src/test/java/com/google/devtools/build/android/ziputils/ZipInTest.java delete mode 100644 src/test/java/com/google/devtools/build/android/ziputils/ZipOutTest.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/Aapt2OptimizeAction.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/Aapt2ResourcePackagingAction.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/Aapt2ResourceShrinkingAction.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AaptCommandBuilder.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AarGeneratorAction.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AbstractBusyBoxAction.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidAssetMergingAction.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidCompiledDataDeserializer.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidCompiledResourceMergingAction.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidDataBindingProcessingAction.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidDataDeserializer.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidDataMerger.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidDataPathWalker.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidDataSerializer.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidDataWriter.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidDataWritingVisitor.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidFrameworkAttrIdJar.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidFrameworkAttrIdProvider.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidManifest.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidManifestProcessor.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidOptionsUtils.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidParsedDataDeserializer.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidResourceClassWriter.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidResourceMerger.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidResourceOutputs.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidResourceParsingAction.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessor.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/AndroidResourceSymbolSink.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/BUILD.tools delete mode 100644 src/tools/android/java/com/google/devtools/build/android/CommandHelper.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/CompatShellQuotedParamsFilePreProcessor.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/CompileLibraryResourcesAction.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ConvertResourceZipToApkAction.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/Converters.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/DataAsset.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/DataKey.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/DataResource.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/DataResourceXml.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/DataSource.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/DataSourceTable.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/DataValue.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/DataValueFile.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/DataValueFileWithIds.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/DensityFilteredAndroidData.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/DensitySpecificManifestProcessor.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/DensitySpecificResourceFilter.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/DependencyAndroidData.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/DependencyInfo.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/DependencySymbolFileProvider.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/DeserializationException.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ExecutorServiceCloser.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/FailedFutureAggregator.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/FullyQualifiedName.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/GenerateDatabindingBaseClassesAction.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/InMemoryProfiler.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/KeyValueConsumers.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/LoggingProfiler.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ManifestContainer.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ManifestMergerAction.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/MergeConflict.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/MergeConflictExempter.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/MergedAndroidData.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/OptionsBaseWithResidue.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ParsedAndroidData.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/PlaceholderIdFieldInitializerBuilder.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/PlaceholderRTxtWriter.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/Profiler.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/RClassGeneratorAction.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/README delete mode 100644 src/tools/android/java/com/google/devtools/build/android/RelativeAssetPath.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ResourceName.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ResourceProcessorBusyBox.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ResourceProcessorCommonOptions.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ResourceShrinkerAction.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ResourcesZip.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ScopedTemporaryDirectory.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/SerializedAndroidData.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/TriState.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/UnvalidatedAndroidData.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/UnvalidatedAndroidDirectories.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/UnwrittenMergedAndroidData.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/UserException.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ValidateAndLinkResourcesAction.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/XmlResourceValue.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/XmlResourceValues.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ZipFilterAction.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ZipFilterEntryFilter.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/aapt2/Aapt2ConfigOptions.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/aapt2/Aapt2Exception.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/aapt2/CompiledResources.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/aapt2/PackagedResources.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/aapt2/ProtoApk.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/aapt2/ProtoResourceUsageAnalyzer.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/aapt2/ResourceCompiler.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/aapt2/ResourceLinker.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/aapt2/SdkToolAttributeWriter.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/aapt2/StaticLibrary.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/BUILD delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/BUILD.tools delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/dependencies/BUILD delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/dependencies/MetadataCollector.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/BUILD delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/BitFlags.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/BootClassPathDigest.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/ClassFileBatchProvider.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/CoreLibraryRewriter.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/DirectoryInputFileProvider.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/DirectoryOutputFileProvider.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/FieldInfo.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/FileBasedTypeReferenceClosure.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/FileBasedTypeReferenceNode.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/FileContentProvider.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/HeaderClassLoader.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/IndexedInputs.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/InputFileProvider.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/JarDigest.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/JarItem.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/MapBasedClassFileProvider.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/OutputFileProvider.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/ResourceBasedClassFiles.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/ThrowingClassLoader.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/ZipInputFileProvider.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/io/ZipOutputFileProvider.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/BUILD delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassAttributeRecord.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassAttributes.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassMemberKey.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassMemberRecord.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassMemberTrackReason.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassMemberUse.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassMemberUseCounter.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassName.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/DependencyGraph.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/DesugarMethodAttribute.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/FieldInstrVisitor.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/FieldKey.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/LangModelConstants.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/LangModelHelper.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/MemberUseKind.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/MethodDeclInfo.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/MethodDeclVisitor.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/MethodInstrVisitor.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/MethodInvocationSite.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/MethodKey.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/SwitchableTypeMapper.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/TypeMappable.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/TypeMapper.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/desugar_method_attr.proto delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/scan/BUILD delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/scan/BUILD.tools delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/scan/KeepReference.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/scan/KeepScanner.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/desugar/scan/PrefixReferenceScanner.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/dexer/AsyncZipOut.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/dexer/BUILD.tools delete mode 100644 src/tools/android/java/com/google/devtools/build/android/dexer/DexFileSplitter.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/dexer/DexLimitTracker.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/dexer/NoAndroidSdkStub.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/dexer/ZipEntryComparator.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/dexer/ZipEntryContent.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/dexer/ZipEntryPredicates.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/idlclass/BUILD.tools delete mode 100644 src/tools/android/java/com/google/devtools/build/android/idlclass/IdlClass.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/idlclass/IdlClassOptions.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/junctions/BUILD delete mode 100644 src/tools/android/java/com/google/devtools/build/android/junctions/JunctionCreator.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/junctions/NoopJunctionCreator.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/junctions/WindowsJunctionCreator.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/proto/BUILD delete mode 100644 src/tools/android/java/com/google/devtools/build/android/proto/Configuration.proto delete mode 100644 src/tools/android/java/com/google/devtools/build/android/proto/Resources.proto delete mode 100644 src/tools/android/java/com/google/devtools/build/android/proto/ResourcesInternal.proto delete mode 100644 src/tools/android/java/com/google/devtools/build/android/proto/serialize_format.proto delete mode 100644 src/tools/android/java/com/google/devtools/build/android/r8/BUILD.tools delete mode 100644 src/tools/android/java/com/google/devtools/build/android/r8/CompatDexBuilder.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/r8/CompatDx.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/r8/CompatDxCompilationError.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/r8/CompatDxUnimplemented.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/r8/CompatOptionsConverters.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/r8/Constants.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/r8/CoreLibraryDesugar.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/r8/DependencyCollector.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/r8/DescriptorUtils.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/r8/Desugar.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/r8/DexFileMerger.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/r8/FileUtils.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/r8/NoAndroidSdkStub.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/r8/NoWriteCollectors.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/r8/R8Utils.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/r8/ZipUtils.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/r8/desugar/OrderedClassFileResourceProvider.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/r8/desugar/OutputConsumer.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/resources/FieldInitializer.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/resources/FieldInitializers.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/resources/IntArrayFieldInitializer.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/resources/IntFieldInitializer.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/resources/JavaIdentifierValidator.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/resources/Provenance.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/resources/RClassGenerator.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/resources/RPackageId.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/resources/RSourceGenerator.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/resources/ResourceSymbols.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/resources/ResourceTypeEnum.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/resources/Visibility.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/xml/ArrayXmlResourceValue.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/xml/AttrXmlResourceValue.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/xml/IdXmlResourceValue.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/xml/MacroXmlResourceValue.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/xml/Namespaces.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/xml/PluralXmlResourceValue.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/xml/ProtoXmlUtils.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/xml/PublicXmlResourceValue.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/xml/ResourcesAttribute.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/xml/SimpleXmlResourceValue.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/xml/StyleXmlResourceValue.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/xml/StyleableXmlResourceValue.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ziputils/BUILD.tools delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ziputils/BufferedFile.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ziputils/CentralDirectory.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ziputils/DataDescriptor.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ziputils/DexMapper.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ziputils/DexReducer.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ziputils/DirectoryEntry.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ziputils/DosTime.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ziputils/EndOfCentralDirectory.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ziputils/EntryHandler.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ziputils/LocalFileHeader.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ziputils/README delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ziputils/ScanUtil.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ziputils/SplitZip.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ziputils/SplitZipFilters.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ziputils/Splitter.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ziputils/UnsignedShorts.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ziputils/View.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ziputils/ZipIn.java delete mode 100644 src/tools/android/java/com/google/devtools/build/android/ziputils/ZipOut.java diff --git a/.bazelci/postsubmit.yml b/.bazelci/postsubmit.yml index 40898a2dc962e0..e435486f768d85 100644 --- a/.bazelci/postsubmit.yml +++ b/.bazelci/postsubmit.yml @@ -31,7 +31,6 @@ tasks: - "//src/tools/singlejar/..." - "//src/tools/workspacelog/..." - "//third_party/ijar/..." - - "//tools/android/..." - "//tools/aquery_differ/..." - "//tools/compliance/..." - "//tools/python/..." @@ -42,7 +41,6 @@ tasks: - "-//src/test/shell/bazel:bazel_coverage_cc_head_test_gcc" - "-//src/test/shell/bazel:bazel_coverage_sh_test" # Disable some Android tests since we are moving Android rules out of the Bazel repo. - - "-//src/test/java/com/google/devtools/build/android/r8:AllTests" - "-//src/test/shell/bazel:bazel_android_tools_test" include_json_profile: - build @@ -83,12 +81,10 @@ tasks: - "//src/tools/singlejar/..." - "//src/tools/workspacelog/..." - "//third_party/ijar/..." - - "//tools/android/..." - "//tools/aquery_differ/..." - "//tools/python/..." - "//tools/bash/..." # Disable some Android tests since we are moving Android rules out of the Bazel repo. - - "-//src/test/java/com/google/devtools/build/android/r8:AllTests" - "-//src/test/shell/bazel:bazel_android_tools_test" include_json_profile: - build @@ -139,12 +135,10 @@ tasks: - "//src/tools/singlejar/..." - "//src/tools/workspacelog/..." - "//third_party/ijar/..." - - "//tools/android/..." - "//tools/aquery_differ/..." - "//tools/python/..." - "//tools/bash/..." # Disable some Android tests since we are moving Android rules out of the Bazel repo. - - "-//src/test/java/com/google/devtools/build/android/r8:AllTests" - "-//src/test/shell/bazel:bazel_android_tools_test" include_json_profile: - build @@ -174,7 +168,6 @@ tasks: - "//src/tools/singlejar/..." - "//src/tools/workspacelog/..." - "//third_party/ijar/..." - - "//tools/android/..." - "//tools/aquery_differ/..." - "//tools/python/..." - "//tools/bash/..." @@ -184,9 +177,6 @@ tasks: # https://github.com/bazelbuild/bazel/issues/17410 - "-//src/test/java/com/google/devtools/build/lib/platform:SystemMemoryPressureEventTest" # Disable android tests since we are moving Android rules out of the Bazel repo. - - "-//src/tools/android/java/com/google/devtools/build/android/..." - - "-//src/test/java/com/google/devtools/build/android/dexer:AllTests" - - "-//src/test/java/com/google/devtools/build/android/r8:AllTests" # ServerTests frequently runs into deadlocks on Intel Macs - "-//src/test/java/com/google/devtools/build/lib/server:ServerTests" # Add back a few Apple specific tests @@ -220,17 +210,12 @@ tasks: - "//src/tools/singlejar/..." - "//src/tools/workspacelog/..." - "//third_party/ijar/..." - - "//tools/android/..." - "//tools/aquery_differ/..." - "//tools/python/..." - "//tools/bash/..." # https://github.com/bazelbuild/bazel/issues/17410 - "-//src/test/java/com/google/devtools/build/lib/platform:SystemMemoryPressureEventTest" # Disable android tests since we are moving Android rules out of Bazel repo. - - "-//src/test/shell/bazel/android/..." - - "-//src/tools/android/java/com/google/devtools/build/android/..." - - "-//src/test/java/com/google/devtools/build/android/dexer:AllTests" - - "-//src/test/java/com/google/devtools/build/android/r8:AllTests" - "-//src/test/shell/bazel:bazel_android_tools_test" include_json_profile: - build @@ -252,7 +237,6 @@ tasks: - "//src:embedded_tools_size_test" - "//src/main/starlark/tests/builtins_bzl/..." - "//src/test/cpp/..." - - "//src/test/java/com/google/devtools/build/android/..." - "//src/test/java/com/google/devtools/build/lib/..." - "//src/test/java/com/google/devtools/build/skyframe/..." - "//src/test/java/com/google/devtools/common/options/..." @@ -264,7 +248,6 @@ tasks: - "//src/tools/one_version/..." - "//src/tools/singlejar/..." - "//third_party/def_parser/..." - - "//tools/android/..." - "//tools/aquery_differ/..." - "//tools/bash/..." - "//tools/build_defs/..." @@ -275,7 +258,6 @@ tasks: - "//tools/test/..." # Re-enable the following tests on Windows: # https://github.com/bazelbuild/bazel/issues/4292 - - "-//src/test/java/com/google/devtools/build/android/r8/..." - "-//src/test/java/com/google/devtools/build/lib/query2/cquery/..." - "-//src/test/java/com/google/devtools/build/lib/query2/engine/..." - "-//src/test/java/com/google/devtools/build/lib/versioning/..." @@ -336,7 +318,6 @@ tasks: - "//tools/aquery_differ/..." - "//tools/python/..." - "//tools/bash/..." - - "//tools/android/..." # See https://github.com/bazelbuild/bazel/issues/8033 - "-//src/tools/singlejar:output_jar_simple_test" - "-//src/test/shell/bazel:external_integration_test" @@ -354,7 +335,6 @@ tasks: - "-//src/test/shell/bazel:starlark_repository_test" - "-//src/test/shell/bazel:verify_workspace" # Disable some Android tests since we are moving Android rules out of the Bazel repo. - - "-//src/test/java/com/google/devtools/build/android/r8:AllTests" - "-//src/test/shell/bazel:bazel_android_tools_test" include_json_profile: - build diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index 2bf5ed610d9948..f0b2c24b58e192 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -32,7 +32,6 @@ tasks: - "//src/tools/singlejar/..." - "//src/tools/workspacelog/..." - "//third_party/ijar/..." - - "//tools/android/..." - "//tools/aquery_differ/..." - "//tools/compliance/..." - "//tools/python/..." @@ -43,7 +42,6 @@ tasks: - "-//src/test/shell/bazel:bazel_coverage_cc_head_test_gcc" - "-//src/test/shell/bazel:bazel_coverage_sh_test" # Disable some Android tests since we are moving Android rules out of the Bazel repo. - - "-//src/test/java/com/google/devtools/build/android/r8:AllTests" - "-//src/test/shell/bazel:bazel_android_tools_test" include_json_profile: - build @@ -85,12 +83,10 @@ tasks: - "//src/tools/singlejar/..." - "//src/tools/workspacelog/..." - "//third_party/ijar/..." - - "//tools/android/..." - "//tools/aquery_differ/..." - "//tools/python/..." - "//tools/bash/..." # Disable some Android tests since we are moving Android rules out of the Bazel repo. - - "-//src/test/java/com/google/devtools/build/android/r8:AllTests" - "-//src/test/shell/bazel:bazel_android_tools_test" include_json_profile: - build @@ -142,12 +138,10 @@ tasks: - "//src/tools/singlejar/..." - "//src/tools/workspacelog/..." - "//third_party/ijar/..." - - "//tools/android/..." - "//tools/aquery_differ/..." - "//tools/python/..." - "//tools/bash/..." # Disable some Android tests since we are moving Android rules out of the Bazel repo. - - "-//src/test/java/com/google/devtools/build/android/r8:AllTests" - "-//src/test/shell/bazel:bazel_android_tools_test" include_json_profile: - build @@ -177,7 +171,6 @@ tasks: - "//src/tools/singlejar/..." - "//src/tools/workspacelog/..." - "//third_party/ijar/..." - - "//tools/android/..." - "//tools/aquery_differ/..." - "//tools/python/..." - "//tools/bash/..." @@ -187,9 +180,6 @@ tasks: # https://github.com/bazelbuild/bazel/issues/17410 - "-//src/test/java/com/google/devtools/build/lib/platform:SystemMemoryPressureEventTest" # Disable android tests since we are moving Android rules out of the Bazel repo. - - "-//src/tools/android/java/com/google/devtools/build/android/..." - - "-//src/test/java/com/google/devtools/build/android/dexer:AllTests" - - "-//src/test/java/com/google/devtools/build/android/r8:AllTests" # ServerTests frequently runs into deadlocks on Intel Macs - "-//src/test/java/com/google/devtools/build/lib/server:ServerTests" # Add back a few Apple specific tests @@ -220,17 +210,12 @@ tasks: - "//src/tools/singlejar/..." - "//src/tools/workspacelog/..." - "//third_party/ijar/..." - - "//tools/android/..." - "//tools/aquery_differ/..." - "//tools/python/..." - "//tools/bash/..." # https://github.com/bazelbuild/bazel/issues/17410 - "-//src/test/java/com/google/devtools/build/lib/platform:SystemMemoryPressureEventTest" # Disable android tests since we are moving Android rules out of Bazel repo. - - "-//src/test/shell/bazel/android/..." - - "-//src/tools/android/java/com/google/devtools/build/android/..." - - "-//src/test/java/com/google/devtools/build/android/dexer:AllTests" - - "-//src/test/java/com/google/devtools/build/android/r8:AllTests" - "-//src/test/shell/bazel:bazel_android_tools_test" # https://github.com/bazelbuild/bazel/issues/23726 - "-//src/test/shell/bazel:bazel_determinism_test" @@ -263,7 +248,6 @@ tasks: - "//src:embedded_tools_size_test" - "//src/main/starlark/tests/builtins_bzl/..." - "//src/test/cpp/..." - - "//src/test/java/com/google/devtools/build/android/..." - "//src/test/java/com/google/devtools/build/lib/..." - "//src/test/java/com/google/devtools/build/skyframe/..." - "//src/test/java/com/google/devtools/common/options/..." @@ -275,7 +259,6 @@ tasks: - "//src/tools/one_version/..." - "//src/tools/singlejar/..." - "//third_party/def_parser/..." - - "//tools/android/..." - "//tools/aquery_differ/..." - "//tools/bash/..." - "//tools/build_defs/..." @@ -286,7 +269,6 @@ tasks: - "//tools/test/..." # Re-enable the following tests on Windows: # https://github.com/bazelbuild/bazel/issues/4292 - - "-//src/test/java/com/google/devtools/build/android/r8/..." - "-//src/test/java/com/google/devtools/build/lib/query2/cquery/..." - "-//src/test/java/com/google/devtools/build/lib/query2/engine/..." - "-//src/test/java/com/google/devtools/build/lib/versioning/..." @@ -347,7 +329,6 @@ tasks: - "//tools/aquery_differ/..." - "//tools/python/..." - "//tools/bash/..." - - "//tools/android/..." # See https://github.com/bazelbuild/bazel/issues/8033 - "-//src/tools/singlejar:output_jar_simple_test" - "-//src/test/shell/bazel:external_integration_test" @@ -368,7 +349,6 @@ tasks: # https://github.com/bazelbuild/continuous-integration/issues/1631 - "-//src/test/shell/bazel:bazel_sandboxing_networking_test" # Disable some Android tests since we are moving Android rules out of the Bazel repo. - - "-//src/test/java/com/google/devtools/build/android/r8:AllTests" - "-//src/test/shell/bazel:bazel_android_tools_test" include_json_profile: - build diff --git a/src/BUILD b/src/BUILD index 45d0490696d2d9..7b63d3a5126f66 100644 --- a/src/BUILD +++ b/src/BUILD @@ -97,7 +97,6 @@ JAVA_TOOLS = [ "//src/main/cpp/util:embedded_tools", "//src/main/native:embedded_tools", "//src/main/protobuf:srcs", - "//src/tools/android/java/com/google/devtools/build/android:embedded_tools", "//src/tools/launcher:srcs", "//third_party:gpl-srcs", "//third_party/def_parser:srcs", @@ -358,7 +357,6 @@ filegroup( "//src/main/tools:srcs", "//src/test/cpp:srcs", "//src/test/gen:srcs", - "//src/test/java/com/google/devtools/build/android:srcs", "//src/test/java/com/google/devtools/build/docgen:srcs", "//src/test/java/com/google/devtools/build/lib:srcs", "//src/test/java/com/google/devtools/build/lib/shell:srcs", @@ -374,7 +372,6 @@ filegroup( "//src/test/tools:srcs", "//src/test/tools/bzlmod:srcs", "//src/tools/android:srcs", - "//src/tools/android/java/com/google/devtools/build/android:srcs", "//src/tools/bzlmod:srcs", "//src/tools/diskcache:srcs", "//src/tools/execlog:srcs", diff --git a/src/java_tools/singlejar/java/com/google/devtools/build/singlejar/BUILD b/src/java_tools/singlejar/java/com/google/devtools/build/singlejar/BUILD index 9edccfada77a9f..2bf63a1e979ee7 100644 --- a/src/java_tools/singlejar/java/com/google/devtools/build/singlejar/BUILD +++ b/src/java_tools/singlejar/java/com/google/devtools/build/singlejar/BUILD @@ -31,6 +31,9 @@ java_library( "//src/java_tools/singlejar/javatests/com/google/devtools/build/singlejar:__pkg__", "//src/test/java/com/google/devtools/build/android:__pkg__", "//src/tools/android/java/com/google/devtools/build/android:__pkg__", + "//third_party/bazel_rules/rules_android/src/tools/java/com/google/devtools/build/android:__pkg__", + "//third_party/bazel_rules/rules_android/src/tools/javatests/com/google/devtools/build/android:__pkg__", + "//third_party/bazel_rules/rules_android/src/tools/javatests/com/google/devtools/build/android/r8:__pkg__", ], deps = [ "//src/java_tools/singlejar/java/com/google/devtools/build/zip", diff --git a/src/test/java/com/google/devtools/build/android/AaptCommandBuilderTest.java b/src/test/java/com/google/devtools/build/android/AaptCommandBuilderTest.java deleted file mode 100644 index ebd705ac3b94d3..00000000000000 --- a/src/test/java/com/google/devtools/build/android/AaptCommandBuilderTest.java +++ /dev/null @@ -1,302 +0,0 @@ -// Copyright 2017 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -package com.google.devtools.build.android; - -import static com.google.common.truth.Truth.assertThat; -import static java.util.stream.Collectors.toList; - -import com.android.builder.core.VariantTypeImpl; -import com.android.repository.Revision; -import com.google.common.base.Splitter; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Streams; -import com.google.common.testing.NullPointerTester; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.stream.IntStream; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -/** Tests for {@link AaptCommandBuilder}. */ -@RunWith(JUnit4.class) -public class AaptCommandBuilderTest { - private Path aapt; - private Path manifest; - private Path workingDirectory; - - @Before - public void createPaths() throws IOException { - final Path tempDirectory = - Files.createTempDirectory(AaptCommandBuilderTest.class.getCanonicalName()); - aapt = tempDirectory.resolve("aapt"); - manifest = tempDirectory.resolve("AndroidManifest.xml"); - workingDirectory = tempDirectory.resolve("working"); - } - - @Test - public void testPassesNullPointerTester() throws Exception { - NullPointerTester tester = new NullPointerTester().setDefault(Path.class, aapt); - - tester.testConstructor(AaptCommandBuilder.class.getConstructor(Path.class)); - tester.ignore(AaptCommandBuilder.class.getMethod("execute", String.class)); - tester.setDefault(Optional.class, Optional.empty()); - tester.testAllPublicInstanceMethods(new AaptCommandBuilder(aapt)); - tester.testAllPublicInstanceMethods(new AaptCommandBuilder(aapt).when(true)); - tester.testAllPublicInstanceMethods(new AaptCommandBuilder(aapt).when(false)); - } - - @Test - public void testAaptPathAddedAsFirstArgument() { - assertThat(new AaptCommandBuilder(aapt).build()).containsExactly(aapt.toString()); - } - - @Test - public void testAddArgumentAddedToList() { - assertThat(new AaptCommandBuilder(aapt).add("package").build()).contains("package"); - } - - @Test - public void testAddCallsAddedToEndOfList() { - assertThat(new AaptCommandBuilder(aapt).add("package").add("-f").build()) - .containsExactly(aapt.toString(), "package", "-f") - .inOrder(); - } - - @Test - public void testAddWithStringValueAddsFlagThenValueAsSeparateWords() { - assertThat(new AaptCommandBuilder(aapt).add("-0", "gif").build()) - .containsExactly(aapt.toString(), "-0", "gif") - .inOrder(); - } - - @Test - public void testAddWithEmptyValueAddsNothing() { - assertThat(new AaptCommandBuilder(aapt).add("-0", "").build()).doesNotContain("-0"); - } - - @Test - public void testAddWithNullStringValueAddsNothing() { - assertThat(new AaptCommandBuilder(aapt).add("-0", (String) null).build()).doesNotContain("-0"); - } - - @Test - public void testAddWithPathValueAddsFlagThenStringValueAsSeparateWords() { - assertThat(new AaptCommandBuilder(aapt).add("-M", manifest).build()) - .containsExactly(aapt.toString(), "-M", manifest.toString()) - .inOrder(); - } - - @Test - public void testAddWithNullPathValueAddsNothing() { - assertThat(new AaptCommandBuilder(aapt).add("-M", (Path) null).build()).doesNotContain("-M"); - } - - @Test - public void testAddRepeatedWithEmptyValuesAddsNothing() { - assertThat(new AaptCommandBuilder(aapt).addRepeated("-0", ImmutableList.of()).build()) - .doesNotContain("-0"); - } - - @Test - public void testAddRepeatedWithSingleValueAddsOneFlagOneValue() { - assertThat(new AaptCommandBuilder(aapt).addRepeated("-0", ImmutableList.of("gif")).build()) - .containsExactly(aapt.toString(), "-0", "gif") - .inOrder(); - } - - @Test - public void testAddRepeatedWithMultipleValuesAddsFlagBeforeEachValue() { - assertThat( - new AaptCommandBuilder(aapt).addRepeated("-0", ImmutableList.of("gif", "png")).build()) - .containsExactly(aapt.toString(), "-0", "gif", "-0", "png") - .inOrder(); - } - - @Test - public void testAddRepeatedSkipsNullValues() { - ArrayList list = new ArrayList<>(3); - list.add("gif"); - list.add(null); - list.add("png"); - assertThat(new AaptCommandBuilder(aapt).addRepeated("-0", list).build()) - .containsExactly(aapt.toString(), "-0", "gif", "-0", "png") - .inOrder(); - } - - @Test - public void testThenAddFlagForwardsCallAfterWhenTrue() { - assertThat(new AaptCommandBuilder(aapt).when(true).thenAdd("--addthisflag").build()) - .contains("--addthisflag"); - } - - @Test - public void testThenAddFlagWithValueForwardsCallAfterWhenTrue() { - assertThat( - new AaptCommandBuilder(aapt) - .when(true) - .thenAdd("--addthisflag", "andthisvalue") - .build()) - .contains("--addthisflag"); - } - - @Test - public void testThenAddFlagWithPathForwardsCallAfterWhenTrue() { - assertThat(new AaptCommandBuilder(aapt).when(true).thenAdd("--addthisflag", manifest).build()) - .contains("--addthisflag"); - } - - @Test - public void testThenAddRepeatedForwardsCallAfterWhenTrue() { - assertThat( - new AaptCommandBuilder(aapt) - .when(true) - .thenAddRepeated("--addthisflag", ImmutableList.of("andthesevalues")) - .build()) - .contains("--addthisflag"); - } - - @Test - public void testThenAddFlagDoesNothingAfterWhenFalse() { - assertThat(new AaptCommandBuilder(aapt).when(false).thenAdd("--dontaddthisflag").build()) - .doesNotContain("--dontaddthisflag"); - } - - @Test - public void testThenAddFlagWithValueDoesNothingAfterWhenFalse() { - assertThat( - new AaptCommandBuilder(aapt) - .when(false) - .thenAdd("--dontaddthisflag", "orthisvalue") - .build()) - .doesNotContain("--dontaddthisflag"); - } - - @Test - public void testThenAddFlagWithPathDoesNothingAfterWhenFalse() { - assertThat( - new AaptCommandBuilder(aapt).when(false).thenAdd("--dontaddthisflag", manifest).build()) - .doesNotContain("--dontaddthisflag"); - } - - @Test - public void testThenAddRepeatedDoesNothingAfterWhenFalse() { - assertThat( - new AaptCommandBuilder(aapt) - .when(false) - .thenAddRepeated("--dontaddthisflag", ImmutableList.of("orthesevalues")) - .build()) - .doesNotContain("--dontaddthisflag"); - } - - @Test - public void testWhenVersionIsAtLeastAddsFlagsForEqualVersion() { - assertThat( - new AaptCommandBuilder(aapt) - .forBuildToolsVersion(new Revision(23)) - .whenVersionIsAtLeast(new Revision(23)) - .thenAdd("--addthisflag") - .build()) - .contains("--addthisflag"); - } - - @Test - public void testWhenVersionIsAtLeastAddsFlagsForGreaterVersion() { - assertThat( - new AaptCommandBuilder(aapt) - .forBuildToolsVersion(new Revision(24)) - .whenVersionIsAtLeast(new Revision(23)) - .thenAdd("--addthisflag") - .build()) - .contains("--addthisflag"); - } - - @Test - public void testWhenVersionIsAtLeastAddsFlagsForUnspecifiedVersion() { - assertThat( - new AaptCommandBuilder(aapt) - .whenVersionIsAtLeast(new Revision(23)) - .thenAdd("--addthisflag") - .build()) - .contains("--addthisflag"); - } - - @Test - public void testWhenVersionIsAtLeastDoesNotAddFlagsForLesserVersion() { - assertThat( - new AaptCommandBuilder(aapt) - .forBuildToolsVersion(new Revision(22)) - .whenVersionIsAtLeast(new Revision(23)) - .thenAdd("--dontaddthisflag") - .build()) - .doesNotContain("--dontaddthisflag"); - } - - @Test - public void testWhenVariantIsAddsFlagsForEqualVariantType() { - assertThat( - new AaptCommandBuilder(aapt) - .forVariantType(VariantTypeImpl.LIBRARY) - .whenVariantIs(VariantTypeImpl.LIBRARY) - .thenAdd("--addthisflag") - .build()) - .contains("--addthisflag"); - } - - @Test - public void testWhenVariantIsDoesNotAddFlagsForUnequalVariantType() { - assertThat( - new AaptCommandBuilder(aapt) - .forVariantType(VariantTypeImpl.BASE_APK) - .whenVariantIs(VariantTypeImpl.LIBRARY) - .thenAdd("--dontaddthisflag") - .build()) - .doesNotContain("--dontaddthisflag"); - } - - @Test - public void testWhenVariantIsDoesNotAddFlagsForUnspecifiedVariantType() { - assertThat( - new AaptCommandBuilder(aapt) - .whenVariantIs(VariantTypeImpl.LIBRARY) - .thenAdd("--dontaddthisflag") - .build()) - .doesNotContain("--dontaddthisflag"); - } - - @Test - public void testParamFile() throws IOException { - - final List resources = - IntStream.range(0, 201).mapToObj(i -> "res" + i).collect(toList()); - assertThat( - new AaptCommandBuilder(aapt) - .addParameterableRepeated("-R", resources, workingDirectory) - .build()) - .containsAtLeast("-R", "@" + workingDirectory.resolve("params-R")); - assertThat( - Files.readAllLines(workingDirectory.resolve("params-R"), StandardCharsets.UTF_8) - .stream() - .map(Splitter.on(' ')::split) - .flatMap(Streams::stream) - .collect(toList())) - .containsAtLeastElementsIn(resources); - } -} diff --git a/src/test/java/com/google/devtools/build/android/AarGeneratorActionTest.java b/src/test/java/com/google/devtools/build/android/AarGeneratorActionTest.java deleted file mode 100644 index b594780c280a22..00000000000000 --- a/src/test/java/com/google/devtools/build/android/AarGeneratorActionTest.java +++ /dev/null @@ -1,764 +0,0 @@ -// Copyright 2018 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -package com.google.devtools.build.android; - -import static com.google.common.truth.Truth.assertThat; -import static java.nio.charset.StandardCharsets.UTF_8; -import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertNotNull; - -import com.android.builder.core.VariantTypeImpl; -import com.beust.jcommander.JCommander; -import com.beust.jcommander.ParameterException; -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableList; -import com.google.devtools.build.android.AarGeneratorAction.AarGeneratorOptions; -import com.google.devtools.build.zip.ZipReader; -import com.google.errorprone.annotations.CanIgnoreReturnValue; -import java.io.BufferedReader; -import java.io.ByteArrayOutputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.attribute.FileTime; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; -import java.util.zip.ZipOutputStream; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -/** Tests for {@link AarGeneratorAction}. */ -@RunWith(JUnit4.class) -public class AarGeneratorActionTest { - - private static class AarData { - /** Templates for resource files generation. */ - enum ResourceType { - VALUE { - @Override public String create(String... lines) { - return String.format( - "\n%s", - Joiner.on("\n").join(lines)); - } - }, - LAYOUT { - @Override public String create(String... lines) { - return String.format("" - + "%s", - Joiner.on("\n").join(lines)); - } - }, - UNFORMATTED { - @Override public String create(String... lines) { - return String.format(Joiner.on("\n").join(lines)); - } - }; - - public abstract String create(String... lines); - } - - private static class Builder { - - private final Path root; - private final Path assetDir; - private final Path resourceDir; - private Path manifest; - private Path rtxt; - private Path classes; - private Map filesToWrite = new HashMap<>(); - private Map classesToWrite = new HashMap<>(); - private ImmutableList.Builder proguardSpecs = ImmutableList.builder(); - private boolean withEmptyRes = false; - private boolean withEmptyAssets = false; - - public Builder(Path root) { - this(root, "res", "assets"); - } - - public Builder(Path root, String resourceRoot, String assetRoot) { - this.root = root; - assetDir = root.resolve(assetRoot); - resourceDir = root.resolve(resourceRoot); - manifest = root.resolve("fake-manifest-path"); - rtxt = root.resolve("fake-rtxt-path"); - classes = root.resolve("fake-classes-path"); - } - - @CanIgnoreReturnValue - public Builder addResource(String path, ResourceType template, String... lines) { - filesToWrite.put(resourceDir.resolve(path), template.create(lines)); - return this; - } - - @CanIgnoreReturnValue - public Builder withEmptyResources(boolean isEmpty) { - this.withEmptyRes = isEmpty; - return this; - } - - @CanIgnoreReturnValue - public Builder addAsset(String path, String... lines) { - filesToWrite.put(assetDir.resolve(path), Joiner.on("\n").join(lines)); - return this; - } - - @CanIgnoreReturnValue - public Builder withEmptyAssets(boolean isEmpty) { - this.withEmptyAssets = isEmpty; - return this; - } - - @CanIgnoreReturnValue - public Builder createManifest(String path, String manifestPackage, String... lines) { - this.manifest = root.resolve(path); - filesToWrite.put(manifest, String.format("" - + "" - + "%s", manifestPackage, Joiner.on("\n").join(lines))); - return this; - } - - @CanIgnoreReturnValue - public Builder createRtxt(String path, String... lines) { - this.rtxt = root.resolve(path); - filesToWrite.put(rtxt, String.format("%s", Joiner.on("\n").join(lines))); - return this; - } - - @CanIgnoreReturnValue - public Builder createClassesJar(String path) { - this.classes = root.resolve(path); - classesToWrite.put("META-INF/MANIFEST.MF", "Manifest-Version: 1.0\n"); - return this; - } - - @CanIgnoreReturnValue - public Builder addClassesFile(String filePackage, String filename, String... lines) { - classesToWrite.put(filePackage.replace(".", "/") + "/" + filename, - String.format("%s", Joiner.on("\n").join(lines))); - return this; - } - - @CanIgnoreReturnValue - public Builder addProguardSpec(String path, String... lines) { - Path proguardSpecPath = root.resolve(path); - proguardSpecs.add(proguardSpecPath); - filesToWrite.put(proguardSpecPath, String.format("%s", Joiner.on("\n").join(lines))); - return this; - } - - public AarData build() throws IOException { - writeFiles(); - return new AarData(buildMerged(), manifest, rtxt, classes, proguardSpecs.build()); - } - - private MergedAndroidData buildMerged() { - return new MergedAndroidData( - resourceDir, - assetDir, - manifest); - } - - private void writeFiles() throws IOException { - assertNotNull("A manifest is required.", manifest); - assertNotNull("A resource file is required.", rtxt); - assertNotNull("A classes jar is required.", classes); - if (withEmptyRes) { - Files.createDirectories(resourceDir); - } - if (withEmptyAssets) { - Files.createDirectories(assetDir); - } - for (Map.Entry entry : filesToWrite.entrySet()) { - Path file = entry.getKey(); - // only write files in assets if assets has not been set to empty and same for resources - if (!((file.startsWith(assetDir) && withEmptyAssets) - || (file.startsWith(resourceDir) && withEmptyRes))) { - Files.createDirectories(file.getParent()); - Files.write(file, entry.getValue().getBytes(StandardCharsets.UTF_8)); - assertThat(Files.exists(file)).isTrue(); - } - } - if (!classesToWrite.isEmpty()) { - writeClassesJar(); - } - } - - private void writeClassesJar() throws IOException { - final ZipOutputStream zout = new ZipOutputStream(new FileOutputStream(classes.toFile())); - - for (Map.Entry file : classesToWrite.entrySet()) { - ZipEntry entry = new ZipEntry(file.getKey()); - zout.putNextEntry(entry); - zout.write(file.getValue().getBytes(UTF_8)); - zout.closeEntry(); - } - - zout.close(); - - Files.setLastModifiedTime(classes, FileTime.from(AarGeneratorAction.DEFAULT_TIMESTAMP)); - } - } - - final MergedAndroidData data; - final Path manifest; - final Path rtxt; - final Path classes; - final ImmutableList proguardSpecs; - - private AarData( - MergedAndroidData data, - Path manifest, - Path rtxt, - Path classes, - ImmutableList proguardSpecs) { - this.data = data; - this.manifest = manifest; - this.rtxt = rtxt; - this.classes = classes; - this.proguardSpecs = proguardSpecs; - } - } - - /** - * Operation to perform on a file. - */ - private interface FileOperation { - /** - * Performs the operation on a file, given its name, modificationTime and contents. - */ - void perform(String name, long modificationTime, String contents); - } - - /** - * Runs a {@link FileOperation} on every entry in a zip file. - * - * @param zip {@link Path} of the zip file to traverse. - * @param operation {@link FileOperation} to be run on every entry of the zip file. - * @throws IOException if there is an error reading the zip file. - */ - private void traverseZipFile(Path zip, FileOperation operation) throws IOException { - ZipInputStream zis = new ZipInputStream(Files.newInputStream(zip)); - ZipEntry z = zis.getNextEntry(); - while (z != null) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024]; - for (int count = 0; count != -1; count = zis.read(buffer)) { - baos.write(buffer); - } - // Replace Windows path separators so that test cases are consistent across platforms. - String name = z.getName().replace('\\', '/'); - operation.perform( - name, z.getTime(), new String(baos.toByteArray(), StandardCharsets.UTF_8)); - z = zis.getNextEntry(); - } - } - - private Set getZipEntries(Path zip) throws IOException { - final Set zipEntries = new HashSet<>(); - traverseZipFile(zip, new FileOperation() { - @Override public void perform(String name, long modificationTime, String contents) { - zipEntries.add(name); - } - }); - return zipEntries; - } - - private Set getZipEntryTimestamps(Path zip) throws IOException { - final Set timestamps = new HashSet<>(); - traverseZipFile(zip, new FileOperation() { - @Override public void perform(String name, long modificationTime, String contents) { - timestamps.add(modificationTime); - } - }); - return timestamps; - } - - private Path tempDir; - - @Rule public ExpectedException thrown = ExpectedException.none(); - - @Before public void setUp() throws IOException { - tempDir = Files.createTempDirectory(toString()); - tempDir.toFile().deleteOnExit(); - - } - - private AarGeneratorOptions parseFlags(String[] args) throws ParameterException { - AarGeneratorOptions options = new AarGeneratorOptions(); - JCommander jc = new JCommander(options); - String[] preprocessedArgs = AndroidOptionsUtils.runArgFilePreprocessor(jc, args); - String[] normalizedArgs = - AndroidOptionsUtils.normalizeBooleanOptions(options, preprocessedArgs); - jc.parse(normalizedArgs); - return options; - } - - @Test - public void testCheckFlags() throws IOException, ParameterException { - Path manifest = tempDir.resolve("AndroidManifest.xml"); - Files.createFile(manifest); - Path rtxt = tempDir.resolve("R.txt"); - Files.createFile(rtxt); - Path classes = tempDir.resolve("classes.jar"); - Files.createFile(classes); - - String[] args = new String[] {"--manifest", manifest.toString(), "--rtxt", rtxt.toString(), - "--classes", classes.toString()}; - AarGeneratorOptions options = parseFlags(args); - AarGeneratorAction.checkFlags(options); - } - - @Test - public void testCheckFlags_MissingClasses() throws IOException, ParameterException { - Path manifest = tempDir.resolve("AndroidManifest.xml"); - Files.createFile(manifest); - Path rtxt = tempDir.resolve("R.txt"); - Files.createFile(rtxt); - - String[] args = new String[] {"--manifest", manifest.toString(), "--rtxt", rtxt.toString()}; - AarGeneratorOptions options = parseFlags(args); - thrown.expect(IllegalArgumentException.class); - thrown.expectMessage("classes must be specified. Building an .aar without" - + " classes is unsupported."); - AarGeneratorAction.checkFlags(options); - } - - @Test - public void testCheckFlags_MissingMultiple() throws IOException, ParameterException { - Path manifest = tempDir.resolve("AndroidManifest.xml"); - Files.createFile(manifest); - String[] args = new String[] {"--manifest", manifest.toString()}; - AarGeneratorOptions options = parseFlags(args); - thrown.expect(IllegalArgumentException.class); - thrown.expectMessage("rtxt, classes must be specified. Building an .aar without" - + " rtxt, classes is unsupported."); - AarGeneratorAction.checkFlags(options); - } - - @Test public void testWriteAar() throws Exception { - Path aar = tempDir.resolve("foo.aar"); - AarData aarData = new AarData.Builder(tempDir.resolve("data")) - .createManifest("AndroidManifest.xml", "com.google.android.apps.foo.d1", "") - .createRtxt("R.txt", - "int string app_name 0x7f050001", - "int string hello_world 0x7f050002") - .addResource("values/ids.xml", - AarData.ResourceType.VALUE, - "") - .addAsset("some/other/ft/data.txt", "bar") - .createClassesJar("classes.jar") - .addClassesFile("com.google.android.apps.foo", "Test.class", "test file contents") - .build(); - - AarGeneratorAction.writeAar(aar, - aarData.data, - aarData.manifest, - aarData.rtxt, - aarData.classes, - aarData.proguardSpecs); - } - - @Test public void testWriteAar_DefaultTimestamps() throws Exception { - Path aar = tempDir.resolve("foo.aar"); - AarData aarData = new AarData.Builder(tempDir.resolve("data")) - .createManifest("AndroidManifest.xml", "com.google.android.apps.foo.d1", "") - .createRtxt("R.txt", - "int string app_name 0x7f050001", - "int string hello_world 0x7f050002") - .addResource("values/ids.xml", - AarData.ResourceType.VALUE, - "") - .addAsset("some/other/ft/data.txt", "bar") - .createClassesJar("classes.jar") - .addClassesFile("com.google.android.apps.foo", "Test.class", "test file contents") - .build(); - - AarGeneratorAction.writeAar(aar, - aarData.data, - aarData.manifest, - aarData.rtxt, - aarData.classes, - aarData.proguardSpecs); - - assertThat(getZipEntryTimestamps(aar)) - .containsExactly(AarGeneratorAction.DEFAULT_TIMESTAMP.toEpochMilli()); - assertThat(Files.getLastModifiedTime(aar).toInstant()) - .isEqualTo(AarGeneratorAction.DEFAULT_TIMESTAMP); - } - - @Test public void testAssetResourceSubdirs() throws Exception { - Path aar = tempDir.resolve("foo.aar"); - AarData aarData = new AarData.Builder(tempDir.resolve("data"), "xyz", "assets") - .createManifest("AndroidManifest.xml", "com.google.android.apps.foo.d1", "") - .createRtxt("R.txt", - "int string app_name 0x7f050001", - "int string hello_world 0x7f050002") - .addResource("values/ids.xml", - AarData.ResourceType.VALUE, - "") - .addAsset("some/other/ft/data.txt", "bar") - .createClassesJar("classes.jar") - .addClassesFile("com.google.android.apps.foo", "Test.class", "test file contents") - .build(); - - AarGeneratorAction.writeAar(aar, - aarData.data, - aarData.manifest, - aarData.rtxt, - aarData.classes, - aarData.proguardSpecs); - - // verify aar archive - Set zipEntries = getZipEntries(aar); - assertThat(zipEntries).contains("res/"); - assertThat(zipEntries).contains("assets/"); - } - - @Test public void testMissingManifest() throws Exception { - Path aar = tempDir.resolve("foo.aar"); - AarData aarData = new AarData.Builder(tempDir.resolve("data")) - .createRtxt("R.txt", - "int string app_name 0x7f050001", - "int string hello_world 0x7f050002") - .addResource("values/ids.xml", - AarData.ResourceType.VALUE, - "") - .addAsset("some/other/ft/data.txt", "bar") - .createClassesJar("classes.jar") - .addClassesFile("com.google.android.apps.foo", "Test.class", "test file contents") - .build(); - - thrown.expect(IOException.class); - thrown.expectMessage(containsString("fake-manifest-path")); - AarGeneratorAction.writeAar(aar, - aarData.data, - aarData.manifest, - aarData.rtxt, - aarData.classes, - aarData.proguardSpecs); - } - - @Test public void testMissingRtxt() throws Exception { - Path aar = tempDir.resolve("foo.aar"); - AarData aarData = new AarData.Builder(tempDir.resolve("data")) - .createManifest("AndroidManifest.xml", "com.google.android.apps.foo.d1", "") - .addResource("values/ids.xml", - AarData.ResourceType.VALUE, - "") - .addAsset("some/other/ft/data.txt", "bar") - .createClassesJar("classes.jar") - .addClassesFile("com.google.android.apps.foo", "Test.class", "test file contents") - .build(); - - thrown.expect(IOException.class); - thrown.expectMessage(containsString("fake-rtxt-path")); - AarGeneratorAction.writeAar(aar, - aarData.data, - aarData.manifest, - aarData.rtxt, - aarData.classes, - aarData.proguardSpecs); - } - - @Test public void testMissingClasses() throws Exception { - Path aar = tempDir.resolve("foo.aar"); - AarData aarData = new AarData.Builder(tempDir.resolve("data")) - .createManifest("AndroidManifest.xml", "com.google.android.apps.foo.d1", "") - .createRtxt("R.txt", - "int string app_name 0x7f050001", - "int string hello_world 0x7f050002") - .addResource("values/ids.xml", - AarData.ResourceType.VALUE, - "") - .addAsset("some/other/ft/data.txt", "bar") - .build(); - - thrown.expect(IOException.class); - thrown.expectMessage(containsString("fake-classes-path")); - AarGeneratorAction.writeAar(aar, - aarData.data, - aarData.manifest, - aarData.rtxt, - aarData.classes, - aarData.proguardSpecs); - } - - @Test public void testMissingResources() throws Exception { - Path aar = tempDir.resolve("foo.aar"); - AarData aarData = new AarData.Builder(tempDir.resolve("data")) - .createManifest("AndroidManifest.xml", "com.google.android.apps.foo.d1", "") - .createRtxt("R.txt", - "int string app_name 0x7f050001", - "int string hello_world 0x7f050002") - .addAsset("some/other/ft/data.txt", "bar") - .createClassesJar("classes.jar") - .addClassesFile("com.google.android.apps.foo", "Test.class", "test file contents") - .build(); - - thrown.expect(IOException.class); - thrown.expectMessage(containsString("res")); - AarGeneratorAction.writeAar(aar, - aarData.data, - aarData.manifest, - aarData.rtxt, - aarData.classes, - aarData.proguardSpecs); - } - - @Test public void testEmptyResources() throws Exception { - Path aar = tempDir.resolve("foo.aar"); - AarData aarData = new AarData.Builder(tempDir.resolve("data")) - .createManifest("AndroidManifest.xml", "com.google.android.apps.foo.d1", "") - .createRtxt("R.txt", - "int string app_name 0x7f050001", - "int string hello_world 0x7f050002") - .withEmptyResources(true) - .addResource("values/ids.xml", - AarData.ResourceType.VALUE, - "") - .addAsset("some/other/ft/data.txt", "bar") - .createClassesJar("classes.jar") - .addClassesFile("com.google.android.apps.foo", "Test.class", "test file contents") - .build(); - - AarGeneratorAction.writeAar(aar, - aarData.data, - aarData.manifest, - aarData.rtxt, - aarData.classes, - aarData.proguardSpecs); - } - - @Test public void testMissingAssets() throws Exception { - Path aar = tempDir.resolve("foo.aar"); - AarData aarData = new AarData.Builder(tempDir.resolve("data")) - .createManifest("AndroidManifest.xml", "com.google.android.apps.foo.d1", "") - .createRtxt("R.txt", - "int string app_name 0x7f050001", - "int string hello_world 0x7f050002") - .addResource("values/ids.xml", - AarData.ResourceType.VALUE, - "") - .createClassesJar("classes.jar") - .addClassesFile("com.google.android.apps.foo", "Test.class", "test file contents") - .build(); - - AarGeneratorAction.writeAar(aar, - aarData.data, - aarData.manifest, - aarData.rtxt, - aarData.classes, - aarData.proguardSpecs); - } - - @Test public void testEmptyAssets() throws Exception { - Path aar = tempDir.resolve("foo.aar"); - AarData aarData = new AarData.Builder(tempDir.resolve("data")) - .createManifest("AndroidManifest.xml", "com.google.android.apps.foo.d1", "") - .createRtxt("R.txt", - "int string app_name 0x7f050001", - "int string hello_world 0x7f050002") - .addResource("values/ids.xml", - AarData.ResourceType.VALUE, - "") - .withEmptyAssets(true) - .createClassesJar("classes.jar") - .addClassesFile("com.google.android.apps.foo", "Test.class", "test file contents") - .build(); - - AarGeneratorAction.writeAar(aar, - aarData.data, - aarData.manifest, - aarData.rtxt, - aarData.classes, - aarData.proguardSpecs); - } - - @Test public void testFullIntegration() throws Exception { - Path aar = tempDir.resolve("foo.aar"); - AarData aarData = new AarData.Builder(tempDir.resolve("data")) - .createManifest("AndroidManifest.xml", "com.google.android.apps.foo", "") - .createRtxt("R.txt", - "int string app_name 0x7f050001", - "int string hello_world 0x7f050002") - .addResource("values/ids.xml", - AarData.ResourceType.VALUE, - "") - .addResource("layout/layout.xml", - AarData.ResourceType.LAYOUT, - "") - .addAsset("some/other/ft/data.txt", - "foo") - .createClassesJar("classes.jar") - .addClassesFile("com.google.android.apps.foo", "Test.class", "test file contents") - .build(); - - MergedAndroidData md1 = new AarData.Builder(tempDir.resolve("d1")) - .addResource("values/ids.xml", - AarData.ResourceType.VALUE, - "") - .addResource("layout/foo.xml", - AarData.ResourceType.LAYOUT, - "") - .addAsset("some/other/ft/data1.txt", - "bar") - .createManifest("AndroidManifest.xml", "com.google.android.apps.foo.d1", "") - .build().data; - - MergedAndroidData md2 = new AarData.Builder(tempDir.resolve("d2")) - .addResource("values/ids.xml", - AarData.ResourceType.VALUE, - "") - .addResource("layout/bar.xml", - AarData.ResourceType.LAYOUT, - "") - .addResource("drawable-mdpi/icon.png", - AarData.ResourceType.UNFORMATTED, - "Thttpt.") - .addResource("drawable-xxxhdpi/icon.png", - AarData.ResourceType.UNFORMATTED, - "Double Thttpt.") - .addAsset("some/other/ft/data2.txt", - "foo") - .createManifest("AndroidManifest.xml", "com.google.android.apps.foo.d2", "") - .build().data; - - UnvalidatedAndroidData primary = new UnvalidatedAndroidData( - ImmutableList.of(aarData.data.getResourceDir()), - ImmutableList.of(aarData.data.getAssetDir()), - aarData.data.getManifest()); - - DependencyAndroidData d1 = - new DependencyAndroidData( - ImmutableList.of(md1.getResourceDir()), - ImmutableList.of(md1.getAssetDir()), - md1.getManifest(), - null, - null, - null); - - DependencyAndroidData d2 = - new DependencyAndroidData( - ImmutableList.of(md2.getResourceDir()), - ImmutableList.of(md2.getAssetDir()), - md2.getManifest(), - null, - null, - null); - - Path working = tempDir; - - Path resourcesOut = working.resolve("resources"); - Path assetsOut = working.resolve("assets"); - - MergedAndroidData mergedData = - AndroidResourceMerger.mergeDataAndWrite( - primary, - ImmutableList.of(d1, d2), - ImmutableList.of(), - resourcesOut, - assetsOut, - VariantTypeImpl.LIBRARY, - null, - /* filteredResources= */ ImmutableList.of(), - true); - - AarGeneratorAction.writeAar( - aar, mergedData, aarData.manifest, aarData.rtxt, aarData.classes, aarData.proguardSpecs); - - // verify aar archive - Set zipEntries = getZipEntries(aar); - assertThat(zipEntries).containsExactly( - "AndroidManifest.xml", - "R.txt", - "classes.jar", - "res/", - "res/values/", - "res/values/values.xml", - "res/layout/", - "res/layout/layout.xml", - "res/layout/foo.xml", - "res/layout/bar.xml", - "res/drawable-mdpi-v4/", - "res/drawable-mdpi-v4/icon.png", - "res/drawable-xxxhdpi-v4/", - "res/drawable-xxxhdpi-v4/icon.png", - "assets/", - "assets/some/", - "assets/some/other/", - "assets/some/other/ft/", - "assets/some/other/ft/data.txt", - "assets/some/other/ft/data1.txt", - "assets/some/other/ft/data2.txt"); - } - - @Test public void testProguardSpecs() throws Exception { - Path aar = tempDir.resolve("foo.aar"); - AarData aarData = - new AarData.Builder(tempDir.resolve("data")) - .createManifest("AndroidManifest.xml", "com.google.android.apps.foo.d1", "") - .createRtxt("R.txt", "") - .withEmptyResources(true) - .withEmptyAssets(true) - .createClassesJar("classes.jar") - .addProguardSpec("spec1", "foo", "bar") - .addProguardSpec("spec2", "baz") - .build(); - - AarGeneratorAction.writeAar( - aar, - aarData.data, - aarData.manifest, - aarData.rtxt, - aarData.classes, - aarData.proguardSpecs); - Set zipEntries = getZipEntries(aar); - assertThat(zipEntries).contains("proguard.txt"); - List proguardTxtContents = null; - try (ZipReader aarReader = new ZipReader(aar.toFile())) { - try (BufferedReader entryReader = - new BufferedReader( - new InputStreamReader( - aarReader.getInputStream(aarReader.getEntry("proguard.txt")), - StandardCharsets.UTF_8))) { - proguardTxtContents = entryReader.lines().collect(Collectors.toList()); - } - } - assertThat(proguardTxtContents).containsExactly("foo", "bar", "baz").inOrder(); - } -} diff --git a/src/test/java/com/google/devtools/build/android/AndroidDataBindingProcessingActionTest.java b/src/test/java/com/google/devtools/build/android/AndroidDataBindingProcessingActionTest.java deleted file mode 100644 index e9d30b21cd5ca6..00000000000000 --- a/src/test/java/com/google/devtools/build/android/AndroidDataBindingProcessingActionTest.java +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2018 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -package com.google.devtools.build.android; - -import static com.google.common.truth.Truth.assertThat; - -import com.google.common.io.MoreFiles; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Collections; -import java.util.List; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -/** Tests for {@link AndroidDataBindingProcessingAction}. */ -@RunWith(JUnit4.class) -public class AndroidDataBindingProcessingActionTest { - - private final String testDataPrefix = - System.getProperty("AndroidDataBindingProcessingActionTest.testDataPrefix", ""); - - private Path tempDir; - private Path dataBindingInfoOut; - - @Before - public void setupPaths() throws Exception { - tempDir = Files.createTempDirectory(toString()); - dataBindingInfoOut = tempDir.resolve("layout-info.zip"); - } - - @After - public void deletePaths() throws Exception { - Files.deleteIfExists(dataBindingInfoOut); - MoreFiles.deleteRecursively(tempDir); - } - - @Test - public void testNoResourceRoots() throws Exception { - - String[] args = { - "--output_resource_directory=" + tempDir.resolve("res"), - "--dataBindingInfoOut=" + dataBindingInfoOut, - "--appId=foo.bar", - }; - AndroidDataBindingProcessingAction.main(args); - - assertThat(Files.exists(dataBindingInfoOut)).isTrue(); - - ZipFile layoutInfo = new ZipFile(dataBindingInfoOut.toFile()); - assertThat(layoutInfo.entries().hasMoreElements()).isFalse(); - } - - @Test - public void testOneResourceRoot() throws Exception { - - String resourceRoot = - testDataPrefix + "src/test/java/com/google/devtools/build/android/testing/databinding/res"; - - String[] args = { - "--output_resource_directory=" + tempDir.resolve("res"), - "--resource_root=" + resourceRoot, - "--dataBindingInfoOut=" + dataBindingInfoOut, - "--appId=foo.bar", - }; - AndroidDataBindingProcessingAction.main(args); - - assertThat(Files.exists(dataBindingInfoOut)).isTrue(); - - ZipFile layoutInfo = new ZipFile(dataBindingInfoOut.toFile()); - List zipEntries = Collections.list(layoutInfo.entries()); - assertThat(zipEntries).hasSize(1); - } - - @Test - public void testTwoResourceRoots() throws Exception { - - String resourceRoot = - testDataPrefix + "src/test/java/com/google/devtools/build/android/testing/databinding/res"; - String resourceRoot2 = - testDataPrefix + "src/test/java/com/google/devtools/build/android/testing/databinding/res2"; - - String[] args = { - "--output_resource_directory=" + tempDir.resolve("res"), - "--resource_root=" + resourceRoot, - "--resource_root=" + resourceRoot2, - "--dataBindingInfoOut=" + dataBindingInfoOut, - "--appId=foo.bar", - }; - AndroidDataBindingProcessingAction.main(args); - - assertThat(Files.exists(dataBindingInfoOut)).isTrue(); - - ZipFile layoutInfo = new ZipFile(dataBindingInfoOut.toFile()); - List zipEntries = Collections.list(layoutInfo.entries()); - assertThat(zipEntries).hasSize(2); - } -} diff --git a/src/test/java/com/google/devtools/build/android/AndroidDataBuilder.java b/src/test/java/com/google/devtools/build/android/AndroidDataBuilder.java deleted file mode 100644 index 84ebacaa220a32..00000000000000 --- a/src/test/java/com/google/devtools/build/android/AndroidDataBuilder.java +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright 2017 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -package com.google.devtools.build.android; - -import com.google.common.base.Joiner; -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableList; -import com.google.devtools.build.android.AndroidResourceMerger.MergingException; -import com.google.errorprone.annotations.CanIgnoreReturnValue; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Utility for building {@link UnvalidatedAndroidData}, {@link ParsedAndroidData}, - * {@link DependencyAndroidData} and {@link MergedAndroidData}. - */ -public class AndroidDataBuilder { - /** Templates for resource files generation. */ - public enum ResourceType { - VALUE { - @Override - public String create(String... lines) { - return String.format( - "\n%s", - Joiner.on("\n").join(lines)); - } - }, - LAYOUT { - @Override - public String create(String... lines) { - return String.format( - "" - + "%s", - Joiner.on("\n").join(lines)); - } - }, - UNFORMATTED { - @Override - public String create(String... lines) { - return String.format(Joiner.on("\n").join(lines)); - } - }; - - public abstract String create(String... lines); - } - - public static AndroidDataBuilder of(Path root) { - return new AndroidDataBuilder(root); - } - - private final Path root; - private final Path assetDir; - private final Path resourceDir; - private Map filesToWrite = new HashMap<>(); - private Map filesToCopy = new HashMap<>(); - private Path manifest; - private Path rTxt; - - private AndroidDataBuilder(Path root) { - this.root = root; - assetDir = root.resolve("assets"); - resourceDir = root.resolve("res"); - } - - @CanIgnoreReturnValue - public AndroidDataBuilder addResource( - String path, AndroidDataBuilder.ResourceType template, String... lines) { - filesToWrite.put(resourceDir.resolve(path), template.create(lines)); - return this; - } - - @CanIgnoreReturnValue - public AndroidDataBuilder addValuesWithAttributes( - String path, Map attributes, String... lines) { - ImmutableList.Builder attributeBuilder = ImmutableList.builder(); - for (Map.Entry attribute : attributes.entrySet()) { - if (attribute.getKey() != null && attribute.getValue() != null) { - attributeBuilder.add(String.format("%s=\"%s\"", attribute.getKey(), attribute.getValue())); - } - } - String fileContents = ResourceType.VALUE.create(lines); - fileContents = fileContents.replace("", - String.format("", Joiner.on(" ").join(attributeBuilder.build()))); - filesToWrite.put(resourceDir.resolve(path), fileContents); - return this; - } - - @CanIgnoreReturnValue - public AndroidDataBuilder addResourceBinary(String path, Path source) { - final Path target = resourceDir.resolve(path); - filesToCopy.put(target, source); - return this; - } - - @CanIgnoreReturnValue - public AndroidDataBuilder addAsset(String path, String... lines) { - filesToWrite.put(assetDir.resolve(path), Joiner.on("\n").join(lines)); - return this; - } - - public AndroidDataBuilder createManifest(String path, String manifestPackage, String... lines) { - return createManifest(path, manifestPackage, ImmutableList.of(), lines); - } - - @CanIgnoreReturnValue - public AndroidDataBuilder createManifest( - String path, String manifestPackage, List namespaces, String... lines) { - this.manifest = root.resolve(path); - filesToWrite.put( - manifest, - String.format( - "" - + "" - + "%s", - Joiner.on(" ").join(namespaces), - manifestPackage, - Joiner.on("\n").join(lines))); - return this; - } - - @CanIgnoreReturnValue - public AndroidDataBuilder createRTxt(String path, String... lines) { - this.rTxt = root.resolve(path); - filesToWrite.put(rTxt, Joiner.on("\n").join(lines)); - return this; - } - - public UnvalidatedAndroidData buildUnvalidated() throws IOException { - writeFiles(); - return new UnvalidatedAndroidData( - ImmutableList.of(resourceDir), ImmutableList.of(assetDir), manifest); - } - - public ParsedAndroidData buildParsed() throws IOException, MergingException { - return ParsedAndroidData.from(buildUnvalidated()); - } - - public DependencyAndroidData buildDependency() throws IOException { - writeFiles(); - return new DependencyAndroidData( - ImmutableList.of(resourceDir), ImmutableList.of(assetDir), manifest, rTxt, null, null); - } - - public MergedAndroidData buildMerged() throws IOException { - writeFiles(); - return new MergedAndroidData(resourceDir, assetDir, manifest); - } - - private void writeFiles() throws IOException { - Files.createDirectories(assetDir); - Files.createDirectories(resourceDir); - Preconditions.checkNotNull(manifest, "A manifest is required."); - for (Map.Entry entry : filesToWrite.entrySet()) { - Files.createDirectories(entry.getKey().getParent()); - Files.write(entry.getKey(), entry.getValue().getBytes(StandardCharsets.UTF_8)); - Preconditions.checkArgument(Files.exists(entry.getKey())); - } - for (Map.Entry entry : filesToCopy.entrySet()) { - Path target = entry.getKey(); - Path source = entry.getValue(); - Files.createDirectories(target.getParent()); - Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); - } - } - -} diff --git a/src/test/java/com/google/devtools/build/android/AndroidDataMergerTest.java b/src/test/java/com/google/devtools/build/android/AndroidDataMergerTest.java deleted file mode 100644 index de4fa5dd296c03..00000000000000 --- a/src/test/java/com/google/devtools/build/android/AndroidDataMergerTest.java +++ /dev/null @@ -1,1569 +0,0 @@ -// Copyright 2017 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -package com.google.devtools.build.android; - -import static com.google.common.truth.Truth.assertAbout; -import static com.google.common.truth.Truth.assertThat; -import static com.google.devtools.build.android.ParsedAndroidDataBuilder.file; -import static com.google.devtools.build.android.ParsedAndroidDataBuilder.xml; - -import com.google.common.base.Optional; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.jimfs.Jimfs; -import com.google.common.truth.Subject; -import com.google.devtools.build.android.AndroidDataBuilder.ResourceType; -import com.google.devtools.build.android.AndroidDataMerger.ContentComparingChecker; -import com.google.devtools.build.android.AndroidDataMerger.MergeConflictException; -import com.google.devtools.build.android.AndroidDataMerger.SourceChecker; -import com.google.devtools.build.android.xml.IdXmlResourceValue; -import com.google.devtools.build.android.xml.PublicXmlResourceValue; -import com.google.devtools.build.android.xml.SimpleXmlResourceValue; -import com.google.devtools.build.android.xml.StyleableXmlResourceValue; -import java.io.IOException; -import java.nio.file.FileSystem; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Handler; -import java.util.logging.Level; -import java.util.logging.LogRecord; -import java.util.logging.Logger; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -/** Tests for {@link AndroidDataMerger}. */ -@RunWith(JUnit4.class) -public class AndroidDataMergerTest { - - static final String XLIFF_NAMESPACE = "urn:oasis:names:tc:xliff:document:1.2"; - static final String XLIFF_PREFIX = "xliff"; - - private FileSystem fileSystem; - private FullyQualifiedName.Factory fqnFactory; - private TestLoggingHandler loggingHandler; - private Logger mergerLogger; - - @Before - public void setUp() throws Exception { - fileSystem = Jimfs.newFileSystem(); - fqnFactory = FullyQualifiedName.Factory.from(ImmutableList.of()); - mergerLogger = Logger.getLogger(AndroidDataMerger.class.getCanonicalName()); - loggingHandler = new TestLoggingHandler(); - mergerLogger.addHandler(loggingHandler); - } - - @After - public void removeLoggingHandler() { - mergerLogger.removeHandler(loggingHandler); - } - - @Test - public void mergeDirectDeps() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - - DataSource primaryStrings = - DataSource.of(DependencyInfo.UNKNOWN, primaryRoot.resolve("res/values/resources.xml")); - DataSource directStrings = - DataSource.of(DependencyInfo.UNKNOWN, directRoot.resolve("res/values/strings.xml")); - - ParsedAndroidData transitiveDependency = ParsedAndroidDataBuilder.empty(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory) - .overwritable( - file("layout/exit").source("res/layout/exit.xml"), - xml("string/exit") - .source(directStrings) - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "no way out"))) - .combining(xml("id/exit").source("values/ids.xml").value(IdXmlResourceValue.of())) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .addResource( - "values/resources.xml", ResourceType.VALUE, "way out") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - - UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, false, true); - - UnwrittenMergedAndroidData expected = - UnwrittenMergedAndroidData.of( - primary.getManifest(), - ParsedAndroidDataBuilder.buildOn(fqnFactory) - .overwritable( - xml("string/exit") - .source(primaryStrings.overwrite(directStrings)) - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "way out"))) - .build(), - ParsedAndroidDataBuilder.buildOn(fqnFactory) - .overwritable(file("layout/exit").root(directRoot).source("res/layout/exit.xml")) - .combining( - xml("id/exit") - .root(directRoot) - .source("values/ids.xml") - .value(IdXmlResourceValue.of())) - .build()); - - assertAbout(unwrittenMergedAndroidData).that(data).isEqualTo(expected); - } - - @Test - public void mergeDirectAndTransitiveDeps() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - Path transitiveRoot = fileSystem.getPath("transitive"); - - DataSource directString = - DataSource.of(DependencyInfo.UNKNOWN, directRoot.resolve("res/values/resources.xml")); - DataSource primaryString = - DataSource.of( - DependencyInfo.UNKNOWN, primaryRoot.resolve("res").resolve("values/resources.xml")); - - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.buildOn(transitiveRoot, fqnFactory) - .overwritable(file("layout/enter").source("res/layout/enter.xml")) - .combining(xml("id/exit").source("values/ids.xml").value(IdXmlResourceValue.of())) - .build(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory) - .overwritable( - file("layout/exit").source("res/layout/exit.xml"), - xml("string/exit") - .source(directString) - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "no way out"))) - .combining(xml("id/exit").source("values/ids.xml").value(IdXmlResourceValue.of())) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .addResource( - "values/resources.xml", ResourceType.VALUE, "way out") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - - UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, false, true); - - UnwrittenMergedAndroidData expected = - UnwrittenMergedAndroidData.of( - primary.getManifest(), - ParsedAndroidDataBuilder.buildOn(fqnFactory) - .overwritable( - xml("string/exit") - .root(primaryRoot) - .source(primaryString.overwrite(directString)) - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "way out"))) - .build(), - ParsedAndroidDataBuilder.buildOn(fqnFactory) - .overwritable( - file("layout/enter").root(transitiveRoot).source("res/layout/enter.xml"), - file("layout/exit").root(directRoot).source("res/layout/exit.xml")) - .combining( - xml("id/exit") - .root(directRoot) - .source("values/ids.xml") - .value(IdXmlResourceValue.of())) - .build()); - assertAbout(unwrittenMergedAndroidData).that(data).isEqualTo(expected); - } - - @Test - public void mergeWithOverwriteInTransitiveDeps() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - Path transitiveRoot = fileSystem.getPath("transitive"); - Path descendantRoot = fileSystem.getPath("descendant"); - - DataSource descendantLayout = - DataSource.of(DependencyInfo.UNKNOWN, descendantRoot.resolve("res/layout/enter.xml")); - DataSource transitiveLayout = - DataSource.of(DependencyInfo.UNKNOWN, transitiveRoot.resolve("res/layout/enter.xml")); - - DataSource primaryString = - DataSource.of(DependencyInfo.UNKNOWN, primaryRoot.resolve("res/values/resources.xml")); - DataSource directStrings = - DataSource.of(DependencyInfo.UNKNOWN, directRoot.resolve("res/values/strings.xml")); - - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.buildOn(transitiveRoot, fqnFactory) - .overwritable(file("layout/enter").source(descendantLayout)) - .overwritable(file("layout/enter").source(transitiveLayout.overwrite(descendantLayout))) - .combining(xml("id/exit").source("values/ids.xml").value(IdXmlResourceValue.of())) - .build(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory) - .overwritable( - file("layout/exit").source("res/layout/exit.xml"), - xml("string/exit") - .source(directStrings) - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "no way out"))) - .combining(xml("id/exit").source("values/ids.xml").value(IdXmlResourceValue.of())) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .addResource( - "values/resources.xml", ResourceType.VALUE, "way out") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - - UnwrittenMergedAndroidData transitive = - merger.merge(transitiveDependency, directDependency, primary, false, true); - - UnwrittenMergedAndroidData expected = - UnwrittenMergedAndroidData.of( - primary.getManifest(), - ParsedAndroidDataBuilder.buildOn(fqnFactory) - .overwritable( - xml("string/exit") - .source(primaryString.overwrite(directStrings)) - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "way out"))) - .build(), - ParsedAndroidDataBuilder.buildOn(fqnFactory) - .overwritable( - file("layout/enter").source(transitiveLayout.overwrite(descendantLayout)), - file("layout/exit").root(directRoot).source("res/layout/exit.xml")) - .combining( - xml("id/exit") - .root(directRoot) - .source("values/ids.xml") - .value(IdXmlResourceValue.of())) - .build()); - assertAbout(unwrittenMergedAndroidData).that(transitive).isEqualTo(expected); - } - - @Test - public void mergeDirectConflict() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - - ParsedAndroidData transitiveDependency = ParsedAndroidDataBuilder.empty(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory) - // Two string/exit will create conflict. - .overwritable( - xml("string/exit") - .source("values/strings.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "wrong way out")), - xml("string/exit") - .source("values/strings.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "no way out"))) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - - merger.merge(transitiveDependency, directDependency, primary, false, false); - - assertThat(loggingHandler.warnings) - .containsExactly( - MergeConflict.of( - fqnFactory.parse("string/exit"), - DataResourceXml.createWithNoNamespace( - directRoot.resolve("res/values/strings.xml"), - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "no way out")), - DataResourceXml.createWithNoNamespace( - directRoot.resolve("res/values/strings.xml"), - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "wrong way out"))) - .toConflictMessage()); - } - - @Test - public void mergeDirectConflictDuplicated() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - - ParsedAndroidData transitiveDependency = ParsedAndroidDataBuilder.empty(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory) - // Two string/exit will create conflict. - .overwritable( - xml("string/exit") - .source("values/strings.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "way out")), - xml("string/exit") - .source("values/strings.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "way out"))) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .buildUnvalidated(); - - AndroidDataMerger merger = - AndroidDataMerger.createWithDefaultThreadPool( - new SourceChecker() { - @Override - public boolean checkEquality(DataSource one, DataSource two) throws IOException { - return one.equals(two); - } - }); - - assertAbout(unwrittenMergedAndroidData) - .that(merger.merge(transitiveDependency, directDependency, primary, false, true)) - .isEqualTo( - UnwrittenMergedAndroidData.of( - primary.getManifest(), - ParsedAndroidDataBuilder.empty(), - ParsedAndroidDataBuilder.buildOn(fqnFactory) - .overwritable( - xml("string/exit") - .root(directRoot) - .source("values/strings.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "way out"))) - .build())); - } - - @Test - public void mergeDirectConflictDuplicatedWithDifferentSources() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - - ParsedAndroidData transitiveDependency = ParsedAndroidDataBuilder.empty(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory) - // Two string/exit will create conflict. - .overwritable( - xml("string/exit") - .source("values/strings.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "way out")), - xml("string/exit") - .source("values/more_strings.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "way out")), - xml("string/another_key") - .source("values/more_strings.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "another way out"))) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - merger.merge(transitiveDependency, directDependency, primary, false, true); - - assertThat(loggingHandler.warnings).isEmpty(); - } - - @Test - public void mergeDirectConflictWithPseudoLocale() throws Exception { - fqnFactory = FullyQualifiedName.Factory.from(ImmutableList.of("en-rXA")); - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - - ParsedAndroidData transitiveDependency = ParsedAndroidDataBuilder.empty(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory) - // Two string/exit will create conflict. - .overwritable( - xml("string/exit") - .source("values/strings.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "wrong way out")), - xml("string/exit") - .source("values/strings.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "no way out"))) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - merger.merge(transitiveDependency, directDependency, primary, false, false); - - assertThat(loggingHandler.warnings).isEmpty(); - } - - @Test - public void mergeDirectConflictWithPrimaryOverride() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - DataSource primaryStrings = - DataSource.of(DependencyInfo.UNKNOWN, primaryRoot.resolve("res/values/strings.xml")); - DataSource directStrings = - DataSource.of(DependencyInfo.UNKNOWN, directRoot.resolve("res/values/strings.xml")); - - ParsedAndroidData transitiveDependency = ParsedAndroidDataBuilder.empty(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory) - // Two string/exit will create conflict. - .overwritable( - xml("string/exit") - .source(directStrings) - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "wrong way out")), - xml("string/exit") - .source(directStrings) - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "no way out"))) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .addResource( - "values/strings.xml", ResourceType.VALUE, "way out") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, true, true); - UnwrittenMergedAndroidData expected = - UnwrittenMergedAndroidData.of( - primary.getManifest(), - ParsedAndroidDataBuilder.buildOn(fqnFactory) - .overwritable( - xml("string/exit") - .source(primaryStrings.overwrite(directStrings)) - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "way out"))) - .build(), - ParsedAndroidDataBuilder.empty()); - assertAbout(unwrittenMergedAndroidData).that(data).isEqualTo(expected); - } - - @Test - public void mergeTransitiveConflict() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path transitiveRoot = fileSystem.getPath("transitive"); - - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.buildOn(transitiveRoot, fqnFactory) - // Two string/exit will create conflict. - .overwritable( - xml("string/exit") - .source("values/strings.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "wrong way out")), - xml("string/exit") - .source("values/strings.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "no way out"))) - .build(); - - ParsedAndroidData directDependency = ParsedAndroidDataBuilder.empty(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - - merger.merge(transitiveDependency, directDependency, primary, false, false); - - assertThat(loggingHandler.warnings) - .containsExactly( - MergeConflict.of( - fqnFactory.parse("string/exit"), - DataResourceXml.createWithNoNamespace( - transitiveRoot.resolve("res/values/strings.xml"), - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "no way out")), - DataResourceXml.createWithNoNamespace( - transitiveRoot.resolve("res/values/strings.xml"), - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "wrong way out"))) - .toConflictMessage()); - } - - @Test - public void mergeTransitiveConflictWithPrimaryOverride() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - Path transitiveRoot = fileSystem.getPath("transitive"); - - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.buildOn(transitiveRoot, fqnFactory) - // Two string/exit will create conflict. - .overwritable( - xml("string/exit") - .root(transitiveRoot.resolve("1")) - .source("values/strings.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "wrong way out")), - xml("string/exit") - .root(transitiveRoot.resolve("2")) - .source("values/strings.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "no way out"))) - .build(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory).build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .addResource( - "values/strings.xml", ResourceType.VALUE, "way out") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, true, true); - UnwrittenMergedAndroidData expected = - UnwrittenMergedAndroidData.of( - primary.getManifest(), - ParsedAndroidDataBuilder.buildOn(fqnFactory) - .overwritable( - xml("string/exit") - .root(primaryRoot) - .source("values/strings.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "way out"))) - .build(), - ParsedAndroidDataBuilder.empty()); - assertAbout(unwrittenMergedAndroidData).that(data).isEqualTo(expected); - } - - @Test - public void mergeTransitiveConflictBetweenDataResourceXmlAndDataValueFile() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path transitiveRoot = fileSystem.getPath("transitive"); - - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.buildOn(transitiveRoot, fqnFactory) - // Two drawable/ambiguous_name (one from xml, one from file) will create conflict. - .overwritable( - xml("drawable/ambiguous_name") - .source("values/resources.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.DRAWABLE, "#99000000")), - file("drawable/ambiguous_name").source("drawable/ambiguous_name.png")) - .build(); - - ParsedAndroidData directDependency = ParsedAndroidDataBuilder.empty(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - - merger.merge(transitiveDependency, directDependency, primary, false, false); - - assertThat(loggingHandler.warnings) - .containsExactly( - MergeConflict.of( - fqnFactory.parse("drawable/ambiguous_name"), - DataResourceXml.createWithNoNamespace( - transitiveRoot.resolve("res/values/resources.xml"), - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.DRAWABLE, "#99000000")), - DataValueFile.from(transitiveRoot.resolve("res/drawable/ambiguous_name.png"))) - .toConflictMessage()); - } - - @Test - public void mergeDirectAndTransitiveConflict() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - Path transitiveRoot = fileSystem.getPath("transitive"); - - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.buildOn(transitiveRoot, fqnFactory) - .overwritable( - xml("string/exit") - .source("values/strings.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "no way out"))) - .build(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory) - .overwritable( - xml("string/exit") - .source("values/strings.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "wrong way out"))) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - - merger.merge(transitiveDependency, directDependency, primary, false, false); - assertThat(loggingHandler.warnings) - .containsExactly( - MergeConflict.of( - fqnFactory.parse("string/exit"), - DataResourceXml.createWithNoNamespace( - directRoot.resolve("res/values/strings.xml"), - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "wrong way out")), - DataResourceXml.createWithNoNamespace( - transitiveRoot.resolve("res/values/strings.xml"), - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "no way out"))) - .toConflictMessage()); - } - - @Test - public void mergeDirectTransitivePrimaryConflictWithoutPrimaryOverride() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - Path transitiveRoot = fileSystem.getPath("transitive"); - - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.buildOn(transitiveRoot, fqnFactory) - .overwritable( - xml("string/exit") - .source("values/strings.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "no way out"))) - .build(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory) - .overwritable( - xml("string/exit") - .source("values/strings.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "wrong way out"))) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .addResource( - "values/strings.xml", ResourceType.VALUE, "way out") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - - merger.merge(transitiveDependency, directDependency, primary, false, false); - - FullyQualifiedName fullyQualifiedName = fqnFactory.parse("string/exit"); - assertThat(loggingHandler.warnings) - .containsExactly( - MergeConflict.of( - fullyQualifiedName, - DataResourceXml.createWithNoNamespace( - transitiveRoot.resolve("res/values/strings.xml"), - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "no way out")), - DataResourceXml.createWithNoNamespace( - directRoot.resolve("res/values/strings.xml"), - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "wrong way out"))) - .toConflictMessage()); - } - - @Test - public void mergeDirectTransitivePrimaryConflictWithThrowOnConflict() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - Path transitiveRoot = fileSystem.getPath("transitive"); - - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.buildOn(transitiveRoot, fqnFactory) - .overwritable( - xml("string/exit") - .source("values/strings.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "no way out"))) - .build(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory) - .overwritable( - xml("string/exit") - .source("values/strings.xml") - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "wrong way out"))) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .addResource( - "values/strings.xml", ResourceType.VALUE, "way out") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - - try { - merger.merge(transitiveDependency, directDependency, primary, false, true); - throw new Exception("Expected a MergeConflictException!"); - } catch (MergeConflictException e) { - return; - } - } - - @Test - public void mergeDirectTransitivePrimaryConflictWithPrimaryOverride() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - Path transitiveRoot = fileSystem.getPath("transitive"); - - DataSource primaryStrings = - DataSource.of(DependencyInfo.UNKNOWN, primaryRoot.resolve("res/values/strings.xml")); - DataSource directStrings = - DataSource.of(DependencyInfo.UNKNOWN, directRoot.resolve("res/values/strings.xml")); - DataSource transitiveStrings = - DataSource.of(DependencyInfo.UNKNOWN, transitiveRoot.resolve("res/values/strings.xml")); - - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.buildOn(transitiveRoot, fqnFactory) - .overwritable( - xml("string/exit") - .source(transitiveStrings) - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "no way out"))) - .build(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory) - .overwritable( - xml("string/exit") - .source(directStrings) - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "wrong way out"))) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .addResource( - "values/strings.xml", ResourceType.VALUE, "way out") - .buildUnvalidated(); - - UnwrittenMergedAndroidData data = - AndroidDataMerger.createWithDefaults() - .merge(transitiveDependency, directDependency, primary, true, true); - - UnwrittenMergedAndroidData expected = - UnwrittenMergedAndroidData.of( - primary.getManifest(), - ParsedAndroidDataBuilder.buildOn(fqnFactory) - .overwritable( - xml("string/exit") - .source(primaryStrings.overwrite(directStrings)) - .value( - SimpleXmlResourceValue.createWithValue( - SimpleXmlResourceValue.Type.STRING, "way out"))) - .build(), - ParsedAndroidDataBuilder.empty()); - assertAbout(unwrittenMergedAndroidData).that(data).isEqualTo(expected); - } - - @Test - public void mergeDirectAndTransitiveNinepatchConflict() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - Path transitiveRoot = fileSystem.getPath("transitive"); - - // A drawable nine-patch png and plain png with the same base filename will conflict. - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.buildOn(transitiveRoot, fqnFactory) - .overwritable(file("drawable/rounded_corners").source("drawable/rounded_corners.9.png")) - .build(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory) - .overwritable(file("drawable/rounded_corners").source("drawable/rounded_corners.png")) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - merger.merge(transitiveDependency, directDependency, primary, false, false); - - assertThat(loggingHandler.warnings) - .containsExactly( - MergeConflict.of( - fqnFactory.parse("drawable/rounded_corners"), - DataValueFile.of(directRoot.resolve("res/drawable/rounded_corners.png")), - DataValueFile.of(transitiveRoot.resolve("res/drawable/rounded_corners.9.png"))) - .toConflictMessage()); - } - - @Test - public void mergeDirectAndTransitiveFileConflict() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - Path transitiveRoot = fileSystem.getPath("transitive"); - - Path transitiveDrawableRoot = Files.createDirectories(transitiveRoot.resolve("res/drawable")); - Files.write(transitiveDrawableRoot.resolve("app_icon.png"), new byte[] {0x01, 0x02, 0x03}); - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.buildOn(transitiveRoot, fqnFactory) - .overwritable(file("drawable/app_icon").source("drawable/app_icon.png")) - .build(); - - Path directDrawableRoot = Files.createDirectories(directRoot.resolve("res/drawable")); - Files.write(directDrawableRoot.resolve("app_icon.png"), new byte[] {0x01, 0x02, 0x04}); - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory) - .overwritable(file("drawable/app_icon").source("drawable/app_icon.png")) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .buildUnvalidated(); - - AndroidDataMerger merger = - AndroidDataMerger.createWithDefaultThreadPool(ContentComparingChecker.create()); - - merger.merge(transitiveDependency, directDependency, primary, false, false); - - assertThat(loggingHandler.warnings) - .containsExactly( - MergeConflict.of( - fqnFactory.parse("drawable/app_icon"), - DataValueFile.from(transitiveRoot.resolve("res/drawable/app_icon.png")), - DataValueFile.from(directRoot.resolve("res/drawable/app_icon.png"))) - .toConflictMessage()); - } - - @Test - public void mergeDirectAndTransitiveFileConflictDuplicatedContent() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - Path transitiveRoot = fileSystem.getPath("transitive"); - - Path transitiveDrawableRoot = Files.createDirectories(transitiveRoot.resolve("res/drawable")); - Files.write(transitiveDrawableRoot.resolve("app_icon.png"), new byte[] {0x01, 0x02, 0x03}); - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.buildOn(transitiveRoot, fqnFactory) - .overwritable(file("drawable/app_icon").source("drawable/app_icon.png")) - .build(); - - Path directDrawableRoot = Files.createDirectories(directRoot.resolve("res/drawable")); - Files.write(directDrawableRoot.resolve("app_icon.png"), new byte[] {0x01, 0x02, 0x03}); - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory) - .overwritable(file("drawable/app_icon").source("drawable/app_icon.png")) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .buildUnvalidated(); - - AndroidDataMerger merger = - AndroidDataMerger.createWithDefaultThreadPool(ContentComparingChecker.create()); - - merger.merge(transitiveDependency, directDependency, primary, false, false); - - assertAbout(unwrittenMergedAndroidData) - .that(merger.merge(transitiveDependency, directDependency, primary, false, true)) - .isEqualTo( - UnwrittenMergedAndroidData.of( - primary.getManifest(), - ParsedAndroidDataBuilder.empty(), - ParsedAndroidDataBuilder.buildOn(fqnFactory) - .overwritable( - file("drawable/app_icon").root(directRoot).source("drawable/app_icon.png")) - .build())); - } - - @Test - public void mergeAssetsDirectDeps() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - - ParsedAndroidData transitiveDependency = ParsedAndroidDataBuilder.empty(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot) - .assets(file().source("hunting/of/the/snark.txt")) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .addAsset("bin/boojum") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - - UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, false, true); - - UnwrittenMergedAndroidData expected = - UnwrittenMergedAndroidData.of( - primary.getManifest(), - ParsedAndroidDataBuilder.builder() - .assets(file().root(primaryRoot).source("bin/boojum")) - .build(), - ParsedAndroidDataBuilder.builder() - .assets(file().root(directRoot).source("hunting/of/the/snark.txt")) - .build()); - assertAbout(unwrittenMergedAndroidData).that(data).isEqualTo(expected); - } - - @Test - public void mergeCombiningResources() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - Path transitiveRoot = fileSystem.getPath("transitive"); - - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.buildOn(transitiveRoot, fqnFactory) - .combining( - xml("styleable/RubADubDub") - .source("values/attrs.xml") - .value( - StyleableXmlResourceValue.createAllAttrAsReferences( - fqnFactory.parse("attr/baker")))) - .build(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory) - .combining( - xml("styleable/RubADubDub") - .source("values/attrs.xml") - .value( - StyleableXmlResourceValue.createAllAttrAsReferences( - fqnFactory.parse("attr/candlestickmaker")))) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .addResource( - "values/attrs.xml", - ResourceType.VALUE, - "", - " ", - "") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - - UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, false, true); - - UnwrittenMergedAndroidData expected = - UnwrittenMergedAndroidData.of( - primary.getManifest(), - ParsedAndroidDataBuilder.buildOn(primaryRoot, fqnFactory) - .combining( - xml("styleable/RubADubDub") - .source("values/attrs.xml") - .value( - StyleableXmlResourceValue.createAllAttrAsReferences( - fqnFactory.parse("attr/baker"), - fqnFactory.parse("attr/butcher"), - fqnFactory.parse("attr/candlestickmaker")))) - .build(), - ParsedAndroidDataBuilder.empty()); - assertAbout(unwrittenMergedAndroidData).that(data).isEqualTo(expected); - } - - @Test - public void mergeCombiningResourcesWithNamespaces() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - Path transitiveRoot = fileSystem.getPath("transitive"); - - // TODO(corysmith): Make conflict uris for a single prefix and error - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.buildOn(transitiveRoot, fqnFactory) - .combining( - xml("styleable/RubADubDub") - .source("values/attrs.xml") - .namespace(XLIFF_PREFIX, XLIFF_NAMESPACE) - .namespace("tools", "http://schemas.android.com/tools") - .value( - StyleableXmlResourceValue.createAllAttrAsReferences( - fqnFactory.parse("attr/baker")))) - .build(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory) - .combining( - xml("styleable/RubADubDub") - .source("values/attrs.xml") - .namespace(XLIFF_PREFIX, "wrong uri") - .value( - StyleableXmlResourceValue.createAllAttrAsReferences( - fqnFactory.parse("attr/candlestickmaker")))) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .addResource( - "values/attrs.xml", - ResourceType.VALUE, - "", - " ", - "") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - - UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, false, true); - - UnwrittenMergedAndroidData expected = - UnwrittenMergedAndroidData.of( - primary.getManifest(), - ParsedAndroidDataBuilder.buildOn(primaryRoot, fqnFactory) - .combining( - xml("styleable/RubADubDub") - .source("values/attrs.xml") - .namespace(XLIFF_PREFIX, "wrong uri") - .namespace("tools", "http://schemas.android.com/tools") - .value( - StyleableXmlResourceValue.createAllAttrAsReferences( - fqnFactory.parse("attr/baker"), - fqnFactory.parse("attr/butcher"), - fqnFactory.parse("attr/candlestickmaker")))) - .build(), - ParsedAndroidDataBuilder.empty()); - assertAbout(unwrittenMergedAndroidData).that(data).isEqualTo(expected); - } - - @Test - public void mergeCombiningLayoutIDResources() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - Path transitiveRoot = fileSystem.getPath("transitive"); - - DataSource transitiveLayout = - DataSource.of(DependencyInfo.UNKNOWN, transitiveRoot.resolve("res/layout/transitive.xml")); - DataSource directLayout = - DataSource.of(DependencyInfo.UNKNOWN, directRoot.resolve("res/layout/direct.xml")); - DataSource primaryLayout = - DataSource.of(DependencyInfo.UNKNOWN, primaryRoot.resolve("res/layout/primary.xml")); - - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.buildOn(transitiveRoot, fqnFactory) - .overwritable(file("layout/transitive").source(transitiveLayout)) - .combining( - xml("id/back_door").source(transitiveLayout).value(IdXmlResourceValue.of()), - xml("id/door").source("values/ids.xml").value(IdXmlResourceValue.of()), - xml("id/slide").source(transitiveLayout).value(IdXmlResourceValue.of())) - .build(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory) - .overwritable(file("layout/zzDirect").source(directLayout)) - .combining( - xml("id/door").source(directLayout).value(IdXmlResourceValue.of()), - xml("id/slide").source(directLayout).value(IdXmlResourceValue.of()), - xml("id/window").source(directLayout).value(IdXmlResourceValue.of())) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .addResource( - "layout/primary.xml", - ResourceType.LAYOUT, - " \"", - " android:layout_width=\"wrap_content\"", - " android:layout_height=\"wrap_content\" />", - "") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - - UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, false, true); - - UnwrittenMergedAndroidData expected = - UnwrittenMergedAndroidData.of( - primary.getManifest(), - ParsedAndroidDataBuilder.buildOn(primaryRoot, fqnFactory) - .overwritable(file("layout/primary").source(primaryLayout)) - .combining( - xml("id/window").source("layout/primary.xml").value(IdXmlResourceValue.of()), - xml("id/door") - .root(transitiveRoot) - .source("values/ids.xml") - .value(IdXmlResourceValue.of())) - .build(), - ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory) - .overwritable( - file("layout/transitive").source(transitiveLayout), - file("layout/zzDirect").source(directLayout)) - .combining( - xml("id/back_door").source(transitiveLayout).value(IdXmlResourceValue.of()), - xml("id/slide").source(directLayout).value(IdXmlResourceValue.of())) - .build()); - assertAbout(unwrittenMergedAndroidData).that(data).isEqualTo(expected); - } - - @Test - public void mergeCombiningPublicResources() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - Path transitiveRoot = fileSystem.getPath("transitive"); - - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.buildOn(transitiveRoot, fqnFactory) - .combining( - xml("public/RubADubDub") - .source("values/public.xml") - .value( - PublicXmlResourceValue.create( - com.android.resources.ResourceType.STRING, Optional.of(0x7f040000)))) - .build(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory) - .combining( - xml("public/RubADubDub") - .source("values/public.xml") - .value( - PublicXmlResourceValue.create( - com.android.resources.ResourceType.DIMEN, Optional.of(0x7f020000)))) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .addResource( - "values/public.xml", - ResourceType.VALUE, - "") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - - UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, false, true); - - UnwrittenMergedAndroidData expected = - UnwrittenMergedAndroidData.of( - primary.getManifest(), - ParsedAndroidDataBuilder.buildOn(primaryRoot, fqnFactory) - .combining( - xml("public/RubADubDub") - .source("values/public.xml") - .value( - PublicXmlResourceValue.of( - ImmutableMap.of( - com.android.resources.ResourceType.COLOR, - Optional.of(0x7f030000), - com.android.resources.ResourceType.DIMEN, - Optional.of(0x7f020000), - com.android.resources.ResourceType.STRING, - Optional.of(0x7f040000))))) - .build(), - ParsedAndroidDataBuilder.empty()); - assertAbout(unwrittenMergedAndroidData).that(data).isEqualTo(expected); - } - - @Test - public void mergeAssetsDirectAndTransitiveDeps() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - Path transitiveRoot = fileSystem.getPath("transitive"); - - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.buildOn(transitiveRoot) - .assets(file().source("hunting/of/the/jubjub.bird")) - .build(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot) - .assets(file().source("hunting/of/the/snark.txt")) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .addAsset("bin/boojum") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - - UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, false, true); - - UnwrittenMergedAndroidData expected = - UnwrittenMergedAndroidData.of( - primary.getManifest(), - ParsedAndroidDataBuilder.builder() - .assets(file().root(primaryRoot).source("bin/boojum")) - .build(), - ParsedAndroidDataBuilder.builder() - .assets( - file().root(directRoot).source("hunting/of/the/snark.txt"), - file().root(transitiveRoot).source("hunting/of/the/jubjub.bird")) - .build()); - assertAbout(unwrittenMergedAndroidData).that(data).isEqualTo(expected); - } - - @Test - public void mergeAssetsDirectConflict() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRootOne = fileSystem.getPath("directOne"); - Path directRootTwo = fileSystem.getPath("directTwo"); - - ParsedAndroidData transitiveDependency = ParsedAndroidDataBuilder.empty(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.builder() - .assets( - file().root(directRootOne).source("hunting/of/the/snark.txt"), - file().root(directRootTwo).source("hunting/of/the/snark.txt")) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - - merger.merge(transitiveDependency, directDependency, primary, false, false); - assertThat(loggingHandler.warnings) - .containsExactly( - MergeConflict.of( - RelativeAssetPath.Factory.of(directRootOne.resolve("assets")) - .create(directRootOne.resolve("assets/hunting/of/the/snark.txt")), - DataValueFile.of(directRootOne.resolve("assets/hunting/of/the/snark.txt")), - DataValueFile.of(directRootTwo.resolve("assets/hunting/of/the/snark.txt"))) - .toConflictMessage()); - } - - @Test - public void mergeAssetsDirectConflictWithPrimaryOverride() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRootOne = fileSystem.getPath("directOne"); - Path directRootTwo = fileSystem.getPath("directTwo"); - - ParsedAndroidData transitiveDependency = ParsedAndroidDataBuilder.empty(); - String assetFile = "hunting/of/the/snark.txt"; - - DataSource primarySource = - DataSource.of(DependencyInfo.UNKNOWN, primaryRoot.resolve("assets/" + assetFile)); - DataSource directSourceOne = - DataSource.of(DependencyInfo.UNKNOWN, directRootOne.resolve("assets/" + assetFile)); - DataSource directSourceTwo = - DataSource.of(DependencyInfo.UNKNOWN, directRootTwo.resolve("assets/" + assetFile)); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.builder() - .assets( - file().root(directRootOne).source(directSourceOne), - file().root(directRootTwo).source(directSourceTwo)) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .addAsset(assetFile) - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, true, true); - UnwrittenMergedAndroidData expected = - UnwrittenMergedAndroidData.of( - primary.getManifest(), - ParsedAndroidDataBuilder.builder() - .assets( - file() - .root(primaryRoot) - .source(primarySource.overwrite(directSourceOne, directSourceTwo))) - .build(), - ParsedAndroidDataBuilder.empty()); - assertAbout(unwrittenMergedAndroidData).that(data).isEqualTo(expected); - } - - @Test - public void mergeAssetsTransitiveConflict() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path transitiveRootOne = fileSystem.getPath("transitiveOne"); - Path transitiveRootTwo = fileSystem.getPath("transitiveTwo"); - - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.builder() - .assets( - file().root(transitiveRootOne).source("hunting/of/the/snark.txt"), - file().root(transitiveRootTwo).source("hunting/of/the/snark.txt")) - .build(); - - ParsedAndroidData directDependency = ParsedAndroidDataBuilder.empty(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - - merger.merge(transitiveDependency, directDependency, primary, false, false); - assertThat(loggingHandler.warnings) - .containsExactly( - MergeConflict.of( - RelativeAssetPath.Factory.of(transitiveRootOne.resolve("assets")) - .create(transitiveRootOne.resolve("assets/hunting/of/the/snark.txt")), - DataValueFile.of(transitiveRootOne.resolve("assets/hunting/of/the/snark.txt")), - DataValueFile.of(transitiveRootTwo.resolve("assets/hunting/of/the/snark.txt"))) - .toConflictMessage()); - } - - @Test - public void mergeAssetsTransitiveConflictWithPrimaryOverride() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path transitiveRoot = fileSystem.getPath("transitive"); - - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.buildOn(transitiveRoot) - .assets(file().source("hunting/of/the/snark.txt")) - .build(); - - ParsedAndroidData directDependency = ParsedAndroidDataBuilder.empty(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .addAsset("hunting/of/the/snark.txt") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, true, true); - UnwrittenMergedAndroidData expected = - UnwrittenMergedAndroidData.of( - primary.getManifest(), - ParsedAndroidDataBuilder.buildOn(primaryRoot) - .assets(file().source("hunting/of/the/snark.txt")) - .build(), - ParsedAndroidDataBuilder.empty()); - assertAbout(unwrittenMergedAndroidData).that(data).isEqualTo(expected); - } - - @Test - public void mergeAssetsDirectAndTransitiveConflict() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - Path transitiveRoot = fileSystem.getPath("transitive"); - - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.buildOn(transitiveRoot) - .assets(file().source("hunting/of/the/snark.txt")) - .build(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot) - .assets(file().source("hunting/of/the/snark.txt")) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - - merger.merge(transitiveDependency, directDependency, primary, false, false); - assertThat(loggingHandler.warnings) - .containsExactly( - MergeConflict.of( - RelativeAssetPath.Factory.of(directRoot.resolve("assets")) - .create(directRoot.resolve("assets/hunting/of/the/snark.txt")), - DataValueFile.of(directRoot.resolve("assets/hunting/of/the/snark.txt")), - DataValueFile.of(transitiveRoot.resolve("assets/hunting/of/the/snark.txt"))) - .toConflictMessage()); - } - - @Test - public void mergeAssetsDirectTransitivePrimaryConflictWithoutPrimaryOverride() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - Path transitiveRoot = fileSystem.getPath("transitive"); - - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.buildOn(transitiveRoot) - .assets(file().source("hunting/of/the/snark.txt")) - .build(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot) - .assets(file().source("hunting/of/the/snark.txt")) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .addAsset("hunting/of/the/snark.txt") - .buildUnvalidated(); - - AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - - merger.merge(transitiveDependency, directDependency, primary, false, false); - assertThat(loggingHandler.warnings) - .containsExactly( - MergeConflict.of( - RelativeAssetPath.Factory.of(directRoot.resolve("assets")) - .create(directRoot.resolve("assets/hunting/of/the/snark.txt")), - DataValueFile.of(directRoot.resolve("assets/hunting/of/the/snark.txt")), - DataValueFile.of(transitiveRoot.resolve("assets/hunting/of/the/snark.txt"))) - .toConflictMessage()); - } - - @Test - public void mergeAssetsDirectTransitivePrimaryConflictWithPrimaryOverride() throws Exception { - Path primaryRoot = fileSystem.getPath("primary"); - Path directRoot = fileSystem.getPath("direct"); - Path transitiveRoot = fileSystem.getPath("transitive"); - - DataSource primarySource = - DataSource.of( - DependencyInfo.UNKNOWN, primaryRoot.resolve("assets/hunting/of/the/snark.txt")); - DataSource directSource = - DataSource.of( - DependencyInfo.UNKNOWN, directRoot.resolve("assets/hunting/of/the/snark.txt")); - - ParsedAndroidData transitiveDependency = - ParsedAndroidDataBuilder.buildOn(transitiveRoot) - .assets(file().source("hunting/of/the/snark.txt")) - .build(); - - ParsedAndroidData directDependency = - ParsedAndroidDataBuilder.buildOn(directRoot) - .assets(file().source("hunting/of/the/snark.txt")) - .build(); - - UnvalidatedAndroidData primary = - AndroidDataBuilder.of(primaryRoot) - .createManifest("AndroidManifest.xml", "com.google.mergetest") - .addAsset("hunting/of/the/snark.txt") - .buildUnvalidated(); - - UnwrittenMergedAndroidData data = - AndroidDataMerger.createWithDefaults() - .merge(transitiveDependency, directDependency, primary, true, true); - - UnwrittenMergedAndroidData expected = - UnwrittenMergedAndroidData.of( - primary.getManifest(), - ParsedAndroidDataBuilder.buildOn(primaryRoot) - .assets(file().source(primarySource.overwrite(directSource))) - .build(), - ParsedAndroidDataBuilder.empty()); - assertAbout(unwrittenMergedAndroidData).that(data).isEqualTo(expected); - } - - final Subject.Factory - unwrittenMergedAndroidData = UnwrittenMergedAndroidDataSubject::new; - - private static final class TestLoggingHandler extends Handler { - public final List warnings = new ArrayList(); - - @Override - public void publish(LogRecord record) { - if (record.getLevel().equals(Level.WARNING)) { - warnings.add(record.getMessage()); - } - } - - @Override - public void flush() {} - - @Override - public void close() throws SecurityException {} - } -} diff --git a/src/test/java/com/google/devtools/build/android/AndroidDataSerializerAndDeserializerTest.java b/src/test/java/com/google/devtools/build/android/AndroidDataSerializerAndDeserializerTest.java deleted file mode 100644 index 94529e3db31948..00000000000000 --- a/src/test/java/com/google/devtools/build/android/AndroidDataSerializerAndDeserializerTest.java +++ /dev/null @@ -1,364 +0,0 @@ -// Copyright 2017 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -package com.google.devtools.build.android; - -import static com.google.devtools.build.android.ParsedAndroidDataBuilder.file; -import static com.google.devtools.build.android.ParsedAndroidDataBuilder.xml; - -import com.google.common.base.MoreObjects; -import com.google.common.collect.ImmutableList; -import com.google.common.jimfs.Jimfs; -import com.google.common.truth.Truth; -import com.google.devtools.build.android.xml.IdXmlResourceValue; -import com.google.devtools.build.android.xml.ResourcesAttribute; -import java.nio.file.FileSystem; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -/** Tests for the AndroidDataSerializer and AndroidDataDeserializer. */ -@RunWith(JUnit4.class) -public class AndroidDataSerializerAndDeserializerTest { - - private FileSystem fs; - private FullyQualifiedName.Factory fqnFactory; - private Path source; - private Path manifest; - - @Before - public void createCleanEnvironment() throws Exception { - fs = Jimfs.newFileSystem(); - fqnFactory = FullyQualifiedName.Factory.from(ImmutableList.of()); - source = Files.createDirectory(fs.getPath("source")); - manifest = Files.createFile(source.resolve("AndroidManifest.xml")); - } - - @Test - public void serializeAssets() throws Exception { - Path binaryPath = fs.getPath("out.bin"); - AndroidDataSerializer serializer = AndroidDataSerializer.create(); - UnwrittenMergedAndroidData expected = - UnwrittenMergedAndroidData.of( - manifest, - ParsedAndroidDataBuilder.buildOn(source) - .assets(file().source("hunting/of/the/boojum")) - .build(), - ParsedAndroidDataBuilder.empty()); - expected.serializeTo(serializer); - serializer.flushTo(binaryPath); - - AndroidDataDeserializer deserializer = AndroidParsedDataDeserializer.create(); - TestMapConsumer assets = TestMapConsumer.ofAssets(); - deserializer.read(binaryPath, KeyValueConsumers.of(null, null, assets)); - Truth.assertThat(assets).isEqualTo(expected.getPrimary().getAssets()); - } - - @Test - public void serializeCombiningResource() throws Exception { - Path binaryPath = fs.getPath("out.bin"); - AndroidDataSerializer serializer = AndroidDataSerializer.create(); - UnwrittenMergedAndroidData expected = - UnwrittenMergedAndroidData.of( - manifest, - ParsedAndroidDataBuilder.buildOn(source, fqnFactory) - .combining( - xml("id/snark").source("values/ids.xml").value(IdXmlResourceValue.of())) - .build(), - ParsedAndroidDataBuilder.empty()); - expected.serializeTo(serializer); - serializer.flushTo(binaryPath); - - AndroidDataDeserializer deserializer = AndroidParsedDataDeserializer.create(); - TestMapConsumer resources = TestMapConsumer.ofResources(); - deserializer.read( - binaryPath, - KeyValueConsumers.of( - null, // overwriting - resources, // combining - null // assets - )); - Truth.assertThat(resources).isEqualTo(expected.getPrimary().getCombiningResources()); - } - - @Test - public void serializeOverwritingResource() throws Exception { - Path binaryPath = fs.getPath("out.bin"); - AndroidDataSerializer serializer = AndroidDataSerializer.create(); - UnwrittenMergedAndroidData expected = - UnwrittenMergedAndroidData.of( - manifest, - ParsedAndroidDataBuilder.buildOn(source, fqnFactory) - .overwritable(file("layout/banker").source("layout/banker.xml")) - .build(), - ParsedAndroidDataBuilder.empty()); - expected.serializeTo(serializer); - serializer.flushTo(binaryPath); - - AndroidDataDeserializer deserializer = AndroidParsedDataDeserializer.create(); - TestMapConsumer resources = TestMapConsumer.ofResources(); - deserializer.read( - binaryPath, - KeyValueConsumers.of( - resources, // overwriting - null, // combining - null // assets - )); - Truth.assertThat(resources).isEqualTo(expected.getPrimary().getOverwritingResources()); - } - - @Test - public void serializeFileWithIds() throws Exception { - Path binaryPath = fs.getPath("out.bin"); - AndroidDataSerializer serializer = AndroidDataSerializer.create(); - ParsedAndroidData direct = - AndroidDataBuilder.of(source) - .addResource( - "layout/some_layout.xml", - AndroidDataBuilder.ResourceType.LAYOUT, - "") - // Test what happens if a user accidentally uses the same ID in multiple layouts too. - .addResource( - "layout/another_layout.xml", - AndroidDataBuilder.ResourceType.LAYOUT, - "") - // Also check what happens if a value XML file also contains the same ID. - .addResource( - "values/ids.xml", - AndroidDataBuilder.ResourceType.VALUE, - "", - "") - .addResource( - "values/strings.xml", - AndroidDataBuilder.ResourceType.VALUE, - "I has a bucket") - .createManifest("AndroidManifest.xml", "com.carroll.lewis", "") - .buildParsed(); - UnwrittenMergedAndroidData expected = - UnwrittenMergedAndroidData.of( - manifest, - direct, - ParsedAndroidDataBuilder.empty()); - expected.serializeTo(serializer); - serializer.flushTo(binaryPath); - - AndroidDataDeserializer deserializer = AndroidParsedDataDeserializer.create(); - TestMapConsumer overwriting = TestMapConsumer.ofResources(); - TestMapConsumer combining = TestMapConsumer.ofResources(); - deserializer.read( - binaryPath, - KeyValueConsumers.of( - overwriting, - combining, - null // assets - )); - Truth.assertThat(overwriting).isEqualTo(expected.getPrimary().getOverwritingResources()); - Truth.assertThat(combining).isEqualTo(expected.getPrimary().getCombiningResources()); - } - - @Test - public void serialize() throws Exception { - Path binaryPath = fs.getPath("out.bin"); - AndroidDataSerializer serializer = AndroidDataSerializer.create(); - UnwrittenMergedAndroidData expected = - UnwrittenMergedAndroidData.of( - manifest, - ParsedAndroidDataBuilder.buildOn(source, fqnFactory) - .overwritable( - file("layout/banker").source("layout/banker.xml"), - xml("/foo").source("values/ids.xml") - .value(ResourcesAttribute.of( - fqnFactory.parse("/foo"), "foo", "fooVal"))) - .combining( - xml("id/snark").source("values/ids.xml").value(IdXmlResourceValue.of())) - .assets(file().source("hunting/of/the/boojum")) - .build(), - ParsedAndroidDataBuilder.buildOn(source, fqnFactory) - .overwritable(file("layout/butcher").source("layout/butcher.xml")) - .combining( - xml("id/snark").source("values/ids.xml").value(IdXmlResourceValue.of())) - .assets(file().source("hunting/of/the/snark")) - .build()); - expected.serializeTo(serializer); - serializer.flushTo(binaryPath); - - KeyValueConsumers primary = - KeyValueConsumers.of( - TestMapConsumer.ofResources(), // overwriting - TestMapConsumer.ofResources(), // combining - TestMapConsumer.ofAssets() // assets - ); - - AndroidDataDeserializer deserializer = AndroidParsedDataDeserializer.create(); - deserializer.read(binaryPath, primary); - Truth.assertThat(primary.overwritingConsumer) - .isEqualTo(expected.getPrimary().getOverwritingResources()); - Truth.assertThat(primary.combiningConsumer) - .isEqualTo(expected.getPrimary().getCombiningResources()); - Truth.assertThat(primary.assetConsumer).isEqualTo(expected.getPrimary().getAssets()); - } - - @Test - public void testDeserializeMissing() throws Exception { - Path binaryPath = fs.getPath("out.bin"); - AndroidDataSerializer serializer = AndroidDataSerializer.create(); - UnwrittenMergedAndroidData expected = - UnwrittenMergedAndroidData.of( - manifest, - ParsedAndroidDataBuilder.buildOn(source, fqnFactory) - .overwritable( - file("layout/banker").source("layout/banker.xml"), - xml("/foo").source("values/ids.xml") - .value(ResourcesAttribute.of( - fqnFactory.parse("/foo"), "foo", "fooVal"))) - .combining( - xml("id/snark").source("values/ids.xml").value(IdXmlResourceValue.of())) - .assets(file().source("hunting/of/the/boojum")) - .build(), - ParsedAndroidDataBuilder.buildOn(source, fqnFactory) - .overwritable(file("layout/butcher").source("layout/butcher.xml")) - .combining( - xml("id/snark").source("values/ids.xml").value(IdXmlResourceValue.of())) - .assets(file().source("hunting/of/the/snark")) - .build()); - expected.serializeTo(serializer); - serializer.flushTo(binaryPath); - - AndroidDataDeserializer deserializer = - AndroidParsedDataDeserializer.withFilteredResources( - ImmutableList.of("the/boojum", "values/ids.xml", "layout/banker.xml")); - - KeyValueConsumers primary = - KeyValueConsumers.of( - TestMapConsumer.ofResources(), // overwriting - TestMapConsumer.ofResources(), // combining - null // assets - ); - - deserializer.read(binaryPath, primary); - Truth.assertThat(primary.overwritingConsumer).isEqualTo(Collections.emptyMap()); - Truth.assertThat(primary.combiningConsumer).isEqualTo(Collections.emptyMap()); - } - - private static class TestMapConsumer - implements ParsedAndroidData.KeyValueConsumer, Map { - - Map target; - - static TestMapConsumer ofAssets() { - return new TestMapConsumer<>(new HashMap()); - } - - static TestMapConsumer ofResources() { - return new TestMapConsumer<>(new HashMap()); - } - - public TestMapConsumer(Map target) { - this.target = target; - } - - @Override - public void accept(DataKey key, T value) { - target.put(key, value); - } - - @Override - public int size() { - return target.size(); - } - - @Override - public boolean isEmpty() { - return target.isEmpty(); - } - - @Override - public boolean containsKey(Object key) { - return target.containsKey(key); - } - - @Override - public boolean containsValue(Object value) { - return target.containsValue(value); - } - - @Override - public T get(Object key) { - return target.get(key); - } - - @Override - public T put(DataKey key, T value) { - return target.put(key, value); - } - - @Override - public T remove(Object key) { - return target.remove(key); - } - - @Override - public void putAll(Map m) { - target.putAll(m); - } - - @Override - public void clear() { - target.clear(); - } - - @Override - public Set keySet() { - return target.keySet(); - } - - @Override - public Collection values() { - return target.values(); - } - - @Override - public Set> entrySet() { - return target.entrySet(); - } - - @Override - public boolean equals(Object o) { - return target.equals(o); - } - - @Override - public int hashCode() { - return target.hashCode(); - } - - @Override - public String toString() { - return MoreObjects.toStringHelper(this).add("target", target).toString(); - } - } -} diff --git a/src/test/java/com/google/devtools/build/android/AndroidDataWriterTest.java b/src/test/java/com/google/devtools/build/android/AndroidDataWriterTest.java deleted file mode 100644 index cd5a5a991e800d..00000000000000 --- a/src/test/java/com/google/devtools/build/android/AndroidDataWriterTest.java +++ /dev/null @@ -1,368 +0,0 @@ -// Copyright 2017 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -package com.google.devtools.build.android; - -import static com.google.common.truth.Truth.assertAbout; - -import com.google.common.collect.ImmutableMap; -import com.google.common.jimfs.Jimfs; -import com.google.common.truth.Subject; -import com.google.common.util.concurrent.MoreExecutors; -import java.nio.file.FileSystem; -import java.nio.file.Files; -import java.nio.file.Path; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -/** Tests for the AndroidDataWriter. */ -@RunWith(JUnit4.class) -public class AndroidDataWriterTest { - - private static final String START_RESOURCES = - new String(AndroidDataWriter.PRELUDE) + "", - "") - .addResource( - "values/stubs.xml", - AndroidDataBuilder.ResourceType.VALUE, - "") - .createManifest("AndroidManifest.xml", "com.carroll.lewis", "") - .buildParsed(); - MergedAndroidData actual = - UnwrittenMergedAndroidData.of( - source.resolve("AndroidManifest.xml"), direct, ParsedAndroidDataBuilder.empty()) - .write(mergedDataWriter); - - assertAbout(paths).that(actual.getManifest()).exists(); - assertAbout(paths).that(actual.getResourceDir().resolve("values/values.xml")).exists(); - assertAbout(paths) - .that(actual.getResourceDir().resolve("values/values.xml")) - .xmlContentsIsEqualTo( - START_RESOURCES + ">", - "", - "", - "", - "", - "", - END_RESOURCES); - } - - @Test - public void writeResourceXmlWithQualfiers() throws Exception { - Path target = fs.getPath("target"); - Path source = fs.getPath("source"); - AndroidDataWriter mergedDataWriter = AndroidDataWriter.createWithDefaults(target); - ParsedAndroidData direct = - AndroidDataBuilder.of(source) - .addResource( - "values/ids.xml", - AndroidDataBuilder.ResourceType.VALUE, - "") - .addResource( - "values-en/ids.xml", - AndroidDataBuilder.ResourceType.VALUE, - "") - .createManifest("AndroidManifest.xml", "com.carroll.lewis", "") - .buildParsed(); - MergedAndroidData actual = - UnwrittenMergedAndroidData.of( - source.resolve("AndroidManifest.xml"), direct, ParsedAndroidDataBuilder.empty()) - .write(mergedDataWriter); - - assertAbout(paths).that(actual.getManifest()).exists(); - assertAbout(paths).that(actual.getResourceDir().resolve("values/values.xml")).exists(); - assertAbout(paths) - .that(actual.getResourceDir().resolve("values/values.xml")) - .xmlContentsIsEqualTo( - START_RESOURCES + ">", - "", - END_RESOURCES); - assertAbout(paths).that(actual.getResourceDir().resolve("values-en/values.xml")).exists(); - assertAbout(paths) - .that(actual.getResourceDir().resolve("values-en/values.xml")) - .xmlContentsIsEqualTo( - START_RESOURCES + ">", - "", - END_RESOURCES); - } - - @Test - public void writePublicResourceSameNameDifferentType() throws Exception { - Path target = fs.getPath("target"); - Path source = fs.getPath("source"); - AndroidDataWriter mergedDataWriter = AndroidDataWriter.createWithDefaults(target); - ParsedAndroidData direct = - AndroidDataBuilder.of(source) - .addResource( - "values/integers.xml", - AndroidDataBuilder.ResourceType.VALUE, - "12345", - "", - "54321", - "") - .addResource( - "values/strings.xml", - AndroidDataBuilder.ResourceType.VALUE, - "meow", - "") - .createManifest("AndroidManifest.xml", "com.carroll.lewis", "") - .buildParsed(); - MergedAndroidData actual = - UnwrittenMergedAndroidData.of( - source.resolve("AndroidManifest.xml"), direct, ParsedAndroidDataBuilder.empty()) - .write(mergedDataWriter); - - assertAbout(paths).that(actual.getManifest()).exists(); - assertAbout(paths).that(actual.getResourceDir().resolve("values/values.xml")).exists(); - assertAbout(paths) - .that(actual.getResourceDir().resolve("values/values.xml")) - .xmlContentsIsEqualTo( - START_RESOURCES + ">", - "", - "12345", - "54321", - "", - "meow", - "", - "", - "", - "", - END_RESOURCES); - } - - @Test - public void writeWithIDDuplicates() throws Exception { - // We parse IDs from layout, etc. XML. We can include it in the merged values.xml redundantly - // (redundant because we also give aapt the original layout xml, which it can parse for IDs - // too), but make sure we don't accidentally put multiple copies in the merged values.xml file. - // Otherwise, aapt will throw an error if there are duplicates in the same values.xml file. - Path target = fs.getPath("target"); - Path source = fs.getPath("source"); - AndroidDataWriter mergedDataWriter = AndroidDataWriter.createWithDefaults(target); - ParsedAndroidData direct = - AndroidDataBuilder.of(source) - .addResource( - "layout/some_layout.xml", - AndroidDataBuilder.ResourceType.LAYOUT, - "", - // Test redundantly having a "+id/MyTextView" in a different attribute. - "") - // Test what happens if a user accidentally uses the same ID in multiple layouts too. - .addResource( - "layout/another_layout.xml", - AndroidDataBuilder.ResourceType.LAYOUT, - "") - // Also check what happens if a value XML file also contains the same ID. - .addResource( - "values/ids.xml", - AndroidDataBuilder.ResourceType.VALUE, - "", - "") - .addResource( - "values/strings.xml", - AndroidDataBuilder.ResourceType.VALUE, - "I has a bucket") - .createManifest("AndroidManifest.xml", "com.carroll.lewis", "") - .buildParsed(); - MergedAndroidData actual = - UnwrittenMergedAndroidData.of( - source.resolve("AndroidManifest.xml"), direct, ParsedAndroidDataBuilder.empty()) - .write(mergedDataWriter); - - assertAbout(paths).that(actual.getManifest()).exists(); - assertAbout(paths).that(actual.getResourceDir().resolve("layout/some_layout.xml")).exists(); - assertAbout(paths).that(actual.getResourceDir().resolve("values/values.xml")).exists(); - assertAbout(paths) - .that(actual.getResourceDir().resolve("values/values.xml")) - .xmlContentsIsEqualTo( - START_RESOURCES + ">", - "", - "", - "", - "", - "I has a bucket", - END_RESOURCES); - } - - @Test - public void writeResourceXmlWithAttributes() throws Exception { - Path target = fs.getPath("target"); - Path source = fs.getPath("source"); - AndroidDataWriter mergedDataWriter = AndroidDataWriter.createWithDefaults(target); - ParsedAndroidData direct = - AndroidDataBuilder.of(source) - .addValuesWithAttributes( - "values/ids.xml", - ImmutableMap.of("foo", "fooVal", "bar", "barVal"), - "", - "") - .addValuesWithAttributes( - "values/stubs.xml", - ImmutableMap.of("baz", "bazVal"), - "") - .createManifest("AndroidManifest.xml", "com.carroll.lewis", "") - .buildParsed(); - MergedAndroidData actual = - UnwrittenMergedAndroidData.of( - source.resolve("AndroidManifest.xml"), direct, ParsedAndroidDataBuilder.empty()) - .write(mergedDataWriter); - - assertAbout(paths).that(actual.getManifest()).exists(); - assertAbout(paths).that(actual.getResourceDir().resolve("values/values.xml")).exists(); - assertAbout(paths) - .that(actual.getResourceDir().resolve("values/values.xml")) - .xmlContentsIsEqualTo( - START_RESOURCES + " foo=\"fooVal\" bar=\"barVal\" baz=\"bazVal\">", - "", - "", - "", - "", - "", - END_RESOURCES); - } - - @Test - public void writeAssetFile() throws Exception { - Path target = fs.getPath("target"); - Path source = fs.getPath("source"); - AndroidDataWriter mergedDataWriter = AndroidDataWriter.createWithDefaults(target); - String asset = "hunting/of/the/boojum"; - ParsedAndroidData direct = - AndroidDataBuilder.of(source) - .addAsset(asset, "not a snark!") - .createManifest("AndroidManifest.xml", "com.carroll.lewis", "") - .buildParsed(); - MergedAndroidData actual = - UnwrittenMergedAndroidData.of( - source.resolve("AndroidManifest.xml"), direct, ParsedAndroidDataBuilder.empty()) - .write(mergedDataWriter); - - assertAbout(paths).that(actual.getManifest()).exists(); - assertAbout(paths).that(actual.getAssetDir().resolve(asset)).exists(); - } - - private static final Subject.Factory paths = PathsSubject::new; -} diff --git a/src/test/java/com/google/devtools/build/android/AndroidManifestTest.java b/src/test/java/com/google/devtools/build/android/AndroidManifestTest.java deleted file mode 100644 index 175bb6530652b4..00000000000000 --- a/src/test/java/com/google/devtools/build/android/AndroidManifestTest.java +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright 2018 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -package com.google.devtools.build.android; - -import static java.nio.file.StandardOpenOption.CREATE_NEW; - -import com.google.common.collect.ImmutableList; -import com.google.common.jimfs.Jimfs; -import com.google.common.truth.Truth; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.FileSystem; -import java.nio.file.Files; -import java.nio.file.Path; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -/** Tests for the AndroidManifest class */ -@RunWith(JUnit4.class) -public class AndroidManifestTest { - - private FileSystem fileSystem; - - @Before - public void setUp() throws Exception { - fileSystem = Jimfs.newFileSystem(); - } - - @Test - public void parseMinSdkAndPackageName() throws Exception { - final String packageName = "com.google.wooga"; - final String minSdk = "26"; - final AndroidManifest androidManifest = - AndroidManifest.parseFrom(manifest(packageName, minSdk).write(fileSystem.getPath("tmp"))); - Truth.assertThat(androidManifest).isEqualTo(AndroidManifest.of(packageName, minSdk)); - } - - @Test - public void parseMissingMinSdk() throws Exception { - final String packageName = "com.google.wooga"; - final AndroidManifest androidManifest = - AndroidManifest.parseFrom(manifest(packageName).write(fileSystem.getPath("tmp"))); - - Truth.assertThat(androidManifest).isEqualTo(AndroidManifest.of(packageName, "1")); - } - - @Test - public void writeDummyManifestWithoutPlaceholdersNoMinSdk() throws Exception { - final String packageName = "${applicationId}.wooga"; - final String packageForR = "com.google.android.wooga"; - final AndroidManifest androidManifest = - AndroidManifest.parseFrom(manifest(packageName).write(fileSystem.getPath("tmp"))); - - Truth.assertThat( - Files.readAllLines( - androidManifest.writeDummyManifestForAapt( - fileSystem.getPath("dummy-manifest"), packageForR), - StandardCharsets.UTF_8)) - .containsExactly( - "", - "", - "", - "", - "") - .inOrder(); - } - - @Test - public void writeDummyManifestWithoutPlaceholdersAndMinSdk() throws Exception { - final String packageName = "${applicationId}.wooga"; - final String packageForR = "com.google.android.wooga"; - final AndroidManifest androidManifest = - AndroidManifest.parseFrom(manifest(packageName, "26").write(fileSystem.getPath("tmp"))); - - Truth.assertThat( - Files.readAllLines( - androidManifest.writeDummyManifestForAapt( - fileSystem.getPath("dummy-manifest"), packageForR), - StandardCharsets.UTF_8)) - .containsExactly( - "", - "", - "", - "", - "") - .inOrder(); - } - - private static Manifest manifest(String pkg) { - return manifest(pkg, ""); - } - - private static Manifest manifest(String pkg, String minSdk, String... lines) { - return parent -> - Files.write( - Files.createDirectories(parent).resolve("AndroidManifest.xml"), - ImmutableList.builder() - .add( - "", - "", pkg), - "", - (minSdk == null || minSdk.isEmpty()) - ? "" - : String.format("", minSdk)) - .add(lines) - .add("", "") - .build(), - CREATE_NEW); - } - - private interface Manifest { - Path write(Path parent) throws IOException; - } -} diff --git a/src/test/java/com/google/devtools/build/android/AndroidOptionsUtilsTest.java b/src/test/java/com/google/devtools/build/android/AndroidOptionsUtilsTest.java deleted file mode 100644 index 9fcf294725be13..00000000000000 --- a/src/test/java/com/google/devtools/build/android/AndroidOptionsUtilsTest.java +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2024 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -package com.google.devtools.build.android; - -import static com.google.common.truth.Truth.assertThat; - -import com.beust.jcommander.JCommander; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -@RunWith(JUnit4.class) -public final class AndroidOptionsUtilsTest { - private TestOptions options; - private JCommander jc; - - @Before - public void setUp() { - options = new TestOptions(); - jc = new JCommander(options); - } - - @Test - public void testNormalizeFalseBoolean() { - String[] args = {"--nofoo"}; - String[] normalizedArgs = AndroidOptionsUtils.normalizeBooleanOptions(options, args); - assertThat(normalizedArgs[0]).isEqualTo("--foo=false"); - jc.parse(normalizedArgs); - assertThat(options.foo).isFalse(); - } - - @Test - public void testNormalizeTrueBoolean() { - String[] args = {"--foo"}; - String[] normalizedArgs = AndroidOptionsUtils.normalizeBooleanOptions(options, args); - assertThat(normalizedArgs[0]).isEqualTo("--foo=true"); - jc.parse(normalizedArgs); - assertThat(options.foo).isTrue(); - } - - @Test - public void testNormalizeNoBoolean() { - String[] args = {"--normalize"}; - String[] normalizedArgs = AndroidOptionsUtils.normalizeBooleanOptions(options, args); - assertThat(normalizedArgs[0]).isEqualTo("--normalize=true"); - jc.parse(normalizedArgs); - assertThat(options.normalize).isTrue(); - } - - @Test - public void testNormalizeNoNoBoolean() { - String[] args = {"--nonormalize"}; - String[] normalizedArgs = AndroidOptionsUtils.normalizeBooleanOptions(options, args); - assertThat(normalizedArgs[0]).isEqualTo("--normalize=false"); - jc.parse(normalizedArgs); - assertThat(options.normalize).isFalse(); - } -} diff --git a/src/test/java/com/google/devtools/build/android/AndroidResourceClassWriterTest.java b/src/test/java/com/google/devtools/build/android/AndroidResourceClassWriterTest.java deleted file mode 100644 index 6ce233f7b7bc09..00000000000000 --- a/src/test/java/com/google/devtools/build/android/AndroidResourceClassWriterTest.java +++ /dev/null @@ -1,635 +0,0 @@ -// Copyright 2017 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -package com.google.devtools.build.android; - -import static com.google.common.truth.Truth.assertAbout; -import static com.google.common.truth.Truth.assertThat; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.jimfs.Jimfs; -import com.google.common.truth.Subject; -import com.google.devtools.build.android.resources.JavaIdentifierValidator.InvalidJavaIdentifier; -import java.io.IOException; -import java.nio.file.FileSystem; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.logging.Handler; -import java.util.logging.LogRecord; -import java.util.logging.Logger; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -/** Tests for {@link AndroidResourceClassWriter}. */ -@RunWith(JUnit4.class) -public class AndroidResourceClassWriterTest { - - private FileSystem fs; - private TestLoggingHandler loggingHandler; - - @Rule public final ExpectedException thrown = ExpectedException.none(); - - private static final AndroidFrameworkAttrIdProvider mockAndroidFrameworkIds = - new MockAndroidFrameworkAttrIdProvider(ImmutableMap.of()); - - @Before - public void createCleanEnvironment() { - fs = Jimfs.newFileSystem(); - loggingHandler = new TestLoggingHandler(); - Logger.getLogger(PlaceholderIdFieldInitializerBuilder.class.getCanonicalName()) - .addHandler(loggingHandler); - } - - @After - public void removeLoggingHandler() { - Logger.getLogger(PlaceholderIdFieldInitializerBuilder.class.getCanonicalName()) - .removeHandler(loggingHandler); - } - - @Test - public void simpleIdFromLayout() throws Exception { - Path target = fs.getPath("target"); - Path source = fs.getPath("source"); - AndroidResourceClassWriter resourceClassWriter = - AndroidResourceClassWriter.of(mockAndroidFrameworkIds, target, "com.carroll.lewis"); - ParsedAndroidData direct = - AndroidDataBuilder.of(source) - .addResource( - "layout/some_layout.xml", - AndroidDataBuilder.ResourceType.LAYOUT, - "", - "