env.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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/args.hpp>
  13. #include <boost/process/child.hpp>
  14. #include <boost/process/env.hpp>
  15. #include <boost/process/environment.hpp>
  16. #include <boost/process/error.hpp>
  17. #include <boost/process/io.hpp>
  18. #include <boost/algorithm/string/predicate.hpp>
  19. #include <boost/system/error_code.hpp>
  20. #include <boost/program_options/environment_iterator.hpp>
  21. #include <string>
  22. #include <stdlib.h>
  23. #include <list>
  24. namespace bp = boost::process;
  25. BOOST_AUTO_TEST_CASE(inherit_env, *boost::unit_test::timeout(2))
  26. {
  27. using boost::unit_test::framework::master_test_suite;
  28. bp::ipstream st;
  29. std::error_code ec;
  30. bp::child c(
  31. master_test_suite().argv[1],
  32. "test", "--query", "PATH",
  33. bp::std_out>st,
  34. ec
  35. );
  36. BOOST_REQUIRE(!ec);
  37. std::string s;
  38. std::getline(st, s);
  39. auto path = boost::this_process::environment()["PATH"].to_string();
  40. std::cout << "Path : '" << path << "'" << std::endl;
  41. std::cout << "Value: '" << s << "'" << std::endl;
  42. if(!path.empty())
  43. {
  44. auto size = (path.size() < s.size()) ? path.size() : s.size();
  45. BOOST_CHECK_EQUAL_COLLECTIONS(
  46. s.begin(), s. begin() + size,
  47. path.begin(), path.begin() + size
  48. );
  49. }
  50. else
  51. BOOST_CHECK(boost::starts_with(s, "************** empty environment **************"));
  52. c.wait();
  53. }
  54. BOOST_AUTO_TEST_CASE(inherit_mod_env, *boost::unit_test::timeout(2))
  55. {
  56. using boost::unit_test::framework::master_test_suite;
  57. auto ie = boost::this_process::environment();
  58. std::string value = "TestString";
  59. ie["BOOST_PROCESS_TEST_1"] = value;
  60. {
  61. auto ie2 = boost::this_process::environment();
  62. auto val = ie2["BOOST_PROCESS_TEST_1"];
  63. auto st = val.to_string();
  64. BOOST_CHECK_EQUAL_COLLECTIONS(
  65. st.begin(), st.end(),
  66. value.begin(), value.end()
  67. );
  68. }
  69. bp::ipstream st;
  70. std::error_code ec;
  71. bp::child c(
  72. master_test_suite().argv[1],
  73. "test", "--query", "BOOST_PROCESS_TEST_1",
  74. bp::std_out>st,
  75. ec
  76. );
  77. BOOST_REQUIRE(!ec);
  78. std::string s;
  79. std::getline(st, s);
  80. auto size = (value.size() < s.size()) ? value.size() : s.size();
  81. BOOST_CHECK_EQUAL_COLLECTIONS(
  82. s.begin(), s. begin() + size,
  83. value.begin(), value.begin() + size
  84. );
  85. c.wait();
  86. }
  87. BOOST_AUTO_TEST_CASE(modifided_env, *boost::unit_test::timeout(2))
  88. {
  89. using boost::unit_test::framework::master_test_suite;
  90. bp::ipstream st;
  91. boost::process::environment env = boost::this_process::environment(); //empty env, that would fail.
  92. std::string value = "TestString";
  93. env["BOOST_PROCESS_TEST_2"] = value;
  94. std::error_code ec;
  95. bp::child c(
  96. master_test_suite().argv[1],
  97. "test", "--query", "BOOST_PROCESS_TEST_2",
  98. bp::std_out>st,
  99. env,
  100. ec
  101. );
  102. BOOST_REQUIRE(!ec);
  103. BOOST_REQUIRE(boost::this_process::environment().count(value) == 0);
  104. std::string s;
  105. std::getline(st, s);
  106. BOOST_CHECK(boost::algorithm::starts_with(s, "TestString"));
  107. c.wait();
  108. }
  109. BOOST_AUTO_TEST_CASE(append, *boost::unit_test::timeout(5))
  110. {
  111. using boost::unit_test::framework::master_test_suite;
  112. bp::ipstream st;
  113. BOOST_TEST_PASSPOINT();
  114. bp::environment e = boost::this_process::environment();
  115. std::error_code ec;
  116. BOOST_REQUIRE_GE(e.size(), 1u);
  117. std::list<std::string> arg = {"test", "--query", "BOOST_PROCESS_TEST_3"};
  118. bp::child c(
  119. master_test_suite().argv[1],
  120. bp::env["BOOST_PROCESS_TEST_3"]="some_string",
  121. bp::env=e,
  122. bp::env["BOOST_PROCESS_TEST_3"]=boost::none,
  123. bp::env["BOOST_PROCESS_TEST_3"]+="some_fictional_path_42",
  124. bp::env["BOOST_PROCESS_TEST_3"]+={"other", "next"},
  125. bp::args=arg,
  126. bp::std_out>st,
  127. ec
  128. );
  129. BOOST_REQUIRE(!ec);
  130. BOOST_WARN(c.running());
  131. std::string s;
  132. std::getline(st, s);
  133. #if defined(BOOST_WINDOWS_API)
  134. BOOST_CHECK(boost::starts_with(s, "some_fictional_path_42;other;next"));
  135. #else
  136. BOOST_CHECK(boost::starts_with(s, "some_fictional_path_42:other:next"));
  137. #endif
  138. c.wait();
  139. }