diff options
author | Adam Michael <ajmichael@google.com> | 2016-10-10 15:37:10 +0000 |
---|---|---|
committer | Yue Gan <yueg@google.com> | 2016-10-11 08:43:32 +0000 |
commit | 2fcf0e4cfb97af7cc8b8a090c5144c87b759bc13 (patch) | |
tree | 5956650202941ecdc176682cb38e46cf45afb381 /src/test/java/com | |
parent | 87366aae2f9608eae5692fa2b69f86d8ef10072b (diff) |
Generate aar_import and java_import rules for local maven repositories in <sdk>/extras for sdk in android_sdk_repository.
Addresses https://github.com/bazelbuild/bazel/issues/1745.
--
MOS_MIGRATED_REVID=135679008
Diffstat (limited to 'src/test/java/com')
5 files changed, 243 insertions, 2 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD index 137bfe8638..f15be52f78 100644 --- a/src/test/java/com/google/devtools/build/lib/BUILD +++ b/src/test/java/com/google/devtools/build/lib/BUILD @@ -956,13 +956,17 @@ java_test( ":analysis_testutil", ":foundations_testutil", ":test_runner", + ":testutil", "//src/main/java/com/google/devtools/build/lib:bazel-main", "//src/main/java/com/google/devtools/build/lib:bazel-rules", "//src/main/java/com/google/devtools/build/lib:build-base", "//src/main/java/com/google/devtools/build/lib:events", + "//src/main/java/com/google/devtools/build/lib:packages-internal", + "//src/main/java/com/google/devtools/build/lib:syntax", "//src/main/java/com/google/devtools/build/lib:util", "//src/main/java/com/google/devtools/build/lib:vfs", "//src/main/java/com/google/devtools/build/lib/actions", + "//src/main/java/com/google/devtools/build/lib/cmdline", "//src/main/protobuf:crosstool_config_java_proto", "//third_party:guava", "//third_party:junit4", diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java index f3a7d258c8..b741e073f4 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java @@ -111,6 +111,11 @@ public final class BazelAnalysisMock extends AnalysisMock { config.create( "/bazel_tools_workspace/tools/android/BUILD", androidBuildContents.toArray(new String[androidBuildContents.size()])); + config.create( + "/bazel_tools_workspace/tools/android/android_sdk_repository_template.bzl", + "def create_android_sdk_rules(" + + "name, build_tools_version, build_tools_directory, api_level):", + " pass"); config.create( "/bazel_tools_workspace/tools/genrule/BUILD", "exports_files(['genrule-setup.sh'])"); @@ -139,7 +144,9 @@ public final class BazelAnalysisMock extends AnalysisMock { "/bazel_tools_workspace/tools/zip/BUILD", "package(default_visibility=['//visibility:public'])", "exports_files(['precompile.py'])", - "cc_binary(name='zipper', srcs=['zip_main.cc'])"); + "cc_binary(name='zipper', srcs=['zip_main.cc'])", + "sh_binary(name='zip_manifest_creator', srcs=['zip_manifest_creator.sh'])", + "py_binary(name = 'embedded_jar_extractor', srcs=['embedded_jar_extractor.py'])"); ccSupport().setup(config); } diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java index d01db4f360..c1c8a55fbb 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java @@ -18,6 +18,8 @@ import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.analysis.ConfigurationCollectionFactory; import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider; import com.google.devtools.build.lib.analysis.config.ConfigurationFactory; +import com.google.devtools.build.lib.bazel.rules.android.AndroidSdkRepositoryFunction; +import com.google.devtools.build.lib.bazel.rules.android.AndroidSdkRepositoryRule; import com.google.devtools.build.lib.flags.InvocationPolicyEnforcer; import com.google.devtools.build.lib.packages.PackageFactory; import com.google.devtools.build.lib.packages.util.LoadingMock; @@ -110,7 +112,8 @@ public abstract class AnalysisMock extends LoadingMock { // Some tests require the local_repository rule so we need the appropriate SkyFunctions. RepositoryFunction localRepositoryFunction = new LocalRepositoryFunction(); ImmutableMap<String, RepositoryFunction> repositoryHandlers = ImmutableMap.of( - LocalRepositoryRule.NAME, localRepositoryFunction); + LocalRepositoryRule.NAME, localRepositoryFunction, + AndroidSdkRepositoryRule.NAME, new AndroidSdkRepositoryFunction()); return ImmutableMap.of( SkyFunctions.REPOSITORY_DIRECTORY, diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryTest.java b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryTest.java new file mode 100644 index 0000000000..265981b3c6 --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryTest.java @@ -0,0 +1,79 @@ +// Copyright 2016 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.lib.bazel.rules.android; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider; +import com.google.devtools.build.lib.analysis.ConfiguredTarget; +import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; +import com.google.devtools.build.lib.testutil.TestRuleClassProvider; +import com.google.devtools.build.lib.vfs.FileSystemUtils; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Tests for {@link AndroidNdkRepositoryFunction}. */ +@RunWith(JUnit4.class) +public class AndroidSdkRepositoryTest extends BuildViewTestCase { + + @Override + protected ConfiguredRuleClassProvider getRuleClassProvider() { + ConfiguredRuleClassProvider.Builder builder = new ConfiguredRuleClassProvider.Builder(); + TestRuleClassProvider.addStandardRules(builder); + return builder + .addRuleDefinition(new AarImportRule()) + .addRuleDefinition(new AndroidSdkRepositoryRule()) + .build(); + } + + @Before + public void setup() throws Exception { + scratch.setWorkingDir("/sdk"); + scratch.file("extras/google/m2repository/com/google/android/foo/1.0.0/foo.pom", + "<project>", + " <groupId>com.google.android</groupId>", + " <artifactId>foo</artifactId>", + " <version>1.0.0</version>", + " <packaging>aar</packaging>", + "</project>"); + + scratch.setWorkingDir("/workspace"); + FileSystemUtils.appendIsoLatin1(scratch.resolve("WORKSPACE"), + "android_sdk_repository(", + " name = 'mysdk',", + " path = '/sdk',", + " build_tools_version = '24.0.0',", + " api_level = 24,", + ")"); + } + + @Test + public void testGeneratedAarImport() throws Exception { + invalidatePackages(); + ConfiguredTarget aarImportTarget = getConfiguredTarget("@mysdk//com.google.android:foo-1.0.0"); + assertThat(aarImportTarget.getTarget().getAssociatedRule().getRuleClass()) + .isEqualTo("aar_import"); + } + + @Test + public void testExportsFiles() throws Exception { + invalidatePackages(); + ConfiguredTarget aarTarget = getConfiguredTarget( + "@mysdk//:extras/google/m2repository/com/google/android/foo/1.0.0/foo.aar"); + assertThat(aarTarget).isNotNull(); + } +} diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/android/SdkMavenRepositoryTest.java b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/SdkMavenRepositoryTest.java new file mode 100644 index 0000000000..7d9bdb28c6 --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/SdkMavenRepositoryTest.java @@ -0,0 +1,148 @@ +// Copyright 2016 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.lib.bazel.rules.android; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider; +import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; +import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.packages.AttributeMap; +import com.google.devtools.build.lib.packages.BuildType; +import com.google.devtools.build.lib.packages.RawAttributeMapper; +import com.google.devtools.build.lib.packages.Rule; +import com.google.devtools.build.lib.syntax.Type; +import com.google.devtools.build.lib.testutil.TestRuleClassProvider; +import com.google.devtools.build.lib.vfs.Path; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Tests for {@link SdkMavenRepository}. */ +@RunWith(JUnit4.class) +public class SdkMavenRepositoryTest extends BuildViewTestCase { + Path workspaceDir; + Path repoPath; + SdkMavenRepository sdkMavenRepository; + + @Override + protected ConfiguredRuleClassProvider getRuleClassProvider() { + ConfiguredRuleClassProvider.Builder builder = new ConfiguredRuleClassProvider.Builder(); + TestRuleClassProvider.addStandardRules(builder); + return builder.addRuleDefinition(new AarImportRule()).build(); + } + + @Before + public void setup() throws Exception { + repoPath = scratch.dir("repo"); + workspaceDir = scratch.dir(""); + + scratch.file("repo/com/google/android/foo/1.0.0/foo.pom", + "<project>", + " <groupId>com.google.android</groupId>", + " <artifactId>foo</artifactId>", + " <version>1.0.0</version>", + "</project>"); + scratch.file("repo/com/google/android/bar/1.0.0/bar.pom", + "<project>", + " <groupId>com.google.android</groupId>", + " <artifactId>bar</artifactId>", + " <version>1.0.0</version>", + " <packaging>aar</packaging>", + " <dependencies>", + " <dependency>", + " <groupId>com.google.android</groupId>", + " <artifactId>foo</artifactId>", + " <version>1.0.0</version>", + " </dependency>", + " <dependency>", + " <groupId>com.google.android</groupId>", + " <artifactId>baz</artifactId>", + " <version>1.0.0</version>", + " </dependency>", + " </dependencies>", + "</project>"); + scratch.file("repo/com/google/android/baz/1.0.0/baz.pom", + "<project>", + " <groupId>com.google.android</groupId>", + " <artifactId>baz</artifactId>", + " <version>1.0.0</version>", + " <packaging>par</packaging>", + "</project>"); + sdkMavenRepository = SdkMavenRepository.create(ImmutableList.of(repoPath)); + scratch.file("BUILD", + "exports_files([", + sdkMavenRepository.getExportsFiles(workspaceDir), + "])"); + } + + @Test + public void testExportsFiles() throws Exception { + assertThat(sdkMavenRepository.getExportsFiles(workspaceDir)).isEqualTo( + " 'repo/com/google/android/bar/1.0.0/bar.aar',\n" + + " 'repo/com/google/android/baz/1.0.0/baz.par',\n" + + " 'repo/com/google/android/foo/1.0.0/foo.jar',\n" + ); + } + + @Test + public void testBuildFilesWritten() throws Exception { + sdkMavenRepository.writeBuildFiles(workspaceDir); + + Path groupIdPath = scratch.resolve("com.google.android"); + assertThat(workspaceDir.getDirectoryEntries()).containsAllOf(repoPath, groupIdPath); + + Path buildFilePath = groupIdPath.getRelative("BUILD"); + assertThat(groupIdPath.getDirectoryEntries()).containsExactly(buildFilePath); + } + + @Test + public void testGeneratedAarImport() throws Exception { + sdkMavenRepository.writeBuildFiles(workspaceDir); + Rule aarImport = + getConfiguredTarget("//com.google.android:bar-1.0.0").getTarget().getAssociatedRule(); + assertThat(aarImport.getRuleClass()).isEqualTo("aar_import"); + AttributeMap attributes = RawAttributeMapper.of(aarImport); + assertThat(attributes.get("aar", BuildType.LABEL)) + .isEqualTo(Label.parseAbsoluteUnchecked("//:repo/com/google/android/bar/1.0.0/bar.aar")); + assertThat(attributes.get("exports", BuildType.LABEL_LIST)) + .containsExactly(Label.parseAbsoluteUnchecked("//com.google.android:foo-1.0.0")); + } + + @Test + public void testGeneratedJavaImport() throws Exception { + sdkMavenRepository.writeBuildFiles(workspaceDir); + Rule javaImport = + getConfiguredTarget("//com.google.android:foo-1.0.0").getTarget().getAssociatedRule(); + assertThat(javaImport.getRuleClass()).isEqualTo("java_import"); + AttributeMap attributes = RawAttributeMapper.of(javaImport); + assertThat(attributes.get("jars", BuildType.LABEL_LIST)).containsExactly( + Label.parseAbsoluteUnchecked("//:repo/com/google/android/foo/1.0.0/foo.jar")); + assertThat(attributes.get("exports", BuildType.LABEL_LIST)).isEmpty(); + } + + @Test + public void testGeneratedRuleForInvalidPackaging() throws Exception { + sdkMavenRepository.writeBuildFiles(workspaceDir); + Rule invalidPackagingGenrule = + getConfiguredTarget("//com.google.android:baz-1.0.0").getTarget().getAssociatedRule(); + assertThat(invalidPackagingGenrule.getRuleClass()).isEqualTo("genrule"); + assertThat(RawAttributeMapper.of(invalidPackagingGenrule).get("cmd", Type.STRING)) + .isEqualTo("echo Bazel does not recognize the Maven packaging type for: " + + "\"//:repo/com/google/android/baz/1.0.0/baz.par\"; exit 1"); + } +} |