1 #include <cstdlib>
2
3 #include "../src/commandlineflags.h"
4 #include "../src/internal_macros.h"
5 #include "gtest/gtest.h"
6
7 namespace benchmark {
8 namespace {
9
10 #if defined(BENCHMARK_OS_WINDOWS)
setenv(const char * name,const char * value,int overwrite)11 int setenv(const char* name, const char* value, int overwrite) {
12 if (!overwrite) {
13 // NOTE: getenv_s is far superior but not available under mingw.
14 char* env_value = getenv(name);
15 if (env_value == nullptr) {
16 return -1;
17 }
18 }
19 return _putenv_s(name, value);
20 }
21
unsetenv(const char * name)22 int unsetenv(const char* name) {
23 return _putenv_s(name, "");
24 }
25
26 #endif // BENCHMARK_OS_WINDOWS
27
TEST(BoolFromEnv,Default)28 TEST(BoolFromEnv, Default) {
29 ASSERT_EQ(unsetenv("BENCHMARK_NOT_IN_ENV"), 0);
30 EXPECT_EQ(BoolFromEnv("not_in_env", true), true);
31 }
32
TEST(BoolFromEnv,False)33 TEST(BoolFromEnv, False) {
34 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "0", 1), 0);
35 EXPECT_EQ(BoolFromEnv("in_env", true), false);
36 unsetenv("BENCHMARK_IN_ENV");
37
38 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "N", 1), 0);
39 EXPECT_EQ(BoolFromEnv("in_env", true), false);
40 unsetenv("BENCHMARK_IN_ENV");
41
42 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "n", 1), 0);
43 EXPECT_EQ(BoolFromEnv("in_env", true), false);
44 unsetenv("BENCHMARK_IN_ENV");
45
46 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "NO", 1), 0);
47 EXPECT_EQ(BoolFromEnv("in_env", true), false);
48 unsetenv("BENCHMARK_IN_ENV");
49
50 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "No", 1), 0);
51 EXPECT_EQ(BoolFromEnv("in_env", true), false);
52 unsetenv("BENCHMARK_IN_ENV");
53
54 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "no", 1), 0);
55 EXPECT_EQ(BoolFromEnv("in_env", true), false);
56 unsetenv("BENCHMARK_IN_ENV");
57
58 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "F", 1), 0);
59 EXPECT_EQ(BoolFromEnv("in_env", true), false);
60 unsetenv("BENCHMARK_IN_ENV");
61
62 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "f", 1), 0);
63 EXPECT_EQ(BoolFromEnv("in_env", true), false);
64 unsetenv("BENCHMARK_IN_ENV");
65
66 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "FALSE", 1), 0);
67 EXPECT_EQ(BoolFromEnv("in_env", true), false);
68 unsetenv("BENCHMARK_IN_ENV");
69
70 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "False", 1), 0);
71 EXPECT_EQ(BoolFromEnv("in_env", true), false);
72 unsetenv("BENCHMARK_IN_ENV");
73
74 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "false", 1), 0);
75 EXPECT_EQ(BoolFromEnv("in_env", true), false);
76 unsetenv("BENCHMARK_IN_ENV");
77
78 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "OFF", 1), 0);
79 EXPECT_EQ(BoolFromEnv("in_env", true), false);
80 unsetenv("BENCHMARK_IN_ENV");
81
82 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "Off", 1), 0);
83 EXPECT_EQ(BoolFromEnv("in_env", true), false);
84 unsetenv("BENCHMARK_IN_ENV");
85
86 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "off", 1), 0);
87 EXPECT_EQ(BoolFromEnv("in_env", true), false);
88 unsetenv("BENCHMARK_IN_ENV");
89 }
90
TEST(BoolFromEnv,True)91 TEST(BoolFromEnv, True) {
92 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "1", 1), 0);
93 EXPECT_EQ(BoolFromEnv("in_env", false), true);
94 unsetenv("BENCHMARK_IN_ENV");
95
96 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "Y", 1), 0);
97 EXPECT_EQ(BoolFromEnv("in_env", false), true);
98 unsetenv("BENCHMARK_IN_ENV");
99
100 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "y", 1), 0);
101 EXPECT_EQ(BoolFromEnv("in_env", false), true);
102 unsetenv("BENCHMARK_IN_ENV");
103
104 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "YES", 1), 0);
105 EXPECT_EQ(BoolFromEnv("in_env", false), true);
106 unsetenv("BENCHMARK_IN_ENV");
107
108 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "Yes", 1), 0);
109 EXPECT_EQ(BoolFromEnv("in_env", false), true);
110 unsetenv("BENCHMARK_IN_ENV");
111
112 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "yes", 1), 0);
113 EXPECT_EQ(BoolFromEnv("in_env", false), true);
114 unsetenv("BENCHMARK_IN_ENV");
115
116 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "T", 1), 0);
117 EXPECT_EQ(BoolFromEnv("in_env", false), true);
118 unsetenv("BENCHMARK_IN_ENV");
119
120 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "t", 1), 0);
121 EXPECT_EQ(BoolFromEnv("in_env", false), true);
122 unsetenv("BENCHMARK_IN_ENV");
123
124 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "TRUE", 1), 0);
125 EXPECT_EQ(BoolFromEnv("in_env", false), true);
126 unsetenv("BENCHMARK_IN_ENV");
127
128 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "True", 1), 0);
129 EXPECT_EQ(BoolFromEnv("in_env", false), true);
130 unsetenv("BENCHMARK_IN_ENV");
131
132 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "true", 1), 0);
133 EXPECT_EQ(BoolFromEnv("in_env", false), true);
134 unsetenv("BENCHMARK_IN_ENV");
135
136 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "ON", 1), 0);
137 EXPECT_EQ(BoolFromEnv("in_env", false), true);
138 unsetenv("BENCHMARK_IN_ENV");
139
140 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "On", 1), 0);
141 EXPECT_EQ(BoolFromEnv("in_env", false), true);
142 unsetenv("BENCHMARK_IN_ENV");
143
144 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "on", 1), 0);
145 EXPECT_EQ(BoolFromEnv("in_env", false), true);
146 unsetenv("BENCHMARK_IN_ENV");
147
148 #ifndef BENCHMARK_OS_WINDOWS
149 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "", 1), 0);
150 EXPECT_EQ(BoolFromEnv("in_env", false), true);
151 unsetenv("BENCHMARK_IN_ENV");
152 #endif
153 }
154
TEST(Int32FromEnv,NotInEnv)155 TEST(Int32FromEnv, NotInEnv) {
156 ASSERT_EQ(unsetenv("BENCHMARK_NOT_IN_ENV"), 0);
157 EXPECT_EQ(Int32FromEnv("not_in_env", 42), 42);
158 }
159
TEST(Int32FromEnv,InvalidInteger)160 TEST(Int32FromEnv, InvalidInteger) {
161 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "foo", 1), 0);
162 EXPECT_EQ(Int32FromEnv("in_env", 42), 42);
163 unsetenv("BENCHMARK_IN_ENV");
164 }
165
TEST(Int32FromEnv,ValidInteger)166 TEST(Int32FromEnv, ValidInteger) {
167 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "42", 1), 0);
168 EXPECT_EQ(Int32FromEnv("in_env", 64), 42);
169 unsetenv("BENCHMARK_IN_ENV");
170 }
171
TEST(DoubleFromEnv,NotInEnv)172 TEST(DoubleFromEnv, NotInEnv) {
173 ASSERT_EQ(unsetenv("BENCHMARK_NOT_IN_ENV"), 0);
174 EXPECT_EQ(DoubleFromEnv("not_in_env", 0.51), 0.51);
175 }
176
TEST(DoubleFromEnv,InvalidReal)177 TEST(DoubleFromEnv, InvalidReal) {
178 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "foo", 1), 0);
179 EXPECT_EQ(DoubleFromEnv("in_env", 0.51), 0.51);
180 unsetenv("BENCHMARK_IN_ENV");
181 }
182
TEST(DoubleFromEnv,ValidReal)183 TEST(DoubleFromEnv, ValidReal) {
184 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "0.51", 1), 0);
185 EXPECT_EQ(DoubleFromEnv("in_env", 0.71), 0.51);
186 unsetenv("BENCHMARK_IN_ENV");
187 }
188
TEST(StringFromEnv,Default)189 TEST(StringFromEnv, Default) {
190 ASSERT_EQ(unsetenv("BENCHMARK_NOT_IN_ENV"), 0);
191 EXPECT_STREQ(StringFromEnv("not_in_env", "foo"), "foo");
192 }
193
TEST(StringFromEnv,Valid)194 TEST(StringFromEnv, Valid) {
195 ASSERT_EQ(setenv("BENCHMARK_IN_ENV", "foo", 1), 0);
196 EXPECT_STREQ(StringFromEnv("in_env", "bar"), "foo");
197 unsetenv("BENCHMARK_IN_ENV");
198 }
199
200 } // namespace
201 } // namespace benchmark
202