|  | // 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.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.nio.file.Path; | 
|  | import java.nio.file.Paths; | 
|  | 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<Path> idlSources = | 
|  | Sets.newHashSet(Paths.get("c/g/Bar.java"), Paths.get("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; | 
|  | } | 
|  | } |