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
This commit is contained in:
Todd Fiala 2016-09-22 16:00:01 +00:00
parent d5d57635ba
commit 36bf6a46d8
2 changed files with 91 additions and 4 deletions

View File

@ -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);
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;

View File

@ -11,6 +11,9 @@
#include "lldb/Interpreter/Args.h"
#include <limits>
#include <sstream>
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<size_t>::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));
}