blob: 5452f671f363d06c693780a698472bcb7adf26b4 [file] [log] [blame]
// 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;
}
}