blob: 7d8a01f798881726f1033b44bab4f1f1bfeb4e65 [file] [log] [blame]
/*
* Copyright (C) 2008 The Android Open Source Project
*
* 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.android.sdklib.util;
import com.android.utils.ILogger;
import com.android.utils.StdLogger;
import java.util.Arrays;
import java.util.List;
import junit.framework.TestCase;
public class CommandLineParserTest extends TestCase {
private StdLogger mLog;
/**
* A mock version of the {@link CommandLineParser} class that does not
* exits and captures its stdout/stderr output.
*/
public static class MockCommandLineProcessor extends CommandLineParser {
private boolean mExitCalled;
private boolean mHelpCalled;
private String mStdOut = "";
private String mStdErr = "";
public MockCommandLineProcessor(ILogger logger) {
super(logger,
new String[][] {
{ "verb1", "action1", "Some action" },
{ "verb1", "action2", "Another action" },
{ "verb2", NO_VERB_OBJECT, "Action with string array" },
});
define(Mode.STRING, false /*mandatory*/,
"verb1", "action1", "1", "first", "non-mandatory flag", null);
define(Mode.STRING, true /*mandatory*/,
"verb1", "action1", "2", "second", "mandatory flag", null);
define(Mode.STRING, true /*mandatory*/,
"verb2", NO_VERB_OBJECT, "1", "first", "1st mandatory flag", null);
define(Mode.STRING_ARRAY, true /*mandatory*/,
"verb2", NO_VERB_OBJECT, "2", "second", "2nd mandatory flag", null);
define(Mode.STRING, true /*mandatory*/,
"verb2", NO_VERB_OBJECT, "3", "third", "3rd mandatory flag", null);
}
@Override
public void printHelpAndExitForAction(String verb, String directObject,
String errorFormat, Object... args) {
mHelpCalled = true;
super.printHelpAndExitForAction(verb, directObject, errorFormat, args);
}
@Override
protected void exit() {
mExitCalled = true;
}
@Override
protected void stdout(String format, Object... args) {
String s = String.format(format, args);
mStdOut += s + "\n";
// don't call super to avoid printing stuff
}
@Override
protected void stderr(String format, Object... args) {
String s = String.format(format, args);
mStdErr += s + "\n";
// don't call super to avoid printing stuff
}
public boolean wasHelpCalled() {
return mHelpCalled;
}
public boolean wasExitCalled() {
return mExitCalled;
}
public String getStdOut() {
return mStdOut;
}
public String getStdErr() {
return mStdErr;
}
}
@Override
protected void setUp() throws Exception {
mLog = new StdLogger(StdLogger.Level.VERBOSE);
super.setUp();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
public void testPrintHelpAndExit() {
MockCommandLineProcessor c = new MockCommandLineProcessor(mLog);
assertFalse(c.wasExitCalled());
assertFalse(c.wasHelpCalled());
assertTrue(c.getStdOut().equals(""));
assertTrue(c.getStdErr().equals(""));
c.printHelpAndExit(null);
assertTrue(c.getStdOut().indexOf("-v") != -1);
assertTrue(c.getStdOut().indexOf("--verbose") != -1);
assertTrue(c.getStdErr().equals(""));
assertTrue(c.wasExitCalled());
c = new MockCommandLineProcessor(mLog);
assertFalse(c.wasExitCalled());
assertTrue(c.getStdOut().equals(""));
assertTrue(c.getStdErr().indexOf("Missing parameter") == -1);
c.printHelpAndExit("Missing %s", "parameter");
assertTrue(c.wasExitCalled());
assertFalse(c.getStdOut().equals(""));
assertTrue(c.getStdErr().indexOf("Missing parameter") != -1);
}
public void testVerbose() {
MockCommandLineProcessor c = new MockCommandLineProcessor(mLog);
assertFalse(c.isVerbose());
c.parseArgs(new String[] { "-v" });
assertTrue(c.isVerbose());
assertTrue(c.wasExitCalled());
assertTrue(c.wasHelpCalled());
assertTrue(c.getStdErr().indexOf("Missing verb name.") != -1);
c = new MockCommandLineProcessor(mLog);
c.parseArgs(new String[] { "--verbose" });
assertTrue(c.isVerbose());
assertTrue(c.wasExitCalled());
assertTrue(c.wasHelpCalled());
assertTrue(c.getStdErr().indexOf("Missing verb name.") != -1);
}
public void testHelp() {
MockCommandLineProcessor c = new MockCommandLineProcessor(mLog);
c.parseArgs(new String[] { "-h" });
assertTrue(c.wasExitCalled());
assertTrue(c.wasHelpCalled());
assertTrue(c.getStdErr().indexOf("Missing verb name.") == -1);
c = new MockCommandLineProcessor(mLog);
c.parseArgs(new String[] { "--help" });
assertTrue(c.wasExitCalled());
assertTrue(c.wasHelpCalled());
assertTrue(c.getStdErr().indexOf("Missing verb name.") == -1);
}
public void testMandatory() {
MockCommandLineProcessor c = new MockCommandLineProcessor(mLog);
c.parseArgs(new String[] { "verb1", "action1", "-1", "value1", "-2", "value2" });
assertFalse(c.wasExitCalled());
assertFalse(c.wasHelpCalled());
assertEquals("", c.getStdErr());
assertEquals("value1", c.getValue("verb1", "action1", "first"));
assertEquals("value2", c.getValue("verb1", "action1", "second"));
c = new MockCommandLineProcessor(mLog);
c.parseArgs(new String[] { "verb1", "action1", "-2", "value2" });
assertFalse(c.wasExitCalled());
assertFalse(c.wasHelpCalled());
assertEquals("", c.getStdErr());
assertEquals(null, c.getValue("verb1", "action1", "first"));
assertEquals("value2", c.getValue("verb1", "action1", "second"));
c = new MockCommandLineProcessor(mLog);
c.parseArgs(new String[] { "verb1", "action1" });
assertTrue(c.wasExitCalled());
assertTrue(c.wasHelpCalled());
assertTrue(c.getStdErr().indexOf("must be defined") != -1);
assertEquals(null, c.getValue("verb1", "action1", "first"));
assertEquals(null, c.getValue("verb1", "action1", "second"));
}
public void testStringArray() {
MockCommandLineProcessor c = new MockCommandLineProcessor(mLog);
c.parseArgs(new String[] { "verb2",
"-1", "value1",
"-2", "value2_a", "value2_b", "value2_c", "value2_d",
"-3", "value3" });
assertFalse(c.wasExitCalled());
assertFalse(c.wasHelpCalled());
assertEquals("", c.getStdErr());
assertEquals("value1", c.getValue("verb2", null, "first"));
assertTrue(c.getValue("verb2", null, "second") instanceof List<?>);
assertEquals("[value2_a, value2_b, value2_c, value2_d]",
Arrays.toString(((List<?>) c.getValue("verb2", null, "second")).toArray()));
assertEquals("value3", c.getValue("verb2", null, "third"));
}
public void testStringArray_DashDash() {
MockCommandLineProcessor c = new MockCommandLineProcessor(mLog);
// Use -- to tell argument -2 it can absorb any argument, including dashed ones.
// Logically -2 must be the last argument and -1/-3 must be placed before it.
c.parseArgs(new String[] { "verb2",
"-1", "value1",
"-3", "value3",
"-2", "value2_a", "--", "-value2_b", "--value2_c", "value2_d" });
assertFalse(c.wasExitCalled());
assertFalse(c.wasHelpCalled());
assertEquals("", c.getStdErr());
assertEquals("value1", c.getValue("verb2", null, "first"));
assertTrue(c.getValue("verb2", null, "second") instanceof List<?>);
assertEquals("[value2_a, --, -value2_b, --value2_c, value2_d]",
Arrays.toString(((List<?>) c.getValue("verb2", null, "second")).toArray()));
assertEquals("value3", c.getValue("verb2", null, "third"));
}
public void testStringArray_EmptyStringArray() {
MockCommandLineProcessor c = new MockCommandLineProcessor(mLog);
c.parseArgs(new String[] { "verb2",
"-1", "value1",
"-2",
"-3", "value3" });
assertTrue(c.wasExitCalled());
assertTrue(c.wasHelpCalled());
assertEquals("Invalid usage for flag -2: No values provided.", c.getStdErr().trim());
}
}