xref: /freebsd/contrib/atf/atf-c/tp.c (revision c243e4902be8df1e643c76b5f18b68bb77cc5268)
1*c243e490SMarcel Moolenaar /*
2*c243e490SMarcel Moolenaar  * Automated Testing Framework (atf)
3*c243e490SMarcel Moolenaar  *
4*c243e490SMarcel Moolenaar  * Copyright (c) 2008 The NetBSD Foundation, Inc.
5*c243e490SMarcel Moolenaar  * All rights reserved.
6*c243e490SMarcel Moolenaar  *
7*c243e490SMarcel Moolenaar  * Redistribution and use in source and binary forms, with or without
8*c243e490SMarcel Moolenaar  * modification, are permitted provided that the following conditions
9*c243e490SMarcel Moolenaar  * are met:
10*c243e490SMarcel Moolenaar  * 1. Redistributions of source code must retain the above copyright
11*c243e490SMarcel Moolenaar  *    notice, this list of conditions and the following disclaimer.
12*c243e490SMarcel Moolenaar  * 2. Redistributions in binary form must reproduce the above copyright
13*c243e490SMarcel Moolenaar  *    notice, this list of conditions and the following disclaimer in the
14*c243e490SMarcel Moolenaar  *    documentation and/or other materials provided with the distribution.
15*c243e490SMarcel Moolenaar  *
16*c243e490SMarcel Moolenaar  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17*c243e490SMarcel Moolenaar  * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18*c243e490SMarcel Moolenaar  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19*c243e490SMarcel Moolenaar  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20*c243e490SMarcel Moolenaar  * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21*c243e490SMarcel Moolenaar  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*c243e490SMarcel Moolenaar  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23*c243e490SMarcel Moolenaar  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24*c243e490SMarcel Moolenaar  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25*c243e490SMarcel Moolenaar  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26*c243e490SMarcel Moolenaar  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27*c243e490SMarcel Moolenaar  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*c243e490SMarcel Moolenaar  */
29*c243e490SMarcel Moolenaar 
30*c243e490SMarcel Moolenaar #include <stdio.h>
31*c243e490SMarcel Moolenaar #include <stdlib.h>
32*c243e490SMarcel Moolenaar #include <string.h>
33*c243e490SMarcel Moolenaar #include <unistd.h>
34*c243e490SMarcel Moolenaar 
35*c243e490SMarcel Moolenaar #include "atf-c/error.h"
36*c243e490SMarcel Moolenaar #include "atf-c/tc.h"
37*c243e490SMarcel Moolenaar #include "atf-c/tp.h"
38*c243e490SMarcel Moolenaar 
39*c243e490SMarcel Moolenaar #include "detail/fs.h"
40*c243e490SMarcel Moolenaar #include "detail/map.h"
41*c243e490SMarcel Moolenaar #include "detail/sanity.h"
42*c243e490SMarcel Moolenaar 
43*c243e490SMarcel Moolenaar struct atf_tp_impl {
44*c243e490SMarcel Moolenaar     atf_list_t m_tcs;
45*c243e490SMarcel Moolenaar     atf_map_t m_config;
46*c243e490SMarcel Moolenaar };
47*c243e490SMarcel Moolenaar 
48*c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
49*c243e490SMarcel Moolenaar  * Auxiliary functions.
50*c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
51*c243e490SMarcel Moolenaar 
52*c243e490SMarcel Moolenaar static
53*c243e490SMarcel Moolenaar const atf_tc_t *
54*c243e490SMarcel Moolenaar find_tc(const atf_tp_t *tp, const char *ident)
55*c243e490SMarcel Moolenaar {
56*c243e490SMarcel Moolenaar     const atf_tc_t *tc;
57*c243e490SMarcel Moolenaar     atf_list_citer_t iter;
58*c243e490SMarcel Moolenaar 
59*c243e490SMarcel Moolenaar     tc = NULL;
60*c243e490SMarcel Moolenaar     atf_list_for_each_c(iter, &tp->pimpl->m_tcs) {
61*c243e490SMarcel Moolenaar         const atf_tc_t *tc2;
62*c243e490SMarcel Moolenaar         tc2 = atf_list_citer_data(iter);
63*c243e490SMarcel Moolenaar         if (strcmp(atf_tc_get_ident(tc2), ident) == 0) {
64*c243e490SMarcel Moolenaar             tc = tc2;
65*c243e490SMarcel Moolenaar             break;
66*c243e490SMarcel Moolenaar         }
67*c243e490SMarcel Moolenaar     }
68*c243e490SMarcel Moolenaar     return tc;
69*c243e490SMarcel Moolenaar }
70*c243e490SMarcel Moolenaar 
71*c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
72*c243e490SMarcel Moolenaar  * The "atf_tp" type.
73*c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
74*c243e490SMarcel Moolenaar 
75*c243e490SMarcel Moolenaar /*
76*c243e490SMarcel Moolenaar  * Constructors/destructors.
77*c243e490SMarcel Moolenaar  */
78*c243e490SMarcel Moolenaar 
79*c243e490SMarcel Moolenaar atf_error_t
80*c243e490SMarcel Moolenaar atf_tp_init(atf_tp_t *tp, const char *const *config)
81*c243e490SMarcel Moolenaar {
82*c243e490SMarcel Moolenaar     atf_error_t err;
83*c243e490SMarcel Moolenaar 
84*c243e490SMarcel Moolenaar     PRE(config != NULL);
85*c243e490SMarcel Moolenaar 
86*c243e490SMarcel Moolenaar     tp->pimpl = malloc(sizeof(struct atf_tp_impl));
87*c243e490SMarcel Moolenaar     if (tp->pimpl == NULL)
88*c243e490SMarcel Moolenaar         return atf_no_memory_error();
89*c243e490SMarcel Moolenaar 
90*c243e490SMarcel Moolenaar     err = atf_list_init(&tp->pimpl->m_tcs);
91*c243e490SMarcel Moolenaar     if (atf_is_error(err))
92*c243e490SMarcel Moolenaar         goto out;
93*c243e490SMarcel Moolenaar 
94*c243e490SMarcel Moolenaar     err = atf_map_init_charpp(&tp->pimpl->m_config, config);
95*c243e490SMarcel Moolenaar     if (atf_is_error(err)) {
96*c243e490SMarcel Moolenaar         atf_list_fini(&tp->pimpl->m_tcs);
97*c243e490SMarcel Moolenaar         goto out;
98*c243e490SMarcel Moolenaar     }
99*c243e490SMarcel Moolenaar 
100*c243e490SMarcel Moolenaar     INV(!atf_is_error(err));
101*c243e490SMarcel Moolenaar out:
102*c243e490SMarcel Moolenaar     return err;
103*c243e490SMarcel Moolenaar }
104*c243e490SMarcel Moolenaar 
105*c243e490SMarcel Moolenaar void
106*c243e490SMarcel Moolenaar atf_tp_fini(atf_tp_t *tp)
107*c243e490SMarcel Moolenaar {
108*c243e490SMarcel Moolenaar     atf_list_iter_t iter;
109*c243e490SMarcel Moolenaar 
110*c243e490SMarcel Moolenaar     atf_map_fini(&tp->pimpl->m_config);
111*c243e490SMarcel Moolenaar 
112*c243e490SMarcel Moolenaar     atf_list_for_each(iter, &tp->pimpl->m_tcs) {
113*c243e490SMarcel Moolenaar         atf_tc_t *tc = atf_list_iter_data(iter);
114*c243e490SMarcel Moolenaar         atf_tc_fini(tc);
115*c243e490SMarcel Moolenaar     }
116*c243e490SMarcel Moolenaar     atf_list_fini(&tp->pimpl->m_tcs);
117*c243e490SMarcel Moolenaar 
118*c243e490SMarcel Moolenaar     free(tp->pimpl);
119*c243e490SMarcel Moolenaar }
120*c243e490SMarcel Moolenaar 
121*c243e490SMarcel Moolenaar /*
122*c243e490SMarcel Moolenaar  * Getters.
123*c243e490SMarcel Moolenaar  */
124*c243e490SMarcel Moolenaar 
125*c243e490SMarcel Moolenaar char **
126*c243e490SMarcel Moolenaar atf_tp_get_config(const atf_tp_t *tp)
127*c243e490SMarcel Moolenaar {
128*c243e490SMarcel Moolenaar     return atf_map_to_charpp(&tp->pimpl->m_config);
129*c243e490SMarcel Moolenaar }
130*c243e490SMarcel Moolenaar 
131*c243e490SMarcel Moolenaar bool
132*c243e490SMarcel Moolenaar atf_tp_has_tc(const atf_tp_t *tp, const char *id)
133*c243e490SMarcel Moolenaar {
134*c243e490SMarcel Moolenaar     const atf_tc_t *tc = find_tc(tp, id);
135*c243e490SMarcel Moolenaar     return tc != NULL;
136*c243e490SMarcel Moolenaar }
137*c243e490SMarcel Moolenaar 
138*c243e490SMarcel Moolenaar const atf_tc_t *
139*c243e490SMarcel Moolenaar atf_tp_get_tc(const atf_tp_t *tp, const char *id)
140*c243e490SMarcel Moolenaar {
141*c243e490SMarcel Moolenaar     const atf_tc_t *tc = find_tc(tp, id);
142*c243e490SMarcel Moolenaar     PRE(tc != NULL);
143*c243e490SMarcel Moolenaar     return tc;
144*c243e490SMarcel Moolenaar }
145*c243e490SMarcel Moolenaar 
146*c243e490SMarcel Moolenaar const atf_tc_t *const *
147*c243e490SMarcel Moolenaar atf_tp_get_tcs(const atf_tp_t *tp)
148*c243e490SMarcel Moolenaar {
149*c243e490SMarcel Moolenaar     const atf_tc_t **array;
150*c243e490SMarcel Moolenaar     atf_list_citer_t iter;
151*c243e490SMarcel Moolenaar     size_t i;
152*c243e490SMarcel Moolenaar 
153*c243e490SMarcel Moolenaar     array = malloc(sizeof(atf_tc_t *) *
154*c243e490SMarcel Moolenaar                    (atf_list_size(&tp->pimpl->m_tcs) + 1));
155*c243e490SMarcel Moolenaar     if (array == NULL)
156*c243e490SMarcel Moolenaar         goto out;
157*c243e490SMarcel Moolenaar 
158*c243e490SMarcel Moolenaar     i = 0;
159*c243e490SMarcel Moolenaar     atf_list_for_each_c(iter, &tp->pimpl->m_tcs) {
160*c243e490SMarcel Moolenaar         array[i] = atf_list_citer_data(iter);
161*c243e490SMarcel Moolenaar         if (array[i] == NULL) {
162*c243e490SMarcel Moolenaar             free(array);
163*c243e490SMarcel Moolenaar             array = NULL;
164*c243e490SMarcel Moolenaar             goto out;
165*c243e490SMarcel Moolenaar         }
166*c243e490SMarcel Moolenaar 
167*c243e490SMarcel Moolenaar         i++;
168*c243e490SMarcel Moolenaar     }
169*c243e490SMarcel Moolenaar     array[i] = NULL;
170*c243e490SMarcel Moolenaar 
171*c243e490SMarcel Moolenaar out:
172*c243e490SMarcel Moolenaar     return array;
173*c243e490SMarcel Moolenaar }
174*c243e490SMarcel Moolenaar 
175*c243e490SMarcel Moolenaar /*
176*c243e490SMarcel Moolenaar  * Modifiers.
177*c243e490SMarcel Moolenaar  */
178*c243e490SMarcel Moolenaar 
179*c243e490SMarcel Moolenaar atf_error_t
180*c243e490SMarcel Moolenaar atf_tp_add_tc(atf_tp_t *tp, atf_tc_t *tc)
181*c243e490SMarcel Moolenaar {
182*c243e490SMarcel Moolenaar     atf_error_t err;
183*c243e490SMarcel Moolenaar 
184*c243e490SMarcel Moolenaar     PRE(find_tc(tp, atf_tc_get_ident(tc)) == NULL);
185*c243e490SMarcel Moolenaar 
186*c243e490SMarcel Moolenaar     err = atf_list_append(&tp->pimpl->m_tcs, tc, false);
187*c243e490SMarcel Moolenaar 
188*c243e490SMarcel Moolenaar     POST(find_tc(tp, atf_tc_get_ident(tc)) != NULL);
189*c243e490SMarcel Moolenaar 
190*c243e490SMarcel Moolenaar     return err;
191*c243e490SMarcel Moolenaar }
192*c243e490SMarcel Moolenaar 
193*c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
194*c243e490SMarcel Moolenaar  * Free functions.
195*c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
196*c243e490SMarcel Moolenaar 
197*c243e490SMarcel Moolenaar atf_error_t
198*c243e490SMarcel Moolenaar atf_tp_run(const atf_tp_t *tp, const char *tcname, const char *resfile)
199*c243e490SMarcel Moolenaar {
200*c243e490SMarcel Moolenaar     const atf_tc_t *tc;
201*c243e490SMarcel Moolenaar 
202*c243e490SMarcel Moolenaar     tc = find_tc(tp, tcname);
203*c243e490SMarcel Moolenaar     PRE(tc != NULL);
204*c243e490SMarcel Moolenaar 
205*c243e490SMarcel Moolenaar     return atf_tc_run(tc, resfile);
206*c243e490SMarcel Moolenaar }
207*c243e490SMarcel Moolenaar 
208*c243e490SMarcel Moolenaar atf_error_t
209*c243e490SMarcel Moolenaar atf_tp_cleanup(const atf_tp_t *tp, const char *tcname)
210*c243e490SMarcel Moolenaar {
211*c243e490SMarcel Moolenaar     const atf_tc_t *tc;
212*c243e490SMarcel Moolenaar 
213*c243e490SMarcel Moolenaar     tc = find_tc(tp, tcname);
214*c243e490SMarcel Moolenaar     PRE(tc != NULL);
215*c243e490SMarcel Moolenaar 
216*c243e490SMarcel Moolenaar     return atf_tc_cleanup(tc);
217*c243e490SMarcel Moolenaar }
218