blob: 815367611cc8d61dc02db1a3f972358235715acb [file] [log] [blame]
/*
* Copyright 2017 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.idea.blaze.aspect;
import static com.google.common.truth.Truth.assertThat;
import static java.nio.charset.StandardCharsets.UTF_8;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.common.io.Files;
import com.google.idea.blaze.aspect.JarFilter.JarFilterOptions;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/** Unit tests for {@link JarFilter} */
@RunWith(JUnit4.class)
public class JarFilterTest {
@Rule public TemporaryFolder folder = new TemporaryFolder();
@Test
public void testFilterMethod() throws Exception {
List<String> prefixes =
ImmutableList.of("com/google/foo/Foo", "com/google/bar/Bar", "com/google/baz/Baz");
assertThat(JarFilter.shouldKeepClass(prefixes, "com/google/foo/Foo.class")).isTrue();
assertThat(JarFilter.shouldKeepClass(prefixes, "com/google/foo/Foo$Inner.class")).isTrue();
assertThat(JarFilter.shouldKeepClass(prefixes, "com/google/bar/Bar.class")).isTrue();
assertThat(JarFilter.shouldKeepClass(prefixes, "com/google/foo/Foo/NotFoo.class")).isFalse();
assertThat(JarFilter.shouldKeepClass(prefixes, "wrong/com/google/foo/Foo.class")).isFalse();
}
@Test
public void fullIntegrationTest() throws Exception {
File fooJava = folder.newFile("Foo.java");
Files.write("package com.google.foo; class Foo { class Inner {} }".getBytes(UTF_8), fooJava);
File barJava = folder.newFile("Bar.java");
Files.write("package com.google.foo.bar; class Bar {}".getBytes(UTF_8), barJava);
File srcJar = folder.newFile("gen.srcjar");
try (ZipOutputStream zo = new ZipOutputStream(new FileOutputStream(srcJar))) {
zo.putNextEntry(new ZipEntry("com/google/foo/gen/Gen.java"));
zo.write("package gen; class Gen {}".getBytes(UTF_8));
zo.closeEntry();
zo.putNextEntry(new ZipEntry("com/google/foo/gen/Gen2.java"));
zo.write("package gen; class Gen2 {}".getBytes(UTF_8));
zo.closeEntry();
}
File src3Jar = folder.newFile("gen3.srcjar");
try (ZipOutputStream zo = new ZipOutputStream(new FileOutputStream(src3Jar))) {
zo.putNextEntry(new ZipEntry("com/google/foo/gen/Gen3.java"));
zo.write("package gen; class Gen3 {}".getBytes(UTF_8));
zo.closeEntry();
}
File filterJar = folder.newFile("foo.jar");
try (ZipOutputStream zo = new ZipOutputStream(new FileOutputStream(filterJar))) {
zo.putNextEntry(new ZipEntry("com/google/foo/Foo.class"));
zo.closeEntry();
zo.putNextEntry(new ZipEntry("com/google/foo/Foo$Inner.class"));
zo.closeEntry();
zo.putNextEntry(new ZipEntry("com/google/foo/bar/Bar.class"));
zo.closeEntry();
zo.putNextEntry(new ZipEntry("gen/Gen.class"));
zo.closeEntry();
zo.putNextEntry(new ZipEntry("gen/Gen2.class"));
zo.closeEntry();
zo.putNextEntry(new ZipEntry("gen/Gen3.class"));
zo.closeEntry();
zo.putNextEntry(new ZipEntry("com/google/foo/Foo2.class"));
zo.closeEntry();
}
File filterSrcJar = folder.newFile("foo-src.jar");
try (ZipOutputStream zo = new ZipOutputStream(new FileOutputStream(filterSrcJar))) {
zo.putNextEntry(new ZipEntry("com/google/foo/Foo.java"));
zo.closeEntry();
zo.putNextEntry(new ZipEntry("com/google/foo/bar/Bar.java"));
zo.closeEntry();
zo.putNextEntry(new ZipEntry("gen/Gen.java"));
zo.closeEntry();
zo.putNextEntry(new ZipEntry("gen/Gen2.java"));
zo.closeEntry();
zo.putNextEntry(new ZipEntry("gen/Gen3.java"));
zo.closeEntry();
zo.putNextEntry(new ZipEntry("com/google/foo/Foo2.java"));
zo.closeEntry();
zo.putNextEntry(new ZipEntry("com/google/foo/bar/Bar2.java"));
zo.closeEntry();
}
File filteredJar = folder.newFile("foo-filtered-gen.jar");
File filteredSourceJar = folder.newFile("foo-filtered-gen-src.jar");
String[] args =
new String[] {
"--keep_java_file",
fooJava.getPath(),
"--keep_java_file",
barJava.getPath(),
"--keep_source_jar",
srcJar.getPath(),
"--keep_source_jar",
src3Jar.getPath(),
"--filter_jar",
filterJar.getPath(),
"--filter_source_jar",
filterSrcJar.getPath(),
"--filtered_jar",
filteredJar.getPath(),
"--filtered_source_jar",
filteredSourceJar.getPath()
};
JarFilterOptions options = JarFilter.parseArgs(args);
JarFilter.main(options);
List<String> filteredJarNames = Lists.newArrayList();
try (ZipFile zipFile = new ZipFile(filteredJar)) {
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry zipEntry = entries.nextElement();
filteredJarNames.add(zipEntry.getName());
}
}
List<String> filteredSourceJarNames = Lists.newArrayList();
try (ZipFile zipFile = new ZipFile(filteredSourceJar)) {
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry zipEntry = entries.nextElement();
filteredSourceJarNames.add(zipEntry.getName());
}
}
assertThat(filteredJarNames)
.containsExactly(
"com/google/foo/Foo.class",
"com/google/foo/Foo$Inner.class",
"com/google/foo/bar/Bar.class",
"gen/Gen.class",
"gen/Gen2.class",
"gen/Gen3.class");
assertThat(filteredSourceJarNames)
.containsExactly(
"com/google/foo/Foo.java",
"com/google/foo/bar/Bar.java",
"gen/Gen.java",
"gen/Gen2.java",
"gen/Gen3.java");
}
}