xref: /freebsd/contrib/atf/atf-c/detail/test_helpers.c (revision 8f0ea33f2bbf3a6aa80235f0a02fa5f2780c2b17)
1*0677dfd1SJulio Merino /* Copyright (c) 2008 The NetBSD Foundation, Inc.
2c243e490SMarcel Moolenaar  * All rights reserved.
3c243e490SMarcel Moolenaar  *
4c243e490SMarcel Moolenaar  * Redistribution and use in source and binary forms, with or without
5c243e490SMarcel Moolenaar  * modification, are permitted provided that the following conditions
6c243e490SMarcel Moolenaar  * are met:
7c243e490SMarcel Moolenaar  * 1. Redistributions of source code must retain the above copyright
8c243e490SMarcel Moolenaar  *    notice, this list of conditions and the following disclaimer.
9c243e490SMarcel Moolenaar  * 2. Redistributions in binary form must reproduce the above copyright
10c243e490SMarcel Moolenaar  *    notice, this list of conditions and the following disclaimer in the
11c243e490SMarcel Moolenaar  *    documentation and/or other materials provided with the distribution.
12c243e490SMarcel Moolenaar  *
13c243e490SMarcel Moolenaar  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
14c243e490SMarcel Moolenaar  * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
15c243e490SMarcel Moolenaar  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
16c243e490SMarcel Moolenaar  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17c243e490SMarcel Moolenaar  * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
18c243e490SMarcel Moolenaar  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19c243e490SMarcel Moolenaar  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
20c243e490SMarcel Moolenaar  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21c243e490SMarcel Moolenaar  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
22c243e490SMarcel Moolenaar  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23c243e490SMarcel Moolenaar  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
24*0677dfd1SJulio Merino  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  */
25*0677dfd1SJulio Merino 
26*0677dfd1SJulio Merino #include "atf-c/detail/test_helpers.h"
27c243e490SMarcel Moolenaar 
28c243e490SMarcel Moolenaar #include <fcntl.h>
29c243e490SMarcel Moolenaar #include <stdio.h>
30c243e490SMarcel Moolenaar #include <stdlib.h>
31c243e490SMarcel Moolenaar #include <unistd.h>
32c243e490SMarcel Moolenaar 
33*0677dfd1SJulio Merino #include <atf-c.h>
34*0677dfd1SJulio Merino 
35c243e490SMarcel Moolenaar #include "atf-c/build.h"
36c243e490SMarcel Moolenaar #include "atf-c/check.h"
37*0677dfd1SJulio Merino #include "atf-c/detail/dynstr.h"
38*0677dfd1SJulio Merino #include "atf-c/detail/env.h"
39*0677dfd1SJulio Merino #include "atf-c/detail/fs.h"
40*0677dfd1SJulio Merino #include "atf-c/detail/process.h"
41c243e490SMarcel Moolenaar #include "atf-c/error.h"
42c243e490SMarcel Moolenaar 
431a61beb0SJulio Merino bool
build_check_c_o(const char * path)441a61beb0SJulio Merino build_check_c_o(const char *path)
45c243e490SMarcel Moolenaar {
46c243e490SMarcel Moolenaar     bool success;
47c243e490SMarcel Moolenaar     atf_dynstr_t iflag;
48c243e490SMarcel Moolenaar     const char *optargs[4];
49c243e490SMarcel Moolenaar 
50*0677dfd1SJulio Merino     RE(atf_dynstr_init_fmt(&iflag, "-I%s", atf_env_get_with_default(
51*0677dfd1SJulio Merino         "ATF_INCLUDEDIR", ATF_INCLUDEDIR)));
52c243e490SMarcel Moolenaar 
53c243e490SMarcel Moolenaar     optargs[0] = atf_dynstr_cstring(&iflag);
54c243e490SMarcel Moolenaar     optargs[1] = "-Wall";
55c243e490SMarcel Moolenaar     optargs[2] = "-Werror";
56c243e490SMarcel Moolenaar     optargs[3] = NULL;
57c243e490SMarcel Moolenaar 
58c243e490SMarcel Moolenaar     RE(atf_check_build_c_o(path, "test.o", optargs, &success));
59c243e490SMarcel Moolenaar 
60c243e490SMarcel Moolenaar     atf_dynstr_fini(&iflag);
61c243e490SMarcel Moolenaar 
621a61beb0SJulio Merino     return success;
63c243e490SMarcel Moolenaar }
64c243e490SMarcel Moolenaar 
651a61beb0SJulio Merino bool
build_check_c_o_srcdir(const atf_tc_t * tc,const char * sfile)661a61beb0SJulio Merino build_check_c_o_srcdir(const atf_tc_t *tc, const char *sfile)
67c243e490SMarcel Moolenaar {
68c243e490SMarcel Moolenaar     atf_fs_path_t path;
69c243e490SMarcel Moolenaar 
70c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&path, "%s/%s",
71c243e490SMarcel Moolenaar                             atf_tc_get_config_var(tc, "srcdir"), sfile));
721a61beb0SJulio Merino     const bool result = build_check_c_o(atf_fs_path_cstring(&path));
73c243e490SMarcel Moolenaar     atf_fs_path_fini(&path);
741a61beb0SJulio Merino     return result;
75c243e490SMarcel Moolenaar }
76c243e490SMarcel Moolenaar 
77c243e490SMarcel Moolenaar void
header_check(const char * hdrname)78c243e490SMarcel Moolenaar header_check(const char *hdrname)
79c243e490SMarcel Moolenaar {
80c243e490SMarcel Moolenaar     FILE *srcfile;
81c243e490SMarcel Moolenaar     char failmsg[128];
82c243e490SMarcel Moolenaar 
83c243e490SMarcel Moolenaar     srcfile = fopen("test.c", "w");
84c243e490SMarcel Moolenaar     ATF_REQUIRE(srcfile != NULL);
85c243e490SMarcel Moolenaar     fprintf(srcfile, "#include <%s>\n", hdrname);
86c243e490SMarcel Moolenaar     fclose(srcfile);
87c243e490SMarcel Moolenaar 
88c243e490SMarcel Moolenaar     snprintf(failmsg, sizeof(failmsg),
89c243e490SMarcel Moolenaar              "Header check failed; %s is not self-contained", hdrname);
90c243e490SMarcel Moolenaar 
911a61beb0SJulio Merino     if (!build_check_c_o("test.c"))
921a61beb0SJulio Merino         atf_tc_fail("%s", failmsg);
93c243e490SMarcel Moolenaar }
94c243e490SMarcel Moolenaar 
95c243e490SMarcel Moolenaar void
get_process_helpers_path(const atf_tc_t * tc,const bool is_detail,atf_fs_path_t * path)96c243e490SMarcel Moolenaar get_process_helpers_path(const atf_tc_t *tc, const bool is_detail,
97c243e490SMarcel Moolenaar                          atf_fs_path_t *path)
98c243e490SMarcel Moolenaar {
99c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(path, "%s/%sprocess_helpers",
100c243e490SMarcel Moolenaar                             atf_tc_get_config_var(tc, "srcdir"),
101c243e490SMarcel Moolenaar                             is_detail ? "" : "detail/"));
102c243e490SMarcel Moolenaar }
103c243e490SMarcel Moolenaar 
104c243e490SMarcel Moolenaar struct run_h_tc_data {
105c243e490SMarcel Moolenaar     atf_tc_t *m_tc;
106c243e490SMarcel Moolenaar     const char *m_resname;
107c243e490SMarcel Moolenaar };
108c243e490SMarcel Moolenaar 
109c243e490SMarcel Moolenaar static
110c243e490SMarcel Moolenaar void
run_h_tc_child(void * v)111c243e490SMarcel Moolenaar run_h_tc_child(void *v)
112c243e490SMarcel Moolenaar {
113c243e490SMarcel Moolenaar     struct run_h_tc_data *data = (struct run_h_tc_data *)v;
114c243e490SMarcel Moolenaar 
115c243e490SMarcel Moolenaar     RE(atf_tc_run(data->m_tc, data->m_resname));
116c243e490SMarcel Moolenaar }
117c243e490SMarcel Moolenaar 
118c243e490SMarcel Moolenaar /* TODO: Investigate if it's worth to add this functionality as part of
119c243e490SMarcel Moolenaar  * the public API.  I.e. a function to easily run a test case body in a
120c243e490SMarcel Moolenaar  * subprocess. */
121c243e490SMarcel Moolenaar void
run_h_tc(atf_tc_t * tc,const char * outname,const char * errname,const char * resname)122c243e490SMarcel Moolenaar run_h_tc(atf_tc_t *tc, const char *outname, const char *errname,
123c243e490SMarcel Moolenaar          const char *resname)
124c243e490SMarcel Moolenaar {
125c243e490SMarcel Moolenaar     atf_fs_path_t outpath, errpath;
126c243e490SMarcel Moolenaar     atf_process_stream_t outb, errb;
127c243e490SMarcel Moolenaar     atf_process_child_t child;
128c243e490SMarcel Moolenaar     atf_process_status_t status;
129c243e490SMarcel Moolenaar 
130c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&outpath, outname));
131c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&errpath, errname));
132c243e490SMarcel Moolenaar 
133c243e490SMarcel Moolenaar     struct run_h_tc_data data = { tc, resname };
134c243e490SMarcel Moolenaar 
135c243e490SMarcel Moolenaar     RE(atf_process_stream_init_redirect_path(&outb, &outpath));
136c243e490SMarcel Moolenaar     RE(atf_process_stream_init_redirect_path(&errb, &errpath));
137c243e490SMarcel Moolenaar     RE(atf_process_fork(&child, run_h_tc_child, &outb, &errb, &data));
138c243e490SMarcel Moolenaar     atf_process_stream_fini(&errb);
139c243e490SMarcel Moolenaar     atf_process_stream_fini(&outb);
140c243e490SMarcel Moolenaar 
141c243e490SMarcel Moolenaar     RE(atf_process_child_wait(&child, &status));
142c243e490SMarcel Moolenaar     ATF_CHECK(atf_process_status_exited(&status));
143c243e490SMarcel Moolenaar     atf_process_status_fini(&status);
144c243e490SMarcel Moolenaar 
145c243e490SMarcel Moolenaar     atf_fs_path_fini(&errpath);
146c243e490SMarcel Moolenaar     atf_fs_path_fini(&outpath);
147c243e490SMarcel Moolenaar }
148