/******************************************************************************* * * Copyright (c) 2004-2010 Oracle Corporation. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * * Kohsuke Kawaguchi, Yahoo! Inc. * * *******************************************************************************/ package hudson.util; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.junit.Assert; import org.junit.Test; public class ArgumentListBuilderTest extends Assert { public static void assertArrayEquals(String msg, boolean[] expected, boolean[] actual) { assertArrayEquals(msg,box(expected),box(actual)); } private static Boolean[] box(boolean[] a) { if(a==null) return null; Boolean[] r = new Boolean[a.length]; for (int i = 0; i < a.length; i++) r[i] = a[i]; return r; } @Test public void assertEmptyMask() { ArgumentListBuilder builder = new ArgumentListBuilder(); builder.add("arg"); builder.add("other", "arguments"); assertFalse("There shouldnt be any masked arguments", builder.hasMaskedArguments()); boolean[] array = builder.toMaskArray(); assertNotNull("The mask array should not be null", array); assertArrayEquals("The mask array was incorrect", new boolean[]{false,false,false}, array); } @Test public void assertLastArgumentIsMasked() { ArgumentListBuilder builder = new ArgumentListBuilder(); builder.add("arg"); builder.addMasked("ismasked"); assertTrue("There should be masked arguments", builder.hasMaskedArguments()); boolean[] array = builder.toMaskArray(); assertNotNull("The mask array should not be null", array); assertArrayEquals("The mask array was incorrect", new boolean[]{false,true}, array); } @Test public void assertSeveralMaskedArguments() { ArgumentListBuilder builder = new ArgumentListBuilder(); builder.add("arg"); builder.addMasked("ismasked"); builder.add("non masked arg"); builder.addMasked("ismasked2"); assertTrue("There should be masked arguments", builder.hasMaskedArguments()); boolean[] array = builder.toMaskArray(); assertNotNull("The mask array should not be null", array); assertArrayEquals("The mask array was incorrect", new boolean[]{false,true, false, true}, array); } @Test public void assertPrependAfterAddingMasked() { ArgumentListBuilder builder = new ArgumentListBuilder(); builder.addMasked("ismasked"); builder.add("arg"); builder.prepend("first", "second"); assertTrue("There should be masked arguments", builder.hasMaskedArguments()); boolean[] array = builder.toMaskArray(); assertNotNull("The mask array should not be null", array); assertArrayEquals("The mask array was incorrect", new boolean[]{false,false,true,false}, array); } @Test public void assertPrependBeforeAddingMasked() { ArgumentListBuilder builder = new ArgumentListBuilder(); builder.prepend("first", "second"); builder.addMasked("ismasked"); builder.add("arg"); assertTrue("There should be masked arguments", builder.hasMaskedArguments()); boolean[] array = builder.toMaskArray(); assertNotNull("The mask array should not be null", array); assertArrayEquals("The mask array was incorrect", new boolean[]{false,false,true,false}, array); } @Test public void testToWindowsCommand() { ArgumentListBuilder builder = new ArgumentListBuilder( "ant.bat", "-Dfoo1=abc", // nothing special, no quotes "-Dfoo2=foo bar", "-Dfoo3=/u*r", "-Dfoo4=/us?", // add quotes "-Dfoo10=bar,baz", "-Dfoo5=foo;bar^baz", "-Dfoo6=<xml>&here;</xml>", // add quotes "-Dfoo7=foo|bar\"baz", // add quotes and "" for " "-Dfoo8=% %QED% %comspec% %-%(%.%", // add quotes, and extra quotes for %Q and %c "-Dfoo9=%'''%%@%"); // no quotes as none of the % are followed by a letter assertArrayEquals(new String[] { "cmd.exe", "/C", "\"ant.bat -Dfoo1=abc \"-Dfoo2=foo bar\"" + " \"-Dfoo3=/u*r\" \"-Dfoo4=/us?\" \"-Dfoo10=bar,baz\" \"-Dfoo5=foo;bar^baz\"" + " \"-Dfoo6=<xml>&here;</xml>\" \"-Dfoo7=foo|bar\"\"baz\"" + " \"-Dfoo8=% %\"Q\"ED% %\"c\"omspec% %-%(%.%\"" + " -Dfoo9=%'''%%@% && exit %%ERRORLEVEL%%\"" }, builder.toWindowsCommand().toCommandArray()); } @Test public void assertMaskOnClone() { ArgumentListBuilder builder = new ArgumentListBuilder(); builder.add("arg1"); builder.addMasked("masked1"); builder.add("arg2"); ArgumentListBuilder clone = builder.clone(); assertTrue("There should be masked arguments", clone.hasMaskedArguments()); boolean[] array = clone.toMaskArray(); assertNotNull("The mask array should not be null", array); assertArrayEquals("The mask array was incorrect", builder.toMaskArray(), array); } private static final Map<String, String> KEY_VALUES = new HashMap<String, String>() {{ put("key1", "value1"); put("key2", "value2"); put("key3", "value3"); }}; private static final Set<String> MASKS = new HashSet<String>() {{ add("key2"); }}; @Test public void assertKeyValuePairsWithMask() { ArgumentListBuilder builder = new ArgumentListBuilder(); builder.addKeyValuePairs(null, KEY_VALUES, MASKS); assertTrue("There should be masked arguments", builder.hasMaskedArguments()); boolean[] array = builder.toMaskArray(); assertNotNull("The mask array should not be null", array); assertArrayEquals("The mask array was incorrect", new boolean[]{false,true,false}, array); } @Test public void assertKeyValuePairs() { ArgumentListBuilder builder = new ArgumentListBuilder(); builder.addKeyValuePairs(null, KEY_VALUES); assertFalse("There shouldnt be any masked arguments", builder.hasMaskedArguments()); boolean[] array = builder.toMaskArray(); assertNotNull("The mask array should not be null", array); assertArrayEquals("The mask array was incorrect", new boolean[]{false,false,false}, array); } }