OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/files/file_path.h" | 10 #include "base/files/file_path.h" |
| 11 #include "base/memory/scoped_ptr.h" |
11 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
12 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
13 | 14 |
14 namespace base { | 15 namespace base { |
15 | 16 |
16 // To test Windows quoting behavior, we use a string that has some backslashes | 17 // To test Windows quoting behavior, we use a string that has some backslashes |
17 // and quotes. | 18 // and quotes. |
18 // Consider the command-line argument: q\"bs1\bs2\\bs3q\\\" | 19 // Consider the command-line argument: q\"bs1\bs2\\bs3q\\\" |
19 // Here it is with C-style escapes. | 20 // Here it is with C-style escapes. |
20 static const CommandLine::StringType kTrickyQuoted = | 21 static const CommandLine::StringType kTrickyQuoted = |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 EXPECT_FALSE(cl.HasSwitch("dog")); | 54 EXPECT_FALSE(cl.HasSwitch("dog")); |
54 EXPECT_FALSE(cl.HasSwitch("cat")); | 55 EXPECT_FALSE(cl.HasSwitch("cat")); |
55 EXPECT_FALSE(cl.HasSwitch("output-rotation")); | 56 EXPECT_FALSE(cl.HasSwitch("output-rotation")); |
56 EXPECT_FALSE(cl.HasSwitch("not-a-switch")); | 57 EXPECT_FALSE(cl.HasSwitch("not-a-switch")); |
57 EXPECT_FALSE(cl.HasSwitch("--")); | 58 EXPECT_FALSE(cl.HasSwitch("--")); |
58 | 59 |
59 EXPECT_EQ(FilePath(FILE_PATH_LITERAL("program")).value(), | 60 EXPECT_EQ(FilePath(FILE_PATH_LITERAL("program")).value(), |
60 cl.GetProgram().value()); | 61 cl.GetProgram().value()); |
61 | 62 |
62 EXPECT_TRUE(cl.HasSwitch("foo")); | 63 EXPECT_TRUE(cl.HasSwitch("foo")); |
63 EXPECT_TRUE(cl.HasSwitch("bAr")); | 64 #if defined(OS_WIN) |
| 65 EXPECT_TRUE(cl.HasSwitch("bar")); |
| 66 #else |
| 67 EXPECT_FALSE(cl.HasSwitch("bar")); |
| 68 #endif |
64 EXPECT_TRUE(cl.HasSwitch("baz")); | 69 EXPECT_TRUE(cl.HasSwitch("baz")); |
65 EXPECT_TRUE(cl.HasSwitch("spaetzle")); | 70 EXPECT_TRUE(cl.HasSwitch("spaetzle")); |
66 #if defined(OS_WIN) | |
67 EXPECT_TRUE(cl.HasSwitch("SPAETZLE")); | |
68 #endif | |
69 EXPECT_TRUE(cl.HasSwitch("other-switches")); | 71 EXPECT_TRUE(cl.HasSwitch("other-switches")); |
70 EXPECT_TRUE(cl.HasSwitch("input-translation")); | 72 EXPECT_TRUE(cl.HasSwitch("input-translation")); |
71 | 73 |
72 EXPECT_EQ("Crepe", cl.GetSwitchValueASCII("spaetzle")); | 74 EXPECT_EQ("Crepe", cl.GetSwitchValueASCII("spaetzle")); |
73 EXPECT_EQ("", cl.GetSwitchValueASCII("Foo")); | 75 EXPECT_EQ("", cl.GetSwitchValueASCII("foo")); |
74 EXPECT_EQ("", cl.GetSwitchValueASCII("bar")); | 76 EXPECT_EQ("", cl.GetSwitchValueASCII("bar")); |
75 EXPECT_EQ("", cl.GetSwitchValueASCII("cruller")); | 77 EXPECT_EQ("", cl.GetSwitchValueASCII("cruller")); |
76 EXPECT_EQ("--dog=canine --cat=feline", cl.GetSwitchValueASCII( | 78 EXPECT_EQ("--dog=canine --cat=feline", cl.GetSwitchValueASCII( |
77 "other-switches")); | 79 "other-switches")); |
78 EXPECT_EQ("45--output-rotation", cl.GetSwitchValueASCII("input-translation")); | 80 EXPECT_EQ("45--output-rotation", cl.GetSwitchValueASCII("input-translation")); |
79 | 81 |
80 const CommandLine::StringVector& args = cl.GetArgs(); | 82 const CommandLine::StringVector& args = cl.GetArgs(); |
81 ASSERT_EQ(8U, args.size()); | 83 ASSERT_EQ(8U, args.size()); |
82 | 84 |
83 std::vector<CommandLine::StringType>::const_iterator iter = args.begin(); | 85 std::vector<CommandLine::StringType>::const_iterator iter = args.begin(); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 EXPECT_FALSE(cl.HasSwitch("not-a-switch")); | 123 EXPECT_FALSE(cl.HasSwitch("not-a-switch")); |
122 EXPECT_FALSE(cl.HasSwitch("--")); | 124 EXPECT_FALSE(cl.HasSwitch("--")); |
123 | 125 |
124 EXPECT_EQ(FilePath(FILE_PATH_LITERAL("program")).value(), | 126 EXPECT_EQ(FilePath(FILE_PATH_LITERAL("program")).value(), |
125 cl.GetProgram().value()); | 127 cl.GetProgram().value()); |
126 | 128 |
127 EXPECT_TRUE(cl.HasSwitch("foo")); | 129 EXPECT_TRUE(cl.HasSwitch("foo")); |
128 EXPECT_TRUE(cl.HasSwitch("bar")); | 130 EXPECT_TRUE(cl.HasSwitch("bar")); |
129 EXPECT_TRUE(cl.HasSwitch("baz")); | 131 EXPECT_TRUE(cl.HasSwitch("baz")); |
130 EXPECT_TRUE(cl.HasSwitch("spaetzle")); | 132 EXPECT_TRUE(cl.HasSwitch("spaetzle")); |
131 EXPECT_TRUE(cl.HasSwitch("SPAETZLE")); | |
132 EXPECT_TRUE(cl.HasSwitch("other-switches")); | 133 EXPECT_TRUE(cl.HasSwitch("other-switches")); |
133 EXPECT_TRUE(cl.HasSwitch("input-translation")); | 134 EXPECT_TRUE(cl.HasSwitch("input-translation")); |
134 EXPECT_TRUE(cl.HasSwitch("quotes")); | 135 EXPECT_TRUE(cl.HasSwitch("quotes")); |
135 | 136 |
136 EXPECT_EQ("Crepe", cl.GetSwitchValueASCII("spaetzle")); | 137 EXPECT_EQ("Crepe", cl.GetSwitchValueASCII("spaetzle")); |
137 EXPECT_EQ("", cl.GetSwitchValueASCII("Foo")); | 138 EXPECT_EQ("", cl.GetSwitchValueASCII("foo")); |
138 EXPECT_EQ("", cl.GetSwitchValueASCII("bar")); | 139 EXPECT_EQ("", cl.GetSwitchValueASCII("bar")); |
139 EXPECT_EQ("", cl.GetSwitchValueASCII("cruller")); | 140 EXPECT_EQ("", cl.GetSwitchValueASCII("cruller")); |
140 EXPECT_EQ("--dog=canine --cat=feline", cl.GetSwitchValueASCII( | 141 EXPECT_EQ("--dog=canine --cat=feline", cl.GetSwitchValueASCII( |
141 "other-switches")); | 142 "other-switches")); |
142 EXPECT_EQ("45--output-rotation", cl.GetSwitchValueASCII("input-translation")); | 143 EXPECT_EQ("45--output-rotation", cl.GetSwitchValueASCII("input-translation")); |
143 EXPECT_EQ(kTricky, cl.GetSwitchValueNative("quotes")); | 144 EXPECT_EQ(kTricky, cl.GetSwitchValueNative("quotes")); |
144 | 145 |
145 const CommandLine::StringVector& args = cl.GetArgs(); | 146 const CommandLine::StringVector& args = cl.GetArgs(); |
146 ASSERT_EQ(5U, args.size()); | 147 ASSERT_EQ(5U, args.size()); |
147 | 148 |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 std::string value4 = "\"a value with quotes\""; | 267 std::string value4 = "\"a value with quotes\""; |
267 std::string switch5 = "quotes"; | 268 std::string switch5 = "quotes"; |
268 CommandLine::StringType value5 = kTricky; | 269 CommandLine::StringType value5 = kTricky; |
269 | 270 |
270 CommandLine cl(FilePath(FILE_PATH_LITERAL("Program"))); | 271 CommandLine cl(FilePath(FILE_PATH_LITERAL("Program"))); |
271 | 272 |
272 cl.AppendSwitch(switch1); | 273 cl.AppendSwitch(switch1); |
273 cl.AppendSwitchASCII(switch2, value2); | 274 cl.AppendSwitchASCII(switch2, value2); |
274 cl.AppendSwitchASCII(switch3, value3); | 275 cl.AppendSwitchASCII(switch3, value3); |
275 cl.AppendSwitchASCII(switch4, value4); | 276 cl.AppendSwitchASCII(switch4, value4); |
| 277 cl.AppendSwitchASCII(switch5, value4); |
276 cl.AppendSwitchNative(switch5, value5); | 278 cl.AppendSwitchNative(switch5, value5); |
277 | 279 |
278 EXPECT_TRUE(cl.HasSwitch(switch1)); | 280 EXPECT_TRUE(cl.HasSwitch(switch1)); |
279 EXPECT_TRUE(cl.HasSwitch(switch2)); | 281 EXPECT_TRUE(cl.HasSwitch(switch2)); |
280 EXPECT_EQ(value2, cl.GetSwitchValueASCII(switch2)); | 282 EXPECT_EQ(value2, cl.GetSwitchValueASCII(switch2)); |
281 EXPECT_TRUE(cl.HasSwitch(switch3)); | 283 EXPECT_TRUE(cl.HasSwitch(switch3)); |
282 EXPECT_EQ(value3, cl.GetSwitchValueASCII(switch3)); | 284 EXPECT_EQ(value3, cl.GetSwitchValueASCII(switch3)); |
283 EXPECT_TRUE(cl.HasSwitch(switch4)); | 285 EXPECT_TRUE(cl.HasSwitch(switch4)); |
284 EXPECT_EQ(value4, cl.GetSwitchValueASCII(switch4)); | 286 EXPECT_EQ(value4, cl.GetSwitchValueASCII(switch4)); |
285 EXPECT_TRUE(cl.HasSwitch(switch5)); | 287 EXPECT_TRUE(cl.HasSwitch(switch5)); |
286 EXPECT_EQ(value5, cl.GetSwitchValueNative(switch5)); | 288 EXPECT_EQ(value5, cl.GetSwitchValueNative(switch5)); |
287 | 289 |
288 #if defined(OS_WIN) | 290 #if defined(OS_WIN) |
289 EXPECT_EQ(L"Program " | 291 EXPECT_EQ(L"Program " |
290 L"--switch1 " | 292 L"--switch1 " |
291 L"--switch2=value " | 293 L"--switch2=value " |
292 L"--switch3=\"a value with spaces\" " | 294 L"--switch3=\"a value with spaces\" " |
293 L"--switch4=\"\\\"a value with quotes\\\"\" " | 295 L"--switch4=\"\\\"a value with quotes\\\"\" " |
| 296 // Even though the switches are unique, appending can add repeat |
| 297 // switches to argv. |
| 298 L"--quotes=\"\\\"a value with quotes\\\"\" " |
294 L"--quotes=\"" + kTrickyQuoted + L"\"", | 299 L"--quotes=\"" + kTrickyQuoted + L"\"", |
295 cl.GetCommandLineString()); | 300 cl.GetCommandLineString()); |
296 #endif | 301 #endif |
297 } | 302 } |
298 | 303 |
299 TEST(CommandLineTest, AppendSwitchesDashDash) { | 304 TEST(CommandLineTest, AppendSwitchesDashDash) { |
300 const CommandLine::CharType* raw_argv[] = { FILE_PATH_LITERAL("prog"), | 305 const CommandLine::CharType* raw_argv[] = { FILE_PATH_LITERAL("prog"), |
301 FILE_PATH_LITERAL("--"), | 306 FILE_PATH_LITERAL("--"), |
302 FILE_PATH_LITERAL("--arg1") }; | 307 FILE_PATH_LITERAL("--arg1") }; |
303 CommandLine cl(arraysize(raw_argv), raw_argv); | 308 CommandLine cl(arraysize(raw_argv), raw_argv); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
372 #endif | 377 #endif |
373 | 378 |
374 // Calling Init multiple times should not modify the previous CommandLine. | 379 // Calling Init multiple times should not modify the previous CommandLine. |
375 TEST(CommandLineTest, Init) { | 380 TEST(CommandLineTest, Init) { |
376 CommandLine* initial = CommandLine::ForCurrentProcess(); | 381 CommandLine* initial = CommandLine::ForCurrentProcess(); |
377 EXPECT_FALSE(CommandLine::Init(0, NULL)); | 382 EXPECT_FALSE(CommandLine::Init(0, NULL)); |
378 CommandLine* current = CommandLine::ForCurrentProcess(); | 383 CommandLine* current = CommandLine::ForCurrentProcess(); |
379 EXPECT_EQ(initial, current); | 384 EXPECT_EQ(initial, current); |
380 } | 385 } |
381 | 386 |
| 387 // Test that copies of CommandLine have a valid StringPiece map. |
| 388 TEST(CommandLineTest, Copy) { |
| 389 scoped_ptr<CommandLine> initial(new CommandLine(CommandLine::NO_PROGRAM)); |
| 390 initial->AppendSwitch("a"); |
| 391 initial->AppendSwitch("bbbbbbbbbbbbbbb"); |
| 392 initial->AppendSwitch("c"); |
| 393 CommandLine copy_constructed(*initial); |
| 394 CommandLine assigned = *initial; |
| 395 CommandLine::SwitchMap switch_map = initial->GetSwitches(); |
| 396 initial.reset(); |
| 397 for (const auto& pair : switch_map) |
| 398 EXPECT_TRUE(copy_constructed.HasSwitch(pair.first)); |
| 399 for (const auto& pair : switch_map) |
| 400 EXPECT_TRUE(assigned.HasSwitch(pair.first)); |
| 401 } |
| 402 |
382 } // namespace base | 403 } // namespace base |
OLD | NEW |