blob: ef2fa0e4176f077b22a4e499fa7d63461e7354cf [file] [log] [blame]
// Copyright 2016 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.java.turbine;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.fail;
import com.google.devtools.build.buildjar.JarOwner;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
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.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
@RunWith(JUnit4.class)
public class TurbineOptionsTest {
@Rule public final TemporaryFolder tmpFolder = new TemporaryFolder();
static final ImmutableList<String> BASE_ARGS =
ImmutableList.of(
"--output",
"out.jar",
"--temp_dir",
"_tmp",
"--target_label",
"//java/com/google/test",
"--rule_kind",
"java_library");
@Test
public void exhaustiveArgs() throws Exception {
String[] lines = {
"--output",
"out.jar",
"--source_jars",
"sources1.srcjar",
"sources2.srcjar",
"--temp_dir",
"_tmp",
"--processors",
"com.foo.MyProcessor",
"com.foo.OtherProcessor",
"--processorpath",
"libproc1.jar:libproc2.jar",
"--classpath",
"lib1.jar:lib2.jar",
"--bootclasspath",
"rt.jar:zipfs.jar",
"--javacopts",
"-source",
"8",
"-target",
"8",
"--sources",
"Source1.java",
"Source2.java",
"--output_deps",
"out.jdeps",
"--target_label",
"//java/com/google/test",
"--rule_kind",
"java_library",
};
TurbineOptions options =
TurbineOptionsParser.parse(Iterables.concat(BASE_ARGS, Arrays.asList(lines)));
assertThat(options.outputFile()).isEqualTo("out.jar");
assertThat(options.sourceJars())
.containsExactly("sources1.srcjar", "sources2.srcjar")
.inOrder();
assertThat(options.tempDir()).isEqualTo("_tmp");
assertThat(options.processors())
.containsExactly("com.foo.MyProcessor", "com.foo.OtherProcessor")
.inOrder();
assertThat(options.processorPath()).containsExactly("libproc1.jar", "libproc2.jar").inOrder();
assertThat(options.classPath()).containsExactly("lib1.jar", "lib2.jar").inOrder();
assertThat(options.bootClassPath()).containsExactly("rt.jar", "zipfs.jar").inOrder();
assertThat(options.javacOpts()).containsExactly("-source", "8", "-target", "8").inOrder();
assertThat(options.sources()).containsExactly("Source1.java", "Source2.java");
assertThat(options.outputDeps()).hasValue("out.jdeps");
assertThat(options.targetLabel()).hasValue("//java/com/google/test");
assertThat(options.ruleKind()).hasValue("java_library");
}
@Test
public void strictJavaDepsArgs() throws Exception {
String[] lines = {
"--strict_java_deps",
"OFF",
"--direct_dependency",
"blaze-out/foo/libbar.jar",
"//foo/bar",
"--indirect_dependency",
"blaze-out/foo/libbaz1.jar",
"//foo/baz1",
"--indirect_dependency",
"blaze-out/foo/libbaz2.jar",
"//foo/baz2",
"--deps_artifacts",
"foo.jdeps",
"bar.jdeps",
"",
};
TurbineOptions options =
TurbineOptionsParser.parse(Iterables.concat(BASE_ARGS, Arrays.asList(lines)));
assertThat(options.targetLabel()).hasValue("//java/com/google/test");
assertThat(options.directJarsToTargets())
.containsExactlyEntriesIn(
ImmutableMap.of("blaze-out/foo/libbar.jar", JarOwner.create("//foo/bar")));
assertThat(options.indirectJarsToTargets())
.containsExactlyEntriesIn(
ImmutableMap.of(
"blaze-out/foo/libbaz1.jar", JarOwner.create("//foo/baz1"),
"blaze-out/foo/libbaz2.jar", JarOwner.create("//foo/baz2")));
assertThat(options.depsArtifacts()).containsExactly("foo.jdeps", "bar.jdeps");
}
@Test
public void classpathArgs() throws Exception {
String[] lines = {
"--classpath",
"liba.jar:libb.jar:libc.jar",
"--processorpath",
"libpa.jar:libpb.jar:libpc.jar",
};
TurbineOptions options =
TurbineOptionsParser.parse(Iterables.concat(BASE_ARGS, Arrays.asList(lines)));
assertThat(options.classPath()).containsExactly("liba.jar", "libb.jar", "libc.jar").inOrder();
assertThat(options.processorPath())
.containsExactly("libpa.jar", "libpb.jar", "libpc.jar")
.inOrder();
}
@Test
public void repeatedClasspath() throws Exception {
String[] lines = {
"--classpath",
"liba.jar",
"libb.jar:libc.jar",
"--processorpath",
"libpa.jar",
"libpb.jar",
"libpc.jar",
};
TurbineOptions options =
TurbineOptionsParser.parse(Iterables.concat(BASE_ARGS, Arrays.asList(lines)));
assertThat(options.classPath()).containsExactly("liba.jar", "libb.jar", "libc.jar").inOrder();
assertThat(options.processorPath())
.containsExactly("libpa.jar", "libpb.jar", "libpc.jar")
.inOrder();
}
@Test
public void optionalTargetLabelAndRuleKind() throws Exception {
String[] lines = {
"--output",
"out.jar",
"--temp_dir",
"_tmp",
"--classpath",
"liba.jar:libb.jar:libc.jar",
"--processorpath",
"libpa.jar:libpb.jar:libpc.jar",
};
TurbineOptions options = TurbineOptionsParser.parse(Arrays.asList(lines));
assertThat(options.ruleKind()).isAbsent();
assertThat(options.targetLabel()).isAbsent();
}
@Test
public void paramsFile() throws Exception {
Iterable<String> paramsArgs =
Iterables.concat(BASE_ARGS, Arrays.asList("--javacopts", "-source", "8", "-target", "8"));
Path params = tmpFolder.newFile("params.txt").toPath();
Files.write(params, paramsArgs, StandardCharsets.UTF_8);
// @ is a prefix for external repository targets, and the prefix for params files. Targets
// are disambiguated by prepending an extra @.
String[] lines = {
"@" + params.toAbsolutePath(), "--target_label", "//custom/label",
};
TurbineOptions options = TurbineOptionsParser.parse(Arrays.asList(lines));
// assert that options were read from params file
assertThat(options.javacOpts()).containsExactly("-source", "8", "-target", "8").inOrder();
// ... and directly from the command line
assertThat(options.targetLabel()).hasValue("//custom/label");
}
@Test
public void escapedExternalRepositoryLabel() throws Exception {
// @ is a prefix for external repository targets, and the prefix for params files. Targets
// are disambiguated by prepending an extra @.
String[] lines = {
"--target_label", "@@other-repo//foo:local-jam",
};
TurbineOptions options =
TurbineOptionsParser.parse(Iterables.concat(BASE_ARGS, Arrays.asList(lines)));
assertThat(options.targetLabel()).hasValue("@@other-repo//foo:local-jam");
}
@Test
public void failIfMissingExpectedArgs() throws Exception {
try {
TurbineOptions.builder().build();
fail();
} catch (NullPointerException e) {
assertThat(e).hasMessage("output must not be null");
}
}
}