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