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