| // 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; | |
| } | |
| } |