From 5abf4ed4dc9fc134e47f9b56e3b65ba26d0ba9f0 Mon Sep 17 00:00:00 2001 From: Googler Date: Thu, 13 Jul 2017 19:50:00 +0200 Subject: Add flag to turn Android resource merge conflicts from warnings into errors RELNOTES: none PiperOrigin-RevId: 161831232 --- .../build/android/AndroidDataMergerTest.java | 106 ++++++++++++++------- .../build/lib/rules/android/AndroidBinaryTest.java | 18 ++++ 2 files changed, 91 insertions(+), 33 deletions(-) (limited to 'src/test/java') diff --git a/src/test/java/com/google/devtools/build/android/AndroidDataMergerTest.java b/src/test/java/com/google/devtools/build/android/AndroidDataMergerTest.java index 1444b83fd6..e28d65ceb3 100644 --- a/src/test/java/com/google/devtools/build/android/AndroidDataMergerTest.java +++ b/src/test/java/com/google/devtools/build/android/AndroidDataMergerTest.java @@ -25,6 +25,7 @@ import com.google.common.jimfs.Jimfs; import com.google.common.truth.FailureStrategy; import com.google.common.truth.SubjectFactory; import com.google.devtools.build.android.AndroidDataBuilder.ResourceType; +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; @@ -102,7 +103,7 @@ public class AndroidDataMergerTest { AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, false); + merger.merge(transitiveDependency, directDependency, primary, false, true); UnwrittenMergedAndroidData expected = UnwrittenMergedAndroidData.of( @@ -161,7 +162,7 @@ public class AndroidDataMergerTest { AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, false); + merger.merge(transitiveDependency, directDependency, primary, false, true); UnwrittenMergedAndroidData expected = UnwrittenMergedAndroidData.of( @@ -226,7 +227,7 @@ public class AndroidDataMergerTest { AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); UnwrittenMergedAndroidData transitive = - merger.merge(transitiveDependency, directDependency, primary, false); + merger.merge(transitiveDependency, directDependency, primary, false, true); UnwrittenMergedAndroidData expected = UnwrittenMergedAndroidData.of( @@ -276,7 +277,7 @@ public class AndroidDataMergerTest { AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - merger.merge(transitiveDependency, directDependency, primary, false); + merger.merge(transitiveDependency, directDependency, primary, false, false); assertThat(loggingHandler.warnings) .containsExactly( @@ -325,7 +326,7 @@ public class AndroidDataMergerTest { }); assertAbout(unwrittenMergedAndroidData) - .that(merger.merge(transitiveDependency, directDependency, primary, false)) + .that(merger.merge(transitiveDependency, directDependency, primary, false, true)) .isEqualTo( UnwrittenMergedAndroidData.of( primary.getManifest(), @@ -367,7 +368,7 @@ public class AndroidDataMergerTest { .buildUnvalidated(); AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - merger.merge(transitiveDependency, directDependency, primary, false); + merger.merge(transitiveDependency, directDependency, primary, false, true); assertThat(loggingHandler.warnings).isEmpty(); } @@ -402,7 +403,7 @@ public class AndroidDataMergerTest { AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, true); + merger.merge(transitiveDependency, directDependency, primary, true, true); UnwrittenMergedAndroidData expected = UnwrittenMergedAndroidData.of( primary.getManifest(), @@ -442,7 +443,7 @@ public class AndroidDataMergerTest { AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - merger.merge(transitiveDependency, directDependency, primary, false); + merger.merge(transitiveDependency, directDependency, primary, false, false); assertThat(loggingHandler.warnings) .containsExactly( @@ -489,7 +490,7 @@ public class AndroidDataMergerTest { AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, true); + merger.merge(transitiveDependency, directDependency, primary, true, true); UnwrittenMergedAndroidData expected = UnwrittenMergedAndroidData.of( primary.getManifest(), @@ -533,7 +534,7 @@ public class AndroidDataMergerTest { AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - merger.merge(transitiveDependency, directDependency, primary, false); + merger.merge(transitiveDependency, directDependency, primary, false, false); assertThat(loggingHandler.warnings) .containsExactly( MergeConflict.of( @@ -578,22 +579,61 @@ public class AndroidDataMergerTest { AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - merger.merge(transitiveDependency, directDependency, primary, false); + merger.merge(transitiveDependency, directDependency, primary, false, false); FullyQualifiedName fullyQualifiedName = fqnFactory.parse("string/exit"); assertThat(loggingHandler.warnings) .containsExactly( MergeConflict.of( - fullyQualifiedName, - DataResourceXml.createWithNoNamespace( - directRoot.resolve("res/values/strings.xml"), - SimpleXmlResourceValue.createWithValue(Type.STRING, "no way out")), - DataResourceXml.createWithNoNamespace( - transitiveRoot.resolve("res/values/strings.xml"), - SimpleXmlResourceValue.createWithValue(Type.STRING, "wrong way out"))) + fullyQualifiedName, + DataResourceXml.createWithNoNamespace( + directRoot.resolve("res/values/strings.xml"), + SimpleXmlResourceValue.createWithValue(Type.STRING, "no way out")), + DataResourceXml.createWithNoNamespace( + transitiveRoot.resolve("res/values/strings.xml"), + SimpleXmlResourceValue.createWithValue(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(Type.STRING, "no way out"))) + .build(); + + ParsedAndroidData directDependency = + ParsedAndroidDataBuilder.buildOn(directRoot, fqnFactory) + .overwritable( + xml("string/exit") + .source("values/strings.xml") + .value(SimpleXmlResourceValue.createWithValue(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"); @@ -629,7 +669,7 @@ public class AndroidDataMergerTest { UnwrittenMergedAndroidData data = AndroidDataMerger.createWithDefaults() - .merge(transitiveDependency, directDependency, primary, true); + .merge(transitiveDependency, directDependency, primary, true, true); UnwrittenMergedAndroidData expected = UnwrittenMergedAndroidData.of( @@ -667,7 +707,7 @@ public class AndroidDataMergerTest { .buildUnvalidated(); AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - merger.merge(transitiveDependency, directDependency, primary, false); + merger.merge(transitiveDependency, directDependency, primary, false, false); assertThat(loggingHandler.warnings) .containsExactly( @@ -699,7 +739,7 @@ public class AndroidDataMergerTest { AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, false); + merger.merge(transitiveDependency, directDependency, primary, false, true); UnwrittenMergedAndroidData expected = UnwrittenMergedAndroidData.of( @@ -753,7 +793,7 @@ public class AndroidDataMergerTest { AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, false); + merger.merge(transitiveDependency, directDependency, primary, false, true); UnwrittenMergedAndroidData expected = UnwrittenMergedAndroidData.of( @@ -816,7 +856,7 @@ public class AndroidDataMergerTest { AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, false); + merger.merge(transitiveDependency, directDependency, primary, false, true); UnwrittenMergedAndroidData expected = UnwrittenMergedAndroidData.of( @@ -885,7 +925,7 @@ public class AndroidDataMergerTest { AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, false); + merger.merge(transitiveDependency, directDependency, primary, false, true); UnwrittenMergedAndroidData expected = UnwrittenMergedAndroidData.of( @@ -948,7 +988,7 @@ public class AndroidDataMergerTest { AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, false); + merger.merge(transitiveDependency, directDependency, primary, false, true); UnwrittenMergedAndroidData expected = UnwrittenMergedAndroidData.of( @@ -996,7 +1036,7 @@ public class AndroidDataMergerTest { AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, false); + merger.merge(transitiveDependency, directDependency, primary, false, true); UnwrittenMergedAndroidData expected = UnwrittenMergedAndroidData.of( @@ -1034,7 +1074,7 @@ public class AndroidDataMergerTest { AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - merger.merge(transitiveDependency, directDependency, primary, false); + merger.merge(transitiveDependency, directDependency, primary, false, false); assertThat(loggingHandler.warnings) .containsExactly( MergeConflict.of( @@ -1073,7 +1113,7 @@ public class AndroidDataMergerTest { AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, true); + merger.merge(transitiveDependency, directDependency, primary, true, true); UnwrittenMergedAndroidData expected = UnwrittenMergedAndroidData.of( primary.getManifest(), @@ -1109,7 +1149,7 @@ public class AndroidDataMergerTest { AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - merger.merge(transitiveDependency, directDependency, primary, false); + merger.merge(transitiveDependency, directDependency, primary, false, false); assertThat(loggingHandler.warnings) .containsExactly( MergeConflict.of( @@ -1140,7 +1180,7 @@ public class AndroidDataMergerTest { AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); UnwrittenMergedAndroidData data = - merger.merge(transitiveDependency, directDependency, primary, true); + merger.merge(transitiveDependency, directDependency, primary, true, true); UnwrittenMergedAndroidData expected = UnwrittenMergedAndroidData.of( primary.getManifest(), @@ -1174,7 +1214,7 @@ public class AndroidDataMergerTest { AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - merger.merge(transitiveDependency, directDependency, primary, false); + merger.merge(transitiveDependency, directDependency, primary, false, false); assertThat(loggingHandler.warnings) .containsExactly( MergeConflict.of( @@ -1209,7 +1249,7 @@ public class AndroidDataMergerTest { AndroidDataMerger merger = AndroidDataMerger.createWithDefaults(); - merger.merge(transitiveDependency, directDependency, primary, false); + merger.merge(transitiveDependency, directDependency, primary, false, false); assertThat(loggingHandler.warnings) .containsExactly( MergeConflict.of( @@ -1248,7 +1288,7 @@ public class AndroidDataMergerTest { UnwrittenMergedAndroidData data = AndroidDataMerger.createWithDefaults() - .merge(transitiveDependency, directDependency, primary, true); + .merge(transitiveDependency, directDependency, primary, true, true); UnwrittenMergedAndroidData expected = UnwrittenMergedAndroidData.of( diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java index 9be5e5ca7f..704d6a4ee9 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java @@ -1569,6 +1569,24 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { } } + @Test + public void testThrowOnResourceConflictFlagGetsPropagated() throws Exception { + scratch.file( + "java/r/android/BUILD", + "android_binary(", + " name = 'r',", + " manifest = 'AndroidManifest.xml',", + " resource_files = ['res/values/foo.xml'],", + ")"); + useConfiguration("--experimental_android_throw_on_resource_conflict"); + ConfiguredTarget binary = getConfiguredTarget("//java/r/android:r"); + + List resourceProcessingArgs = + resourceGeneratingAction(getResourceContainer(binary)).getArguments(); + + assertThat(resourceProcessingArgs).contains("--throwOnResourceConflict"); + } + /** * Gets the paths of matching artifacts contained within a resource container * -- cgit v1.2.3