From 36bf6a46d8f012ed644e94fd94d7f1611e03fa0a Mon Sep 17 00:00:00 2001 From: Todd Fiala Date: Thu, 22 Sep 2016 16:00:01 +0000 Subject: [PATCH] added environment variable-related Args gtests Also fixed up a couple misbehaving functions. It is perfectly legal to have env vars with no values (i.e. the '=' and following need not be present). llvm-svn: 282171 --- lldb/source/Interpreter/Args.cpp | 10 +-- lldb/unittests/Interpreter/TestArgs.cpp | 85 +++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 4 deletions(-) diff --git a/lldb/source/Interpreter/Args.cpp b/lldb/source/Interpreter/Args.cpp index 36ea78cee1d6..25bcac817795 100644 --- a/lldb/source/Interpreter/Args.cpp +++ b/lldb/source/Interpreter/Args.cpp @@ -976,13 +976,15 @@ void Args::LongestCommonPrefix(std::string &common_prefix) { void Args::AddOrReplaceEnvironmentVariable(llvm::StringRef env_var_name, llvm::StringRef new_value) { - if (env_var_name.empty() || new_value.empty()) + if (env_var_name.empty()) return; // Build the new entry. std::string var_string(env_var_name); - var_string += "="; - var_string += new_value; + if (!new_value.empty()) { + var_string += "="; + var_string += new_value; + } size_t index = 0; if (ContainsEnvironmentVariable(env_var_name, &index)) { @@ -1006,7 +1008,7 @@ bool Args::ContainsEnvironmentVariable(llvm::StringRef env_var_name, llvm::StringRef name, value; std::tie(name, value) = arg_value.split('='); - if (name == env_var_name && !value.empty()) { + if (name == env_var_name) { if (argument_index) *argument_index = i; return true; diff --git a/lldb/unittests/Interpreter/TestArgs.cpp b/lldb/unittests/Interpreter/TestArgs.cpp index 1dbcad155737..3d1153efff59 100644 --- a/lldb/unittests/Interpreter/TestArgs.cpp +++ b/lldb/unittests/Interpreter/TestArgs.cpp @@ -11,6 +11,9 @@ #include "lldb/Interpreter/Args.h" +#include +#include + using namespace lldb_private; TEST(ArgsTest, TestSingleArg) { @@ -153,3 +156,85 @@ TEST(ArgsTest, StringToScriptLanguage) { } TEST(ArgsTest, StringToVersion) {} + +// Environment Variable Tests + +class EnvVarFixture: public ::testing::Test { +protected: + + void SetUp() { + args.AppendArgument(llvm::StringRef("Arg1=foo")); + args.AppendArgument(llvm::StringRef("Arg2")); + args.AppendArgument(llvm::StringRef("Arg3=bar")); + } + + size_t GetIndexForEnvVar(llvm::StringRef envvar_name) { + size_t argument_index = std::numeric_limits::max(); + EXPECT_TRUE(args.ContainsEnvironmentVariable(envvar_name, + &argument_index)); + EXPECT_LT(argument_index, args.GetArgumentCount()); + return argument_index; + } + + Args args; +}; + + +TEST_F(EnvVarFixture, TestContainsEnvironmentVariableNoValue) { + EXPECT_TRUE(args.ContainsEnvironmentVariable(llvm::StringRef("Arg2"))); +} + +TEST_F(EnvVarFixture, TestContainsEnvironmentVariableWithValue) { + EXPECT_TRUE(args.ContainsEnvironmentVariable(llvm::StringRef("Arg3"))); +} + +TEST_F(EnvVarFixture, TestContainsEnvironmentVariableNonExistentVariable) { + auto nonexistent_envvar = llvm::StringRef("ThisEnvVarShouldNotExist"); + EXPECT_FALSE(args.ContainsEnvironmentVariable(nonexistent_envvar)); +} + +TEST_F(EnvVarFixture, TestReplaceEnvironmentVariableInitialNoValueWithNoValue) { + auto envvar_name = llvm::StringRef("Arg2"); + auto argument_index = GetIndexForEnvVar(envvar_name); + + args.AddOrReplaceEnvironmentVariable(envvar_name, llvm::StringRef("")); + EXPECT_TRUE(args.ContainsEnvironmentVariable(envvar_name)); + EXPECT_EQ(envvar_name, args.GetArgumentAtIndex(argument_index)); +} + +TEST_F(EnvVarFixture, TestReplaceEnvironmentVariableInitialNoValueWithValue) { + auto envvar_name = llvm::StringRef("Arg2"); + auto argument_index = GetIndexForEnvVar(envvar_name); + + auto new_value = llvm::StringRef("NewValue"); + args.AddOrReplaceEnvironmentVariable(envvar_name, new_value); + EXPECT_TRUE(args.ContainsEnvironmentVariable(envvar_name)); + + std::stringstream stream; + stream << envvar_name.str() << '=' << new_value.str(); + EXPECT_EQ(llvm::StringRef(stream.str()), + args.GetArgumentAtIndex(argument_index)); +} + +TEST_F(EnvVarFixture, TestReplaceEnvironmentVariableInitialValueWithNoValue) { + auto envvar_name = llvm::StringRef("Arg1"); + auto argument_index = GetIndexForEnvVar(envvar_name); + + args.AddOrReplaceEnvironmentVariable(envvar_name, llvm::StringRef("")); + EXPECT_TRUE(args.ContainsEnvironmentVariable(envvar_name)); + EXPECT_EQ(envvar_name, args.GetArgumentAtIndex(argument_index)); +} + +TEST_F(EnvVarFixture, TestReplaceEnvironmentVariableInitialValueWithValue) { + auto envvar_name = llvm::StringRef("Arg1"); + auto argument_index = GetIndexForEnvVar(envvar_name); + + auto new_value = llvm::StringRef("NewValue"); + args.AddOrReplaceEnvironmentVariable(envvar_name, new_value); + EXPECT_TRUE(args.ContainsEnvironmentVariable(envvar_name)); + + std::stringstream stream; + stream << envvar_name.str() << '=' << new_value.str(); + EXPECT_EQ(llvm::StringRef(stream.str()), + args.GetArgumentAtIndex(argument_index)); +}