diff options
Diffstat (limited to 'src/test/java/com')
3 files changed, 216 insertions, 0 deletions
diff --git a/src/test/java/com/google/devtools/build/android/idlclass/BUILD b/src/test/java/com/google/devtools/build/android/idlclass/BUILD new file mode 100644 index 0000000000..f9255e4083 --- /dev/null +++ b/src/test/java/com/google/devtools/build/android/idlclass/BUILD @@ -0,0 +1,12 @@ +java_test( + name = "IdlClassTest", + size = "medium", + srcs = glob(["*.java"]), + deps = [ + "//src/main/protobuf:proto_java_compilation", + "//src/tools/android/java/com/google/devtools/build/android/idlclass:idlclass_lib", + "//third_party:guava", + "//third_party:junit4", + "//third_party:truth", + ], +) diff --git a/src/test/java/com/google/devtools/build/android/idlclass/IdlClassTest.java b/src/test/java/com/google/devtools/build/android/idlclass/IdlClassTest.java new file mode 100644 index 0000000000..740f753b49 --- /dev/null +++ b/src/test/java/com/google/devtools/build/android/idlclass/IdlClassTest.java @@ -0,0 +1,170 @@ +// Copyright 2015 Google Inc. 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.idlclass; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.common.collect.Sets; +import com.google.devtools.build.buildjar.proto.JavaCompilation.CompilationUnit; +import com.google.devtools.build.buildjar.proto.JavaCompilation.Manifest; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Enumeration; +import java.util.List; +import java.util.Set; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import java.util.zip.ZipOutputStream; + +/** {@link IdlClass} test */ +@RunWith(JUnit4.class) +public class IdlClassTest { + + static final Manifest MANIFEST = + Manifest.newBuilder() + .addCompilationUnit( + CompilationUnit.newBuilder() + .setPath("c/g/Foo.java") + .setPkg("c.g") + .addTopLevel("Foo") + .addTopLevel("Bar")) + .addCompilationUnit( + CompilationUnit.newBuilder() + .setPath("c/g/Bar.java") + .setPkg("c.g") + .addTopLevel("Bar") + .addTopLevel("Bar2")) + .addCompilationUnit( + CompilationUnit.newBuilder() + // default package + .setPath("wrong/source/dir/Baz.java") + .addTopLevel("Baz")) + .build(); + + @Rule public TemporaryFolder tempFolder = new TemporaryFolder(); + + @Test + public void generatedPrefixes() { + Set<String> idlSources = Sets.newHashSet( + "c/g/Bar.java", + "wrong/source/dir/Baz.java" + ); + assertThat(IdlClass.getIdlPrefixes(MANIFEST, idlSources)) + .containsExactly("c/g/Bar", "c/g/Bar2", "Baz"); + } + + @Test + public void idlClass() throws IOException { + File classJar = tempFolder.newFile("lib.jar"); + File manifestProto = tempFolder.newFile("lib.manifest"); + File tempDir = tempFolder.newFolder("temp_files"); + File outputClassJar = tempFolder.newFile("lib-idl.jar"); + File outputSourceJar = tempFolder.newFile("lib-idl-src.jar"); + + List<String> classes = + Arrays.asList( + "Baz.class", + "Baz$0.class", + "Baz$1.class", + "c/g/Foo.class", + "c/g/Foo$0.class", + "c/g/Foo$Inner.class", + "c/g/Foo$Inner$InnerMost.class", + "c/g/Bar.class", + "c/g/Bar2.class", + "c/g/Bar$Inner.class", + "c/g/Bar2$Inner.class"); + + try (OutputStream os = new FileOutputStream(classJar); + ZipOutputStream zos = new ZipOutputStream(os)) { + for (String path : classes) { + zos.putNextEntry(new ZipEntry(path)); + } + } + + tempFolder.newFolder("c"); + tempFolder.newFolder("c/g"); + tempFolder.newFolder("wrong"); + tempFolder.newFolder("wrong/source"); + tempFolder.newFolder("wrong/source/dir"); + for (String file : Arrays.asList("c/g/Foo.java", "c/g/Bar.java", "wrong/source/dir/Baz.java")) { + tempFolder.newFile(file); + } + + try (OutputStream os = new FileOutputStream(manifestProto)) { + MANIFEST.writeTo(os); + } + + IdlClass.main( + new String[]{ + "--manifest_proto", + manifestProto.toString(), + "--class_jar", + classJar.toString(), + "--output_class_jar", + outputClassJar.toString(), + "--output_source_jar", + outputSourceJar.toString(), + "--temp_dir", + tempDir.toString(), + "--idl_source_base_dir", + tempFolder.getRoot().getPath(), + "c/g/Bar.java", + "wrong/source/dir/Baz.java" + }); + + List<String> classJarEntries = getJarEntries(outputClassJar); + assertThat(classJarEntries) + .containsExactly( + "c/g/Bar.class", + "c/g/Bar$Inner.class", + "c/g/Bar2.class", + "c/g/Bar2$Inner.class", + "Baz.class", + "Baz$0.class", + "Baz$1.class"); + + List<String> sourceJarEntries = getJarEntries(outputSourceJar); + assertThat(sourceJarEntries) + .containsExactly( + "c/g/Bar.java", + "Baz.java"); + } + + private List<String> getJarEntries(File outputJar) throws IOException { + List<String> jarEntries = new ArrayList<>(); + try (ZipFile zf = new ZipFile(outputJar)) { + Enumeration<? extends ZipEntry> entries = zf.entries(); + while (entries.hasMoreElements()) { + String name = entries.nextElement().getName(); + if (name.endsWith("/") || name.equals("META-INF/MANIFEST.MF")) { + continue; + } + jarEntries.add(name); + } + } + return jarEntries; + } +} 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 2383b6497b..aff6d9251b 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 @@ -520,6 +520,40 @@ public class AndroidStudioInfoAspectTest extends BuildViewTestCase { assertThat(lRuleInfo.getAndroidRuleIdeInfo().getJavaPackage()).isEqualTo("com.google.example"); } + public void testAndroidLibraryWithoutAidlHasNoIdlJars() throws Exception { + scratch.file( + "java/com/google/example/BUILD", + "android_library(", + " name = 'no_idl',", + " srcs = ['Test.java'],", + ")" + ); + String noIdlTarget = "//java/com/google/example:no_idl"; + Map<String, RuleIdeInfo> ruleIdeInfos = buildRuleIdeInfo(noIdlTarget); + RuleIdeInfo noIdlRuleInfo = getRuleInfoAndVerifyLabel(noIdlTarget, ruleIdeInfos); + + assertThat(noIdlRuleInfo.getAndroidRuleIdeInfo().getHasIdlSources()).isFalse(); + } + + public void testAndroidLibraryWithAidlHasIdlJars() throws Exception { + scratch.file( + "java/com/google/example/BUILD", + "android_library(", + " name = 'has_idl',", + " idl_srcs = ['a.aidl'],", + ")" + ); + String idlTarget = "//java/com/google/example:has_idl"; + Map<String, RuleIdeInfo> ruleIdeInfos = buildRuleIdeInfo(idlTarget); + RuleIdeInfo idlRuleInfo = getRuleInfoAndVerifyLabel(idlTarget, ruleIdeInfos); + + assertThat(idlRuleInfo.getAndroidRuleIdeInfo().getHasIdlSources()).isTrue(); + assertThat(LIBRARY_ARTIFACT_TO_STRING.apply(idlRuleInfo.getAndroidRuleIdeInfo().getIdlJar())) + .isEqualTo( + "<jar:java/com/google/example/libhas_idl-idl.jar>" + + "<source:java/com/google/example/libhas_idl-idl.srcjar>"); + } + private Map<String, RuleIdeInfo> buildRuleIdeInfo(String target) throws Exception { AnalysisResult analysisResult = update( |