/* * Copyright 2013-present Facebook, Inc. * * 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.facebook.buck.jvm.java; import static org.easymock.EasyMock.createMock; import static org.hamcrest.Matchers.hasEntry; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.hasKey; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertThat; import com.facebook.buck.io.ProjectFilesystem; import com.facebook.buck.rules.SourcePathResolver; import com.google.common.collect.Lists; import java.util.Collections; import org.hamcrest.Matcher; import org.junit.Test; public class JavacOptionsTest { @Test public void buildsAreDebugByDefault() { JavacOptions options = createStandardBuilder().build(); assertOptionFlags(options, hasItem("g")); } @Test public void spoolModeToDiskByDefault() { JavacOptions options = createStandardBuilder().build(); assertThat(options.getSpoolMode(), is(JavacOptions.SpoolMode.INTERMEDIATE_TO_DISK)); } @Test public void compilationModeFullByDefault() { JavacOptions options = createStandardBuilder().build(); assertThat(options.getCompilationMode(), is(Javac.CompilationMode.FULL)); } @Test public void productionBuildsCanBeEnabled() { JavacOptions options = createStandardBuilder().setProductionBuild(true).build(); assertOptionFlags(options, not(hasItem("g"))); } @Test public void testDoesNotSetBootclasspathByDefault() { JavacOptions options = createStandardBuilder().build(); assertOptionsHasNoKey(options, "bootclasspath"); } @Test public void canSetBootclasspath() { JavacOptions options = createStandardBuilder().setBootclasspath("foo:bar").build(); assertOptionsHasKeyValue(options, "bootclasspath", "foo:bar"); } @Test public void shouldSetTheAnnotationSource() { AnnotationProcessingParams params = AnnotationProcessingParams.builder() .setLegacySafeAnnotationProcessors(Collections.emptySet()) .setLegacyAnnotationProcessorNames(Collections.singleton("processor")) .setProcessOnly(true) .build(); JavacOptions options = createStandardBuilder().setAnnotationProcessingParams(params).build(); assertOptionFlags(options, hasItem("proc:only")); } @Test public void shouldAddAllAddedAnnotationProcessors() { AnnotationProcessingParams params = AnnotationProcessingParams.builder() .setLegacyAnnotationProcessorDeps(Collections.emptySet()) .setLegacyAnnotationProcessorNames(Lists.newArrayList("myproc", "theirproc")) .setProcessOnly(true) .build(); JavacOptions options = createStandardBuilder().setAnnotationProcessingParams(params).build(); assertOptionsHasKeyValue(options, "processor", "myproc,theirproc"); } @Test public void shouldDisableAnnotationProcessingIfNoProcessorsSpecified() { JavacOptions options = createStandardBuilder().build(); assertOptionFlags(options, hasItem("proc:none")); } @Test public void sourceAndTarget7ByDefault() { JavacOptions options = createStandardBuilder().build(); assertOptionsHasKeyValue(options, "source", "7"); assertOptionsHasKeyValue(options, "target", "7"); } @Test public void shouldSetSourceAndTargetLevels() { JavacOptions original = createStandardBuilder().setSourceLevel("8").setTargetLevel("5").build(); JavacOptions copy = JavacOptions.builder(original).build(); assertOptionsHasKeyValue(copy, "source", "8"); assertOptionsHasKeyValue(copy, "target", "5"); } @Test public void shouldAddABootClasspathIfTheMapContainsOne() { JavacOptions options = createStandardBuilder() .setSourceLevel("5") .putSourceToBootclasspath("5", "some-magic.jar:also.jar") .build(); assertOptionsHasKeyValue(options, "bootclasspath", "some-magic.jar:also.jar"); } @Test public void shouldNotOverrideTheBootclasspathIfOneIsSet() { String expectedBootClasspath = "some-magic.jar:also.jar"; JavacOptions options = createStandardBuilder() .setBootclasspath(expectedBootClasspath) .setSourceLevel("5") .putSourceToBootclasspath("5", "not-the-right-path.jar") .build(); assertOptionsHasKeyValue(options, "bootclasspath", expectedBootClasspath); } @Test public void shouldNotOverrideTheBootclasspathIfSourceLevelHasNoMapping() { JavacOptions options = createStandardBuilder() .setBootclasspath("cake.jar") .setSourceLevel("6") .putSourceToBootclasspath("5", "some-magic.jar:also.jar") .build(); assertOptionsHasKeyValue(options, "bootclasspath", "cake.jar"); } @Test public void shouldCopyMapOfSourceLevelToBootclassPathWhenBuildingNewJavacOptions() { JavacOptions original = createStandardBuilder() .setSourceLevel("5") .putSourceToBootclasspath("5", "some-magic.jar:also.jar") .build(); JavacOptions copy = JavacOptions.builder(original).build(); assertOptionsHasKeyValue(copy, "bootclasspath", "some-magic.jar:also.jar"); } @Test public void shouldIncoporateExtraOptionsInOutput() { JavacOptions options = createStandardBuilder().addExtraArguments("-Xfoobar").build(); assertOptionsHasExtra(options, "-Xfoobar"); } private JavacOptions.Builder createStandardBuilder() { return JavacOptions.builderForUseInJavaBuckConfig(); } private void assertOptionFlags(JavacOptions options, Matcher<Iterable<? super String>> matcher) { assertThat(visitOptions(options).flags, matcher); } private OptionAccumulator visitOptions(JavacOptions options) { OptionAccumulator optionsConsumer = new OptionAccumulator(); options.appendOptionsTo( optionsConsumer, createMock(SourcePathResolver.class), createMock(ProjectFilesystem.class)); return optionsConsumer; } private void assertOptionsHasNoKey(JavacOptions options, String optionKey) { assertThat(visitOptions(options).keyVals, not(hasKey(optionKey))); } private void assertOptionsHasExtra(JavacOptions options, String extra) { assertThat(visitOptions(options).extras, hasItem(extra)); } private void assertOptionsHasKeyValue( JavacOptions options, String optionName, String optionValue) { assertThat(visitOptions(options).keyVals, hasEntry(optionName, optionValue)); } }