229 lines · plain
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_WINDOWS26 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_WINDOWS148 ASSERT_EQ(setenv("IN_ENV", "", 1), 0);149 EXPECT_EQ(BoolFromEnv("in_env", false), true);150 unsetenv("IN_ENV");151#endif152}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} // namespace228} // namespace benchmark229