public static void main(String[] args) throws OptionsParsingException, IOException { FileSystem fileSystem = FileSystems.getDefault(); OptionsParser parser = OptionsParser.newOptionsParser(PlMergeOptions.class); parser.parse(args); PlMergeOptions options = parser.getOptions(PlMergeOptions.class); if (options.controlPath == null) { missingArg("control"); } InputStream in = Files.newInputStream(fileSystem.getPath(options.controlPath)); Control control = Control.parseFrom(in); validateControl(control); PlistMerging merging = PlistMerging.from( control, new KeysToRemoveIfEmptyString("CFBundleIconFile", "NSPrincipalClass")); String primaryBundleId = Strings.emptyToNull(control.getPrimaryBundleId()); String fallbackBundleId = Strings.emptyToNull(control.getFallbackBundleId()); if (primaryBundleId != null || fallbackBundleId != null) { // Only set the bundle identifier if we were passed arguments to do so. // This prevents CFBundleIdentifiers being put into strings files. merging.setBundleIdentifier(primaryBundleId, fallbackBundleId); } merging.writePlist(fileSystem.getPath(control.getOutFile())); }
@Test public void testUseDefaultWithImplicitlyRequiredFlags() throws Exception { InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder(); invocationPolicyBuilder .addFlagPoliciesBuilder() .setFlagName("an_implicit_requirement") .getUseDefaultBuilder(); InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder); parser.parse( "--test_implicit_requirement=user value", "--an_implicit_requirement=implicit user value"); // test_implicit_requirement sets an_implicit_requirement to "foo", which ignores the user's // value because the parser processes implicit values last. TestOptions testOptions = getTestOptions(); assertEquals("user value", testOptions.testImplicitRequirement); assertEquals("foo", testOptions.anImplicitRequirement); // Then policy puts an_implicit_requirement back to its default. enforcer.enforce(parser, "build"); testOptions = getTestOptions(); assertEquals("user value", testOptions.testImplicitRequirement); assertEquals("implicit default", testOptions.anImplicitRequirement); }
public static void main(String[] args) throws OptionsParsingException, IOException { FileSystem fileSystem = FileSystems.getDefault(); OptionsParser parser = OptionsParser.newOptionsParser(PlMergeOptions.class); parser.parse(args); PlMergeOptions options = parser.getOptions(PlMergeOptions.class); MergingArguments data = null; if (usingControlProtobuf(options)) { InputStream in = Files.newInputStream(fileSystem.getPath(options.controlPath)); Control control = Control.parseFrom(in); validateControl(control); data = new MergingArguments(control); } else if (usingCommandLineArgs(options)) { data = new MergingArguments(options); } else { missingArg("Either --control or --out_file and at least one --source_file"); } PlistMerging merging = PlistMerging.from( data, ImmutableMap.<String, NSObject>of(), new KeysToRemoveIfEmptyString("CFBundleIconFile", "NSPrincipalClass")); if (data.getPrimaryBundleId() != null || data.getFallbackBundleId() != null) { // Only set the bundle identifier if we were passed arguments to do so. // This prevents CFBundleIdentifiers being put into strings files. merging.setBundleIdentifier(data.getPrimaryBundleId(), data.getFallbackBundleId()); } merging.writePlist(fileSystem.getPath(data.getOutFile())); }
/** Tests that SetValue overrides the user's value when the flag allows multiple values. */ @Test public void testSetValueWithMultipleValuesOverridesUser() throws Exception { InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder(); invocationPolicyBuilder .addFlagPoliciesBuilder() .setFlagName("test_multiple_string") .getSetValueBuilder() .addFlagValue("policy value 1") .addFlagValue("policy value 2"); InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder); parser.parse("--test_multiple_string=user value 1", "--test_multiple_string=user value 2"); // Options should not be modified by running the parser through OptionsPolicyEnforcer.create(). TestOptions testOptions = getTestOptions(); assertThat(testOptions.testMultipleString) .containsExactly("user value 1", "user value 2") .inOrder(); // assertEquals(, testOptions.test_multiple_string); enforcer.enforce(parser, "build"); // Get the options again after policy enforcement. testOptions = getTestOptions(); assertThat(testOptions.testMultipleString) .containsExactly("policy value 1", "policy value 2") .inOrder(); }
@Test public void testNonExistantFlagFromPolicy() throws Exception { InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder(); invocationPolicyBuilder .addFlagPoliciesBuilder() .setFlagName("i_do_not_exist") .getSetValueBuilder() .addFlagValue("policy value 1"); invocationPolicyBuilder .addFlagPoliciesBuilder() .setFlagName("test_string") .getSetValueBuilder() .addFlagValue("policy value 2"); InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder); parser.parse("--test_string=user value"); TestOptions testOptions = getTestOptions(); assertEquals("user value", testOptions.testString); enforcer.enforce(parser, "test"); // Still user value. testOptions = getTestOptions(); assertEquals("policy value 2", testOptions.testString); }
@Test public void testUseDefaultWithExpansionFlags() throws Exception { InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder(); invocationPolicyBuilder .addFlagPoliciesBuilder() .setFlagName("test_expansion_b") .getUseDefaultBuilder(); InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder); parser.parse("--test_expansion"); // --test_expansion should turn on test_expansion a, b, and c TestOptions testOptions = getTestOptions(); assertTrue(testOptions.testExpansionA); assertTrue(testOptions.testExpansionB); assertTrue(testOptions.testExpansionC); enforcer.enforce(parser, "build"); // After policy enforcement, test_expansion_b should be back to its default (false), but the // other two should remain the same. testOptions = getTestOptions(); assertTrue(testOptions.testExpansionA); assertFalse(testOptions.testExpansionB); assertTrue(testOptions.testExpansionC); }
@Test public void testAllowValuesDisallowsValue() throws Exception { InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder(); invocationPolicyBuilder .addFlagPoliciesBuilder() .setFlagName("test_string") .getAllowValuesBuilder() // no foo! .addAllowedValues(STRING_FLAG_DEFAULT) .addAllowedValues("bar"); InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder); parser.parse("--test_string=foo"); // Option should be "foo" as specified by the user. TestOptions testOptions = getTestOptions(); assertEquals("foo", testOptions.testString); try { // Should throw because "foo" is not allowed. enforcer.enforce(parser, "build"); fail(); } catch (OptionsParsingException e) { // expected } }
@Test public void testOperationNotSet() throws Exception { InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder(); invocationPolicyBuilder.addFlagPoliciesBuilder(); // No operations added to the flag policy InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder); parser.parse("--test_string=user value"); TestOptions testOptions = getTestOptions(); assertEquals("user value", testOptions.testString); // Shouldn't throw. enforcer.enforce(parser, "test"); // Still user value. testOptions = getTestOptions(); assertEquals("user value", testOptions.testString); }
private static InvocationPolicyEnforcer createOptionsPolicyEnforcer( InvocationPolicy.Builder invocationPolicyBuilder) throws Exception { InvocationPolicy policyProto = invocationPolicyBuilder.build(); // An OptionsPolicyEnforcer could be constructed in the test directly from the InvocationPolicy // proto, however Blaze will actually take the policy as another flag with a Base64 encoded // binary proto and parse that, so exercise that code path in the test. ByteArrayOutputStream out = new ByteArrayOutputStream(); policyProto.writeTo(out); String policyBase64 = BaseEncoding.base64().encode(out.toByteArray()); OptionsParser startupOptionsParser = OptionsParser.newOptionsParser(BlazeServerStartupOptions.class); String policyOption = "--invocation_policy=" + policyBase64; startupOptionsParser.parse(policyOption); return InvocationPolicyEnforcer.create(startupOptionsParser); }
/** Tests that policy overrides a value when that value is from the user. */ @Test public void testSetValueOverridesUser() throws Exception { InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder(); invocationPolicyBuilder .addFlagPoliciesBuilder() .setFlagName("test_string") .getSetValueBuilder() .addFlagValue("policy value"); InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder); parser.parse("--test_string=user value"); TestOptions testOptions = getTestOptions(); assertEquals("user value", testOptions.testString); enforcer.enforce(parser, "build"); // Get the options again after policy enforcement. testOptions = getTestOptions(); assertEquals("policy value", testOptions.testString); }
/** * *********************************************************************************************** * Other tests * ********************************************************************************************** */ @Test public void testFlagPolicyDoesNotApply() throws Exception { InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder(); invocationPolicyBuilder .addFlagPoliciesBuilder() .setFlagName("test_string") .addCommands("build") .getSetValueBuilder() .addFlagValue("policy value"); InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder); parser.parse("--test_string=user value"); TestOptions testOptions = getTestOptions(); assertEquals("user value", testOptions.testString); enforcer.enforce(parser, "test"); // Still user value. testOptions = getTestOptions(); assertEquals("user value", testOptions.testString); }
@Test public void testSetValueWithNoValueThrows() throws Exception { InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder(); invocationPolicyBuilder .addFlagPoliciesBuilder() .setFlagName("test_string") .getSetValueBuilder(); // No value. InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder); parser.parse("--test_string=user value"); // Repeatable flags always default to the empty list. TestOptions testOptions = getTestOptions(); assertEquals("user value", testOptions.testString); try { enforcer.enforce(parser, "build"); fail(); } catch (OptionsParsingException e) { // expected. } }
/** * *********************************************************************************************** * Tests for UseDefault * ********************************************************************************************** */ @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=user value"); // Options should be the user specified value before enforcing policy. TestOptions testOptions = getTestOptions(); assertEquals("user value", testOptions.testString); enforcer.enforce(parser, "build"); // Get the options again after policy enforcement: The flag should now be back to its default // value testOptions = getTestOptions(); assertEquals(STRING_FLAG_DEFAULT, testOptions.testString); }
protected BuildConfigurationCollection createCollection(String... args) throws Exception { OptionsParser parser = OptionsParser.newOptionsParser( ImmutableList.<Class<? extends OptionsBase>>builder() .addAll(buildOptionClasses) .add(TestOptions.class) .build()); parser.parse(args); ImmutableSortedSet<String> multiCpu = ImmutableSortedSet.copyOf(parser.getOptions(TestOptions.class).multiCpus); configurationFactory.forbidSanityCheck(); BuildOptions buildOptions = BuildOptions.of(buildOptionClasses, parser); BuildConfigurationCollection collection = skyframeExecutor.createConfigurations( configurationFactory, buildOptions, new BlazeDirectories(outputBase, outputBase, workspace), multiCpu, false); return collection; }
@Override public void editOptions(CommandEnvironment env, OptionsParser optionsParser) throws AbruptExitException { ProjectFileSupport.handleProjectFiles(env, optionsParser, commandName()); TestOutputFormat testOutput = optionsParser.getOptions(ExecutionOptions.class).testOutput; try { if (testOutput == TestStrategy.TestOutputFormat.STREAMED) { env.getReporter() .handle( Event.warn( "Streamed test output requested so all tests will be run locally, without sharding, " + "one at a time")); optionsParser.parse( OptionPriority.SOFTWARE_REQUIREMENT, "streamed output requires locally run tests, without sharding", ImmutableList.of("--test_sharding_strategy=disabled", "--test_strategy=exclusive")); } } catch (OptionsParsingException e) { throw new IllegalStateException("Known options failed to parse", e); } }
@Test public void testSetValueWithImplicitlyRequiredFlags() throws Exception { InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder(); invocationPolicyBuilder .addFlagPoliciesBuilder() .setFlagName("an_implicit_requirement") .getSetValueBuilder() .addFlagValue("policy value"); InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder); parser.parse("--test_implicit_requirement=user value"); // test_implicit_requirement sets an_implicit_requirement to "foo" TestOptions testOptions = getTestOptions(); assertEquals("user value", testOptions.testImplicitRequirement); assertEquals("foo", testOptions.anImplicitRequirement); enforcer.enforce(parser, "build"); testOptions = getTestOptions(); assertEquals("user value", testOptions.testImplicitRequirement); assertEquals("policy value", testOptions.anImplicitRequirement); }
/** * *********************************************************************************************** * Tests for DisallowValues * ********************************************************************************************** */ @Test public void testDisallowValuesAllowsValue() throws Exception { InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder(); invocationPolicyBuilder .addFlagPoliciesBuilder() .setFlagName("test_string") .getDisallowValuesBuilder() .addDisallowedValues("foo") .addDisallowedValues("bar"); InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder); parser.parse("--test_string=baz"); // Option should be "baz" as specified by the user. TestOptions testOptions = getTestOptions(); assertEquals("baz", testOptions.testString); enforcer.enforce(parser, "build"); // Still "baz" since "baz" is allowed by the policy. testOptions = getTestOptions(); assertEquals("baz", testOptions.testString); }
@Test public void testSetValueOverridable() throws Exception { InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder(); invocationPolicyBuilder .addFlagPoliciesBuilder() .setFlagName("test_string") .getSetValueBuilder() .addFlagValue("policy value") .setOverridable(true); InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder); parser.parse("--test_string=user value"); // Repeatable flags always default to the empty list. TestOptions testOptions = getTestOptions(); assertEquals("user value", testOptions.testString); enforcer.enforce(parser, "build"); // Even though the policy sets the value for test_string, the policy is overridable and the // user set the value, so it should be the user's value. testOptions = getTestOptions(); assertEquals("user value", testOptions.testString); }
@Test public void testDisallowValuesDisallowsMultipleValues() throws Exception { InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder(); invocationPolicyBuilder .addFlagPoliciesBuilder() .setFlagName("test_multiple_string") .getDisallowValuesBuilder() .addDisallowedValues("foo") .addDisallowedValues("bar"); InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder); parser.parse("--test_multiple_string=baz", "--test_multiple_string=bar"); // Option should be "baz" and "bar" as specified by the user. TestOptions testOptions = getTestOptions(); assertThat(testOptions.testMultipleString).containsExactly("baz", "bar").inOrder(); try { enforcer.enforce(parser, "build"); fail(); } catch (OptionsParsingException e) { // expected, since bar is disallowed. } }
@Test public void testDisallowValuesDisallowsValue() throws Exception { InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder(); invocationPolicyBuilder .addFlagPoliciesBuilder() .setFlagName("test_string") .getDisallowValuesBuilder() .addDisallowedValues("foo") .addDisallowedValues("bar"); InvocationPolicyEnforcer enforcer = createOptionsPolicyEnforcer(invocationPolicyBuilder); parser.parse("--test_string=foo"); // Option should be "foo" as specified by the user. TestOptions testOptions = getTestOptions(); assertEquals("foo", testOptions.testString); try { enforcer.enforce(parser, "build"); fail(); } catch (OptionsParsingException e) { // expected, since foo is disallowed. } }