environment.cpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. // Copyright (c) 2006, 2007 Julio M. Merino Vidal
  2. // Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
  3. // Copyright (c) 2009 Boris Schaeling
  4. // Copyright (c) 2010 Felipe Tanus, Boris Schaeling
  5. // Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
  6. //
  7. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  8. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  9. #define BOOST_TEST_MAIN
  10. #define BOOST_TEST_IGNORE_SIGCHLD
  11. #include <boost/test/included/unit_test.hpp>
  12. #include <boost/process/environment.hpp>
  13. namespace bp = boost::process;
  14. namespace std
  15. {
  16. std::ostream & operator<<(std::ostream & str, const std::wstring & ws)
  17. {
  18. str << bp::detail::convert(ws);
  19. return str;
  20. }
  21. }
  22. BOOST_AUTO_TEST_CASE(empty, *boost::unit_test::timeout(5))
  23. {
  24. bp::environment ev ;
  25. BOOST_CHECK(ev.empty());
  26. BOOST_CHECK_EQUAL(ev.size(), 0u);
  27. BOOST_CHECK_EQUAL(ev.end() - ev.begin(), 0);
  28. ev["Thingy"] = "My value";
  29. BOOST_CHECK(!ev.empty());
  30. BOOST_CHECK_EQUAL(ev.size(), 1u);
  31. BOOST_CHECK_EQUAL(ev.end() - ev.begin(), 1);
  32. for (auto x : ev)
  33. {
  34. BOOST_CHECK_EQUAL(x.to_string(), "My value");
  35. BOOST_CHECK_EQUAL(x.get_name(), "Thingy");
  36. }
  37. ev["Thingy"].clear();
  38. BOOST_CHECK(ev.empty());
  39. BOOST_CHECK_EQUAL(ev.size(), 0u);
  40. BOOST_CHECK_EQUAL(ev.end() - ev.begin(), 0);
  41. ev.clear();
  42. }
  43. BOOST_AUTO_TEST_CASE(wempty, *boost::unit_test::timeout(5))
  44. {
  45. bp::wenvironment ev ;
  46. BOOST_CHECK(ev.empty());
  47. BOOST_CHECK_EQUAL(ev.size(), 0u);
  48. BOOST_CHECK_EQUAL(ev.end() - ev.begin(), 0);
  49. ev[L"Thingy"] = L"My value";
  50. BOOST_CHECK(!ev.empty());
  51. BOOST_CHECK_EQUAL(ev.size(), 1u);
  52. BOOST_CHECK_EQUAL(ev.end() - ev.begin(), 1);
  53. for (auto x : ev)
  54. {
  55. BOOST_CHECK(x.to_string() == L"My value");
  56. BOOST_CHECK(x.get_name() == L"Thingy");
  57. }
  58. ev[L"Thingy"].clear();
  59. BOOST_CHECK(ev.empty());
  60. BOOST_CHECK_EQUAL(ev.size(), 0u);
  61. BOOST_CHECK_EQUAL(ev.end() - ev.begin(), 0);
  62. ev.clear();
  63. }
  64. BOOST_AUTO_TEST_CASE(compare, *boost::unit_test::timeout(5))
  65. {
  66. auto nat = boost::this_process::environment();
  67. bp::environment env = nat;
  68. {
  69. BOOST_CHECK_EQUAL(nat.size(), env.size());
  70. auto ni = nat.begin();
  71. auto ei = env.begin();
  72. while ((ni != nat.end()) &&(ei != env.end()))
  73. {
  74. BOOST_CHECK_EQUAL(ni->get_name(), ei->get_name());
  75. BOOST_CHECK_EQUAL(ni->to_string(), ei->to_string());
  76. ni++; ei++;
  77. }
  78. }
  79. //ok check if I can convert it.
  80. bp::wenvironment wenv{env};
  81. auto wnat = boost::this_process::wenvironment();
  82. BOOST_CHECK_EQUAL(wenv.size(), env.size());
  83. BOOST_CHECK_EQUAL(wnat.size(), nat.size());
  84. {
  85. BOOST_CHECK_EQUAL(wnat.size(), wenv.size());
  86. auto ni = wnat.begin();
  87. auto ei = wenv.begin();
  88. while ((ni != wnat.end()) && (ei != wenv.end()))
  89. {
  90. BOOST_CHECK_EQUAL(ni->get_name() , ei->get_name());
  91. BOOST_CHECK_EQUAL(ni->to_string(), ei->to_string());
  92. ni++; ei++;
  93. }
  94. BOOST_CHECK(ni == wnat.end());
  95. }
  96. BOOST_TEST_PASSPOINT();
  97. env.clear();
  98. BOOST_TEST_PASSPOINT();
  99. wenv.clear();
  100. BOOST_TEST_PASSPOINT();
  101. }
  102. BOOST_AUTO_TEST_CASE(insert_remove, *boost::unit_test::timeout(5))
  103. {
  104. bp::environment env(boost::this_process::environment());
  105. auto sz = env.size();
  106. BOOST_REQUIRE_GE(sz, 1u);
  107. BOOST_REQUIRE_EQUAL(env.count("BOOST_TEST_VAR"), 0u);
  108. env["BOOST_TEST_VAR"] = {"some string", "badabumm"};
  109. #if defined(BOOST_WINDOWS_API)
  110. BOOST_CHECK_EQUAL(env["BOOST_TEST_VAR"].to_string(), "some string;badabumm");
  111. #else
  112. BOOST_CHECK_EQUAL(env["BOOST_TEST_VAR"].to_string(), "some string:badabumm");
  113. #endif
  114. BOOST_CHECK_EQUAL(sz +1, env.size());
  115. env["BOOST_TEST_VAR"].clear();
  116. BOOST_CHECK_EQUAL(env.size(), sz);
  117. env.clear();
  118. }
  119. BOOST_AUTO_TEST_CASE(clear_empty_my, *boost::unit_test::timeout(5))
  120. {
  121. bp::native_environment env;
  122. bp::environment e = env;
  123. const std::size_t sz = env.size();
  124. BOOST_TEST_MESSAGE("Current native size: " << sz);
  125. BOOST_REQUIRE_EQUAL(env.count("BOOST_PROCESS_TEST_VAR_a"), 0u);
  126. BOOST_REQUIRE_EQUAL(env.count("BOOST_PROCESS_TEST_VAR_b"), 0u);
  127. BOOST_REQUIRE_EQUAL(env.count("BOOST_PROCESS_TEST_VAR_c"), 0u);
  128. env["BOOST_PROCESS_TEST_VAR_a"] = "1";
  129. env["BOOST_PROCESS_TEST_VAR_b"] = "2";
  130. BOOST_CHECK(env.emplace("BOOST_PROCESS_TEST_VAR_c", "3").second);
  131. BOOST_CHECK_EQUAL(env.count("BOOST_PROCESS_TEST_VAR_a"), 1u);
  132. BOOST_CHECK_EQUAL(env.count("BOOST_PROCESS_TEST_VAR_b"), 1u);
  133. BOOST_CHECK_EQUAL(env.count("BOOST_PROCESS_TEST_VAR_c"), 1u);
  134. BOOST_CHECK_EQUAL(env.at("BOOST_PROCESS_TEST_VAR_a").to_string(), "1");
  135. BOOST_CHECK_EQUAL(env.at("BOOST_PROCESS_TEST_VAR_b").to_string(), "2");
  136. BOOST_CHECK_EQUAL(env.at("BOOST_PROCESS_TEST_VAR_c").to_string(), "3");
  137. BOOST_CHECK_EQUAL(env.size(), sz + 3u);
  138. BOOST_CHECK_EQUAL(std::distance(env.begin(), env.end()), sz + 3);
  139. BOOST_CHECK_EQUAL(std::distance(env.cbegin(), env.cend()), sz + 3);
  140. env.erase("BOOST_PROCESS_TEST_VAR_a");
  141. BOOST_CHECK_EQUAL(env.size(), sz + 2u);
  142. BOOST_CHECK_EQUAL(env.count("BOOST_PROCESS_TEST_VAR_a"), 0u);
  143. BOOST_CHECK_EQUAL(env.at ("BOOST_PROCESS_TEST_VAR_b").to_string(), "2");
  144. BOOST_CHECK_EQUAL(env.at ("BOOST_PROCESS_TEST_VAR_c").to_string(), "3");
  145. BOOST_CHECK_EQUAL(std::distance(env.begin(), env.end()), sz + 2);
  146. BOOST_CHECK_EQUAL(std::distance(env.cbegin(), env.cend()), sz + 2);
  147. env.erase("BOOST_PROCESS_TEST_VAR_b");
  148. BOOST_CHECK_EQUAL(env.size(), sz + 1u);
  149. BOOST_CHECK_EQUAL(env.count("BOOST_PROCESS_TEST_VAR_a"), 0u);
  150. BOOST_CHECK_EQUAL(env.count("BOOST_PROCESS_TEST_VAR_b"), 0u);
  151. BOOST_CHECK_EQUAL(env.at ("BOOST_PROCESS_TEST_VAR_c").to_string(), "3");
  152. BOOST_CHECK_EQUAL(std::distance(env.begin(), env.end()), sz + 1);
  153. BOOST_CHECK_EQUAL(std::distance(env.cbegin(), env.cend()), sz + 1);
  154. env.clear();
  155. //note: windows puts an entry without a name into the list, so it might not be empty after clear.
  156. BOOST_CHECK_LE(env.size(), sz);
  157. BOOST_CHECK_LE(std::distance(env.begin(), env.end()), sz);
  158. BOOST_CHECK_LE(std::distance(env.cbegin(), env.cend()), sz);
  159. for (auto && ee : e)
  160. env.emplace(ee.get_name(), ee.to_string());
  161. }
  162. BOOST_AUTO_TEST_CASE(clear_empty, *boost::unit_test::timeout(5))
  163. {
  164. bp::environment env;
  165. BOOST_CHECK(env.empty());
  166. BOOST_CHECK_EQUAL(env.size(), 0u);
  167. env["a"] = "1";
  168. env["b"] = "2";
  169. env["c"] = "3";
  170. BOOST_CHECK_EQUAL(env.at("a").to_string(), "1");
  171. BOOST_CHECK_EQUAL(env.at("b").to_string(), "2");
  172. BOOST_CHECK_EQUAL(env.at("c").to_string(), "3");
  173. BOOST_CHECK_EQUAL(env.size(), 3u);
  174. BOOST_CHECK_EQUAL(std::distance(env.begin(), env.end()), 3u);
  175. BOOST_CHECK_EQUAL(std::distance(env.cbegin(), env.cend()), 3u);
  176. env.erase("c");
  177. BOOST_CHECK_EQUAL(env.size(), 2u);
  178. BOOST_CHECK_EQUAL(env.at("a").to_string(), "1");
  179. BOOST_CHECK_EQUAL(env.at("b").to_string(), "2");
  180. BOOST_CHECK_EQUAL(env.count("c"), 0u);
  181. BOOST_CHECK_EQUAL(std::distance(env.begin(), env.end()), 2u);
  182. BOOST_CHECK_EQUAL(std::distance(env.cbegin(), env.cend()), 2u);
  183. env.erase("b");
  184. BOOST_CHECK_EQUAL(env.size(), 1u);
  185. BOOST_CHECK_EQUAL(env.at("a").to_string(), "1");
  186. BOOST_CHECK_EQUAL(env.count("b"), 0u);
  187. BOOST_CHECK_EQUAL(env.count("c"), 0u);
  188. BOOST_CHECK_EQUAL(std::distance(env.begin(), env.end()), 1u);
  189. BOOST_CHECK_EQUAL(std::distance(env.cbegin(), env.cend()), 1u);
  190. env.clear();
  191. BOOST_CHECK(env.empty());
  192. BOOST_CHECK_EQUAL(env.size(), 0u);
  193. BOOST_CHECK_EQUAL(std::distance(env.begin(), env.end()), 0u);
  194. BOOST_CHECK_EQUAL(std::distance(env.cbegin(), env.cend()), 0u);
  195. }