1 //===-- ArgsTest.cpp --------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "gtest/gtest.h"
12 #include "lldb/Interpreter/Args.h"
17 using namespace lldb_private;
19 TEST(ArgsTest, TestSingleArg) {
21 args.SetCommandString("arg");
22 EXPECT_EQ(1u, args.GetArgumentCount());
23 EXPECT_STREQ(args.GetArgumentAtIndex(0), "arg");
26 TEST(ArgsTest, TestSingleQuotedArgWithSpace) {
28 args.SetCommandString("\"arg with space\"");
29 EXPECT_EQ(1u, args.GetArgumentCount());
30 EXPECT_STREQ(args.GetArgumentAtIndex(0), "arg with space");
33 TEST(ArgsTest, TestSingleArgWithQuotedSpace) {
35 args.SetCommandString("arg\\ with\\ space");
36 EXPECT_EQ(1u, args.GetArgumentCount());
37 EXPECT_STREQ(args.GetArgumentAtIndex(0), "arg with space");
40 TEST(ArgsTest, TestMultipleArgs) {
42 args.SetCommandString("this has multiple args");
43 EXPECT_EQ(4u, args.GetArgumentCount());
44 EXPECT_STREQ(args.GetArgumentAtIndex(0), "this");
45 EXPECT_STREQ(args.GetArgumentAtIndex(1), "has");
46 EXPECT_STREQ(args.GetArgumentAtIndex(2), "multiple");
47 EXPECT_STREQ(args.GetArgumentAtIndex(3), "args");
50 TEST(ArgsTest, TestOverwriteArgs) {
52 args.SetCommandString("this has multiple args");
53 EXPECT_EQ(4u, args.GetArgumentCount());
54 args.SetCommandString("arg");
55 EXPECT_EQ(1u, args.GetArgumentCount());
56 EXPECT_STREQ(args.GetArgumentAtIndex(0), "arg");
59 TEST(ArgsTest, TestAppendArg) {
61 args.SetCommandString("first_arg");
62 EXPECT_EQ(1u, args.GetArgumentCount());
63 args.AppendArgument(llvm::StringRef("second_arg"));
64 EXPECT_EQ(2u, args.GetArgumentCount());
65 EXPECT_STREQ(args.GetArgumentAtIndex(0), "first_arg");
66 EXPECT_STREQ(args.GetArgumentAtIndex(1), "second_arg");
69 TEST(ArgsTest, TestInsertArg) {
71 args.AppendArgument("1");
72 args.AppendArgument("2");
73 args.AppendArgument("3");
74 args.InsertArgumentAtIndex(1, "1.5");
75 args.InsertArgumentAtIndex(4, "3.5");
77 ASSERT_EQ(5u, args.GetArgumentCount());
78 EXPECT_STREQ("1", args.GetArgumentAtIndex(0));
79 EXPECT_STREQ("1.5", args.GetArgumentAtIndex(1));
80 EXPECT_STREQ("2", args.GetArgumentAtIndex(2));
81 EXPECT_STREQ("3", args.GetArgumentAtIndex(3));
82 EXPECT_STREQ("3.5", args.GetArgumentAtIndex(4));
85 TEST(ArgsTest, TestArgv) {
87 EXPECT_EQ(nullptr, args.GetArgumentVector());
89 args.AppendArgument("1");
90 EXPECT_NE(nullptr, args.GetArgumentVector()[0]);
91 EXPECT_EQ(nullptr, args.GetArgumentVector()[1]);
93 args.AppendArgument("2");
94 EXPECT_NE(nullptr, args.GetArgumentVector()[0]);
95 EXPECT_NE(nullptr, args.GetArgumentVector()[1]);
96 EXPECT_EQ(nullptr, args.GetArgumentVector()[2]);
98 args.AppendArgument("3");
99 EXPECT_NE(nullptr, args.GetArgumentVector()[0]);
100 EXPECT_NE(nullptr, args.GetArgumentVector()[1]);
101 EXPECT_NE(nullptr, args.GetArgumentVector()[2]);
102 EXPECT_EQ(nullptr, args.GetArgumentVector()[3]);
104 args.InsertArgumentAtIndex(1, "1.5");
105 EXPECT_NE(nullptr, args.GetArgumentVector()[0]);
106 EXPECT_NE(nullptr, args.GetArgumentVector()[1]);
107 EXPECT_NE(nullptr, args.GetArgumentVector()[2]);
108 EXPECT_NE(nullptr, args.GetArgumentVector()[3]);
109 EXPECT_EQ(nullptr, args.GetArgumentVector()[4]);
111 args.InsertArgumentAtIndex(4, "3.5");
112 EXPECT_NE(nullptr, args.GetArgumentVector()[0]);
113 EXPECT_NE(nullptr, args.GetArgumentVector()[1]);
114 EXPECT_NE(nullptr, args.GetArgumentVector()[2]);
115 EXPECT_NE(nullptr, args.GetArgumentVector()[3]);
116 EXPECT_NE(nullptr, args.GetArgumentVector()[4]);
117 EXPECT_EQ(nullptr, args.GetArgumentVector()[5]);
120 TEST(ArgsTest, GetQuotedCommandString) {
122 const char *str = "process launch -o stdout.txt -- \"a b c\"";
123 args.SetCommandString(str);
126 ASSERT_TRUE(args.GetQuotedCommandString(stdstr));
127 EXPECT_EQ(str, stdstr);
130 TEST(ArgsTest, BareSingleQuote) {
132 args.SetCommandString("a\\'b");
133 EXPECT_EQ(1u, args.GetArgumentCount());
135 EXPECT_STREQ("a'b", args.GetArgumentAtIndex(0));
138 TEST(ArgsTest, DoubleQuotedItem) {
140 args.SetCommandString("\"a b c\"");
141 EXPECT_EQ(1u, args.GetArgumentCount());
143 EXPECT_STREQ("a b c", args.GetArgumentAtIndex(0));
146 TEST(ArgsTest, AppendArguments) {
148 const char *argv[] = {"1", "2", nullptr};
149 const char *argv2[] = {"3", "4", nullptr};
151 args.AppendArguments(argv);
152 ASSERT_EQ(2u, args.GetArgumentCount());
153 EXPECT_STREQ("1", args.GetArgumentVector()[0]);
154 EXPECT_STREQ("2", args.GetArgumentVector()[1]);
155 EXPECT_EQ(nullptr, args.GetArgumentVector()[2]);
156 EXPECT_STREQ("1", args.GetArgumentAtIndex(0));
157 EXPECT_STREQ("2", args.GetArgumentAtIndex(1));
159 args.AppendArguments(argv2);
160 ASSERT_EQ(4u, args.GetArgumentCount());
161 EXPECT_STREQ("1", args.GetArgumentVector()[0]);
162 EXPECT_STREQ("2", args.GetArgumentVector()[1]);
163 EXPECT_STREQ("3", args.GetArgumentVector()[2]);
164 EXPECT_STREQ("4", args.GetArgumentVector()[3]);
165 EXPECT_EQ(nullptr, args.GetArgumentVector()[4]);
166 EXPECT_STREQ("1", args.GetArgumentAtIndex(0));
167 EXPECT_STREQ("2", args.GetArgumentAtIndex(1));
168 EXPECT_STREQ("3", args.GetArgumentAtIndex(2));
169 EXPECT_STREQ("4", args.GetArgumentAtIndex(3));
172 TEST(ArgsTest, StringToBoolean) {
173 bool success = false;
174 EXPECT_TRUE(Args::StringToBoolean(llvm::StringRef("true"), false, nullptr));
175 EXPECT_TRUE(Args::StringToBoolean(llvm::StringRef("on"), false, nullptr));
176 EXPECT_TRUE(Args::StringToBoolean(llvm::StringRef("yes"), false, nullptr));
177 EXPECT_TRUE(Args::StringToBoolean(llvm::StringRef("1"), false, nullptr));
179 EXPECT_TRUE(Args::StringToBoolean(llvm::StringRef("true"), false, &success));
180 EXPECT_TRUE(success);
181 EXPECT_TRUE(Args::StringToBoolean(llvm::StringRef("on"), false, &success));
182 EXPECT_TRUE(success);
183 EXPECT_TRUE(Args::StringToBoolean(llvm::StringRef("yes"), false, &success));
184 EXPECT_TRUE(success);
185 EXPECT_TRUE(Args::StringToBoolean(llvm::StringRef("1"), false, &success));
186 EXPECT_TRUE(success);
188 EXPECT_FALSE(Args::StringToBoolean(llvm::StringRef("false"), true, nullptr));
189 EXPECT_FALSE(Args::StringToBoolean(llvm::StringRef("off"), true, nullptr));
190 EXPECT_FALSE(Args::StringToBoolean(llvm::StringRef("no"), true, nullptr));
191 EXPECT_FALSE(Args::StringToBoolean(llvm::StringRef("0"), true, nullptr));
193 EXPECT_FALSE(Args::StringToBoolean(llvm::StringRef("false"), true, &success));
194 EXPECT_TRUE(success);
195 EXPECT_FALSE(Args::StringToBoolean(llvm::StringRef("off"), true, &success));
196 EXPECT_TRUE(success);
197 EXPECT_FALSE(Args::StringToBoolean(llvm::StringRef("no"), true, &success));
198 EXPECT_TRUE(success);
199 EXPECT_FALSE(Args::StringToBoolean(llvm::StringRef("0"), true, &success));
200 EXPECT_TRUE(success);
202 EXPECT_FALSE(Args::StringToBoolean(llvm::StringRef("10"), false, &success));
203 EXPECT_FALSE(success);
204 EXPECT_TRUE(Args::StringToBoolean(llvm::StringRef("10"), true, &success));
205 EXPECT_FALSE(success);
206 EXPECT_TRUE(Args::StringToBoolean(llvm::StringRef(""), true, &success));
207 EXPECT_FALSE(success);
210 TEST(ArgsTest, StringToChar) {
211 bool success = false;
213 EXPECT_EQ('A', Args::StringToChar("A", 'B', nullptr));
214 EXPECT_EQ('B', Args::StringToChar("B", 'A', nullptr));
216 EXPECT_EQ('A', Args::StringToChar("A", 'B', &success));
217 EXPECT_TRUE(success);
218 EXPECT_EQ('B', Args::StringToChar("B", 'A', &success));
219 EXPECT_TRUE(success);
221 EXPECT_EQ('A', Args::StringToChar("", 'A', &success));
222 EXPECT_FALSE(success);
223 EXPECT_EQ('A', Args::StringToChar("ABC", 'A', &success));
224 EXPECT_FALSE(success);
227 TEST(ArgsTest, StringToScriptLanguage) {
228 bool success = false;
230 EXPECT_EQ(lldb::eScriptLanguageDefault,
231 Args::StringToScriptLanguage(llvm::StringRef("default"),
232 lldb::eScriptLanguageNone, nullptr));
233 EXPECT_EQ(lldb::eScriptLanguagePython,
234 Args::StringToScriptLanguage(llvm::StringRef("python"),
235 lldb::eScriptLanguageNone, nullptr));
236 EXPECT_EQ(lldb::eScriptLanguageNone,
237 Args::StringToScriptLanguage(llvm::StringRef("none"),
238 lldb::eScriptLanguagePython, nullptr));
240 EXPECT_EQ(lldb::eScriptLanguageDefault,
241 Args::StringToScriptLanguage(llvm::StringRef("default"),
242 lldb::eScriptLanguageNone, &success));
243 EXPECT_TRUE(success);
244 EXPECT_EQ(lldb::eScriptLanguagePython,
245 Args::StringToScriptLanguage(llvm::StringRef("python"),
246 lldb::eScriptLanguageNone, &success));
247 EXPECT_TRUE(success);
248 EXPECT_EQ(lldb::eScriptLanguageNone,
249 Args::StringToScriptLanguage(llvm::StringRef("none"),
250 lldb::eScriptLanguagePython,
252 EXPECT_TRUE(success);
254 EXPECT_EQ(lldb::eScriptLanguagePython,
255 Args::StringToScriptLanguage(llvm::StringRef("invalid"),
256 lldb::eScriptLanguagePython,
258 EXPECT_FALSE(success);
261 TEST(ArgsTest, StringToVersion) {}
263 // Environment Variable Tests
265 class EnvVarFixture: public ::testing::Test {
269 args.AppendArgument(llvm::StringRef("Arg1=foo"));
270 args.AppendArgument(llvm::StringRef("Arg2"));
271 args.AppendArgument(llvm::StringRef("Arg3=bar"));
274 size_t GetIndexForEnvVar(llvm::StringRef envvar_name) {
275 size_t argument_index = std::numeric_limits<size_t>::max();
276 EXPECT_TRUE(args.ContainsEnvironmentVariable(envvar_name,
278 EXPECT_LT(argument_index, args.GetArgumentCount());
279 return argument_index;
286 TEST_F(EnvVarFixture, TestContainsEnvironmentVariableNoValue) {
287 EXPECT_TRUE(args.ContainsEnvironmentVariable(llvm::StringRef("Arg2")));
290 TEST_F(EnvVarFixture, TestContainsEnvironmentVariableWithValue) {
291 EXPECT_TRUE(args.ContainsEnvironmentVariable(llvm::StringRef("Arg3")));
294 TEST_F(EnvVarFixture, TestContainsEnvironmentVariableNonExistentVariable) {
295 auto nonexistent_envvar = llvm::StringRef("ThisEnvVarShouldNotExist");
296 EXPECT_FALSE(args.ContainsEnvironmentVariable(nonexistent_envvar));
299 TEST_F(EnvVarFixture, TestReplaceEnvironmentVariableInitialNoValueWithNoValue) {
300 auto envvar_name = llvm::StringRef("Arg2");
301 auto argument_index = GetIndexForEnvVar(envvar_name);
303 args.AddOrReplaceEnvironmentVariable(envvar_name, llvm::StringRef(""));
304 EXPECT_TRUE(args.ContainsEnvironmentVariable(envvar_name));
305 EXPECT_EQ(envvar_name, args.GetArgumentAtIndex(argument_index));
308 TEST_F(EnvVarFixture, TestReplaceEnvironmentVariableInitialNoValueWithValue) {
309 auto envvar_name = llvm::StringRef("Arg2");
310 auto argument_index = GetIndexForEnvVar(envvar_name);
312 auto new_value = llvm::StringRef("NewValue");
313 args.AddOrReplaceEnvironmentVariable(envvar_name, new_value);
314 EXPECT_TRUE(args.ContainsEnvironmentVariable(envvar_name));
316 std::stringstream stream;
317 stream << envvar_name.str() << '=' << new_value.str();
318 EXPECT_EQ(llvm::StringRef(stream.str()),
319 args.GetArgumentAtIndex(argument_index));
322 TEST_F(EnvVarFixture, TestReplaceEnvironmentVariableInitialValueWithNoValue) {
323 auto envvar_name = llvm::StringRef("Arg1");
324 auto argument_index = GetIndexForEnvVar(envvar_name);
326 args.AddOrReplaceEnvironmentVariable(envvar_name, llvm::StringRef(""));
327 EXPECT_TRUE(args.ContainsEnvironmentVariable(envvar_name));
328 EXPECT_EQ(envvar_name, args.GetArgumentAtIndex(argument_index));
331 TEST_F(EnvVarFixture, TestReplaceEnvironmentVariableInitialValueWithValue) {
332 auto envvar_name = llvm::StringRef("Arg1");
333 auto argument_index = GetIndexForEnvVar(envvar_name);
335 auto new_value = llvm::StringRef("NewValue");
336 args.AddOrReplaceEnvironmentVariable(envvar_name, new_value);
337 EXPECT_TRUE(args.ContainsEnvironmentVariable(envvar_name));
339 std::stringstream stream;
340 stream << envvar_name.str() << '=' << new_value.str();
341 EXPECT_EQ(llvm::StringRef(stream.str()),
342 args.GetArgumentAtIndex(argument_index));