1 // Copyright 2019 The Abseil Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifdef _WIN32
16 #include <windows.h>
17 #endif
18 
19 #include "gtest/gtest.h"
20 #include "absl/base/internal/scoped_set_env.h"
21 
22 namespace {
23 
24 using absl::base_internal::ScopedSetEnv;
25 
GetEnvVar(const char * name)26 std::string GetEnvVar(const char* name) {
27 #ifdef _WIN32
28   char buf[1024];
29   auto get_res = GetEnvironmentVariableA(name, buf, sizeof(buf));
30   if (get_res >= sizeof(buf)) {
31     return "TOO_BIG";
32   }
33 
34   if (get_res == 0) {
35     return "UNSET";
36   }
37 
38   return std::string(buf, get_res);
39 #else
40   const char* val = ::getenv(name);
41   if (val == nullptr) {
42     return "UNSET";
43   }
44 
45   return val;
46 #endif
47 }
48 
TEST(ScopedSetEnvTest,SetNonExistingVarToString)49 TEST(ScopedSetEnvTest, SetNonExistingVarToString) {
50   EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "UNSET");
51 
52   {
53     ScopedSetEnv scoped_set("SCOPED_SET_ENV_TEST_VAR", "value");
54 
55     EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "value");
56   }
57 
58   EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "UNSET");
59 }
60 
TEST(ScopedSetEnvTest,SetNonExistingVarToNull)61 TEST(ScopedSetEnvTest, SetNonExistingVarToNull) {
62   EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "UNSET");
63 
64   {
65     ScopedSetEnv scoped_set("SCOPED_SET_ENV_TEST_VAR", nullptr);
66 
67     EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "UNSET");
68   }
69 
70   EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "UNSET");
71 }
72 
TEST(ScopedSetEnvTest,SetExistingVarToString)73 TEST(ScopedSetEnvTest, SetExistingVarToString) {
74   ScopedSetEnv scoped_set("SCOPED_SET_ENV_TEST_VAR", "value");
75   EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "value");
76 
77   {
78     ScopedSetEnv scoped_set("SCOPED_SET_ENV_TEST_VAR", "new_value");
79 
80     EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "new_value");
81   }
82 
83   EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "value");
84 }
85 
TEST(ScopedSetEnvTest,SetExistingVarToNull)86 TEST(ScopedSetEnvTest, SetExistingVarToNull) {
87   ScopedSetEnv scoped_set("SCOPED_SET_ENV_TEST_VAR", "value");
88   EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "value");
89 
90   {
91     ScopedSetEnv scoped_set("SCOPED_SET_ENV_TEST_VAR", nullptr);
92 
93     EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "UNSET");
94   }
95 
96   EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "value");
97 }
98 
99 }  // namespace
100