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

source code of third-party/benchmark/test/commandlineflags_gtest.cc