1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be 3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file. 4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#include "base/command_line.h" 694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#include <memory> 8b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <string> 9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <vector> 10b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 11b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/files/file_path.h" 120d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/macros.h" 13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/strings/utf_string_conversions.h" 140d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "build/build_config.h" 15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "testing/gtest/include/gtest/gtest.h" 16b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base { 18b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 19b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// To test Windows quoting behavior, we use a string that has some backslashes 20b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// and quotes. 21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Consider the command-line argument: q\"bs1\bs2\\bs3q\\\" 22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Here it is with C-style escapes. 23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic const CommandLine::StringType kTrickyQuoted = 24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("q\\\"bs1\\bs2\\\\bs3q\\\\\\\""); 25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// It should be parsed by Windows as: q"bs1\bs2\\bs3q\" 26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Here that is with C-style escapes. 27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic const CommandLine::StringType kTricky = 28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("q\"bs1\\bs2\\\\bs3q\\\""); 29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(CommandLineTest, CommandLineConstructor) { 31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const CommandLine::CharType* argv[] = { 32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("program"), 33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("--foo="), 34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("-bAr"), 35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("-spaetzel=pierogi"), 36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("-baz"), 37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("flim"), 38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("--other-switches=--dog=canine --cat=feline"), 39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("-spaetzle=Crepe"), 40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("-=loosevalue"), 41b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("-"), 42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("FLAN"), 43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("a"), 44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("--input-translation=45--output-rotation"), 45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("--"), 46b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("--"), 47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("--not-a-switch"), 48b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("\"in the time of submarines...\""), 49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("unquoted arg-with-space")}; 50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine cl(arraysize(argv), argv); 51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 52b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(cl.GetCommandLineString().empty()); 53b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(cl.HasSwitch("cruller")); 54b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(cl.HasSwitch("flim")); 55b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(cl.HasSwitch("program")); 56b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(cl.HasSwitch("dog")); 57b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(cl.HasSwitch("cat")); 58b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(cl.HasSwitch("output-rotation")); 59b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(cl.HasSwitch("not-a-switch")); 60b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(cl.HasSwitch("--")); 61b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 62b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FilePath(FILE_PATH_LITERAL("program")).value(), 63b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl.GetProgram().value()); 64b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 65b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl.HasSwitch("foo")); 66b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_WIN) 67b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl.HasSwitch("bar")); 68b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#else 69b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(cl.HasSwitch("bar")); 70b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 71b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl.HasSwitch("baz")); 72b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl.HasSwitch("spaetzle")); 73b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl.HasSwitch("other-switches")); 74b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl.HasSwitch("input-translation")); 75b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 76b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("Crepe", cl.GetSwitchValueASCII("spaetzle")); 77b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("", cl.GetSwitchValueASCII("foo")); 78b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("", cl.GetSwitchValueASCII("bar")); 79b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("", cl.GetSwitchValueASCII("cruller")); 80b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("--dog=canine --cat=feline", cl.GetSwitchValueASCII( 81b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "other-switches")); 82b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("45--output-rotation", cl.GetSwitchValueASCII("input-translation")); 83b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 84b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const CommandLine::StringVector& args = cl.GetArgs(); 85b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(8U, args.size()); 86b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 87b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::vector<CommandLine::StringType>::const_iterator iter = args.begin(); 88b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FILE_PATH_LITERAL("flim"), *iter); 89b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ++iter; 90b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FILE_PATH_LITERAL("-"), *iter); 91b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ++iter; 92b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FILE_PATH_LITERAL("FLAN"), *iter); 93b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ++iter; 94b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FILE_PATH_LITERAL("a"), *iter); 95b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ++iter; 96b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FILE_PATH_LITERAL("--"), *iter); 97b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ++iter; 98b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FILE_PATH_LITERAL("--not-a-switch"), *iter); 99b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ++iter; 100b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FILE_PATH_LITERAL("\"in the time of submarines...\""), *iter); 101b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ++iter; 102b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FILE_PATH_LITERAL("unquoted arg-with-space"), *iter); 103b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ++iter; 104b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(iter == args.end()); 105b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 106b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 107b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(CommandLineTest, CommandLineFromString) { 108b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_WIN) 109b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine cl = CommandLine::FromString( 110b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat L"program --foo= -bAr /Spaetzel=pierogi /Baz flim " 111b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat L"--other-switches=\"--dog=canine --cat=feline\" " 112b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat L"-spaetzle=Crepe -=loosevalue FLAN " 113b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat L"--input-translation=\"45\"--output-rotation " 114b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat L"--quotes=" + kTrickyQuoted + L" " 115b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat L"-- -- --not-a-switch " 116b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat L"\"in the time of submarines...\""); 117b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 118b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(cl.GetCommandLineString().empty()); 119b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(cl.HasSwitch("cruller")); 120b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(cl.HasSwitch("flim")); 121b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(cl.HasSwitch("program")); 122b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(cl.HasSwitch("dog")); 123b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(cl.HasSwitch("cat")); 124b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(cl.HasSwitch("output-rotation")); 125b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(cl.HasSwitch("not-a-switch")); 126b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(cl.HasSwitch("--")); 127b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 128b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FilePath(FILE_PATH_LITERAL("program")).value(), 129b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl.GetProgram().value()); 130b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 131b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl.HasSwitch("foo")); 132b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl.HasSwitch("bar")); 133b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl.HasSwitch("baz")); 134b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl.HasSwitch("spaetzle")); 135b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl.HasSwitch("other-switches")); 136b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl.HasSwitch("input-translation")); 137b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl.HasSwitch("quotes")); 138b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 139b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("Crepe", cl.GetSwitchValueASCII("spaetzle")); 140b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("", cl.GetSwitchValueASCII("foo")); 141b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("", cl.GetSwitchValueASCII("bar")); 142b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("", cl.GetSwitchValueASCII("cruller")); 143b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("--dog=canine --cat=feline", cl.GetSwitchValueASCII( 144b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "other-switches")); 145b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("45--output-rotation", cl.GetSwitchValueASCII("input-translation")); 146b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kTricky, cl.GetSwitchValueNative("quotes")); 147b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 148b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const CommandLine::StringVector& args = cl.GetArgs(); 149b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(5U, args.size()); 150b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 151b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::vector<CommandLine::StringType>::const_iterator iter = args.begin(); 152b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FILE_PATH_LITERAL("flim"), *iter); 153b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ++iter; 154b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FILE_PATH_LITERAL("FLAN"), *iter); 155b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ++iter; 156b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FILE_PATH_LITERAL("--"), *iter); 157b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ++iter; 158b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FILE_PATH_LITERAL("--not-a-switch"), *iter); 159b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ++iter; 160b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FILE_PATH_LITERAL("in the time of submarines..."), *iter); 161b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ++iter; 162b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(iter == args.end()); 163b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 164b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Check that a generated string produces an equivalent command line. 165b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine cl_duplicate = CommandLine::FromString(cl.GetCommandLineString()); 166b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(cl.GetCommandLineString(), cl_duplicate.GetCommandLineString()); 167b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 168b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 169b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 170b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Tests behavior with an empty input string. 171b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(CommandLineTest, EmptyString) { 172b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_WIN) 173b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine cl_from_string = CommandLine::FromString(L""); 174b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl_from_string.GetCommandLineString().empty()); 175b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl_from_string.GetProgram().empty()); 176b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1U, cl_from_string.argv().size()); 177b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl_from_string.GetArgs().empty()); 178b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 179b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine cl_from_argv(0, NULL); 180b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl_from_argv.GetCommandLineString().empty()); 181b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl_from_argv.GetProgram().empty()); 182b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1U, cl_from_argv.argv().size()); 183b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl_from_argv.GetArgs().empty()); 184b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 185b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 186b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(CommandLineTest, GetArgumentsString) { 187b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static const FilePath::CharType kPath1[] = 188b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("C:\\Some File\\With Spaces.ggg"); 189b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static const FilePath::CharType kPath2[] = 190b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("C:\\no\\spaces.ggg"); 191b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 192b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static const char kFirstArgName[] = "first-arg"; 193b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static const char kSecondArgName[] = "arg2"; 194b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static const char kThirdArgName[] = "arg with space"; 195b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static const char kFourthArgName[] = "nospace"; 196b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static const char kFifthArgName[] = "%1"; 197b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 198b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine cl(CommandLine::NO_PROGRAM); 199b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl.AppendSwitchPath(kFirstArgName, FilePath(kPath1)); 200b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl.AppendSwitchPath(kSecondArgName, FilePath(kPath2)); 201b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl.AppendArg(kThirdArgName); 202b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl.AppendArg(kFourthArgName); 203b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl.AppendArg(kFifthArgName); 204b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 205b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_WIN) 206b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine::StringType expected_first_arg(UTF8ToUTF16(kFirstArgName)); 207b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine::StringType expected_second_arg(UTF8ToUTF16(kSecondArgName)); 208b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine::StringType expected_third_arg(UTF8ToUTF16(kThirdArgName)); 209b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine::StringType expected_fourth_arg(UTF8ToUTF16(kFourthArgName)); 210b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine::StringType expected_fifth_arg(UTF8ToUTF16(kFifthArgName)); 211b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#elif defined(OS_POSIX) 212b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine::StringType expected_first_arg(kFirstArgName); 213b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine::StringType expected_second_arg(kSecondArgName); 214b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine::StringType expected_third_arg(kThirdArgName); 215b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine::StringType expected_fourth_arg(kFourthArgName); 216b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine::StringType expected_fifth_arg(kFifthArgName); 217b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 218b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 219b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_WIN) 220b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define QUOTE_ON_WIN FILE_PATH_LITERAL("\"") 221b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#else 222b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define QUOTE_ON_WIN FILE_PATH_LITERAL("") 223b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif // OS_WIN 224b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 225b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine::StringType expected_str; 226b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat expected_str.append(FILE_PATH_LITERAL("--")) 227b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .append(expected_first_arg) 228b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .append(FILE_PATH_LITERAL("=")) 229b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .append(QUOTE_ON_WIN) 230b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .append(kPath1) 231b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .append(QUOTE_ON_WIN) 232b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .append(FILE_PATH_LITERAL(" ")) 233b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .append(FILE_PATH_LITERAL("--")) 234b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .append(expected_second_arg) 235b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .append(FILE_PATH_LITERAL("=")) 236b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .append(QUOTE_ON_WIN) 237b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .append(kPath2) 238b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .append(QUOTE_ON_WIN) 239b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .append(FILE_PATH_LITERAL(" ")) 240b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .append(QUOTE_ON_WIN) 241b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .append(expected_third_arg) 242b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .append(QUOTE_ON_WIN) 243b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .append(FILE_PATH_LITERAL(" ")) 244b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .append(expected_fourth_arg) 245b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .append(FILE_PATH_LITERAL(" ")); 246b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 247b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine::StringType expected_str_no_quote_placeholders(expected_str); 248b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat expected_str_no_quote_placeholders.append(expected_fifth_arg); 249b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(expected_str_no_quote_placeholders, cl.GetArgumentsString()); 250b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 251b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_WIN) 252b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine::StringType expected_str_quote_placeholders(expected_str); 253b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat expected_str_quote_placeholders.append(QUOTE_ON_WIN) 254b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .append(expected_fifth_arg) 255b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .append(QUOTE_ON_WIN); 256b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(expected_str_quote_placeholders, 257b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl.GetArgumentsStringWithPlaceholders()); 258b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 259b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 260b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 261b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test methods for appending switches to a command line. 262b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(CommandLineTest, AppendSwitches) { 263b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string switch1 = "switch1"; 264b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string switch2 = "switch2"; 265b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string value2 = "value"; 266b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string switch3 = "switch3"; 267b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string value3 = "a value with spaces"; 268b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string switch4 = "switch4"; 269b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string value4 = "\"a value with quotes\""; 270b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string switch5 = "quotes"; 271b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine::StringType value5 = kTricky; 272b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 273b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine cl(FilePath(FILE_PATH_LITERAL("Program"))); 274b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 275b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl.AppendSwitch(switch1); 276b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl.AppendSwitchASCII(switch2, value2); 277b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl.AppendSwitchASCII(switch3, value3); 278b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl.AppendSwitchASCII(switch4, value4); 279b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl.AppendSwitchASCII(switch5, value4); 280b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl.AppendSwitchNative(switch5, value5); 281b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 282b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl.HasSwitch(switch1)); 283b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl.HasSwitch(switch2)); 284b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(value2, cl.GetSwitchValueASCII(switch2)); 285b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl.HasSwitch(switch3)); 286b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(value3, cl.GetSwitchValueASCII(switch3)); 287b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl.HasSwitch(switch4)); 288b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(value4, cl.GetSwitchValueASCII(switch4)); 289b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(cl.HasSwitch(switch5)); 290b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(value5, cl.GetSwitchValueNative(switch5)); 291b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 292b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_WIN) 293b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(L"Program " 294b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat L"--switch1 " 295b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat L"--switch2=value " 296b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat L"--switch3=\"a value with spaces\" " 297b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat L"--switch4=\"\\\"a value with quotes\\\"\" " 298b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Even though the switches are unique, appending can add repeat 299b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // switches to argv. 300b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat L"--quotes=\"\\\"a value with quotes\\\"\" " 301b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat L"--quotes=\"" + kTrickyQuoted + L"\"", 302b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl.GetCommandLineString()); 303b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 304b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 305b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 306b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(CommandLineTest, AppendSwitchesDashDash) { 307b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const CommandLine::CharType* raw_argv[] = { FILE_PATH_LITERAL("prog"), 308b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("--"), 309b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("--arg1") }; 310b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine cl(arraysize(raw_argv), raw_argv); 311b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 312b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl.AppendSwitch("switch1"); 313b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl.AppendSwitchASCII("switch2", "foo"); 314b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 315b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl.AppendArg("--arg2"); 316b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 317b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FILE_PATH_LITERAL("prog --switch1 --switch2=foo -- --arg1 --arg2"), 318b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl.GetCommandLineString()); 319b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine::StringVector cl_argv = cl.argv(); 320b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FILE_PATH_LITERAL("prog"), cl_argv[0]); 321b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FILE_PATH_LITERAL("--switch1"), cl_argv[1]); 322b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FILE_PATH_LITERAL("--switch2=foo"), cl_argv[2]); 323b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FILE_PATH_LITERAL("--"), cl_argv[3]); 324b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FILE_PATH_LITERAL("--arg1"), cl_argv[4]); 325b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(FILE_PATH_LITERAL("--arg2"), cl_argv[5]); 326b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 327b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 328b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Tests that when AppendArguments is called that the program is set correctly 329b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// on the target CommandLine object and the switches from the source 330b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// CommandLine are added to the target. 331b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(CommandLineTest, AppendArguments) { 332b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine cl1(FilePath(FILE_PATH_LITERAL("Program"))); 333b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl1.AppendSwitch("switch1"); 334b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl1.AppendSwitchASCII("switch2", "foo"); 335b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 336b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine cl2(CommandLine::NO_PROGRAM); 337b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl2.AppendArguments(cl1, true); 338b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(cl1.GetProgram().value(), cl2.GetProgram().value()); 339b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(cl1.GetCommandLineString(), cl2.GetCommandLineString()); 340b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 341b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine c1(FilePath(FILE_PATH_LITERAL("Program1"))); 342b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat c1.AppendSwitch("switch1"); 343b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine c2(FilePath(FILE_PATH_LITERAL("Program2"))); 344b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat c2.AppendSwitch("switch2"); 345b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 346b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat c1.AppendArguments(c2, true); 347b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(c1.GetProgram().value(), c2.GetProgram().value()); 348b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(c1.HasSwitch("switch1")); 349b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(c1.HasSwitch("switch2")); 350b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 351b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 352b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_WIN) 353b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Make sure that the command line string program paths are quoted as necessary. 354b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// This only makes sense on Windows and the test is basically here to guard 355b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// against regressions. 356b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(CommandLineTest, ProgramQuotes) { 357b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Check that quotes are not added for paths without spaces. 358b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const FilePath kProgram(L"Program"); 359b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine cl_program(kProgram); 360b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kProgram.value(), cl_program.GetProgram().value()); 361b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kProgram.value(), cl_program.GetCommandLineString()); 362b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 363b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const FilePath kProgramPath(L"Program Path"); 364b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 365b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Check that quotes are not returned from GetProgram(). 366b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine cl_program_path(kProgramPath); 367b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kProgramPath.value(), cl_program_path.GetProgram().value()); 368b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 369b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Check that quotes are added to command line string paths containing spaces. 370b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine::StringType cmd_string(cl_program_path.GetCommandLineString()); 371b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(L"\"Program Path\"", cmd_string); 372b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 373b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Check the optional quoting of placeholders in programs. 374b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine cl_quote_placeholder(FilePath(L"%1")); 375b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(L"%1", cl_quote_placeholder.GetCommandLineString()); 376b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(L"\"%1\"", 377b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cl_quote_placeholder.GetCommandLineStringWithPlaceholders()); 378b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 379b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 380b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 381b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Calling Init multiple times should not modify the previous CommandLine. 382b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(CommandLineTest, Init) { 3831ad3000647abb4e86484f68aa387def88294d82bAri Hausman-Cohen // Call Init without checking output once so we know it's been called 3841ad3000647abb4e86484f68aa387def88294d82bAri Hausman-Cohen // whether or not the test runner does so. 3851ad3000647abb4e86484f68aa387def88294d82bAri Hausman-Cohen CommandLine::Init(0, NULL); 386b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine* initial = CommandLine::ForCurrentProcess(); 387b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(CommandLine::Init(0, NULL)); 388b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine* current = CommandLine::ForCurrentProcess(); 389b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(initial, current); 390b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 391b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 392b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test that copies of CommandLine have a valid StringPiece map. 393b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(CommandLineTest, Copy) { 39494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<CommandLine> initial( 39594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez new CommandLine(CommandLine::NO_PROGRAM)); 396b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat initial->AppendSwitch("a"); 397b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat initial->AppendSwitch("bbbbbbbbbbbbbbb"); 398b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat initial->AppendSwitch("c"); 399b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine copy_constructed(*initial); 400b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine assigned = *initial; 401b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommandLine::SwitchMap switch_map = initial->GetSwitches(); 402b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat initial.reset(); 403b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (const auto& pair : switch_map) 404b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(copy_constructed.HasSwitch(pair.first)); 405b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (const auto& pair : switch_map) 406b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(assigned.HasSwitch(pair.first)); 407b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 408b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 409b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace base 410