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