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