blob: e66f7e02ce575dbe1fd515b8a5614d99fd29a20a [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.devtools.common.options;
import static com.google.common.truth.Truth.assertThat;
import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.InvocationPolicy;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/** Test InvocationPolicies with the UseDefault operation. */
@RunWith(JUnit4.class)
public class InvocationPolicyUseDefaultTest extends InvocationPolicyEnforcerTestBase {
// Useful constants
public static final String BUILD_COMMAND = "build";
public static final String TEST_STRING_USER_VALUE = "user value";
@Test
public void testUseDefault() throws Exception {
InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder();
invocationPolicyBuilder.addFlagPoliciesBuilder()
.setFlagName("test_string")
.getUseDefaultBuilder();
InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder);
parser.parse("--test_string=" + TEST_STRING_USER_VALUE);
// Options should be the user specified value before enforcing policy.
TestOptions testOptions = getTestOptions();
assertThat(testOptions.testString).isEqualTo(TEST_STRING_USER_VALUE);
enforcer.enforce(parser, BUILD_COMMAND);
// Get the options again after policy enforcement: The flag should now be back to its default
// value
testOptions = getTestOptions();
assertThat(testOptions.testString).isEqualTo(TestOptions.TEST_STRING_DEFAULT);
}
/**
* Tests UseDefault when the user never actually specified the flag.
*/
@Test
public void testUseDefaultWhenFlagWasntSet() throws Exception {
InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder();
invocationPolicyBuilder.addFlagPoliciesBuilder()
.setFlagName("test_string")
.getUseDefaultBuilder();
InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder);
// Options should be the default since the user never specified it.
TestOptions testOptions = getTestOptions();
assertThat(testOptions.testString).isEqualTo(TestOptions.TEST_STRING_DEFAULT);
enforcer.enforce(parser, BUILD_COMMAND);
// Still the default.
testOptions = getTestOptions();
assertThat(testOptions.testString).isEqualTo(TestOptions.TEST_STRING_DEFAULT);
}
@Test
public void testUseDefaultWithExpansionFlags() throws Exception {
InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder();
invocationPolicyBuilder.addFlagPoliciesBuilder()
.setFlagName("test_expansion")
.getUseDefaultBuilder();
InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder);
parser.parse("--test_expansion");
TestOptions testOptions = getTestOptions();
assertThat(testOptions.expandedA).isEqualTo(TestOptions.EXPANDED_A_TEST_EXPANSION);
assertThat(testOptions.expandedB).isEqualTo(TestOptions.EXPANDED_B_TEST_EXPANSION);
assertThat(testOptions.expandedC).isEqualTo(TestOptions.EXPANDED_C_TEST_EXPANSION);
assertThat(testOptions.expandedD).isEqualTo(TestOptions.EXPANDED_D_TEST_EXPANSION);
enforcer.enforce(parser, BUILD_COMMAND);
// After policy enforcement, all the flags that --test_expansion expanded into should be back
// to their default values.
testOptions = getTestOptions();
assertThat(testOptions.expandedA).isEqualTo(TestOptions.EXPANDED_A_DEFAULT);
assertThat(testOptions.expandedB).isEqualTo(TestOptions.EXPANDED_B_DEFAULT);
assertThat(testOptions.expandedC).isEqualTo(TestOptions.EXPANDED_C_DEFAULT);
assertThat(testOptions.expandedD).isEqualTo(TestOptions.EXPANDED_D_DEFAULT);
}
@Test
public void testUseDefaultWithVoidExpansionFunction() throws Exception {
InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder();
invocationPolicyBuilder
.addFlagPoliciesBuilder()
.setFlagName("test_void_expansion_function")
.getUseDefaultBuilder();
InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder);
parser.parse("--expanded_d=value to override");
TestOptions testOptions = getTestOptions();
assertThat(testOptions.expandedD).isEqualTo("value to override");
enforcer.enforce(parser, BUILD_COMMAND);
// After policy enforcement, all the flags that --test_void_expansion_function expanded into
// should be back to their default values.
testOptions = getTestOptions();
assertThat(testOptions.expandedD).isEqualTo(TestOptions.EXPANDED_D_DEFAULT);
}
@Test
public void testUseDefaultWithExpansionFlagAndLaterOverride() throws Exception {
InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder();
invocationPolicyBuilder
.addFlagPoliciesBuilder()
.setFlagName("test_expansion")
.getUseDefaultBuilder();
invocationPolicyBuilder
.addFlagPoliciesBuilder()
.setFlagName("expanded_b")
.getAllowValuesBuilder()
.addAllowedValues("false");
InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder);
parser.parse("--test_expansion");
TestOptions testOptions = getTestOptions();
assertThat(testOptions.expandedA).isEqualTo(TestOptions.EXPANDED_A_TEST_EXPANSION);
assertThat(testOptions.expandedB).isEqualTo(TestOptions.EXPANDED_B_TEST_EXPANSION);
assertThat(testOptions.expandedC).isEqualTo(TestOptions.EXPANDED_C_TEST_EXPANSION);
assertThat(testOptions.expandedD).isEqualTo(TestOptions.EXPANDED_D_TEST_EXPANSION);
// If the UseDefault is run, then the value of --expanded_b is back to it's default true, which
// isn't allowed. However, the allowValues in the later policy should wipe the expansion's
// policy on --expanded_b, so that the enforcement does not fail.
enforcer.enforce(parser, BUILD_COMMAND);
testOptions = getTestOptions();
assertThat(testOptions.expandedA).isEqualTo(TestOptions.EXPANDED_A_DEFAULT);
assertThat(testOptions.expandedB).isEqualTo(TestOptions.EXPANDED_B_TEST_EXPANSION);
assertThat(testOptions.expandedC).isEqualTo(TestOptions.EXPANDED_C_DEFAULT);
assertThat(testOptions.expandedD).isEqualTo(TestOptions.EXPANDED_D_DEFAULT);
}
@Test
public void testUseDefaultWithRecursiveExpansionFlags() throws Exception {
InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder();
invocationPolicyBuilder.addFlagPoliciesBuilder()
.setFlagName("test_expansion")
.getUseDefaultBuilder();
InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder);
parser.parse("--test_recursive_expansion_top_level");
TestOptions testOptions = getTestOptions();
assertThat(testOptions.expandedA).isEqualTo(TestOptions.EXPANDED_A_TEST_RECURSIVE_EXPANSION);
assertThat(testOptions.expandedB).isEqualTo(TestOptions.EXPANDED_B_TEST_RECURSIVE_EXPANSION);
assertThat(testOptions.expandedC).isEqualTo(TestOptions.EXPANDED_C_TEST_RECURSIVE_EXPANSION);
assertThat(testOptions.expandedD).isEqualTo(TestOptions.EXPANDED_D_TEST_RECURSIVE_EXPANSION);
enforcer.enforce(parser, BUILD_COMMAND);
// After policy enforcement, all the flags that --test_recursive_expansion_top_level and its
// recursive expansions set should be back to their default values.
testOptions = getTestOptions();
assertThat(testOptions.expandedA).isEqualTo(TestOptions.EXPANDED_A_DEFAULT);
assertThat(testOptions.expandedB).isEqualTo(TestOptions.EXPANDED_B_DEFAULT);
assertThat(testOptions.expandedC).isEqualTo(TestOptions.EXPANDED_C_DEFAULT);
assertThat(testOptions.expandedD).isEqualTo(TestOptions.EXPANDED_D_DEFAULT);
}
@Test
public void testUseDefaultWithExpandedFlags() throws Exception {
InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder();
invocationPolicyBuilder
.addFlagPoliciesBuilder()
.setFlagName("expanded_b")
.getUseDefaultBuilder();
InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder);
parser.parse("--test_expansion");
// --test_expansion should turn set the values from its expansion
TestOptions testOptions = getTestOptions();
assertThat(testOptions.expandedA).isEqualTo(TestOptions.EXPANDED_A_TEST_EXPANSION);
assertThat(testOptions.expandedB).isEqualTo(TestOptions.EXPANDED_B_TEST_EXPANSION);
assertThat(testOptions.expandedC).isEqualTo(TestOptions.EXPANDED_C_TEST_EXPANSION);
assertThat(testOptions.expandedD).isEqualTo(TestOptions.EXPANDED_D_TEST_EXPANSION);
enforcer.enforce(parser, BUILD_COMMAND);
// After policy enforcement, expanded_b should be back to its default (true), but the
// rest should remain the same.
testOptions = getTestOptions();
assertThat(testOptions.expandedA).isEqualTo(TestOptions.EXPANDED_A_TEST_EXPANSION);
assertThat(testOptions.expandedB).isEqualTo(TestOptions.EXPANDED_B_DEFAULT);
assertThat(testOptions.expandedC).isEqualTo(TestOptions.EXPANDED_C_TEST_EXPANSION);
assertThat(testOptions.expandedD).isEqualTo(TestOptions.EXPANDED_D_TEST_EXPANSION);
}
@Test
public void testUseDefaultWithFlagWithImplicitRequirements() throws Exception {
InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder();
invocationPolicyBuilder.addFlagPoliciesBuilder()
.setFlagName("test_implicit_requirement")
.getUseDefaultBuilder();
InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder);
parser.parse("--test_implicit_requirement=" + TEST_STRING_USER_VALUE);
// test_implicit_requirement sets implicit_requirement_a to "foo", which ignores the user's
// value because the parser processes implicit values last.
TestOptions testOptions = getTestOptions();
assertThat(testOptions.testImplicitRequirement).isEqualTo(TEST_STRING_USER_VALUE);
assertThat(testOptions.implicitRequirementA)
.isEqualTo(TestOptions.IMPLICIT_REQUIREMENT_A_REQUIRED);
// Then policy puts test_implicit_requirement and its implicit requirements back to its default.
enforcer.enforce(parser, BUILD_COMMAND);
testOptions = getTestOptions();
assertThat(testOptions.testImplicitRequirement)
.isEqualTo(TestOptions.TEST_IMPLICIT_REQUIREMENT_DEFAULT);
assertThat(testOptions.implicitRequirementA)
.isEqualTo(TestOptions.IMPLICIT_REQUIREMENT_A_DEFAULT);
}
@Test
public void testUseDefaultWithImplicitlyRequiredFlag() throws Exception {
InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder();
invocationPolicyBuilder
.addFlagPoliciesBuilder()
.setFlagName("implicit_requirement_a")
.getUseDefaultBuilder();
InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder);
parser.parse(
"--test_implicit_requirement=" + TEST_STRING_USER_VALUE,
"--implicit_requirement_a=" + TEST_STRING_USER_VALUE);
// test_implicit_requirement sets implicit_requirement_a to "foo", but it gets overwritten
// by the user value.
TestOptions testOptions = getTestOptions();
assertThat(testOptions.testImplicitRequirement).isEqualTo(TEST_STRING_USER_VALUE);
assertThat(testOptions.implicitRequirementA).isEqualTo(TEST_STRING_USER_VALUE);
// Then policy puts implicit_requirement_a back to its default. This is "broken" since it wipes
// the user value, but this is the behavior that was agreed on and is documented for expansion
// flags as well.
enforcer.enforce(parser, BUILD_COMMAND);
testOptions = getTestOptions();
assertThat(testOptions.testImplicitRequirement).isEqualTo(TEST_STRING_USER_VALUE);
assertThat(testOptions.implicitRequirementA)
.isEqualTo(TestOptions.IMPLICIT_REQUIREMENT_A_DEFAULT);
}
@Test
public void testUseDefaultWithFlagWithRecursiveImplicitRequirements() throws Exception {
InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder();
invocationPolicyBuilder.addFlagPoliciesBuilder()
.setFlagName("test_recursive_implicit_requirement")
.getUseDefaultBuilder();
InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder);
parser.parse("--test_recursive_implicit_requirement=" + TEST_STRING_USER_VALUE);
// test_recursive_implicit_requirement gets its value from the command line,
// test_implicit_requirement gets its value from test_recursive_implicit_requirement, and
// implicit_requirement_a gets its value from test_implicit_requirement.
TestOptions testOptions = getTestOptions();
assertThat(testOptions.testRecursiveImplicitRequirement).isEqualTo(TEST_STRING_USER_VALUE);
assertThat(testOptions.testImplicitRequirement)
.isEqualTo(TestOptions.TEST_IMPLICIT_REQUIREMENT_REQUIRED);
assertThat(testOptions.implicitRequirementA)
.isEqualTo(TestOptions.IMPLICIT_REQUIREMENT_A_REQUIRED);
enforcer.enforce(parser, BUILD_COMMAND);
// Policy enforcement should set everything back to its default value.
testOptions = getTestOptions();
assertThat(testOptions.testRecursiveImplicitRequirement)
.isEqualTo(TestOptions.TEST_RECURSIVE_IMPLICIT_REQUIREMENT_DEFAULT);
assertThat(testOptions.testImplicitRequirement)
.isEqualTo(TestOptions.TEST_IMPLICIT_REQUIREMENT_DEFAULT);
assertThat(testOptions.implicitRequirementA)
.isEqualTo(TestOptions.IMPLICIT_REQUIREMENT_A_DEFAULT);
}
}