]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/nowide/test/test_system.cpp
2 // Copyright (c) 2012 Artyom Beilis (Tonkikh)
4 // Distributed under the Boost Software License, Version 1.0. (See
5 // accompanying file LICENSE or copy at
6 // http://www.boost.org/LICENSE_1_0.txt)
9 #define _CRT_SECURE_NO_WARNINGS
12 #include <boost/nowide/cstdlib.hpp>
14 #include <boost/nowide/args.hpp>
15 #include <boost/nowide/utf/convert.hpp>
16 #include <boost/nowide/utf/utf.hpp>
26 bool is_ascii(const std::string
& s
)
28 for(std::string::const_iterator it
= s
.begin(); it
!= s
.end(); ++it
)
30 if(static_cast<unsigned char>(*it
) > 0x7F)
36 std::string
replace_non_ascii(const std::string
& s
)
38 std::string::const_iterator it
= s
.begin();
39 namespace utf
= boost::nowide::utf
;
40 using utf8
= utf::utf_traits
<char>;
42 result
.reserve(s
.size());
45 utf::code_point c
= utf8::decode(it
, s
.end());
46 TEST(c
!= utf::illegal
&& c
!= utf::incomplete
);
48 c
= '?'; // WinAPI seems to do this
49 result
.push_back(static_cast<char>(c
));
54 void compare_string_arrays(char** main_val
, char** utf8_val
, bool sort
)
56 std::vector
<std::string
> vec_main
, vec_utf8
;
57 for(; *main_val
; ++main_val
)
58 vec_main
.push_back(std::string(*main_val
));
59 for(; *utf8_val
; ++utf8_val
)
60 vec_utf8
.push_back(std::string(*utf8_val
));
61 // Same number of strings
62 TEST_EQ(vec_main
.size(), vec_utf8
.size());
65 // Order doesn't matter
66 std::sort(vec_main
.begin(), vec_main
.end());
67 std::sort(vec_utf8
.begin(), vec_utf8
.end());
69 for(size_t i
= 0; i
< vec_main
.size(); ++i
)
71 // Skip strings with non-ascii chars
72 if(is_ascii(vec_main
[i
]) && vec_main
[i
] != vec_utf8
[i
])
73 TEST_EQ(vec_main
[i
], replace_non_ascii(vec_utf8
[i
]));
77 void compare_getenv(char** env
)
79 // For all all variables in env check against getenv
80 for(char** e
= env
; *e
!= 0; e
++)
82 const char* key_begin
= *e
;
83 const char* key_end
= strchr(key_begin
, '=');
85 std::string key
= std::string(key_begin
, key_end
);
86 const char* std_value
= std::getenv(key
.c_str());
87 const char* bnw_value
= boost::nowide::getenv(key
.c_str());
88 // If std_value is set, bnw value must be too and be equal, else bnw value must be unset too
92 // Compare only if ascii
93 if(is_ascii(std_value
) && std::string(std_value
) != std::string(bnw_value
))
94 TEST_EQ(std_value
, replace_non_ascii(bnw_value
));
100 const std::string example
= "\xd7\xa9-\xd0\xbc-\xce\xbd";
102 void run_child(int argc
, char** argv
, char** env
)
106 TEST_EQ(argv
[1], example
);
110 TEST(boost::nowide::getenv("BOOST_NOWIDE_TEST"));
111 TEST_EQ(boost::nowide::getenv("BOOST_NOWIDE_TEST"), example
);
112 TEST(boost::nowide::getenv("BOOST_NOWIDE_TEST_NONE") == 0);
113 // Empty variables are unreliable on windows, hence skip. E.g. using "set FOO=" unsets FOO
114 #ifndef BOOST_WINDOWS
115 TEST(boost::nowide::getenv("BOOST_NOWIDE_EMPTY"));
116 TEST_EQ(boost::nowide::getenv("BOOST_NOWIDE_EMPTY"), std::string());
119 // This must be contained in env
120 std::string sample
= "BOOST_NOWIDE_TEST=" + example
;
122 for(char** e
= env
; *e
!= 0; e
++)
129 std::cout
<< "Subprocess ok" << std::endl
;
132 void run_parent(const char* exe_path
)
134 #if BOOST_NOWIDE_TEST_USE_NARROW
135 TEST(boost::nowide::setenv("BOOST_NOWIDE_TEST", example
.c_str(), 1) == 0);
136 TEST(boost::nowide::setenv("BOOST_NOWIDE_TEST_NONE", example
.c_str(), 1) == 0);
137 TEST(boost::nowide::unsetenv("BOOST_NOWIDE_TEST_NONE") == 0);
138 TEST(boost::nowide::setenv("BOOST_NOWIDE_EMPTY", "", 1) == 0);
139 TEST(boost::nowide::getenv("BOOST_NOWIDE_EMPTY"));
140 std::string command
= "\"";
144 TEST(boost::nowide::system(command
.c_str()) == 0);
145 std::cout
<< "Parent ok" << std::endl
;
147 std::wstring envVar
= L
"BOOST_NOWIDE_TEST=" + boost::nowide::widen(example
);
148 TEST(_wputenv(envVar
.c_str()) == 0);
149 std::wstring wcommand
= boost::nowide::widen(exe_path
) + L
" " + boost::nowide::widen(example
);
150 TEST(_wsystem(wcommand
.c_str()) == 0);
151 std::cout
<< "Wide Parent ok" << std::endl
;
155 void test_main(int argc
, char** argv
, char** env
)
157 const int old_argc
= argc
;
158 char** old_argv
= argv
;
159 char** old_env
= env
;
161 boost::nowide::args
_(argc
, argv
, env
);
162 TEST(argc
== old_argc
);
163 std::cout
<< "Checking arguments" << std::endl
;
164 compare_string_arrays(old_argv
, argv
, false);
165 std::cout
<< "Checking env" << std::endl
;
166 compare_string_arrays(old_env
, env
, true);
169 // When `args` is destructed the old values must be restored
170 TEST(argc
== old_argc
);
171 TEST(argv
== old_argv
);
172 TEST(env
== old_env
);
174 boost::nowide::args
a(argc
, argv
, env
);
178 run_child(argc
, argv
, env
);