| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <string> | 5 #include <string> |
| 6 #include <vector> | 6 #include <vector> |
| 7 | 7 |
| 8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/file_path.h" | 10 #include "base/file_path.h" |
| 11 #include "base/utf_string_conversions.h" | 11 #include "base/utf_string_conversions.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 13 | 13 |
| 14 // To test Windows quoting behavior, we use a string that has some backslashes | 14 // To test Windows quoting behavior, we use a string that has some backslashes |
| 15 // and quotes. | 15 // and quotes. |
| 16 // Consider the command-line argument: q\"bs1\bs2\\bs3q\\\" | 16 // Consider the command-line argument: q\"bs1\bs2\\bs3q\\\" |
| 17 // Here it is with C-style escapes. | 17 // Here it is with C-style escapes. |
| 18 #define TRICKY_QUOTED L"q\\\"bs1\\bs2\\\\bs3q\\\\\\\"" | 18 static const CommandLine::StringType kTrickyQuoted = |
| 19 FILE_PATH_LITERAL("q\\\"bs1\\bs2\\\\bs3q\\\\\\\""); |
| 19 // It should be parsed by Windows as: q"bs1\bs2\\bs3q\" | 20 // It should be parsed by Windows as: q"bs1\bs2\\bs3q\" |
| 20 // Here that is with C-style escapes. | 21 // Here that is with C-style escapes. |
| 21 #define TRICKY L"q\"bs1\\bs2\\\\bs3q\\\"" | 22 static const CommandLine::StringType kTricky = |
| 23 FILE_PATH_LITERAL("q\"bs1\\bs2\\\\bs3q\\\""); |
| 22 | 24 |
| 23 TEST(CommandLineTest, CommandLineConstructor) { | 25 TEST(CommandLineTest, CommandLineConstructor) { |
| 24 #if defined(OS_WIN) | 26 const CommandLine::CharType* argv[] = { |
| 25 CommandLine cl = CommandLine::FromString( | 27 FILE_PATH_LITERAL("program"), |
| 26 L"program --foo= -bAr /Spaetzel=pierogi /Baz flim " | 28 FILE_PATH_LITERAL("--foo="), |
| 27 L"--other-switches=\"--dog=canine --cat=feline\" " | 29 FILE_PATH_LITERAL("-bAr"), |
| 28 L"-spaetzle=Crepe -=loosevalue flan " | 30 FILE_PATH_LITERAL("-spaetzel=pierogi"), |
| 29 L"--input-translation=\"45\"--output-rotation " | 31 FILE_PATH_LITERAL("-baz"), |
| 30 L"--quotes=" TRICKY_QUOTED L" " | 32 FILE_PATH_LITERAL("flim"), |
| 31 L"-- -- --not-a-switch " | 33 FILE_PATH_LITERAL("--other-switches=--dog=canine --cat=feline"), |
| 32 L"\"in the time of submarines...\""); | 34 FILE_PATH_LITERAL("-spaetzle=Crepe"), |
| 35 FILE_PATH_LITERAL("-=loosevalue"), |
| 36 FILE_PATH_LITERAL("FLAN"), |
| 37 FILE_PATH_LITERAL("--input-translation=45--output-rotation"), |
| 38 FILE_PATH_LITERAL("--"), |
| 39 FILE_PATH_LITERAL("--"), |
| 40 FILE_PATH_LITERAL("--not-a-switch"), |
| 41 FILE_PATH_LITERAL("\"in the time of submarines...\""), |
| 42 FILE_PATH_LITERAL("unquoted arg-with-space")}; |
| 43 CommandLine cl(arraysize(argv), argv); |
| 44 |
| 33 EXPECT_FALSE(cl.command_line_string().empty()); | 45 EXPECT_FALSE(cl.command_line_string().empty()); |
| 34 #elif defined(OS_POSIX) | |
| 35 const char* argv[] = {"program", "--foo=", "-bar", | |
| 36 "-spaetzel=pierogi", "-baz", "flim", | |
| 37 "--other-switches=--dog=canine --cat=feline", | |
| 38 "-spaetzle=Crepe", "-=loosevalue", "flan", | |
| 39 "--input-translation=45--output-rotation", | |
| 40 "--", "--", "--not-a-switch", | |
| 41 "in the time of submarines..."}; | |
| 42 CommandLine cl(arraysize(argv), argv); | |
| 43 #endif | |
| 44 EXPECT_FALSE(cl.HasSwitch("cruller")); | 46 EXPECT_FALSE(cl.HasSwitch("cruller")); |
| 45 EXPECT_FALSE(cl.HasSwitch("flim")); | 47 EXPECT_FALSE(cl.HasSwitch("flim")); |
| 46 EXPECT_FALSE(cl.HasSwitch("program")); | 48 EXPECT_FALSE(cl.HasSwitch("program")); |
| 47 EXPECT_FALSE(cl.HasSwitch("dog")); | 49 EXPECT_FALSE(cl.HasSwitch("dog")); |
| 48 EXPECT_FALSE(cl.HasSwitch("cat")); | 50 EXPECT_FALSE(cl.HasSwitch("cat")); |
| 49 EXPECT_FALSE(cl.HasSwitch("output-rotation")); | 51 EXPECT_FALSE(cl.HasSwitch("output-rotation")); |
| 50 EXPECT_FALSE(cl.HasSwitch("not-a-switch")); | 52 EXPECT_FALSE(cl.HasSwitch("not-a-switch")); |
| 51 EXPECT_FALSE(cl.HasSwitch("--")); | 53 EXPECT_FALSE(cl.HasSwitch("--")); |
| 52 | 54 |
| 53 EXPECT_EQ(FilePath(FILE_PATH_LITERAL("program")).value(), | 55 EXPECT_EQ(FilePath(FILE_PATH_LITERAL("program")).value(), |
| 54 cl.GetProgram().value()); | 56 cl.GetProgram().value()); |
| 55 | 57 |
| 56 EXPECT_TRUE(cl.HasSwitch("foo")); | 58 EXPECT_TRUE(cl.HasSwitch("foo")); |
| 57 EXPECT_TRUE(cl.HasSwitch("bar")); | 59 EXPECT_TRUE(cl.HasSwitch("bAr")); |
| 58 EXPECT_TRUE(cl.HasSwitch("baz")); | 60 EXPECT_TRUE(cl.HasSwitch("baz")); |
| 59 EXPECT_TRUE(cl.HasSwitch("spaetzle")); | 61 EXPECT_TRUE(cl.HasSwitch("spaetzle")); |
| 60 #if defined(OS_WIN) | 62 #if defined(OS_WIN) |
| 61 EXPECT_TRUE(cl.HasSwitch("SPAETZLE")); | 63 EXPECT_TRUE(cl.HasSwitch("SPAETZLE")); |
| 62 #endif | 64 #endif |
| 63 EXPECT_TRUE(cl.HasSwitch("other-switches")); | 65 EXPECT_TRUE(cl.HasSwitch("other-switches")); |
| 64 EXPECT_TRUE(cl.HasSwitch("input-translation")); | 66 EXPECT_TRUE(cl.HasSwitch("input-translation")); |
| 65 #if defined(OS_WIN) | |
| 66 EXPECT_TRUE(cl.HasSwitch("quotes")); | |
| 67 #endif | |
| 68 | 67 |
| 69 EXPECT_EQ("Crepe", cl.GetSwitchValueASCII("spaetzle")); | 68 EXPECT_EQ("Crepe", cl.GetSwitchValueASCII("spaetzle")); |
| 70 EXPECT_EQ("", cl.GetSwitchValueASCII("Foo")); | 69 EXPECT_EQ("", cl.GetSwitchValueASCII("Foo")); |
| 70 EXPECT_EQ("", cl.GetSwitchValueASCII("bar")); |
| 71 EXPECT_EQ("", cl.GetSwitchValueASCII("cruller")); |
| 72 EXPECT_EQ("--dog=canine --cat=feline", cl.GetSwitchValueASCII( |
| 73 "other-switches")); |
| 74 EXPECT_EQ("45--output-rotation", cl.GetSwitchValueASCII("input-translation")); |
| 75 |
| 76 const std::vector<CommandLine::StringType>& args = cl.args(); |
| 77 ASSERT_EQ(6U, args.size()); |
| 78 |
| 79 std::vector<CommandLine::StringType>::const_iterator iter = args.begin(); |
| 80 EXPECT_EQ(FILE_PATH_LITERAL("flim"), *iter); |
| 81 ++iter; |
| 82 EXPECT_EQ(FILE_PATH_LITERAL("FLAN"), *iter); |
| 83 ++iter; |
| 84 EXPECT_EQ(FILE_PATH_LITERAL("--"), *iter); |
| 85 ++iter; |
| 86 EXPECT_EQ(FILE_PATH_LITERAL("--not-a-switch"), *iter); |
| 87 ++iter; |
| 88 EXPECT_EQ(FILE_PATH_LITERAL("\"in the time of submarines...\""), *iter); |
| 89 ++iter; |
| 90 EXPECT_EQ(FILE_PATH_LITERAL("unquoted arg-with-space"), *iter); |
| 91 ++iter; |
| 92 EXPECT_TRUE(iter == args.end()); |
| 93 } |
| 94 |
| 95 TEST(CommandLineTest, CommandLineFromString) { |
| 96 #if defined(OS_WIN) |
| 97 CommandLine cl = CommandLine::FromString( |
| 98 L"program --foo= -bAr /Spaetzel=pierogi /Baz flim " |
| 99 L"--other-switches=\"--dog=canine --cat=feline\" " |
| 100 L"-spaetzle=Crepe -=loosevalue FLAN " |
| 101 L"--input-translation=\"45\"--output-rotation " |
| 102 L"--quotes=" + kTrickyQuoted + L" " |
| 103 L"-- -- --not-a-switch " |
| 104 L"\"in the time of submarines...\""); |
| 105 |
| 106 EXPECT_FALSE(cl.command_line_string().empty()); |
| 107 EXPECT_FALSE(cl.HasSwitch("cruller")); |
| 108 EXPECT_FALSE(cl.HasSwitch("flim")); |
| 109 EXPECT_FALSE(cl.HasSwitch("program")); |
| 110 EXPECT_FALSE(cl.HasSwitch("dog")); |
| 111 EXPECT_FALSE(cl.HasSwitch("cat")); |
| 112 EXPECT_FALSE(cl.HasSwitch("output-rotation")); |
| 113 EXPECT_FALSE(cl.HasSwitch("not-a-switch")); |
| 114 EXPECT_FALSE(cl.HasSwitch("--")); |
| 115 |
| 116 EXPECT_EQ(FilePath(FILE_PATH_LITERAL("program")).value(), |
| 117 cl.GetProgram().value()); |
| 118 |
| 119 EXPECT_TRUE(cl.HasSwitch("foo")); |
| 120 EXPECT_TRUE(cl.HasSwitch("bar")); |
| 121 EXPECT_TRUE(cl.HasSwitch("baz")); |
| 122 EXPECT_TRUE(cl.HasSwitch("spaetzle")); |
| 123 EXPECT_TRUE(cl.HasSwitch("SPAETZLE")); |
| 124 EXPECT_TRUE(cl.HasSwitch("other-switches")); |
| 125 EXPECT_TRUE(cl.HasSwitch("input-translation")); |
| 126 EXPECT_TRUE(cl.HasSwitch("quotes")); |
| 127 |
| 128 EXPECT_EQ("Crepe", cl.GetSwitchValueASCII("spaetzle")); |
| 129 EXPECT_EQ("", cl.GetSwitchValueASCII("Foo")); |
| 71 EXPECT_EQ("", cl.GetSwitchValueASCII("bar")); | 130 EXPECT_EQ("", cl.GetSwitchValueASCII("bar")); |
| 72 EXPECT_EQ("", cl.GetSwitchValueASCII("cruller")); | 131 EXPECT_EQ("", cl.GetSwitchValueASCII("cruller")); |
| 73 EXPECT_EQ("--dog=canine --cat=feline", cl.GetSwitchValueASCII( | 132 EXPECT_EQ("--dog=canine --cat=feline", cl.GetSwitchValueASCII( |
| 74 "other-switches")); | 133 "other-switches")); |
| 75 EXPECT_EQ("45--output-rotation", cl.GetSwitchValueASCII("input-translation")); | 134 EXPECT_EQ("45--output-rotation", cl.GetSwitchValueASCII("input-translation")); |
| 76 #if defined(OS_WIN) | 135 EXPECT_EQ(kTricky, cl.GetSwitchValueNative("quotes")); |
| 77 EXPECT_EQ(TRICKY, cl.GetSwitchValueNative("quotes")); | |
| 78 #endif | |
| 79 | 136 |
| 80 const std::vector<CommandLine::StringType>& args = cl.args(); | 137 const std::vector<CommandLine::StringType>& args = cl.args(); |
| 81 ASSERT_EQ(5U, args.size()); | 138 ASSERT_EQ(5U, args.size()); |
| 82 | 139 |
| 83 std::vector<CommandLine::StringType>::const_iterator iter = args.begin(); | 140 std::vector<CommandLine::StringType>::const_iterator iter = args.begin(); |
| 84 EXPECT_EQ(FILE_PATH_LITERAL("flim"), *iter); | 141 EXPECT_EQ(FILE_PATH_LITERAL("flim"), *iter); |
| 85 ++iter; | 142 ++iter; |
| 86 EXPECT_EQ(FILE_PATH_LITERAL("flan"), *iter); | 143 EXPECT_EQ(FILE_PATH_LITERAL("FLAN"), *iter); |
| 87 ++iter; | 144 ++iter; |
| 88 EXPECT_EQ(FILE_PATH_LITERAL("--"), *iter); | 145 EXPECT_EQ(FILE_PATH_LITERAL("--"), *iter); |
| 89 ++iter; | 146 ++iter; |
| 90 EXPECT_EQ(FILE_PATH_LITERAL("--not-a-switch"), *iter); | 147 EXPECT_EQ(FILE_PATH_LITERAL("--not-a-switch"), *iter); |
| 91 ++iter; | 148 ++iter; |
| 92 EXPECT_EQ(FILE_PATH_LITERAL("in the time of submarines..."), *iter); | 149 EXPECT_EQ(FILE_PATH_LITERAL("in the time of submarines..."), *iter); |
| 93 ++iter; | 150 ++iter; |
| 94 EXPECT_TRUE(iter == args.end()); | 151 EXPECT_TRUE(iter == args.end()); |
| 95 #if defined(OS_POSIX) | |
| 96 const std::vector<std::string>& argvec = cl.argv(); | |
| 97 | 152 |
| 98 for (size_t i = 0; i < argvec.size(); i++) { | 153 // Check that a generated string produces an equivalent command line. |
| 99 EXPECT_EQ(0, argvec[i].compare(argv[i])); | 154 CommandLine cl_duplicate = CommandLine::FromString(cl.command_line_string()); |
| 100 } | 155 EXPECT_EQ(cl.command_line_string(), cl_duplicate.command_line_string()); |
| 101 #endif | 156 #endif |
| 102 } | 157 } |
| 103 | 158 |
| 104 // Tests behavior with an empty input string. | 159 // Tests behavior with an empty input string. |
| 105 TEST(CommandLineTest, EmptyString) { | 160 TEST(CommandLineTest, EmptyString) { |
| 106 #if defined(OS_WIN) | 161 #if defined(OS_WIN) |
| 107 CommandLine cl = CommandLine::FromString(L""); | 162 CommandLine cl_from_string = CommandLine::FromString(L""); |
| 108 EXPECT_TRUE(cl.command_line_string().empty()); | 163 EXPECT_TRUE(cl_from_string.command_line_string().empty()); |
| 109 EXPECT_TRUE(cl.GetProgram().empty()); | 164 EXPECT_TRUE(cl_from_string.GetProgram().empty()); |
| 110 #elif defined(OS_POSIX) | 165 EXPECT_EQ(1U, cl_from_string.argv().size()); |
| 111 CommandLine cl(0, NULL); | 166 EXPECT_TRUE(cl_from_string.args().empty()); |
| 112 EXPECT_TRUE(cl.argv().empty()); | |
| 113 #endif | 167 #endif |
| 114 EXPECT_TRUE(cl.args().empty()); | 168 CommandLine cl_from_argv(0, NULL); |
| 169 EXPECT_TRUE(cl_from_argv.command_line_string().empty()); |
| 170 EXPECT_TRUE(cl_from_argv.GetProgram().empty()); |
| 171 EXPECT_EQ(1U, cl_from_argv.argv().size()); |
| 172 EXPECT_TRUE(cl_from_argv.args().empty()); |
| 115 } | 173 } |
| 116 | 174 |
| 117 // Test methods for appending switches to a command line. | 175 // Test methods for appending switches to a command line. |
| 118 TEST(CommandLineTest, AppendSwitches) { | 176 TEST(CommandLineTest, AppendSwitches) { |
| 119 std::string switch1 = "switch1"; | 177 std::string switch1 = "switch1"; |
| 120 std::string switch2 = "switch2"; | 178 std::string switch2 = "switch2"; |
| 121 std::string value = "value"; | 179 std::string value2 = "value"; |
| 122 std::string switch3 = "switch3"; | 180 std::string switch3 = "switch3"; |
| 123 std::string value3 = "a value with spaces"; | 181 std::string value3 = "a value with spaces"; |
| 124 std::string switch4 = "switch4"; | 182 std::string switch4 = "switch4"; |
| 125 std::string value4 = "\"a value with quotes\""; | 183 std::string value4 = "\"a value with quotes\""; |
| 126 std::string switch5 = "quotes"; | 184 std::string switch5 = "quotes"; |
| 127 std::string value5 = WideToUTF8(TRICKY); | 185 CommandLine::StringType value5 = kTricky; |
| 128 | 186 |
| 129 CommandLine cl(FilePath(FILE_PATH_LITERAL("Program"))); | 187 CommandLine cl(FilePath(FILE_PATH_LITERAL("Program"))); |
| 130 | 188 |
| 131 cl.AppendSwitch(switch1); | 189 cl.AppendSwitch(switch1); |
| 132 cl.AppendSwitchASCII(switch2, value); | 190 cl.AppendSwitchASCII(switch2, value2); |
| 133 cl.AppendSwitchASCII(switch3, value3); | 191 cl.AppendSwitchASCII(switch3, value3); |
| 134 cl.AppendSwitchASCII(switch4, value4); | 192 cl.AppendSwitchASCII(switch4, value4); |
| 135 cl.AppendSwitchASCII(switch5, value5); | 193 cl.AppendSwitchNative(switch5, value5); |
| 136 | 194 |
| 137 EXPECT_TRUE(cl.HasSwitch(switch1)); | 195 EXPECT_TRUE(cl.HasSwitch(switch1)); |
| 138 EXPECT_TRUE(cl.HasSwitch(switch2)); | 196 EXPECT_TRUE(cl.HasSwitch(switch2)); |
| 139 EXPECT_EQ(value, cl.GetSwitchValueASCII(switch2)); | 197 EXPECT_EQ(value2, cl.GetSwitchValueASCII(switch2)); |
| 140 EXPECT_TRUE(cl.HasSwitch(switch3)); | 198 EXPECT_TRUE(cl.HasSwitch(switch3)); |
| 141 EXPECT_EQ(value3, cl.GetSwitchValueASCII(switch3)); | 199 EXPECT_EQ(value3, cl.GetSwitchValueASCII(switch3)); |
| 142 EXPECT_TRUE(cl.HasSwitch(switch4)); | 200 EXPECT_TRUE(cl.HasSwitch(switch4)); |
| 143 EXPECT_EQ(value4, cl.GetSwitchValueASCII(switch4)); | 201 EXPECT_EQ(value4, cl.GetSwitchValueASCII(switch4)); |
| 144 EXPECT_TRUE(cl.HasSwitch(switch5)); | 202 EXPECT_TRUE(cl.HasSwitch(switch5)); |
| 145 EXPECT_EQ(value5, cl.GetSwitchValueASCII(switch5)); | 203 EXPECT_EQ(value5, cl.GetSwitchValueNative(switch5)); |
| 146 | 204 |
| 147 #if defined(OS_WIN) | 205 #if defined(OS_WIN) |
| 148 EXPECT_EQ(L"\"Program\" " | 206 EXPECT_EQ(L"Program " |
| 149 L"--switch1 " | 207 L"--switch1 " |
| 150 L"--switch2=value " | 208 L"--switch2=value " |
| 151 L"--switch3=\"a value with spaces\" " | 209 L"--switch3=\"a value with spaces\" " |
| 152 L"--switch4=\"\\\"a value with quotes\\\"\" " | 210 L"--switch4=\"\\\"a value with quotes\\\"\" " |
| 153 L"--quotes=\"" TRICKY_QUOTED L"\"", | 211 L"--quotes=\"" + kTrickyQuoted + L"\"", |
| 154 cl.command_line_string()); | 212 cl.command_line_string()); |
| 155 #endif | 213 #endif |
| 156 } | 214 } |
| 157 | 215 |
| 216 TEST(CommandLineTest, AppendSwitchesDashDash) { |
| 217 const CommandLine::CharType* raw_argv[] = { FILE_PATH_LITERAL("prog"), |
| 218 FILE_PATH_LITERAL("--"), |
| 219 FILE_PATH_LITERAL("--arg1") }; |
| 220 CommandLine cl(arraysize(raw_argv), raw_argv); |
| 221 |
| 222 cl.AppendSwitch("switch1"); |
| 223 cl.AppendSwitchASCII("switch2", "foo"); |
| 224 |
| 225 cl.AppendArg("--arg2"); |
| 226 |
| 227 EXPECT_EQ(FILE_PATH_LITERAL("prog --switch1 --switch2=foo -- --arg1 --arg2"), |
| 228 cl.command_line_string()); |
| 229 CommandLine::StringVector cl_argv = cl.argv(); |
| 230 EXPECT_EQ(FILE_PATH_LITERAL("prog"), cl_argv[0]); |
| 231 EXPECT_EQ(FILE_PATH_LITERAL("--switch1"), cl_argv[1]); |
| 232 EXPECT_EQ(FILE_PATH_LITERAL("--switch2=foo"), cl_argv[2]); |
| 233 EXPECT_EQ(FILE_PATH_LITERAL("--"), cl_argv[3]); |
| 234 EXPECT_EQ(FILE_PATH_LITERAL("--arg1"), cl_argv[4]); |
| 235 EXPECT_EQ(FILE_PATH_LITERAL("--arg2"), cl_argv[5]); |
| 236 } |
| 237 |
| 158 // Tests that when AppendArguments is called that the program is set correctly | 238 // Tests that when AppendArguments is called that the program is set correctly |
| 159 // on the target CommandLine object and the switches from the source | 239 // on the target CommandLine object and the switches from the source |
| 160 // CommandLine are added to the target. | 240 // CommandLine are added to the target. |
| 161 TEST(CommandLineTest, AppendArguments) { | 241 TEST(CommandLineTest, AppendArguments) { |
| 162 CommandLine cl1(FilePath(FILE_PATH_LITERAL("Program"))); | 242 CommandLine cl1(FilePath(FILE_PATH_LITERAL("Program"))); |
| 163 cl1.AppendSwitch("switch1"); | 243 cl1.AppendSwitch("switch1"); |
| 164 cl1.AppendSwitchASCII("switch2", "foo"); | 244 cl1.AppendSwitchASCII("switch2", "foo"); |
| 165 | 245 |
| 166 CommandLine cl2(CommandLine::NO_PROGRAM); | 246 CommandLine cl2(CommandLine::NO_PROGRAM); |
| 167 cl2.AppendArguments(cl1, true); | 247 cl2.AppendArguments(cl1, true); |
| 168 EXPECT_EQ(cl1.GetProgram().value(), cl2.GetProgram().value()); | 248 EXPECT_EQ(cl1.GetProgram().value(), cl2.GetProgram().value()); |
| 169 EXPECT_EQ(cl1.command_line_string(), cl2.command_line_string()); | 249 EXPECT_EQ(cl1.command_line_string(), cl2.command_line_string()); |
| 170 | 250 |
| 171 CommandLine c1(FilePath(FILE_PATH_LITERAL("Program1"))); | 251 CommandLine c1(FilePath(FILE_PATH_LITERAL("Program1"))); |
| 172 c1.AppendSwitch("switch1"); | 252 c1.AppendSwitch("switch1"); |
| 173 CommandLine c2(FilePath(FILE_PATH_LITERAL("Program2"))); | 253 CommandLine c2(FilePath(FILE_PATH_LITERAL("Program2"))); |
| 174 c2.AppendSwitch("switch2"); | 254 c2.AppendSwitch("switch2"); |
| 175 | 255 |
| 176 c1.AppendArguments(c2, true); | 256 c1.AppendArguments(c2, true); |
| 177 EXPECT_EQ(c1.GetProgram().value(), c2.GetProgram().value()); | 257 EXPECT_EQ(c1.GetProgram().value(), c2.GetProgram().value()); |
| 178 EXPECT_TRUE(c1.HasSwitch("switch1")); | 258 EXPECT_TRUE(c1.HasSwitch("switch1")); |
| 179 EXPECT_TRUE(c1.HasSwitch("switch2")); | 259 EXPECT_TRUE(c1.HasSwitch("switch2")); |
| 180 } | 260 } |
| 181 | 261 |
| 182 #if defined(OS_WIN) | 262 #if defined(OS_WIN) |
| 183 // Make sure that the program part of a command line is always quoted. | 263 // Make sure that program paths of command_line_string are quoted as necessary. |
| 184 // This only makes sense on Windows and the test is basically here to guard | 264 // This only makes sense on Windows and the test is basically here to guard |
| 185 // against regressions. | 265 // against regressions. |
| 186 TEST(CommandLineTest, ProgramQuotes) { | 266 TEST(CommandLineTest, ProgramQuotes) { |
| 267 // Check that quotes are not added for paths without spaces. |
| 187 const FilePath kProgram(L"Program"); | 268 const FilePath kProgram(L"Program"); |
| 269 CommandLine cl_program(kProgram); |
| 270 EXPECT_EQ(kProgram.value(), cl_program.GetProgram().value()); |
| 271 EXPECT_EQ(kProgram.value(), cl_program.command_line_string()); |
| 272 |
| 273 const FilePath kProgramPath(L"Program Path"); |
| 188 | 274 |
| 189 // Check that quotes are not returned from GetProgram(). | 275 // Check that quotes are not returned from GetProgram(). |
| 190 CommandLine cl(kProgram); | 276 CommandLine cl_program_path(kProgramPath); |
| 191 EXPECT_EQ(kProgram.value(), cl.GetProgram().value()); | 277 EXPECT_EQ(kProgramPath.value(), cl_program_path.GetProgram().value()); |
| 192 | 278 |
| 193 // Verify that in the command line string, the program part is always quoted. | 279 // Check that quotes are added to command line string paths containing spaces. |
| 194 CommandLine::StringType cmd(cl.command_line_string()); | 280 CommandLine::StringType cmd_string(cl_program_path.command_line_string()); |
| 195 CommandLine::StringType program(cl.GetProgram().value()); | 281 CommandLine::StringType program_string(cl_program_path.GetProgram().value()); |
| 196 EXPECT_EQ('"', cmd[0]); | 282 EXPECT_EQ('"', cmd_string[0]); |
| 197 EXPECT_EQ(program, cmd.substr(1, program.length())); | 283 EXPECT_EQ(program_string, cmd_string.substr(1, program_string.length())); |
| 198 EXPECT_EQ('"', cmd[program.length() + 1]); | 284 EXPECT_EQ('"', cmd_string[program_string.length() + 1]); |
| 199 } | 285 } |
| 200 #endif | 286 #endif |
| OLD | NEW |