env_var_test.cc 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include <gtest/gtest.h>
  4. #include <chrono>
  5. #include <cstdint>
  6. #include <cstdlib>
  7. #include <string>
  8. #include "opentelemetry/sdk/common/env_variables.h"
  9. #if defined(_MSC_VER)
  10. using opentelemetry::sdk::common::setenv;
  11. using opentelemetry::sdk::common::unsetenv;
  12. #endif
  13. using opentelemetry::sdk::common::GetBoolEnvironmentVariable;
  14. using opentelemetry::sdk::common::GetDurationEnvironmentVariable;
  15. using opentelemetry::sdk::common::GetFloatEnvironmentVariable;
  16. using opentelemetry::sdk::common::GetStringEnvironmentVariable;
  17. using opentelemetry::sdk::common::GetUintEnvironmentVariable;
  18. #ifndef NO_GETENV
  19. TEST(EnvVarTest, BoolEnvVar)
  20. {
  21. unsetenv("BOOL_ENV_VAR_NONE");
  22. setenv("BOOL_ENV_VAR_EMPTY", "", 1);
  23. setenv("BOOL_ENV_VAR_T1", "true", 1);
  24. setenv("BOOL_ENV_VAR_T2", "TRUE", 1);
  25. setenv("BOOL_ENV_VAR_T3", "TrUe", 1);
  26. setenv("BOOL_ENV_VAR_F1", "false", 1);
  27. setenv("BOOL_ENV_VAR_F2", "FALSE", 1);
  28. setenv("BOOL_ENV_VAR_F3", "FaLsE", 1);
  29. setenv("BOOL_ENV_VAR_BROKEN", "Maybe ?", 1);
  30. bool exists;
  31. bool value = true;
  32. exists = GetBoolEnvironmentVariable("BOOL_ENV_VAR_NONE", value);
  33. EXPECT_FALSE(exists);
  34. value = true;
  35. exists = GetBoolEnvironmentVariable("BOOL_ENV_VAR_EMPTY", value);
  36. EXPECT_FALSE(exists);
  37. EXPECT_FALSE(value);
  38. value = false;
  39. exists = GetBoolEnvironmentVariable("BOOL_ENV_VAR_T1", value);
  40. EXPECT_TRUE(exists);
  41. EXPECT_TRUE(value);
  42. value = false;
  43. exists = GetBoolEnvironmentVariable("BOOL_ENV_VAR_T2", value);
  44. EXPECT_TRUE(exists);
  45. EXPECT_TRUE(value);
  46. value = false;
  47. exists = GetBoolEnvironmentVariable("BOOL_ENV_VAR_T3", value);
  48. EXPECT_TRUE(exists);
  49. EXPECT_TRUE(value);
  50. value = true;
  51. exists = GetBoolEnvironmentVariable("BOOL_ENV_VAR_F1", value);
  52. EXPECT_TRUE(exists);
  53. EXPECT_FALSE(value);
  54. value = true;
  55. exists = GetBoolEnvironmentVariable("BOOL_ENV_VAR_F2", value);
  56. EXPECT_TRUE(exists);
  57. EXPECT_FALSE(value);
  58. value = true;
  59. exists = GetBoolEnvironmentVariable("BOOL_ENV_VAR_F3", value);
  60. EXPECT_TRUE(exists);
  61. EXPECT_FALSE(value);
  62. // This raises a warning, not verifying the warning text.
  63. value = true;
  64. exists = GetBoolEnvironmentVariable("BOOL_ENV_VAR_BROKEN", value);
  65. EXPECT_TRUE(exists);
  66. EXPECT_FALSE(value);
  67. unsetenv("BOOL_ENV_VAR_EMPTY");
  68. unsetenv("BOOL_ENV_VAR_T1");
  69. unsetenv("BOOL_ENV_VAR_T2");
  70. unsetenv("BOOL_ENV_VAR_T3");
  71. unsetenv("BOOL_ENV_VAR_F1");
  72. unsetenv("BOOL_ENV_VAR_F2");
  73. unsetenv("BOOL_ENV_VAR_F3");
  74. unsetenv("BOOL_ENV_VAR_BROKEN");
  75. }
  76. TEST(EnvVarTest, StringEnvVar)
  77. {
  78. unsetenv("STRING_ENV_VAR_NONE");
  79. setenv("STRING_ENV_VAR_EMPTY", "", 1);
  80. setenv("STRING_ENV_VAR", "my string", 1);
  81. bool exists;
  82. std::string value;
  83. exists = GetStringEnvironmentVariable("STRING_ENV_VAR_NONE", value);
  84. EXPECT_FALSE(exists);
  85. exists = GetStringEnvironmentVariable("STRING_ENV_VAR_EMPTY", value);
  86. EXPECT_FALSE(exists);
  87. EXPECT_EQ(value, "");
  88. value = "poison";
  89. exists = GetStringEnvironmentVariable("STRING_ENV_VAR", value);
  90. EXPECT_TRUE(exists);
  91. EXPECT_EQ(value, "my string");
  92. unsetenv("STRING_ENV_VAR_EMPTY");
  93. unsetenv("STRING_ENV_VAR");
  94. }
  95. TEST(EnvVarTest, DurationEnvVar)
  96. {
  97. unsetenv("DURATION_ENV_VAR_NONE");
  98. setenv("DURATION_ENV_VAR_EMPTY", "", 1);
  99. setenv("DURATION_ENV_VAR_1", "10ns", 1);
  100. setenv("DURATION_ENV_VAR_2", "20us", 1);
  101. setenv("DURATION_ENV_VAR_3", "30ms", 1);
  102. setenv("DURATION_ENV_VAR_4", "40s", 1);
  103. setenv("DURATION_ENV_VAR_5", "50m", 1);
  104. setenv("DURATION_ENV_VAR_6", "60h", 1);
  105. setenv("DURATION_ENV_VAR_7", "123", 1);
  106. setenv("DURATION_ENV_VAR_BROKEN_1", "123 ms", 1);
  107. setenv("DURATION_ENV_VAR_BROKEN_2", "1mississippi", 1);
  108. bool exists;
  109. std::chrono::system_clock::duration poison;
  110. std::chrono::system_clock::duration value;
  111. std::chrono::system_clock::duration expected;
  112. poison =
  113. std::chrono::duration_cast<std::chrono::system_clock::duration>(std::chrono::seconds{666});
  114. exists = GetDurationEnvironmentVariable("DURATION_ENV_VAR_NONE", value);
  115. EXPECT_FALSE(exists);
  116. exists = GetDurationEnvironmentVariable("DURATION_ENV_VAR_EMPTY", value);
  117. EXPECT_FALSE(exists);
  118. value = poison;
  119. expected =
  120. std::chrono::duration_cast<std::chrono::system_clock::duration>(std::chrono::nanoseconds{10});
  121. exists = GetDurationEnvironmentVariable("DURATION_ENV_VAR_1", value);
  122. EXPECT_TRUE(exists);
  123. EXPECT_EQ(value, expected);
  124. value = poison;
  125. expected = std::chrono::duration_cast<std::chrono::system_clock::duration>(
  126. std::chrono::microseconds{20});
  127. exists = GetDurationEnvironmentVariable("DURATION_ENV_VAR_2", value);
  128. EXPECT_TRUE(exists);
  129. EXPECT_EQ(value, expected);
  130. value = poison;
  131. expected = std::chrono::duration_cast<std::chrono::system_clock::duration>(
  132. std::chrono::milliseconds{30});
  133. exists = GetDurationEnvironmentVariable("DURATION_ENV_VAR_3", value);
  134. EXPECT_TRUE(exists);
  135. EXPECT_EQ(value, expected);
  136. value = poison;
  137. expected =
  138. std::chrono::duration_cast<std::chrono::system_clock::duration>(std::chrono::seconds{40});
  139. exists = GetDurationEnvironmentVariable("DURATION_ENV_VAR_4", value);
  140. EXPECT_TRUE(exists);
  141. EXPECT_EQ(value, expected);
  142. value = poison;
  143. expected =
  144. std::chrono::duration_cast<std::chrono::system_clock::duration>(std::chrono::minutes{50});
  145. exists = GetDurationEnvironmentVariable("DURATION_ENV_VAR_5", value);
  146. EXPECT_TRUE(exists);
  147. EXPECT_EQ(value, expected);
  148. value = poison;
  149. expected =
  150. std::chrono::duration_cast<std::chrono::system_clock::duration>(std::chrono::hours{60});
  151. exists = GetDurationEnvironmentVariable("DURATION_ENV_VAR_6", value);
  152. EXPECT_TRUE(exists);
  153. EXPECT_EQ(value, expected);
  154. value = poison;
  155. // Deviation from the spec: 123 seconds instead of 123 milliseconds
  156. expected =
  157. std::chrono::duration_cast<std::chrono::system_clock::duration>(std::chrono::seconds{123});
  158. exists = GetDurationEnvironmentVariable("DURATION_ENV_VAR_7", value);
  159. EXPECT_TRUE(exists);
  160. EXPECT_EQ(value, expected);
  161. // This raises a warning, not verifying the warning text.
  162. exists = GetDurationEnvironmentVariable("DURATION_ENV_VAR_BROKEN_1", value);
  163. EXPECT_FALSE(exists);
  164. // This raises a warning, not verifying the warning text.
  165. exists = GetDurationEnvironmentVariable("DURATION_ENV_VAR_BROKEN_2", value);
  166. EXPECT_FALSE(exists);
  167. unsetenv("STRING_ENV_VAR_EMPTY");
  168. unsetenv("STRING_ENV_VAR_1");
  169. unsetenv("STRING_ENV_VAR_2");
  170. unsetenv("STRING_ENV_VAR_3");
  171. unsetenv("STRING_ENV_VAR_4");
  172. unsetenv("STRING_ENV_VAR_5");
  173. unsetenv("STRING_ENV_VAR_6");
  174. unsetenv("STRING_ENV_VAR_7");
  175. unsetenv("STRING_ENV_VAR_BROKEN_1");
  176. unsetenv("STRING_ENV_VAR_BROKEN_2");
  177. }
  178. TEST(EnvVarTest, UintEnvVar)
  179. {
  180. unsetenv("UINT_ENV_VAR_NONE");
  181. setenv("UINT_ENV_VAR_EMPTY", "", 1);
  182. setenv("UINT_ENV_VAR_POSITIVE_INT", "42", 1);
  183. setenv("UINT_ENV_VAR_NEGATIVE_INT", "-42", 1);
  184. setenv("UINT_ENV_VAR_POSITIVE_DEC", "12.34", 1);
  185. setenv("UINT_ENV_VAR_NEGATIVE_DEC", "-12.34", 1);
  186. setenv("UINT_ENV_VAR_POSITIVE_INT_MAX", "4294967295", 1);
  187. setenv("UINT_ENV_VAR_POSITIVE_OVERFLOW", "4294967296", 1);
  188. setenv("UINT_ENV_VAR_NEGATIVE_INT_MIN", "-2147483648", 1);
  189. setenv("UINT_ENV_VAR_NEGATIVE_OVERFLOW", "-4294967296", 1);
  190. setenv("UINT_ENV_VAR_TOO_LARGE_INT", "99999999999999999999", 1);
  191. setenv("UINT_ENV_VAR_TOO_LARGE_DEC", "3.9999e+99", 1);
  192. setenv("UINT_ENV_VAR_WITH_NOISE", " \t \n 9.12345678.9", 1);
  193. setenv("UINT_ENV_VAR_ONLY_SPACES", " ", 1);
  194. std::uint32_t value;
  195. ASSERT_FALSE(GetUintEnvironmentVariable("UINT_ENV_VAR_NONE", value));
  196. ASSERT_FALSE(GetUintEnvironmentVariable("UINT_ENV_VAR_EMPTY", value));
  197. ASSERT_TRUE(GetUintEnvironmentVariable("UINT_ENV_VAR_POSITIVE_INT", value));
  198. ASSERT_EQ(42, value);
  199. ASSERT_FALSE(GetUintEnvironmentVariable("UINT_ENV_VAR_NEGATIVE_INT", value));
  200. ASSERT_FALSE(GetUintEnvironmentVariable("UINT_ENV_VAR_POSITIVE_DEC", value));
  201. ASSERT_FALSE(GetUintEnvironmentVariable("UINT_ENV_VAR_NEGATIVE_DEC", value));
  202. ASSERT_TRUE(GetUintEnvironmentVariable("UINT_ENV_VAR_POSITIVE_INT_MAX", value));
  203. ASSERT_EQ(4294967295, value);
  204. ASSERT_FALSE(GetUintEnvironmentVariable("UINT_ENV_VAR_POSITIVE_OVERFLOW", value));
  205. ASSERT_FALSE(GetUintEnvironmentVariable("UINT_ENV_VAR_NEGATIVE_INT_MIN", value));
  206. ASSERT_FALSE(GetUintEnvironmentVariable("UINT_ENV_VAR_NEGATIVE_OVERFLOW", value));
  207. ASSERT_FALSE(GetUintEnvironmentVariable("UINT_ENV_VAR_TOO_LARGE_INT", value));
  208. ASSERT_FALSE(GetUintEnvironmentVariable("UINT_ENV_VAR_TOO_LARGE_DEC", value));
  209. ASSERT_FALSE(GetUintEnvironmentVariable("UINT_ENV_VAR_WITH_NOISE", value));
  210. ASSERT_FALSE(GetUintEnvironmentVariable("UINT_ENV_VAR_ONLY_SPACES", value));
  211. unsetenv("UINT_ENV_VAR_EMPTY");
  212. unsetenv("UINT_ENV_VAR_POSITIVE_INT");
  213. unsetenv("UINT_ENV_VAR_NEGATIVE_INT");
  214. unsetenv("UINT_ENV_VAR_POSITIVE_DEC");
  215. unsetenv("UINT_ENV_VAR_NEGATIVE_DEC");
  216. unsetenv("UINT_ENV_VAR_POSITIVE_INT_MAX");
  217. unsetenv("UINT_ENV_VAR_POSITIVE_OVERFLOW");
  218. unsetenv("UINT_ENV_VAR_NEGATIVE_INT_MIN");
  219. unsetenv("UINT_ENV_VAR_NEGATIVE_OVERFLOW");
  220. unsetenv("UINT_ENV_VAR_TOO_LARGE_INT");
  221. unsetenv("UINT_ENV_VAR_TOO_LARGE_DEC");
  222. unsetenv("UINT_ENV_VAR_WITH_NOISE");
  223. unsetenv("UINT_ENV_VAR_ONLY_SPACES");
  224. }
  225. TEST(EnvVarTest, FloatEnvVar)
  226. {
  227. unsetenv("FLOAT_ENV_VAR_NONE");
  228. setenv("FLOAT_ENV_VAR_EMPTY", "", 1);
  229. setenv("FLOAT_ENV_VAR_POSITIVE_INT", "42", 1);
  230. setenv("FLOAT_ENV_VAR_NEGATIVE_INT", "-42", 1);
  231. setenv("FLOAT_ENV_VAR_POSITIVE_DEC", "12.34", 1);
  232. setenv("FLOAT_ENV_VAR_NEGATIVE_DEC", "-12.34", 1);
  233. setenv("FLOAT_ENV_VAR_POSITIVE_INT_MAX", "4294967295", 1);
  234. setenv("FLOAT_ENV_VAR_POSITIVE_OVERFLOW", "4294967296", 1);
  235. setenv("FLOAT_ENV_VAR_NEGATIVE_INT_MIN", "-2147483648", 1);
  236. setenv("FLOAT_ENV_VAR_NEGATIVE_OVERFLOW", "-4294967296", 1);
  237. setenv("FLOAT_ENV_VAR_TOO_LARGE_INT", "99999999999999999999", 1);
  238. setenv("FLOAT_ENV_VAR_TOO_LARGE_DEC", "3.9999e+99", 1);
  239. setenv("FLOAT_ENV_VAR_WITH_NOISE", " \t \n 9.12345678.9", 1);
  240. setenv("FLOAT_ENV_VAR_ONLY_SPACES", " ", 1);
  241. float value;
  242. ASSERT_FALSE(GetFloatEnvironmentVariable("FLOAT_ENV_VAR_NONE", value));
  243. ASSERT_FALSE(GetFloatEnvironmentVariable("FLOAT_ENV_VAR_EMPTY", value));
  244. ASSERT_TRUE(GetFloatEnvironmentVariable("FLOAT_ENV_VAR_POSITIVE_INT", value));
  245. ASSERT_FLOAT_EQ(42.f, value);
  246. ASSERT_TRUE(GetFloatEnvironmentVariable("FLOAT_ENV_VAR_NEGATIVE_INT", value));
  247. ASSERT_FLOAT_EQ(-42.f, value);
  248. ASSERT_TRUE(GetFloatEnvironmentVariable("FLOAT_ENV_VAR_POSITIVE_DEC", value));
  249. ASSERT_FLOAT_EQ(12.34f, value);
  250. ASSERT_TRUE(GetFloatEnvironmentVariable("FLOAT_ENV_VAR_NEGATIVE_DEC", value));
  251. ASSERT_FLOAT_EQ(-12.34f, value);
  252. ASSERT_TRUE(GetFloatEnvironmentVariable("FLOAT_ENV_VAR_POSITIVE_INT_MAX", value));
  253. ASSERT_FLOAT_EQ(4294967295.f, value);
  254. ASSERT_TRUE(GetFloatEnvironmentVariable("FLOAT_ENV_VAR_POSITIVE_OVERFLOW", value));
  255. ASSERT_FLOAT_EQ(4294967296.f, value);
  256. ASSERT_TRUE(GetFloatEnvironmentVariable("FLOAT_ENV_VAR_NEGATIVE_INT_MIN", value));
  257. ASSERT_FLOAT_EQ(-2147483648.f, value);
  258. ASSERT_TRUE(GetFloatEnvironmentVariable("FLOAT_ENV_VAR_NEGATIVE_OVERFLOW", value));
  259. ASSERT_FLOAT_EQ(-4294967296.f, value);
  260. ASSERT_TRUE(GetFloatEnvironmentVariable("FLOAT_ENV_VAR_TOO_LARGE_INT", value));
  261. ASSERT_FLOAT_EQ(99999999999999999999.f, value);
  262. ASSERT_FALSE(GetFloatEnvironmentVariable("FLOAT_ENV_VAR_TOO_LARGE_DEC", value));
  263. ASSERT_FALSE(GetFloatEnvironmentVariable("FLOAT_ENV_VAR_WITH_NOISE", value));
  264. ASSERT_FALSE(GetFloatEnvironmentVariable("FLOAT_ENV_VAR_ONLY_SPACES", value));
  265. unsetenv("FLOAT_ENV_VAR_EMPTY");
  266. unsetenv("FLOAT_ENV_VAR_POSITIVE_INT");
  267. unsetenv("FLOAT_ENV_VAR_NEGATIVE_INT");
  268. unsetenv("FLOAT_ENV_VAR_POSITIVE_DEC");
  269. unsetenv("FLOAT_ENV_VAR_NEGATIVE_DEC");
  270. unsetenv("FLOAT_ENV_VAR_POSITIVE_INT_MAX");
  271. unsetenv("FLOAT_ENV_VAR_POSITIVE_OVERFLOW");
  272. unsetenv("FLOAT_ENV_VAR_NEGATIVE_INT_MIN");
  273. unsetenv("FLOAT_ENV_VAR_NEGATIVE_OVERFLOW");
  274. unsetenv("FLOAT_ENV_VAR_TOO_LARGE_INT");
  275. unsetenv("FLOAT_ENV_VAR_TOO_LARGE_DEC");
  276. unsetenv("FLOAT_ENV_VAR_WITH_NOISE");
  277. unsetenv("FLOAT_ENV_VAR_ONLY_SPACES");
  278. }
  279. #endif // NO_GETENV