diff options
author | Googler <noreply@google.com> | 2015-12-03 15:17:55 +0000 |
---|---|---|
committer | Kristina Chodorow <kchodorow@google.com> | 2015-12-03 18:37:59 +0000 |
commit | 5e34a3d4ea30525971e320ce283ba8cd67c74e3c (patch) | |
tree | 29c755c006c6b5f1fb82f131a72c44e406a18c5a /src/test/java/com | |
parent | 84fb4612dd4203425b59809ea5e3302ff55723fa (diff) |
ASwB aspect: parse java packages during execution
--
MOS_MIGRATED_REVID=109305952
Diffstat (limited to 'src/test/java/com')
6 files changed, 276 insertions, 8 deletions
diff --git a/src/test/java/com/google/devtools/build/android/ideinfo/BUILD b/src/test/java/com/google/devtools/build/android/ideinfo/BUILD new file mode 100644 index 0000000000..79f75dd8a3 --- /dev/null +++ b/src/test/java/com/google/devtools/build/android/ideinfo/BUILD @@ -0,0 +1,14 @@ +java_test( + name = "PackageParserTest", + size = "small", + srcs = glob(["*.java"]), + deps = [ + "//src/main/protobuf:package_manifest_proto", + "//src/tools/android/java/com/google/devtools/build/android/ideinfo:package_parser_lib", + "//third_party:guava", + "//third_party:jsr305", + "//third_party:junit4", + "//third_party:protobuf", + "//third_party:truth", + ], +) diff --git a/src/test/java/com/google/devtools/build/android/ideinfo/PackageParserTest.java b/src/test/java/com/google/devtools/build/android/ideinfo/PackageParserTest.java new file mode 100644 index 0000000000..a02ac30baf --- /dev/null +++ b/src/test/java/com/google/devtools/build/android/ideinfo/PackageParserTest.java @@ -0,0 +1,192 @@ +// Copyright 2015 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.ideinfo; + +import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.fail; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.protobuf.MessageLite; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.StringWriter; +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.Map; + +import javax.annotation.Nonnull; + +/** + * Unit tests for {@link PackageParser} + */ +@RunWith(JUnit4.class) +public class PackageParserTest { + + private static class MockPackageParserIoProvider extends PackageParserIoProvider { + private final Map<Path, InputStream> sources = Maps.newHashMap(); + private StringWriter writer = new StringWriter(); + + public MockPackageParserIoProvider addSource(String filePath, String javaSrc) { + try { + sources.put(Paths.get(filePath), new ByteArrayInputStream(javaSrc.getBytes("UTF-8"))); + } catch (UnsupportedEncodingException e) { + fail(e.getMessage()); + } + return this; + } + + public void reset() { + sources.clear(); + writer = new StringWriter(); + } + + public List<Path> getPaths() { + return Lists.newArrayList(sources.keySet()); + } + + @Nonnull + @Override + public BufferedReader getReader(Path file) throws IOException { + InputStream input = sources.get(file); + return new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)); + } + + @Override + public void writeProto(@Nonnull MessageLite message, @Nonnull Path file) throws IOException { + writer.write(message.toString()); + } + } + + private MockPackageParserIoProvider mockIoProvider; + private PackageParser parser; + + @Before + public void setUp() { + mockIoProvider = new MockPackageParserIoProvider(); + parser = new PackageParser(mockIoProvider); + } + + private Map<Path, String> parsePackageStrings() throws Exception { + List<Path> paths = mockIoProvider.getPaths(); + return parser.parsePackageStrings(paths, paths); + } + + @Test + public void testParseCommandLineArguments() throws Exception { + String[] args = new String[] { + "--output_manifest", + "/tmp/out.manifest", + "--sources_absolute_paths", + "/path/test1.java:/path/test2.java", + "--sources_execution_paths", + "/path/test1.java:/path/test2.java" + }; + PackageParser.PackageParserOptions options = PackageParser.parseArgs(args); + assertThat(options.outputManifest.toString()).isEqualTo("/tmp/out.manifest"); + assertThat(options.sourcesAbsolutePaths).hasSize(2); + assertThat(options.sourcesExecutionPaths).hasSize(2); + assertThat(options.sourcesAbsolutePaths.get(0).toString()).isEqualTo("/path/test1.java"); + assertThat(options.sourcesAbsolutePaths.get(1).toString()).isEqualTo("/path/test2.java"); + } + + @Test + public void testReadNoSources() throws Exception { + Map<Path, String> map = parsePackageStrings(); + assertThat(map).isEmpty(); + } + + @Test + public void testSingleRead() throws Exception { + mockIoProvider + .addSource("java/com/google/Bla.java", + "package com.test;\n public class Bla {}\""); + Map<Path, String> map = parsePackageStrings(); + assertThat(map).hasSize(1); + assertThat(map).containsEntry(Paths.get("java/com/google/Bla.java"), "com.test"); + } + + @Test + public void testMultiRead() throws Exception { + mockIoProvider + .addSource("java/com/google/Bla.java", + "package com.test;\n public class Bla {}\"") + .addSource("java/com/other/Foo.java", + "package com.other;\n public class Foo {}\""); + Map<Path, String> map = parsePackageStrings(); + assertThat(map).hasSize(2); + assertThat(map).containsEntry(Paths.get("java/com/google/Bla.java"), "com.test"); + assertThat(map).containsEntry(Paths.get("java/com/other/Foo.java"), "com.other"); + } + + @Test + public void testReadSomeInvalid() throws Exception { + mockIoProvider + .addSource("java/com/google/Bla.java", + "package %com.test;\n public class Bla {}\"") + .addSource("java/com/other/Foo.java", + "package com.other;\n public class Foo {}\""); + Map<Path, String> map = parsePackageStrings(); + assertThat(map).hasSize(1); + assertThat(map).containsEntry(Paths.get("java/com/other/Foo.java"), "com.other"); + } + + @Test + public void testReadAllInvalid() throws Exception { + mockIoProvider + .addSource("java/com/google/Bla.java", + "#package com.test;\n public class Bla {}\"") + .addSource("java/com/other/Foo.java", + "package com.other\n public class Foo {}\""); + Map<Path, String> map = parsePackageStrings(); + assertThat(map).isEmpty(); + } + + @Test + public void testWriteEmptyMap() throws Exception { + parser.writeManifest( + Maps.<Path, String> newHashMap(), Paths.get("/java/com/google/test.manifest")); + assertThat(mockIoProvider.writer.toString()).isEmpty(); + } + + @Test + public void testWriteMap() throws Exception { + Map<Path, String> map = ImmutableMap.of( + Paths.get("/java/com/google/Bla.java"), "com.google", + Paths.get("/java/com/other/Foo.java"), "com.other" + ); + parser.writeManifest(map, Paths.get("/java/com/google/test.manifest")); + + String writtenString = mockIoProvider.writer.toString(); + assertThat(writtenString).contains("absolute_path: \"/java/com/google/Bla.java\""); + assertThat(writtenString).contains("package_string: \"com.google\""); + assertThat(writtenString).contains("absolute_path: \"/java/com/other/Foo.java\""); + assertThat(writtenString).contains("package_string: \"com.other\""); + } + +} diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD index 707b33d891..b02e782756 100644 --- a/src/test/java/com/google/devtools/build/lib/BUILD +++ b/src/test/java/com/google/devtools/build/lib/BUILD @@ -600,6 +600,7 @@ java_test( "//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:collect", + "//src/main/java/com/google/devtools/build/lib:common", "//src/main/java/com/google/devtools/build/lib:events", "//src/main/java/com/google/devtools/build/lib:ideinfo", "//src/main/java/com/google/devtools/build/lib:packages", 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 65f4c90824..619ba2ff52 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 @@ -181,7 +181,12 @@ public final class BazelAnalysisMock extends AnalysisMock { .add("sh_binary(name = 'shuffle_jars', srcs = ['empty.sh'])") .add("sh_binary(name = 'strip_resources', srcs = ['empty.sh'])") .add("sh_binary(name = 'build_incremental_dexmanifest', srcs = ['empty.sh'])") - .add("sh_binary(name = 'incremental_install', srcs = ['empty.sh'])"); + .add("sh_binary(name = 'incremental_install', srcs = ['empty.sh'])") + .add("java_binary(name = 'PackageParser',") + .add(" runtime_deps = [ ':PackageParser_import'],") + .add(" main_class = 'com.google.devtools.build.android.ideinfo.PackageParser')") + .add("java_import(name = 'PackageParser_import',") + .add(" jars = [ 'package_parser_deploy.jar' ])"); for (Attribute attr : attrs) { if (attr.getType() == LABEL && attr.isMandatory() && !attr.getName().startsWith(":")) { diff --git a/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTest.java b/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTest.java index bb8de48bf3..27ec6a63dd 100644 --- a/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTest.java +++ b/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTest.java @@ -57,7 +57,24 @@ public class AndroidStudioInfoAspectTest extends AndroidStudioInfoAspectTestBase "com/google/example/libsimple-src.jar" ); } - + + public void testPackageManifestCreated() throws Exception { + scratch.file( + "com/google/example/BUILD", + "java_library(", + " name = 'simple',", + " srcs = ['simple/Simple.java']", + ")"); + Map<String, RuleIdeInfo> ruleIdeInfos = buildRuleIdeInfo("//com/google/example:simple"); + assertThat(ruleIdeInfos.size()).isEqualTo(1); + RuleIdeInfo ruleIdeInfo = getRuleInfoAndVerifyLabel( + "//com/google/example:simple", ruleIdeInfos); + + ArtifactLocation packageManifest = ruleIdeInfo.getJavaRuleIdeInfo().getPackageManifest(); + assertNotNull(packageManifest); + assertEquals(packageManifest.getRelativePath(), "com/google/example/simple.manifest"); + } + public void testJavaLibraryProtoWithDependencies() throws Exception { scratch.file( "com/google/example/BUILD", @@ -83,7 +100,7 @@ public class AndroidStudioInfoAspectTest extends AndroidStudioInfoAspectTestBase assertThat(complexRuleIdeInfo.getDependenciesList()) .containsExactly("//com/google/example:simple"); } - + public void testJavaLibraryWithTransitiveDependencies() throws Exception { scratch.file( "com/google/example/BUILD", @@ -320,6 +337,33 @@ public class AndroidStudioInfoAspectTest extends AndroidStudioInfoAspectTestBase .containsExactly("//com/google/example:foobar", "//com/google/example:imp") .inOrder(); } + + public void testNoPackageManifestForExports() throws Exception { + scratch.file( + "com/google/example/BUILD", + "java_library(", + " name = 'foobar',", + " srcs = ['FooBar.java'],", + ")", + "java_import(", + " name = 'imp',", + " jars = ['a.jar', 'b.jar'],", + " deps = [':foobar'],", + " exports = [':foobar'],", + ")", + "java_library(", + " name = 'lib',", + " srcs = ['Lib.java'],", + " deps = [':imp'],", + ")"); + + Map<String, RuleIdeInfo> ruleIdeInfos = buildRuleIdeInfo("//com/google/example:lib"); + RuleIdeInfo libInfo = getRuleInfoAndVerifyLabel("//com/google/example:lib", ruleIdeInfos); + RuleIdeInfo impInfo = getRuleInfoAndVerifyLabel("//com/google/example:imp", ruleIdeInfos); + + assertThat(!impInfo.getJavaRuleIdeInfo().hasPackageManifest()).isTrue(); + assertThat(libInfo.getJavaRuleIdeInfo().hasPackageManifest()).isTrue(); + } public void testGeneratedJavaImportFilesAreAddedToOutputGroup() throws Exception { scratch.file( diff --git a/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTestBase.java b/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTestBase.java index 4a26cc902e..cb3ca8ba79 100644 --- a/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTestBase.java +++ b/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTestBase.java @@ -21,11 +21,13 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.eventbus.EventBus; +import com.google.devtools.build.lib.actions.Action; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.BuildView.AnalysisResult; import com.google.devtools.build.lib.analysis.ConfiguredAspect; import com.google.devtools.build.lib.analysis.OutputGroupProvider; import com.google.devtools.build.lib.analysis.actions.BinaryFileWriteAction; +import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.ideinfo.androidstudio.AndroidStudioIdeInfo.ArtifactLocation; @@ -136,14 +138,24 @@ abstract class AndroidStudioInfoAspectTestBase extends BuildViewTestCase { Iterable<Artifact> artifacts = provider.getIdeInfoFiles(); ImmutableMap.Builder<String, RuleIdeInfo> builder = ImmutableMap.builder(); for (Artifact artifact : artifacts) { - BinaryFileWriteAction generatingAction = - (BinaryFileWriteAction) getGeneratingAction(artifact); - RuleIdeInfo ruleIdeInfo = RuleIdeInfo.parseFrom(generatingAction.getSource().openStream()); - builder.put(ruleIdeInfo.getLabel(), ruleIdeInfo); + Action generatingAction = getGeneratingAction(artifact); + if (generatingAction instanceof BinaryFileWriteAction) { + BinaryFileWriteAction writeAction = (BinaryFileWriteAction) generatingAction; + RuleIdeInfo ruleIdeInfo = RuleIdeInfo.parseFrom(writeAction.getSource().openStream()); + builder.put(ruleIdeInfo.getLabel(), ruleIdeInfo); + } else { + verifyPackageManifestSpawnAction(generatingAction); + } } return builder.build(); } - + + protected final void verifyPackageManifestSpawnAction(Action genAction) { + assertEquals(genAction.getMnemonic(), "JavaPackageManifest"); + SpawnAction action = (SpawnAction) genAction; + assertFalse(action.isShellCommand()); + } + protected List<String> getOutputGroupResult(String outputGroup) { OutputGroupProvider outputGroupProvider = this.configuredAspect.getProvider(OutputGroupProvider.class); |