// 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.build.lib.runtime; import static com.google.common.truth.Truth.assertThat; import com.google.devtools.build.lib.flags.InvocationPolicyEnforcer; 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 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=thrownaway 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 implicit_requirement_a back to its default. 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); } }