diff options
author | corysmith <corysmith@google.com> | 2018-08-06 09:03:18 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-08-06 09:05:02 -0700 |
commit | 1bb38e101456cd610d0a692595700197a21ce1df (patch) | |
tree | a5db5da9f427313fa724d3c30b566ec6ca2c2a30 /src/test | |
parent | e74c1e91e68ce7c8eca6ab62100647d4b49f4597 (diff) |
Move maybeAddProvider to be part of the EnabledDataBindingContext.
RELNOTES: None
PiperOrigin-RevId: 207553449
Diffstat (limited to 'src/test')
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingTest.java | 255 |
1 files changed, 189 insertions, 66 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingTest.java index cc78d474ad..9892da364e 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingTest.java @@ -18,6 +18,7 @@ import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.getFirs import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; +import com.google.common.truth.Truth; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.extra.JavaCompileInfo; import com.google.devtools.build.lib.actions.util.ActionsTestUtil; @@ -26,17 +27,17 @@ import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.rules.java.JavaCompileAction; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; -/** - * Tests for Bazel's Android data binding support. - */ +/** Tests for Bazel's Android data binding support. */ @RunWith(JUnit4.class) public class AndroidDataBindingTest extends AndroidBuildViewTestCase { private void writeDataBindingFiles() throws Exception { - scratch.file("java/android/library/BUILD", + scratch.file( + "java/android/library/BUILD", "android_library(", " name = 'lib_with_data_binding',", " enable_data_binding = 1,", @@ -44,9 +45,10 @@ public class AndroidDataBindingTest extends AndroidBuildViewTestCase { " srcs = ['MyLib.java'],", " resource_files = [],", ")"); - scratch.file("java/android/library/MyLib.java", - "package android.library; public class MyLib {};"); - scratch.file("java/android/binary/BUILD", + scratch.file( + "java/android/library/MyLib.java", "package android.library; public class MyLib {};"); + scratch.file( + "java/android/binary/BUILD", "android_binary(", " name = 'app',", " enable_data_binding = 1,", @@ -54,12 +56,13 @@ public class AndroidDataBindingTest extends AndroidBuildViewTestCase { " srcs = ['MyApp.java'],", " deps = ['//java/android/library:lib_with_data_binding'],", ")"); - scratch.file("java/android/binary/MyApp.java", - "package android.binary; public class MyApp {};"); + scratch.file( + "java/android/binary/MyApp.java", "package android.binary; public class MyApp {};"); } private void writeDataBindingFilesWithNoResourcesDep() throws Exception { - scratch.file("java/android/lib_with_resource_files/BUILD", + scratch.file( + "java/android/lib_with_resource_files/BUILD", "android_library(", " name = 'lib_with_resource_files',", " enable_data_binding = 1,", @@ -67,20 +70,24 @@ public class AndroidDataBindingTest extends AndroidBuildViewTestCase { " srcs = ['LibWithResourceFiles.java'],", " resource_files = glob(['res/**']),", ")"); - scratch.file("java/android/lib_with_resource_files/LibWithResourceFiles.java", + scratch.file( + "java/android/lib_with_resource_files/LibWithResourceFiles.java", "package android.lib_with_resource_files; public class LibWithResourceFiles {};"); - scratch.file("java/android/lib_no_resource_files/BUILD", + scratch.file( + "java/android/lib_no_resource_files/BUILD", "android_library(", " name = 'lib_no_resource_files',", " enable_data_binding = 1,", " srcs = ['LibNoResourceFiles.java'],", " deps = ['//java/android/lib_with_resource_files'],", ")"); - scratch.file("java/android/lib_no_resource_files/LibNoResourceFiles.java", + scratch.file( + "java/android/lib_no_resource_files/LibNoResourceFiles.java", "package android.lib_no_resource_files; public class LibNoResourceFiles {};"); - scratch.file("java/android/binary/BUILD", + scratch.file( + "java/android/binary/BUILD", "android_binary(", " name = 'app',", " enable_data_binding = 1,", @@ -88,8 +95,8 @@ public class AndroidDataBindingTest extends AndroidBuildViewTestCase { " srcs = ['MyApp.java'],", " deps = ['//java/android/lib_no_resource_files'],", ")"); - scratch.file("java/android/binary/MyApp.java", - "package android.binary; public class MyApp {};"); + scratch.file( + "java/android/binary/MyApp.java", "package android.binary; public class MyApp {};"); } @Test @@ -100,14 +107,15 @@ public class AndroidDataBindingTest extends AndroidBuildViewTestCase { // "Data binding"-enabled targets invoke resource processing with a request for data binding // output: - Artifact libResourceInfoOutput = getFirstArtifactEndingWith(allArtifacts, - "databinding/lib_with_data_binding/layout-info.zip"); + Artifact libResourceInfoOutput = + getFirstArtifactEndingWith( + allArtifacts, "databinding/lib_with_data_binding/layout-info.zip"); assertThat(getGeneratingSpawnActionArgs(libResourceInfoOutput)) .containsAllOf("--dataBindingInfoOut", libResourceInfoOutput.getExecPathString()) .inOrder(); - Artifact binResourceInfoOutput = getFirstArtifactEndingWith(allArtifacts, - "databinding/app/layout-info.zip"); + Artifact binResourceInfoOutput = + getFirstArtifactEndingWith(allArtifacts, "databinding/app/layout-info.zip"); assertThat(getGeneratingSpawnActionArgs(binResourceInfoOutput)) .containsAllOf("--dataBindingInfoOut", binResourceInfoOutput.getExecPathString()) .inOrder(); @@ -115,8 +123,10 @@ public class AndroidDataBindingTest extends AndroidBuildViewTestCase { // Java compilation includes the data binding annotation processor, the resource processor's // output, and the auto-generated DataBindingInfo.java the annotation processor uses to figure // out what to do: - JavaCompileAction libCompileAction = (JavaCompileAction) getGeneratingAction( - getFirstArtifactEndingWith(allArtifacts, "lib_with_data_binding.jar")); + JavaCompileAction libCompileAction = + (JavaCompileAction) + getGeneratingAction( + getFirstArtifactEndingWith(allArtifacts, "lib_with_data_binding.jar")); assertThat(libCompileAction.getProcessorNames()) .contains("android.databinding.annotationprocessor.ProcessDataBinding"); assertThat(ActionsTestUtil.prettyArtifactNames(libCompileAction.getInputs())) @@ -124,8 +134,9 @@ public class AndroidDataBindingTest extends AndroidBuildViewTestCase { "java/android/library/databinding/lib_with_data_binding/layout-info.zip", "java/android/library/databinding/lib_with_data_binding/DataBindingInfo.java"); - JavaCompileAction binCompileAction = (JavaCompileAction) getGeneratingAction( - getFirstArtifactEndingWith(allArtifacts, "app.jar")); + JavaCompileAction binCompileAction = + (JavaCompileAction) + getGeneratingAction(getFirstArtifactEndingWith(allArtifacts, "app.jar")); assertThat(binCompileAction.getProcessorNames()) .contains("android.databinding.annotationprocessor.ProcessDataBinding"); assertThat(ActionsTestUtil.prettyArtifactNames(binCompileAction.getInputs())) @@ -143,26 +154,32 @@ public class AndroidDataBindingTest extends AndroidBuildViewTestCase { // The library's compilation doesn't include any of the -setter_store.bin, layoutinfo.bin, etc. // files that store a dependency's data binding results (since the library has no deps). // We check that they don't appear as compilation inputs. - JavaCompileAction libCompileAction = (JavaCompileAction) - getGeneratingAction(getFirstArtifactEndingWith(allArtifacts, "lib_with_data_binding.jar")); + JavaCompileAction libCompileAction = + (JavaCompileAction) + getGeneratingAction( + getFirstArtifactEndingWith(allArtifacts, "lib_with_data_binding.jar")); assertThat( - Iterables.filter(libCompileAction.getInputs(), - ActionsTestUtil.getArtifactSuffixMatcher(".bin"))) + Iterables.filter( + libCompileAction.getInputs(), ActionsTestUtil.getArtifactSuffixMatcher(".bin"))) .isEmpty(); // The binary's compilation includes the library's data binding results. - JavaCompileAction binCompileAction = (JavaCompileAction) getGeneratingAction( - getFirstArtifactEndingWith(allArtifacts, "app.jar")); - Iterable<Artifact> depMetadataInputs = Iterables.filter( - binCompileAction.getInputs(), ActionsTestUtil.getArtifactSuffixMatcher(".bin")); - final String depMetadataBaseDir = Iterables.getFirst(depMetadataInputs, null).getExecPath() - .getParentDirectory().toString(); - ActionsTestUtil.execPaths(Iterables.filter( - binCompileAction.getInputs(), ActionsTestUtil.getArtifactSuffixMatcher(".bin"))); - assertThat(ActionsTestUtil.execPaths(depMetadataInputs)).containsExactly( - depMetadataBaseDir + "/android.library-android.library-setter_store.bin", - depMetadataBaseDir + "/android.library-android.library-layoutinfo.bin", - depMetadataBaseDir + "/android.library-android.library-br.bin"); + JavaCompileAction binCompileAction = + (JavaCompileAction) + getGeneratingAction(getFirstArtifactEndingWith(allArtifacts, "app.jar")); + Iterable<Artifact> depMetadataInputs = + Iterables.filter( + binCompileAction.getInputs(), ActionsTestUtil.getArtifactSuffixMatcher(".bin")); + final String depMetadataBaseDir = + Iterables.getFirst(depMetadataInputs, null).getExecPath().getParentDirectory().toString(); + ActionsTestUtil.execPaths( + Iterables.filter( + binCompileAction.getInputs(), ActionsTestUtil.getArtifactSuffixMatcher(".bin"))); + assertThat(ActionsTestUtil.execPaths(depMetadataInputs)) + .containsExactly( + depMetadataBaseDir + "/android.library-android.library-setter_store.bin", + depMetadataBaseDir + "/android.library-android.library-layoutinfo.bin", + depMetadataBaseDir + "/android.library-android.library-br.bin"); } @Test @@ -170,10 +187,15 @@ public class AndroidDataBindingTest extends AndroidBuildViewTestCase { writeDataBindingFiles(); ConfiguredTarget ctapp = getConfiguredTarget("//java/android/binary:app"); Set<Artifact> allArtifacts = actionsTestUtil().artifactClosureOf(getFilesToBuild(ctapp)); - JavaCompileAction binCompileAction = (JavaCompileAction) getGeneratingAction( - getFirstArtifactEndingWith(allArtifacts, "app.jar")); - String dataBindingFilesDir = targetConfig.getBinDirectory(RepositoryName.MAIN).getExecPath() - .getRelative("java/android/binary/databinding/app").getPathString(); + JavaCompileAction binCompileAction = + (JavaCompileAction) + getGeneratingAction(getFirstArtifactEndingWith(allArtifacts, "app.jar")); + String dataBindingFilesDir = + targetConfig + .getBinDirectory(RepositoryName.MAIN) + .getExecPath() + .getRelative("java/android/binary/databinding/app") + .getPathString(); ImmutableList<String> expectedJavacopts = ImmutableList.of( "-Aandroid.databinding.bindingBuildFolder=" + dataBindingFilesDir, @@ -202,24 +224,29 @@ public class AndroidDataBindingTest extends AndroidBuildViewTestCase { Set<Artifact> allArtifacts = actionsTestUtil().artifactClosureOf(getFilesToBuild(ct)); // Data binding resource processing outputs are expected for the app and libs with resources. - assertThat(getFirstArtifactEndingWith(allArtifacts, - "databinding/lib_with_resource_files/layout-info.zip")).isNotNull(); + assertThat( + getFirstArtifactEndingWith( + allArtifacts, "databinding/lib_with_resource_files/layout-info.zip")) + .isNotNull(); assertThat(getFirstArtifactEndingWith(allArtifacts, "databinding/app/layout-info.zip")) .isNotNull(); // Compiling the app's Java source includes data binding metadata from the resource-equipped // lib, but not the resource-empty one. - JavaCompileAction binCompileAction = (JavaCompileAction) getGeneratingAction( - getFirstArtifactEndingWith(allArtifacts, "app.jar")); + JavaCompileAction binCompileAction = + (JavaCompileAction) + getGeneratingAction(getFirstArtifactEndingWith(allArtifacts, "app.jar")); List<String> appJarInputs = ActionsTestUtil.prettyArtifactNames(binCompileAction.getInputs()); - String libWithResourcesMetadataBaseDir = "java/android/binary/databinding/app/" - + "dependent-lib-artifacts/java/android/lib_with_resource_files/databinding/" - + "lib_with_resource_files/bin-files/android.lib_with_resource_files-"; - assertThat(appJarInputs).containsAllOf( - "java/android/binary/databinding/app/layout-info.zip", - libWithResourcesMetadataBaseDir + "android.lib_with_resource_files-setter_store.bin", - libWithResourcesMetadataBaseDir + "android.lib_with_resource_files-layoutinfo.bin", - libWithResourcesMetadataBaseDir + "android.lib_with_resource_files-br.bin"); + String libWithResourcesMetadataBaseDir = + "java/android/binary/databinding/app/" + + "dependent-lib-artifacts/java/android/lib_with_resource_files/databinding/" + + "lib_with_resource_files/bin-files/android.lib_with_resource_files-"; + assertThat(appJarInputs) + .containsAllOf( + "java/android/binary/databinding/app/layout-info.zip", + libWithResourcesMetadataBaseDir + "android.lib_with_resource_files-setter_store.bin", + libWithResourcesMetadataBaseDir + "android.lib_with_resource_files-layoutinfo.bin", + libWithResourcesMetadataBaseDir + "android.lib_with_resource_files-br.bin"); for (String compileInput : appJarInputs) { assertThat(compileInput).doesNotMatch(".*lib_no_resource_files.*.bin"); } @@ -239,23 +266,27 @@ public class AndroidDataBindingTest extends AndroidBuildViewTestCase { assertThat(getFirstArtifactEndingWith(libArtifacts, "_resources.jar")).isNull(); assertThat(getFirstArtifactEndingWith(libArtifacts, "layout-info.zip")).isNull(); - JavaCompileAction libCompileAction = (JavaCompileAction) getGeneratingAction( - getFirstArtifactEndingWith(libArtifacts, "lib_no_resource_files.jar")); + JavaCompileAction libCompileAction = + (JavaCompileAction) + getGeneratingAction( + getFirstArtifactEndingWith(libArtifacts, "lib_no_resource_files.jar")); // The annotation processor is attached to the Java compilation: assertThat(paramFileArgsForAction(libCompileAction)) .containsAllOf( "--processors", "android.databinding.annotationprocessor.ProcessDataBinding"); // The dummy .java file with annotations that trigger the annotation process is present: assertThat(ActionsTestUtil.prettyArtifactNames(libCompileAction.getInputs())) - .contains("java/android/lib_no_resource_files/databinding/lib_no_resource_files/" - + "DataBindingInfo.java"); + .contains( + "java/android/lib_no_resource_files/databinding/lib_no_resource_files/" + + "DataBindingInfo.java"); } @Test public void missingDataBindingAttributeStillAnalyzes() throws Exception { // When a library is missing enable_data_binding = 1, we expect it to fail in execution (because // aapt doesn't know how to read the data binding expressions). But analysis should work. - scratch.file("java/android/library/BUILD", + scratch.file( + "java/android/library/BUILD", "android_library(", " name = 'lib_with_data_binding',", " enable_data_binding = 1,", @@ -263,9 +294,10 @@ public class AndroidDataBindingTest extends AndroidBuildViewTestCase { " srcs = ['MyLib.java'],", " resource_files = [],", ")"); - scratch.file("java/android/library/MyLib.java", - "package android.library; public class MyLib {};"); - scratch.file("java/android/binary/BUILD", + scratch.file( + "java/android/library/MyLib.java", "package android.library; public class MyLib {};"); + scratch.file( + "java/android/binary/BUILD", "android_binary(", " name = 'app',", " enable_data_binding = 0,", @@ -273,8 +305,99 @@ public class AndroidDataBindingTest extends AndroidBuildViewTestCase { " srcs = ['MyApp.java'],", " deps = ['//java/android/library:lib_with_data_binding'],", ")"); - scratch.file("java/android/binary/MyApp.java", - "package android.binary; public class MyApp {};"); + scratch.file( + "java/android/binary/MyApp.java", "package android.binary; public class MyApp {};"); assertThat(getConfiguredTarget("//java/android/binary:app")).isNotNull(); } + + @Test + public void dataBindingProviderIsProvided() throws Exception { + scratch.file( + "sdk/BUILD", + "android_sdk(", + " name = 'sdk',", + " aapt = 'aapt',", + " aapt2 = 'aapt2',", + " adb = 'adb',", + " aidl = 'aidl',", + " android_jar = 'android.jar',", + " apksigner = 'apksigner',", + " dx = 'dx',", + " framework_aidl = 'framework_aidl',", + " main_dex_classes = 'main_dex_classes',", + " main_dex_list_creator = 'main_dex_list_creator',", + " proguard = 'proguard',", + " shrinked_android_jar = 'shrinked_android_jar',", + " zipalign = 'zipalign')"); + scratch.file( + "java/a/BUILD", + "android_library(", + " name = 'a', ", + " srcs = ['A.java'],", + " enable_data_binding = 1,", + " manifest = 'a/AndroidManifest.xml',", + " resource_files = [ 'res/values/a.xml' ]", + ")"); + + useConfiguration("--android_sdk=//sdk:sdk"); + ConfiguredTarget a = getConfiguredTarget("//java/a:a"); + final UsesDataBindingProvider usesDataBindingProvider = a.get(UsesDataBindingProvider.PROVIDER); + + Truth.assertThat(usesDataBindingProvider) + .named(UsesDataBindingProvider.PROVIDER_NAME) + .isNotNull(); + + Truth.assertThat( + usesDataBindingProvider + .getMetadataOutputs() + .stream() + .map(Artifact::getRootRelativePathString) + .collect(Collectors.toList())) + .containsExactly( + "java/a/databinding/a/bin-files/a-a-setter_store.bin", + "java/a/databinding/a/bin-files/a-a-layoutinfo.bin", + "java/a/databinding/a/bin-files/a-a-br.bin"); + } + + @Test + public void ensureDataBindingProviderIsPropagatedThroughNonDataBindingLibs() throws Exception { + scratch.file( + "sdk/BUILD", + "android_sdk(", + " name = 'sdk',", + " aapt = 'aapt',", + " aapt2 = 'aapt2',", + " adb = 'adb',", + " aidl = 'aidl',", + " android_jar = 'android.jar',", + " apksigner = 'apksigner',", + " dx = 'dx',", + " framework_aidl = 'framework_aidl',", + " main_dex_classes = 'main_dex_classes',", + " main_dex_list_creator = 'main_dex_list_creator',", + " proguard = 'proguard',", + " shrinked_android_jar = 'shrinked_android_jar',", + " zipalign = 'zipalign')"); + scratch.file( + "java/a/BUILD", + "android_library(", + " name = 'a', ", + " srcs = ['A.java'],", + " enable_data_binding = 1,", + " manifest = 'a/AndroidManifest.xml',", + " resource_files = [ 'res/values/a.xml' ]", + ")"); + scratch.file( + "java/b/BUILD", + "android_library(", + " name = 'b', ", + " srcs = ['A.java'],", + " deps = [ '//java/a:a' ]", + ")"); + useConfiguration("--android_sdk=//sdk:sdk"); + ConfiguredTarget b = getConfiguredTarget("//java/b:b"); + Truth.assertThat(b.get(UsesDataBindingProvider.PROVIDER)) + .named("UsesDataBindingProvider") + .isNotNull(); + } } |