// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.base; import android.test.InstrumentationTestCase; import android.test.suitebuilder.annotation.SmallTest; import org.chromium.base.test.util.Feature; public class CommandLineTest extends InstrumentationTestCase { // A reference command line. Note that switch2 is [brea\d], switch3 is [and "butter"], // and switch4 is [a "quoted" 'food'!] static final String INIT_SWITCHES[] = { "init_command", "--SWITCH", "Arg", "--switch2=brea\\d", "--switch3=and \"butter\"", "--switch4=a \"quoted\" 'food'!", "--", "--actually_an_arg" }; // The same command line, but in quoted string format. static final char INIT_SWITCHES_BUFFER[] = ("init_command --SWITCH Arg --switch2=brea\\d --switch3=\"and \\\"butt\"er\\\" " + "--switch4='a \"quoted\" \\'food\\'!' " + "-- --actually_an_arg").toCharArray(); static final String CL_ADDED_SWITCH = "zappo-dappo-doggy-trainer"; static final String CL_ADDED_SWITCH_2 = "username"; static final String CL_ADDED_VALUE_2 = "bozo"; @Override public void setUp() throws Exception { CommandLine.reset(); } void checkInitSwitches() { CommandLine cl = CommandLine.getInstance(); assertFalse(cl.hasSwitch("init_command")); assertFalse(cl.hasSwitch("switch")); assertTrue(cl.hasSwitch("SWITCH")); assertFalse(cl.hasSwitch("--SWITCH")); assertFalse(cl.hasSwitch("Arg")); assertFalse(cl.hasSwitch("actually_an_arg")); assertEquals("brea\\d", cl.getSwitchValue("switch2")); assertEquals("and \"butter\"", cl.getSwitchValue("switch3")); assertEquals("a \"quoted\" 'food'!", cl.getSwitchValue("switch4")); assertNull(cl.getSwitchValue("SWITCH")); assertNull(cl.getSwitchValue("non-existant")); } void checkSettingThenGetting() { CommandLine cl = CommandLine.getInstance(); // Add a plain switch. assertFalse(cl.hasSwitch(CL_ADDED_SWITCH)); cl.appendSwitch(CL_ADDED_SWITCH); assertTrue(cl.hasSwitch(CL_ADDED_SWITCH)); // Add a switch paired with a value. assertFalse(cl.hasSwitch(CL_ADDED_SWITCH_2)); assertNull(cl.getSwitchValue(CL_ADDED_SWITCH_2)); cl.appendSwitchWithValue(CL_ADDED_SWITCH_2, CL_ADDED_VALUE_2); assertTrue(CL_ADDED_VALUE_2.equals(cl.getSwitchValue(CL_ADDED_SWITCH_2))); // Append a few new things. final String switchesAndArgs[] = { "dummy", "--superfast", "--speed=turbo" }; assertFalse(cl.hasSwitch("dummy")); assertFalse(cl.hasSwitch("superfast")); assertNull(cl.getSwitchValue("speed")); cl.appendSwitchesAndArguments(switchesAndArgs); assertFalse(cl.hasSwitch("dummy")); assertFalse(cl.hasSwitch("command")); assertTrue(cl.hasSwitch("superfast")); assertTrue("turbo".equals(cl.getSwitchValue("speed"))); } void checkTokenizer(String[] expected, String toParse) { String[] actual = CommandLine.tokenizeQuotedAruments(toParse.toCharArray()); assertEquals(expected.length, actual.length); for (int i = 0; i < expected.length; ++i) { assertEquals("comparing element " + i, expected[i], actual[i]); } } @SmallTest @Feature({"Android-AppBase"}) public void testJavaInitialization() { CommandLine.init(INIT_SWITCHES); checkInitSwitches(); checkSettingThenGetting(); } @SmallTest @Feature({"Android-AppBase"}) public void testBufferInitialization() { CommandLine.init(CommandLine.tokenizeQuotedAruments(INIT_SWITCHES_BUFFER)); checkInitSwitches(); checkSettingThenGetting(); } @SmallTest @Feature({"Android-AppBase"}) public void testArgumentTokenizer() { String toParse = " a\"\\bc de\\\"f g\"\\h ij k\" \"lm"; String[] expected = { "a\\bc de\"f g\\h", "ij", "k lm" }; checkTokenizer(expected, toParse); toParse = ""; expected = new String[0]; checkTokenizer(expected, toParse); toParse = " \t\n"; checkTokenizer(expected, toParse); toParse = " \"a'b\" 'c\"d' \"e\\\"f\" 'g\\'h' \"i\\'j\" 'k\\\"l'" + " m\"n\\'o\"p q'r\\\"s't"; expected = new String[] { "a'b", "c\"d", "e\"f", "g'h", "i\\'j", "k\\\"l", "mn\\'op", "qr\\\"st"}; checkTokenizer(expected, toParse); } }