xref: /netbsd-src/external/bsd/atf/dist/tools/misc_helpers.cpp (revision d780102efefa02003390cc43ea410dbd0ebb4a85)
1*d780102eSjmmv //
2*d780102eSjmmv // Automated Testing Framework (atf)
3*d780102eSjmmv //
4*d780102eSjmmv // Copyright (c) 2007 The NetBSD Foundation, Inc.
5*d780102eSjmmv // All rights reserved.
6*d780102eSjmmv //
7*d780102eSjmmv // Redistribution and use in source and binary forms, with or without
8*d780102eSjmmv // modification, are permitted provided that the following conditions
9*d780102eSjmmv // are met:
10*d780102eSjmmv // 1. Redistributions of source code must retain the above copyright
11*d780102eSjmmv //    notice, this list of conditions and the following disclaimer.
12*d780102eSjmmv // 2. Redistributions in binary form must reproduce the above copyright
13*d780102eSjmmv //    notice, this list of conditions and the following disclaimer in the
14*d780102eSjmmv //    documentation and/or other materials provided with the distribution.
15*d780102eSjmmv //
16*d780102eSjmmv // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17*d780102eSjmmv // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18*d780102eSjmmv // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19*d780102eSjmmv // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20*d780102eSjmmv // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21*d780102eSjmmv // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*d780102eSjmmv // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23*d780102eSjmmv // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24*d780102eSjmmv // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25*d780102eSjmmv // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26*d780102eSjmmv // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27*d780102eSjmmv // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*d780102eSjmmv //
29*d780102eSjmmv 
30*d780102eSjmmv extern "C" {
31*d780102eSjmmv #include <sys/stat.h>
32*d780102eSjmmv 
33*d780102eSjmmv #include <signal.h>
34*d780102eSjmmv #include <unistd.h>
35*d780102eSjmmv }
36*d780102eSjmmv 
37*d780102eSjmmv #include <cstdlib>
38*d780102eSjmmv #include <fstream>
39*d780102eSjmmv #include <iomanip>
40*d780102eSjmmv #include <ios>
41*d780102eSjmmv #include <iostream>
42*d780102eSjmmv #include <string>
43*d780102eSjmmv 
44*d780102eSjmmv #include <atf-c++.hpp>
45*d780102eSjmmv 
46*d780102eSjmmv #include "env.hpp"
47*d780102eSjmmv #include "fs.hpp"
48*d780102eSjmmv #include "process.hpp"
49*d780102eSjmmv 
50*d780102eSjmmv // ------------------------------------------------------------------------
51*d780102eSjmmv // Auxiliary functions.
52*d780102eSjmmv // ------------------------------------------------------------------------
53*d780102eSjmmv 
54*d780102eSjmmv static
55*d780102eSjmmv void
touch(const std::string & path)56*d780102eSjmmv touch(const std::string& path)
57*d780102eSjmmv {
58*d780102eSjmmv     std::ofstream os(path.c_str());
59*d780102eSjmmv     if (!os)
60*d780102eSjmmv         ATF_FAIL("Could not create file " + path);
61*d780102eSjmmv     os.close();
62*d780102eSjmmv }
63*d780102eSjmmv 
64*d780102eSjmmv // ------------------------------------------------------------------------
65*d780102eSjmmv // Helper tests for "atf-run_test".
66*d780102eSjmmv // ------------------------------------------------------------------------
67*d780102eSjmmv 
68*d780102eSjmmv ATF_TEST_CASE(pass);
ATF_TEST_CASE_HEAD(pass)69*d780102eSjmmv ATF_TEST_CASE_HEAD(pass)
70*d780102eSjmmv {
71*d780102eSjmmv     set_md_var("descr", "Helper test case for the t_integration test program");
72*d780102eSjmmv }
ATF_TEST_CASE_BODY(pass)73*d780102eSjmmv ATF_TEST_CASE_BODY(pass)
74*d780102eSjmmv {
75*d780102eSjmmv }
76*d780102eSjmmv 
77*d780102eSjmmv ATF_TEST_CASE(config);
ATF_TEST_CASE_HEAD(config)78*d780102eSjmmv ATF_TEST_CASE_HEAD(config)
79*d780102eSjmmv {
80*d780102eSjmmv     set_md_var("descr", "Helper test case for the t_integration test program");
81*d780102eSjmmv }
ATF_TEST_CASE_BODY(config)82*d780102eSjmmv ATF_TEST_CASE_BODY(config)
83*d780102eSjmmv {
84*d780102eSjmmv     std::cout << "1st: " << get_config_var("1st") << "\n";
85*d780102eSjmmv     std::cout << "2nd: " << get_config_var("2nd") << "\n";
86*d780102eSjmmv     std::cout << "3rd: " << get_config_var("3rd") << "\n";
87*d780102eSjmmv     std::cout << "4th: " << get_config_var("4th") << "\n";
88*d780102eSjmmv }
89*d780102eSjmmv 
90*d780102eSjmmv ATF_TEST_CASE(fds);
ATF_TEST_CASE_HEAD(fds)91*d780102eSjmmv ATF_TEST_CASE_HEAD(fds)
92*d780102eSjmmv {
93*d780102eSjmmv     set_md_var("descr", "Helper test case for the t_integration test program");
94*d780102eSjmmv }
ATF_TEST_CASE_BODY(fds)95*d780102eSjmmv ATF_TEST_CASE_BODY(fds)
96*d780102eSjmmv {
97*d780102eSjmmv     std::cout << "msg1 to stdout" << "\n";
98*d780102eSjmmv     std::cout << "msg2 to stdout" << "\n";
99*d780102eSjmmv     std::cerr << "msg1 to stderr" << "\n";
100*d780102eSjmmv     std::cerr << "msg2 to stderr" << "\n";
101*d780102eSjmmv }
102*d780102eSjmmv 
103*d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(mux_streams);
ATF_TEST_CASE_BODY(mux_streams)104*d780102eSjmmv ATF_TEST_CASE_BODY(mux_streams)
105*d780102eSjmmv {
106*d780102eSjmmv     for (size_t i = 0; i < 10000; i++) {
107*d780102eSjmmv         switch (i % 5) {
108*d780102eSjmmv         case 0:
109*d780102eSjmmv             std::cout << "stdout " << i << "\n";
110*d780102eSjmmv             break;
111*d780102eSjmmv         case 1:
112*d780102eSjmmv             std::cerr << "stderr " << i << "\n";
113*d780102eSjmmv             break;
114*d780102eSjmmv         case 2:
115*d780102eSjmmv             std::cout << "stdout " << i << "\n";
116*d780102eSjmmv             std::cerr << "stderr " << i << "\n";
117*d780102eSjmmv             break;
118*d780102eSjmmv         case 3:
119*d780102eSjmmv             std::cout << "stdout " << i << "\n";
120*d780102eSjmmv             std::cout << "stdout " << i << "\n";
121*d780102eSjmmv             std::cerr << "stderr " << i << "\n";
122*d780102eSjmmv             break;
123*d780102eSjmmv         case 4:
124*d780102eSjmmv             std::cout << "stdout " << i << "\n";
125*d780102eSjmmv             std::cerr << "stderr " << i << "\n";
126*d780102eSjmmv             std::cerr << "stderr " << i << "\n";
127*d780102eSjmmv             break;
128*d780102eSjmmv         default:
129*d780102eSjmmv             std::abort();
130*d780102eSjmmv         }
131*d780102eSjmmv     }
132*d780102eSjmmv }
133*d780102eSjmmv 
134*d780102eSjmmv ATF_TEST_CASE(testvar);
ATF_TEST_CASE_HEAD(testvar)135*d780102eSjmmv ATF_TEST_CASE_HEAD(testvar)
136*d780102eSjmmv {
137*d780102eSjmmv     set_md_var("descr", "Helper test case for the t_integration test program");
138*d780102eSjmmv }
ATF_TEST_CASE_BODY(testvar)139*d780102eSjmmv ATF_TEST_CASE_BODY(testvar)
140*d780102eSjmmv {
141*d780102eSjmmv     if (!has_config_var("testvar"))
142*d780102eSjmmv         fail("testvar variable not defined");
143*d780102eSjmmv     std::cout << "testvar: " << get_config_var("testvar") << "\n";
144*d780102eSjmmv }
145*d780102eSjmmv 
146*d780102eSjmmv ATF_TEST_CASE(env_list);
ATF_TEST_CASE_HEAD(env_list)147*d780102eSjmmv ATF_TEST_CASE_HEAD(env_list)
148*d780102eSjmmv {
149*d780102eSjmmv     set_md_var("descr", "Helper test case for the t_integration test program");
150*d780102eSjmmv }
ATF_TEST_CASE_BODY(env_list)151*d780102eSjmmv ATF_TEST_CASE_BODY(env_list)
152*d780102eSjmmv {
153*d780102eSjmmv     const tools::process::status s =
154*d780102eSjmmv         tools::process::exec(tools::fs::path("env"),
155*d780102eSjmmv                            tools::process::argv_array("env", NULL),
156*d780102eSjmmv                            tools::process::stream_inherit(),
157*d780102eSjmmv                            tools::process::stream_inherit());
158*d780102eSjmmv     ATF_REQUIRE(s.exited());
159*d780102eSjmmv     ATF_REQUIRE(s.exitstatus() == EXIT_SUCCESS);
160*d780102eSjmmv }
161*d780102eSjmmv 
162*d780102eSjmmv ATF_TEST_CASE(env_home);
ATF_TEST_CASE_HEAD(env_home)163*d780102eSjmmv ATF_TEST_CASE_HEAD(env_home)
164*d780102eSjmmv {
165*d780102eSjmmv     set_md_var("descr", "Helper test case for the t_integration test program");
166*d780102eSjmmv }
ATF_TEST_CASE_BODY(env_home)167*d780102eSjmmv ATF_TEST_CASE_BODY(env_home)
168*d780102eSjmmv {
169*d780102eSjmmv     ATF_REQUIRE(tools::env::has("HOME"));
170*d780102eSjmmv     tools::fs::path p(tools::env::get("HOME"));
171*d780102eSjmmv     tools::fs::file_info fi1(p);
172*d780102eSjmmv     tools::fs::file_info fi2(tools::fs::path("."));
173*d780102eSjmmv     ATF_REQUIRE_EQ(fi1.get_device(), fi2.get_device());
174*d780102eSjmmv     ATF_REQUIRE_EQ(fi1.get_inode(), fi2.get_inode());
175*d780102eSjmmv }
176*d780102eSjmmv 
177*d780102eSjmmv ATF_TEST_CASE(read_stdin);
ATF_TEST_CASE_HEAD(read_stdin)178*d780102eSjmmv ATF_TEST_CASE_HEAD(read_stdin)
179*d780102eSjmmv {
180*d780102eSjmmv     set_md_var("descr", "Helper test case for the t_integration test program");
181*d780102eSjmmv }
ATF_TEST_CASE_BODY(read_stdin)182*d780102eSjmmv ATF_TEST_CASE_BODY(read_stdin)
183*d780102eSjmmv {
184*d780102eSjmmv     char buf[100];
185*d780102eSjmmv     ssize_t len = ::read(STDIN_FILENO, buf, sizeof(buf) - 1);
186*d780102eSjmmv     ATF_REQUIRE(len != -1);
187*d780102eSjmmv 
188*d780102eSjmmv     buf[len + 1] = '\0';
189*d780102eSjmmv     for (ssize_t i = 0; i < len; i++) {
190*d780102eSjmmv         if (buf[i] != '\0') {
191*d780102eSjmmv             fail("The stdin of the test case does not seem to be /dev/zero; "
192*d780102eSjmmv                  "got '" + std::string(buf) + "'");
193*d780102eSjmmv         }
194*d780102eSjmmv     }
195*d780102eSjmmv }
196*d780102eSjmmv 
197*d780102eSjmmv ATF_TEST_CASE(umask);
ATF_TEST_CASE_HEAD(umask)198*d780102eSjmmv ATF_TEST_CASE_HEAD(umask)
199*d780102eSjmmv {
200*d780102eSjmmv     set_md_var("descr", "Helper test case for the t_integration test program");
201*d780102eSjmmv }
ATF_TEST_CASE_BODY(umask)202*d780102eSjmmv ATF_TEST_CASE_BODY(umask)
203*d780102eSjmmv {
204*d780102eSjmmv     mode_t m = ::umask(0);
205*d780102eSjmmv     std::cout << "umask: " << std::setw(4) << std::setfill('0')
206*d780102eSjmmv               << std::oct << m << "\n";
207*d780102eSjmmv     (void)::umask(m);
208*d780102eSjmmv }
209*d780102eSjmmv 
210*d780102eSjmmv ATF_TEST_CASE_WITH_CLEANUP(cleanup_states);
ATF_TEST_CASE_HEAD(cleanup_states)211*d780102eSjmmv ATF_TEST_CASE_HEAD(cleanup_states)
212*d780102eSjmmv {
213*d780102eSjmmv     set_md_var("descr", "Helper test case for the t_integration test program");
214*d780102eSjmmv }
ATF_TEST_CASE_BODY(cleanup_states)215*d780102eSjmmv ATF_TEST_CASE_BODY(cleanup_states)
216*d780102eSjmmv {
217*d780102eSjmmv     touch(get_config_var("statedir") + "/to-delete");
218*d780102eSjmmv     touch(get_config_var("statedir") + "/to-stay");
219*d780102eSjmmv 
220*d780102eSjmmv     if (get_config_var("state") == "fail")
221*d780102eSjmmv         ATF_FAIL("On purpose");
222*d780102eSjmmv     else if (get_config_var("state") == "skip")
223*d780102eSjmmv         ATF_SKIP("On purpose");
224*d780102eSjmmv }
ATF_TEST_CASE_CLEANUP(cleanup_states)225*d780102eSjmmv ATF_TEST_CASE_CLEANUP(cleanup_states)
226*d780102eSjmmv {
227*d780102eSjmmv     tools::fs::remove(tools::fs::path(get_config_var("statedir") + "/to-delete"));
228*d780102eSjmmv }
229*d780102eSjmmv 
230*d780102eSjmmv ATF_TEST_CASE_WITH_CLEANUP(cleanup_curdir);
ATF_TEST_CASE_HEAD(cleanup_curdir)231*d780102eSjmmv ATF_TEST_CASE_HEAD(cleanup_curdir)
232*d780102eSjmmv {
233*d780102eSjmmv     set_md_var("descr", "Helper test case for the t_integration test program");
234*d780102eSjmmv }
ATF_TEST_CASE_BODY(cleanup_curdir)235*d780102eSjmmv ATF_TEST_CASE_BODY(cleanup_curdir)
236*d780102eSjmmv {
237*d780102eSjmmv     std::ofstream os("oldvalue");
238*d780102eSjmmv     if (!os)
239*d780102eSjmmv         ATF_FAIL("Failed to create oldvalue file");
240*d780102eSjmmv     os << 1234;
241*d780102eSjmmv     os.close();
242*d780102eSjmmv }
ATF_TEST_CASE_CLEANUP(cleanup_curdir)243*d780102eSjmmv ATF_TEST_CASE_CLEANUP(cleanup_curdir)
244*d780102eSjmmv {
245*d780102eSjmmv     std::ifstream is("oldvalue");
246*d780102eSjmmv     if (is) {
247*d780102eSjmmv         int i;
248*d780102eSjmmv         is >> i;
249*d780102eSjmmv         std::cout << "Old value: " << i << "\n";
250*d780102eSjmmv         is.close();
251*d780102eSjmmv     }
252*d780102eSjmmv }
253*d780102eSjmmv 
254*d780102eSjmmv ATF_TEST_CASE(require_arch);
ATF_TEST_CASE_HEAD(require_arch)255*d780102eSjmmv ATF_TEST_CASE_HEAD(require_arch)
256*d780102eSjmmv {
257*d780102eSjmmv     set_md_var("descr", "Helper test case for the t_integration test program");
258*d780102eSjmmv     set_md_var("require.arch", get_config_var("arch", "not-set"));
259*d780102eSjmmv }
ATF_TEST_CASE_BODY(require_arch)260*d780102eSjmmv ATF_TEST_CASE_BODY(require_arch)
261*d780102eSjmmv {
262*d780102eSjmmv }
263*d780102eSjmmv 
264*d780102eSjmmv ATF_TEST_CASE(require_config);
ATF_TEST_CASE_HEAD(require_config)265*d780102eSjmmv ATF_TEST_CASE_HEAD(require_config)
266*d780102eSjmmv {
267*d780102eSjmmv     set_md_var("descr", "Helper test case for the t_integration test program");
268*d780102eSjmmv     set_md_var("require.config", "var1 var2");
269*d780102eSjmmv }
ATF_TEST_CASE_BODY(require_config)270*d780102eSjmmv ATF_TEST_CASE_BODY(require_config)
271*d780102eSjmmv {
272*d780102eSjmmv     std::cout << "var1: " << get_config_var("var1") << "\n";
273*d780102eSjmmv     std::cout << "var2: " << get_config_var("var2") << "\n";
274*d780102eSjmmv }
275*d780102eSjmmv 
276*d780102eSjmmv ATF_TEST_CASE(require_files);
ATF_TEST_CASE_HEAD(require_files)277*d780102eSjmmv ATF_TEST_CASE_HEAD(require_files)
278*d780102eSjmmv {
279*d780102eSjmmv     set_md_var("descr", "Helper test case for the t_integration test program");
280*d780102eSjmmv     set_md_var("require.files", get_config_var("files", "not-set"));
281*d780102eSjmmv }
ATF_TEST_CASE_BODY(require_files)282*d780102eSjmmv ATF_TEST_CASE_BODY(require_files)
283*d780102eSjmmv {
284*d780102eSjmmv }
285*d780102eSjmmv 
286*d780102eSjmmv ATF_TEST_CASE(require_machine);
ATF_TEST_CASE_HEAD(require_machine)287*d780102eSjmmv ATF_TEST_CASE_HEAD(require_machine)
288*d780102eSjmmv {
289*d780102eSjmmv     set_md_var("descr", "Helper test case for the t_integration test program");
290*d780102eSjmmv     set_md_var("require.machine", get_config_var("machine", "not-set"));
291*d780102eSjmmv }
ATF_TEST_CASE_BODY(require_machine)292*d780102eSjmmv ATF_TEST_CASE_BODY(require_machine)
293*d780102eSjmmv {
294*d780102eSjmmv }
295*d780102eSjmmv 
296*d780102eSjmmv ATF_TEST_CASE(require_progs);
ATF_TEST_CASE_HEAD(require_progs)297*d780102eSjmmv ATF_TEST_CASE_HEAD(require_progs)
298*d780102eSjmmv {
299*d780102eSjmmv     set_md_var("descr", "Helper test case for the t_integration test program");
300*d780102eSjmmv     set_md_var("require.progs", get_config_var("progs", "not-set"));
301*d780102eSjmmv }
ATF_TEST_CASE_BODY(require_progs)302*d780102eSjmmv ATF_TEST_CASE_BODY(require_progs)
303*d780102eSjmmv {
304*d780102eSjmmv }
305*d780102eSjmmv 
306*d780102eSjmmv ATF_TEST_CASE(require_user);
ATF_TEST_CASE_HEAD(require_user)307*d780102eSjmmv ATF_TEST_CASE_HEAD(require_user)
308*d780102eSjmmv {
309*d780102eSjmmv     set_md_var("descr", "Helper test case for the t_integration test program");
310*d780102eSjmmv     set_md_var("require.user", get_config_var("user", "not-set"));
311*d780102eSjmmv }
ATF_TEST_CASE_BODY(require_user)312*d780102eSjmmv ATF_TEST_CASE_BODY(require_user)
313*d780102eSjmmv {
314*d780102eSjmmv }
315*d780102eSjmmv 
316*d780102eSjmmv ATF_TEST_CASE(timeout);
ATF_TEST_CASE_HEAD(timeout)317*d780102eSjmmv ATF_TEST_CASE_HEAD(timeout)
318*d780102eSjmmv {
319*d780102eSjmmv     set_md_var("descr", "Helper test case for the t_integration test program");
320*d780102eSjmmv     set_md_var("timeout", "1");
321*d780102eSjmmv }
ATF_TEST_CASE_BODY(timeout)322*d780102eSjmmv ATF_TEST_CASE_BODY(timeout)
323*d780102eSjmmv {
324*d780102eSjmmv     sleep(10);
325*d780102eSjmmv     touch(get_config_var("statedir") + "/finished");
326*d780102eSjmmv }
327*d780102eSjmmv 
328*d780102eSjmmv ATF_TEST_CASE(timeout_forkexit);
ATF_TEST_CASE_HEAD(timeout_forkexit)329*d780102eSjmmv ATF_TEST_CASE_HEAD(timeout_forkexit)
330*d780102eSjmmv {
331*d780102eSjmmv     set_md_var("descr", "Helper test case for the t_integration test program");
332*d780102eSjmmv }
ATF_TEST_CASE_BODY(timeout_forkexit)333*d780102eSjmmv ATF_TEST_CASE_BODY(timeout_forkexit)
334*d780102eSjmmv {
335*d780102eSjmmv     pid_t pid = fork();
336*d780102eSjmmv     ATF_REQUIRE(pid != -1);
337*d780102eSjmmv 
338*d780102eSjmmv     if (pid == 0) {
339*d780102eSjmmv         sigset_t mask;
340*d780102eSjmmv         sigemptyset(&mask);
341*d780102eSjmmv 
342*d780102eSjmmv         std::cout << "Waiting in subprocess\n";
343*d780102eSjmmv         std::cout.flush();
344*d780102eSjmmv         ::sigsuspend(&mask);
345*d780102eSjmmv 
346*d780102eSjmmv         touch(get_config_var("statedir") + "/child-finished");
347*d780102eSjmmv         std::cout << "Subprocess exiting\n";
348*d780102eSjmmv         std::cout.flush();
349*d780102eSjmmv         exit(EXIT_SUCCESS);
350*d780102eSjmmv     } else {
351*d780102eSjmmv         // Don't wait for the child process and let atf-run deal with it.
352*d780102eSjmmv         touch(get_config_var("statedir") + "/parent-finished");
353*d780102eSjmmv         std::cout << "Parent process exiting\n";
354*d780102eSjmmv         ATF_PASS();
355*d780102eSjmmv     }
356*d780102eSjmmv }
357*d780102eSjmmv 
358*d780102eSjmmv ATF_TEST_CASE(use_fs);
ATF_TEST_CASE_HEAD(use_fs)359*d780102eSjmmv ATF_TEST_CASE_HEAD(use_fs)
360*d780102eSjmmv {
361*d780102eSjmmv     set_md_var("descr", "Helper test case for the t_integration test program");
362*d780102eSjmmv     set_md_var("use.fs", "this-is-deprecated");
363*d780102eSjmmv }
ATF_TEST_CASE_BODY(use_fs)364*d780102eSjmmv ATF_TEST_CASE_BODY(use_fs)
365*d780102eSjmmv {
366*d780102eSjmmv     touch("test-file");
367*d780102eSjmmv }
368*d780102eSjmmv 
369*d780102eSjmmv // ------------------------------------------------------------------------
370*d780102eSjmmv // Helper tests for "atf-report_test".
371*d780102eSjmmv // ------------------------------------------------------------------------
372*d780102eSjmmv 
373*d780102eSjmmv ATF_TEST_CASE(diff);
ATF_TEST_CASE_HEAD(diff)374*d780102eSjmmv ATF_TEST_CASE_HEAD(diff)
375*d780102eSjmmv {
376*d780102eSjmmv     set_md_var("descr", "Helper test case for the t_integration program");
377*d780102eSjmmv }
ATF_TEST_CASE_BODY(diff)378*d780102eSjmmv ATF_TEST_CASE_BODY(diff)
379*d780102eSjmmv {
380*d780102eSjmmv     std::cout << "--- a	2007-11-04 14:00:41.000000000 +0100\n";
381*d780102eSjmmv     std::cout << "+++ b	2007-11-04 14:00:48.000000000 +0100\n";
382*d780102eSjmmv     std::cout << "@@ -1,7 +1,7 @@\n";
383*d780102eSjmmv     std::cout << " This test is meant to simulate a diff.\n";
384*d780102eSjmmv     std::cout << " Blank space at beginning of context lines must be "
385*d780102eSjmmv                  "preserved.\n";
386*d780102eSjmmv     std::cout << " \n";
387*d780102eSjmmv     std::cout << "-First original line.\n";
388*d780102eSjmmv     std::cout << "-Second original line.\n";
389*d780102eSjmmv     std::cout << "+First modified line.\n";
390*d780102eSjmmv     std::cout << "+Second modified line.\n";
391*d780102eSjmmv     std::cout << " \n";
392*d780102eSjmmv     std::cout << " EOF\n";
393*d780102eSjmmv }
394*d780102eSjmmv 
395*d780102eSjmmv // ------------------------------------------------------------------------
396*d780102eSjmmv // Main.
397*d780102eSjmmv // ------------------------------------------------------------------------
398*d780102eSjmmv 
ATF_INIT_TEST_CASES(tcs)399*d780102eSjmmv ATF_INIT_TEST_CASES(tcs)
400*d780102eSjmmv {
401*d780102eSjmmv     std::string which = tools::env::get("TESTCASE");
402*d780102eSjmmv 
403*d780102eSjmmv     // Add helper tests for atf-run_test.
404*d780102eSjmmv     if (which == "pass")
405*d780102eSjmmv         ATF_ADD_TEST_CASE(tcs, pass);
406*d780102eSjmmv     if (which == "config")
407*d780102eSjmmv         ATF_ADD_TEST_CASE(tcs, config);
408*d780102eSjmmv     if (which == "fds")
409*d780102eSjmmv         ATF_ADD_TEST_CASE(tcs, fds);
410*d780102eSjmmv     if (which == "mux_streams")
411*d780102eSjmmv         ATF_ADD_TEST_CASE(tcs, mux_streams);
412*d780102eSjmmv     if (which == "testvar")
413*d780102eSjmmv         ATF_ADD_TEST_CASE(tcs, testvar);
414*d780102eSjmmv     if (which == "env_list")
415*d780102eSjmmv         ATF_ADD_TEST_CASE(tcs, env_list);
416*d780102eSjmmv     if (which == "env_home")
417*d780102eSjmmv         ATF_ADD_TEST_CASE(tcs, env_home);
418*d780102eSjmmv     if (which == "read_stdin")
419*d780102eSjmmv         ATF_ADD_TEST_CASE(tcs, read_stdin);
420*d780102eSjmmv     if (which == "umask")
421*d780102eSjmmv         ATF_ADD_TEST_CASE(tcs, umask);
422*d780102eSjmmv     if (which == "cleanup_states")
423*d780102eSjmmv         ATF_ADD_TEST_CASE(tcs, cleanup_states);
424*d780102eSjmmv     if (which == "cleanup_curdir")
425*d780102eSjmmv         ATF_ADD_TEST_CASE(tcs, cleanup_curdir);
426*d780102eSjmmv     if (which == "require_arch")
427*d780102eSjmmv         ATF_ADD_TEST_CASE(tcs, require_arch);
428*d780102eSjmmv     if (which == "require_config")
429*d780102eSjmmv         ATF_ADD_TEST_CASE(tcs, require_config);
430*d780102eSjmmv     if (which == "require_files")
431*d780102eSjmmv         ATF_ADD_TEST_CASE(tcs, require_files);
432*d780102eSjmmv     if (which == "require_machine")
433*d780102eSjmmv         ATF_ADD_TEST_CASE(tcs, require_machine);
434*d780102eSjmmv     if (which == "require_progs")
435*d780102eSjmmv         ATF_ADD_TEST_CASE(tcs, require_progs);
436*d780102eSjmmv     if (which == "require_user")
437*d780102eSjmmv         ATF_ADD_TEST_CASE(tcs, require_user);
438*d780102eSjmmv     if (which == "timeout")
439*d780102eSjmmv         ATF_ADD_TEST_CASE(tcs, timeout);
440*d780102eSjmmv     if (which == "timeout_forkexit")
441*d780102eSjmmv         ATF_ADD_TEST_CASE(tcs, timeout_forkexit);
442*d780102eSjmmv     if (which == "use_fs")
443*d780102eSjmmv         ATF_ADD_TEST_CASE(tcs, use_fs);
444*d780102eSjmmv 
445*d780102eSjmmv     // Add helper tests for atf-report_test.
446*d780102eSjmmv     if (which == "diff")
447*d780102eSjmmv         ATF_ADD_TEST_CASE(tcs, diff);
448*d780102eSjmmv }
449