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