50# include <sys/types.h>
53# define DEV_TTY "/dev/tty"
61# define STDIN_FILENO 0
62# define STDOUT_FILENO 1
63# define STDERR_FILENO 2
66# define DEV_TTY "CON:"
82 std::FILE* fp = std::fopen (fname,
"r");
86 "fopen (\"%s\", \"r\") failed: %s",
87 fname, std::strerror (errno));
96 rw_assert (!std::strcmp (expect,
buf), __FILE__, __LINE__,
97 "expected output: \"%s\", got: \"%s\"", expect,
buf);
107 static const char stdout_expect[] = {
109 "[cout,1][stdout,1][cout,2][stdout,2]"
111#ifndef _RWSTD_NO_WCHAR_T
112 "[wcout,1][stdout,3][wcout,2][stdout,4]"
116 static const char stderr_expect[] = {
118 "[cerr,1][stderr,1][cerr,2][stderr,2]"
119 "[clog,1][stderr,3][clog,2][stderr,4]"
121#ifndef _RWSTD_NO_WCHAR_T
122 "[wcerr,1][stderr,5][wcerr,2][stderr,6]"
123 "[wclog,1][stderr,7][wclog,2][stderr,8]"
127 static const char stdio_expect[] = {
128 "[STDOUT_FILENO][STDERR_FILENO]"
129 "[cout,1][stdout,1][cout,2]"
130 "[cerr,1][stderr,1][cerr,2][stderr,2]"
131 "[clog,1][stderr,3][clog,2][stderr,4]"
134#ifndef _RWSTD_NO_WCHAR_T
135 "[wcout,1][stdout,3][wcout,2]"
136 "[wcerr,1][stderr,5][wcerr,2][stderr,6]"
137 "[wclog,1][stderr,7][wclog,2][stderr,8]"
142 rw_info (0, __FILE__, __LINE__,
143 "ios_base::sync_with_stdio (true)");
148 rw_info (0, __FILE__, __LINE__,
149 "interleaved std::cout and stdout output");
152 rw_info (0, __FILE__, __LINE__,
153 "interleaved std::cerr and stderr output");
156 rw_info (0, __FILE__, __LINE__,
157 "interleaved std::cout/cerr and stdout/stderr output");
164redirect_to_file (
const char* fname,
int fd)
170 "open (\"" DEV_TTY "\", O_WRONLY) failed: %s\n",
171 std::strerror (errno));
181 open (fname, O_WRONLY | O_CREAT | O_TRUNC | O_APPEND, 0666);
184 n = std::sprintf (
buf,
185 "open (\"%s\", O_WRONLY | O_CREAT | O_TRUNC, "
186 "0666) failed: %s\n",
187 fname, std::strerror (errno));
188 write (fd_tty,
buf,
n);
192 const int fd2 = dup2 (fd_tmp, fd);
195 n = std::sprintf (
buf,
196 "dup2 (%d, %d) failed: %s\n",
197 fd2, fd, std::strerror (errno));
198 write (fd_tty,
buf,
n);
203 n = std::sprintf (
buf,
204 "dup2 (%d, %d) != %d; got %d\n",
205 fd_tmp, fd, fd, fd2);
207 write (fd_tty,
buf,
n);
210 if (
close (fd_tmp)) {
211 n = std::sprintf (
buf,
212 "close (%d) failed: %s\n",
213 fd_tmp, std::strerror (errno));
214 write (fd_tty,
buf,
n);
239 std::cout <<
"[cout,1]";
240 std::printf (
"[stdout,1]");
241 std::cout <<
"[cout,2]";
242 std::printf (
"[stdout,2]");
244#ifndef _RWSTD_WCHAR_T
246 std::wcout <<
"[wcout,1]";
247 std::printf (
"[stdout,3]");
248 std::wcout <<
"[wcout,2]";
249 std::printf (
"[stdout,4]");
274 std::cerr <<
"[cerr,1]";
275 std::fprintf (
stderr,
"[stderr,1]");
276 std::cerr <<
"[cerr,2]";
277 std::fprintf (
stderr,
"[stderr,2]");
278 std::clog <<
"[clog,1]";
279 std::fprintf (
stderr,
"[stderr,3]");
280 std::clog <<
"[clog,2]";
281 std::fprintf (
stderr,
"[stderr,4]");
283#ifndef _RWSTD_WCHAR_T
285 std::wcerr <<
"[wcerr,1]";
286 std::fprintf (
stderr,
"[stderr,5]");
287 std::wcerr <<
"[wcerr,2]";
288 std::fprintf (
stderr,
"[stderr,6]");
289 std::wclog <<
"[wclog,1]";
290 std::fprintf (
stderr,
"[stderr,7]");
291 std::wclog <<
"[wclog,2]";
292 std::fprintf (
stderr,
"[stderr,8]");
327 std::cout <<
"[cout,1]";
328 std::printf (
"[stdout,1]");
329 std::cout <<
"[cout,2]";
330 std::printf (
"[stdout,2]");
332 std::cerr <<
"[cerr,1]";
333 std::fprintf (
stderr,
"[stderr,1]");
334 std::cerr <<
"[cerr,2]";
335 std::fprintf (
stderr,
"[stderr,2]");
336 std::clog <<
"[clog,1]";
337 std::fprintf (
stderr,
"[stderr,3]");
338 std::clog <<
"[clog,2]";
339 std::fprintf (
stderr,
"[stderr,4]");
341#ifndef _RWSTD_NO_WCHAR_T
343 std::wcout <<
"[wcout,1]";
344 std::printf (
"[stdout,3]");
345 std::wcout <<
"[wcout,2]";
346 std::printf (
"[stdout,4]");
348 std::wcerr <<
"[wcerr,1]";
349 std::fprintf (
stderr,
"[stderr,5]");
350 std::wcerr <<
"[wcerr,2]";
351 std::fprintf (
stderr,
"[stderr,6]");
352 std::wclog <<
"[wclog,1]";
353 std::fprintf (
stderr,
"[stderr,7]");
354 std::wclog <<
"[wclog,2]";
355 std::fprintf (
stderr,
"[stderr,8]");
382 const cleanup remove_tmp_files = { 0 };
385 (void)&remove_tmp_files;
389 "rw_tmpnam (%p) failed: %s\n",
396 "rw_tmpnam (%p) failed: %s\n",
403 "rw_tmpnam (%p) failed: %s\n",
417 for (
int i = 0;
i != 3; ++
i) {
418 const pid_t child_pid = fork ();
422 std::fprintf (
stderr,
"fork() failed: %s\n",
423 std::strerror (errno));
427 else if (child_pid > 0) {
435 case 0: ret = exec_stderr_setup ();
break;
436 case 1: ret = exec_stdout_setup ();
break;
437 case 2: ret = exec_stdio_setup ();
break;
457 return rw_test (argc, argv, __FILE__,
458 "lib.ios.members.static",
459 "27.4.2.4 ios_base static members",
void do_test(int line, const char *src, std::size_t resoff, ForwardIterator dummy_iter, const T *, const char *predname)
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
void test_file(const char *fname, const char *expect)
_TEST_EXPORT int rw_test(int argc, char *argv[], const char *filename, const char *clause, const char *comment, int(*testfun)(int, char **), const char *optspec,...)
_TEST_EXPORT int rw_info(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_assert(int, const char *, int, const char *,...)
_TEST_EXPORT const char * rw_tmpnam(char *)