xref: /freebsd-src/contrib/atf/atf-c/error_test.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 <errno.h>
31*c243e490SMarcel Moolenaar #include <stdint.h>
32*c243e490SMarcel Moolenaar #include <stdio.h>
33*c243e490SMarcel Moolenaar #include <string.h>
34*c243e490SMarcel Moolenaar 
35*c243e490SMarcel Moolenaar #include <atf-c.h>
36*c243e490SMarcel Moolenaar 
37*c243e490SMarcel Moolenaar #include "atf-c/defs.h"
38*c243e490SMarcel Moolenaar #include "atf-c/error.h"
39*c243e490SMarcel Moolenaar 
40*c243e490SMarcel Moolenaar #include "detail/test_helpers.h"
41*c243e490SMarcel Moolenaar 
42*c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
43*c243e490SMarcel Moolenaar  * Auxiliary functions.
44*c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
45*c243e490SMarcel Moolenaar 
46*c243e490SMarcel Moolenaar static
47*c243e490SMarcel Moolenaar void
48*c243e490SMarcel Moolenaar test_format(const atf_error_t err ATF_DEFS_ATTRIBUTE_UNUSED,
49*c243e490SMarcel Moolenaar             char *buf, size_t buflen)
50*c243e490SMarcel Moolenaar {
51*c243e490SMarcel Moolenaar     snprintf(buf, buflen, "Test formatting function");
52*c243e490SMarcel Moolenaar }
53*c243e490SMarcel Moolenaar 
54*c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
55*c243e490SMarcel Moolenaar  * Tests for the "atf_error" type.
56*c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
57*c243e490SMarcel Moolenaar 
58*c243e490SMarcel Moolenaar ATF_TC(error_new);
59*c243e490SMarcel Moolenaar ATF_TC_HEAD(error_new, tc)
60*c243e490SMarcel Moolenaar {
61*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks the construction of an error "
62*c243e490SMarcel Moolenaar                       "object");
63*c243e490SMarcel Moolenaar }
64*c243e490SMarcel Moolenaar ATF_TC_BODY(error_new, tc)
65*c243e490SMarcel Moolenaar {
66*c243e490SMarcel Moolenaar     atf_error_t err;
67*c243e490SMarcel Moolenaar     int data;
68*c243e490SMarcel Moolenaar 
69*c243e490SMarcel Moolenaar     err = atf_error_new("test_error", NULL, 0, NULL);
70*c243e490SMarcel Moolenaar     ATF_REQUIRE(atf_error_is(err, "test_error"));
71*c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_error_is(err, "unknown_error"));
72*c243e490SMarcel Moolenaar     ATF_REQUIRE(atf_error_data(err) == NULL);
73*c243e490SMarcel Moolenaar     atf_error_free(err);
74*c243e490SMarcel Moolenaar 
75*c243e490SMarcel Moolenaar     data = 5;
76*c243e490SMarcel Moolenaar     err = atf_error_new("test_data_error", &data, sizeof(data), NULL);
77*c243e490SMarcel Moolenaar     ATF_REQUIRE(atf_error_is(err, "test_data_error"));
78*c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_error_is(err, "unknown_error"));
79*c243e490SMarcel Moolenaar     ATF_REQUIRE(atf_error_data(err) != NULL);
80*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(*((const int *)atf_error_data(err)), 5);
81*c243e490SMarcel Moolenaar     atf_error_free(err);
82*c243e490SMarcel Moolenaar }
83*c243e490SMarcel Moolenaar 
84*c243e490SMarcel Moolenaar ATF_TC(error_new_wo_memory);
85*c243e490SMarcel Moolenaar ATF_TC_HEAD(error_new_wo_memory, tc)
86*c243e490SMarcel Moolenaar {
87*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks that an unavailable memory error "
88*c243e490SMarcel Moolenaar                       "raised when constructing an error object "
89*c243e490SMarcel Moolenaar                             "is properly converted to the no_memory "
90*c243e490SMarcel Moolenaar                             "static error type");
91*c243e490SMarcel Moolenaar }
92*c243e490SMarcel Moolenaar ATF_TC_BODY(error_new_wo_memory, tc)
93*c243e490SMarcel Moolenaar {
94*c243e490SMarcel Moolenaar     atf_error_t err;
95*c243e490SMarcel Moolenaar     void *invalid;
96*c243e490SMarcel Moolenaar 
97*c243e490SMarcel Moolenaar     invalid = (void *)1;
98*c243e490SMarcel Moolenaar 
99*c243e490SMarcel Moolenaar     err = atf_error_new("test_error", invalid, SIZE_MAX, NULL);
100*c243e490SMarcel Moolenaar     ATF_REQUIRE(atf_error_is(err, "no_memory"));
101*c243e490SMarcel Moolenaar     ATF_REQUIRE(atf_error_data(err) == NULL);
102*c243e490SMarcel Moolenaar     atf_error_free(err);
103*c243e490SMarcel Moolenaar }
104*c243e490SMarcel Moolenaar 
105*c243e490SMarcel Moolenaar ATF_TC(no_error);
106*c243e490SMarcel Moolenaar ATF_TC_HEAD(no_error, tc)
107*c243e490SMarcel Moolenaar {
108*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks that constructing a non-error "
109*c243e490SMarcel Moolenaar                       "object works");
110*c243e490SMarcel Moolenaar }
111*c243e490SMarcel Moolenaar ATF_TC_BODY(no_error, tc)
112*c243e490SMarcel Moolenaar {
113*c243e490SMarcel Moolenaar     atf_error_t err;
114*c243e490SMarcel Moolenaar 
115*c243e490SMarcel Moolenaar     err = atf_no_error();
116*c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_is_error(err));
117*c243e490SMarcel Moolenaar }
118*c243e490SMarcel Moolenaar 
119*c243e490SMarcel Moolenaar ATF_TC(is_error);
120*c243e490SMarcel Moolenaar ATF_TC_HEAD(is_error, tc)
121*c243e490SMarcel Moolenaar {
122*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks the is_error method to determine "
123*c243e490SMarcel Moolenaar                       "if an error object holds success or an error");
124*c243e490SMarcel Moolenaar }
125*c243e490SMarcel Moolenaar ATF_TC_BODY(is_error, tc)
126*c243e490SMarcel Moolenaar {
127*c243e490SMarcel Moolenaar     atf_error_t err;
128*c243e490SMarcel Moolenaar 
129*c243e490SMarcel Moolenaar     err = atf_no_error();
130*c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_is_error(err));
131*c243e490SMarcel Moolenaar 
132*c243e490SMarcel Moolenaar     err = atf_error_new("test_error", NULL, 0, NULL);
133*c243e490SMarcel Moolenaar     ATF_REQUIRE(atf_is_error(err));
134*c243e490SMarcel Moolenaar     atf_error_free(err);
135*c243e490SMarcel Moolenaar }
136*c243e490SMarcel Moolenaar 
137*c243e490SMarcel Moolenaar ATF_TC(format);
138*c243e490SMarcel Moolenaar ATF_TC_HEAD(format, tc)
139*c243e490SMarcel Moolenaar {
140*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks the default formatting function "
141*c243e490SMarcel Moolenaar                       "and the ability to change it");
142*c243e490SMarcel Moolenaar }
143*c243e490SMarcel Moolenaar ATF_TC_BODY(format, tc)
144*c243e490SMarcel Moolenaar {
145*c243e490SMarcel Moolenaar     atf_error_t err;
146*c243e490SMarcel Moolenaar     char buf[1024];
147*c243e490SMarcel Moolenaar 
148*c243e490SMarcel Moolenaar     printf("Testing default formatting function\n");
149*c243e490SMarcel Moolenaar     err = atf_error_new("test_error", NULL, 0, NULL);
150*c243e490SMarcel Moolenaar     atf_error_format(err, buf, sizeof(buf));
151*c243e490SMarcel Moolenaar     printf("Error string is: %s\n", buf);
152*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(buf, "Error 'test_error'") == 0);
153*c243e490SMarcel Moolenaar     atf_error_free(err);
154*c243e490SMarcel Moolenaar 
155*c243e490SMarcel Moolenaar     printf("Testing custom formatting function\n");
156*c243e490SMarcel Moolenaar     err = atf_error_new("test_error", NULL, 0, test_format);
157*c243e490SMarcel Moolenaar     atf_error_format(err, buf, sizeof(buf));
158*c243e490SMarcel Moolenaar     printf("Error string is: %s\n", buf);
159*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(buf, "Test formatting function") == 0);
160*c243e490SMarcel Moolenaar     atf_error_free(err);
161*c243e490SMarcel Moolenaar }
162*c243e490SMarcel Moolenaar 
163*c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
164*c243e490SMarcel Moolenaar  * Tests for the "libc" error.
165*c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
166*c243e490SMarcel Moolenaar 
167*c243e490SMarcel Moolenaar ATF_TC(libc_new);
168*c243e490SMarcel Moolenaar ATF_TC_HEAD(libc_new, tc)
169*c243e490SMarcel Moolenaar {
170*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks the construction of libc errors");
171*c243e490SMarcel Moolenaar }
172*c243e490SMarcel Moolenaar ATF_TC_BODY(libc_new, tc)
173*c243e490SMarcel Moolenaar {
174*c243e490SMarcel Moolenaar     atf_error_t err;
175*c243e490SMarcel Moolenaar 
176*c243e490SMarcel Moolenaar     err = atf_libc_error(ENOMEM, "Test message 1");
177*c243e490SMarcel Moolenaar     ATF_REQUIRE(atf_error_is(err, "libc"));
178*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(atf_libc_error_code(err), ENOMEM);
179*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_libc_error_msg(err), "Test message 1") == 0);
180*c243e490SMarcel Moolenaar     atf_error_free(err);
181*c243e490SMarcel Moolenaar 
182*c243e490SMarcel Moolenaar     err = atf_libc_error(EPERM, "%s message %d", "Test", 2);
183*c243e490SMarcel Moolenaar     ATF_REQUIRE(atf_error_is(err, "libc"));
184*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(atf_libc_error_code(err), EPERM);
185*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_libc_error_msg(err), "Test message 2") == 0);
186*c243e490SMarcel Moolenaar     atf_error_free(err);
187*c243e490SMarcel Moolenaar }
188*c243e490SMarcel Moolenaar 
189*c243e490SMarcel Moolenaar ATF_TC(libc_format);
190*c243e490SMarcel Moolenaar ATF_TC_HEAD(libc_format, tc)
191*c243e490SMarcel Moolenaar {
192*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks the formatting of libc errors");
193*c243e490SMarcel Moolenaar }
194*c243e490SMarcel Moolenaar ATF_TC_BODY(libc_format, tc)
195*c243e490SMarcel Moolenaar {
196*c243e490SMarcel Moolenaar     atf_error_t err;
197*c243e490SMarcel Moolenaar     char buf[1024];
198*c243e490SMarcel Moolenaar 
199*c243e490SMarcel Moolenaar     err = atf_libc_error(ENOMEM, "Test message 1");
200*c243e490SMarcel Moolenaar     atf_error_format(err, buf, sizeof(buf));
201*c243e490SMarcel Moolenaar     ATF_REQUIRE(strstr(buf, strerror(ENOMEM)) != NULL);
202*c243e490SMarcel Moolenaar     ATF_REQUIRE(strstr(buf, "Test message 1") != NULL);
203*c243e490SMarcel Moolenaar     atf_error_free(err);
204*c243e490SMarcel Moolenaar 
205*c243e490SMarcel Moolenaar     err = atf_libc_error(EPERM, "Test message 2");
206*c243e490SMarcel Moolenaar     atf_error_format(err, buf, sizeof(buf));
207*c243e490SMarcel Moolenaar     ATF_REQUIRE(strstr(buf, strerror(EPERM)) != NULL);
208*c243e490SMarcel Moolenaar     ATF_REQUIRE(strstr(buf, "Test message 2") != NULL);
209*c243e490SMarcel Moolenaar     atf_error_free(err);
210*c243e490SMarcel Moolenaar 
211*c243e490SMarcel Moolenaar     err = atf_libc_error(EPERM, "%s message %d", "Test", 3);
212*c243e490SMarcel Moolenaar     atf_error_format(err, buf, sizeof(buf));
213*c243e490SMarcel Moolenaar     ATF_REQUIRE(strstr(buf, strerror(EPERM)) != NULL);
214*c243e490SMarcel Moolenaar     ATF_REQUIRE(strstr(buf, "Test message 3") != NULL);
215*c243e490SMarcel Moolenaar     atf_error_free(err);
216*c243e490SMarcel Moolenaar }
217*c243e490SMarcel Moolenaar 
218*c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
219*c243e490SMarcel Moolenaar  * Tests for the "no_memory" error.
220*c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
221*c243e490SMarcel Moolenaar 
222*c243e490SMarcel Moolenaar ATF_TC(no_memory_new);
223*c243e490SMarcel Moolenaar ATF_TC_HEAD(no_memory_new, tc)
224*c243e490SMarcel Moolenaar {
225*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks the construction of no_memory "
226*c243e490SMarcel Moolenaar                       "errors");
227*c243e490SMarcel Moolenaar }
228*c243e490SMarcel Moolenaar ATF_TC_BODY(no_memory_new, tc)
229*c243e490SMarcel Moolenaar {
230*c243e490SMarcel Moolenaar     atf_error_t err;
231*c243e490SMarcel Moolenaar 
232*c243e490SMarcel Moolenaar     err = atf_no_memory_error();
233*c243e490SMarcel Moolenaar     ATF_REQUIRE(atf_error_is(err, "no_memory"));
234*c243e490SMarcel Moolenaar     ATF_REQUIRE(atf_error_data(err) == NULL);
235*c243e490SMarcel Moolenaar     atf_error_free(err);
236*c243e490SMarcel Moolenaar }
237*c243e490SMarcel Moolenaar 
238*c243e490SMarcel Moolenaar ATF_TC(no_memory_format);
239*c243e490SMarcel Moolenaar ATF_TC_HEAD(no_memory_format, tc)
240*c243e490SMarcel Moolenaar {
241*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks the formatting of no_memory "
242*c243e490SMarcel Moolenaar                       "errors");
243*c243e490SMarcel Moolenaar }
244*c243e490SMarcel Moolenaar ATF_TC_BODY(no_memory_format, tc)
245*c243e490SMarcel Moolenaar {
246*c243e490SMarcel Moolenaar     atf_error_t err;
247*c243e490SMarcel Moolenaar     char buf[1024];
248*c243e490SMarcel Moolenaar 
249*c243e490SMarcel Moolenaar     err = atf_no_memory_error();
250*c243e490SMarcel Moolenaar     atf_error_format(err, buf, sizeof(buf));
251*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(buf, "Not enough memory") == 0);
252*c243e490SMarcel Moolenaar     atf_error_free(err);
253*c243e490SMarcel Moolenaar }
254*c243e490SMarcel Moolenaar 
255*c243e490SMarcel Moolenaar ATF_TC(no_memory_twice);
256*c243e490SMarcel Moolenaar ATF_TC_HEAD(no_memory_twice, tc)
257*c243e490SMarcel Moolenaar {
258*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks the construction of no_memory "
259*c243e490SMarcel Moolenaar                       "errors multiple times, as this error is initialized "
260*c243e490SMarcel Moolenaar                       "statically");
261*c243e490SMarcel Moolenaar }
262*c243e490SMarcel Moolenaar ATF_TC_BODY(no_memory_twice, tc)
263*c243e490SMarcel Moolenaar {
264*c243e490SMarcel Moolenaar     {
265*c243e490SMarcel Moolenaar         atf_error_t err = atf_no_memory_error();
266*c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_error_is(err, "no_memory"));
267*c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_error_data(err) == NULL);
268*c243e490SMarcel Moolenaar         atf_error_free(err);
269*c243e490SMarcel Moolenaar     }
270*c243e490SMarcel Moolenaar 
271*c243e490SMarcel Moolenaar     {
272*c243e490SMarcel Moolenaar         atf_error_t err = atf_no_memory_error();
273*c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_error_is(err, "no_memory"));
274*c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_error_data(err) == NULL);
275*c243e490SMarcel Moolenaar         atf_error_free(err);
276*c243e490SMarcel Moolenaar     }
277*c243e490SMarcel Moolenaar }
278*c243e490SMarcel Moolenaar 
279*c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
280*c243e490SMarcel Moolenaar  * Tests cases for the header file.
281*c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
282*c243e490SMarcel Moolenaar 
283*c243e490SMarcel Moolenaar HEADER_TC(include, "atf-c/error.h");
284*c243e490SMarcel Moolenaar HEADER_TC(include_fwd, "atf-c/error_fwd.h");
285*c243e490SMarcel Moolenaar 
286*c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
287*c243e490SMarcel Moolenaar  * Main.
288*c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
289*c243e490SMarcel Moolenaar 
290*c243e490SMarcel Moolenaar ATF_TP_ADD_TCS(tp)
291*c243e490SMarcel Moolenaar {
292*c243e490SMarcel Moolenaar     /* Add the tests for the "atf_error" type. */
293*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, error_new);
294*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, error_new_wo_memory);
295*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, no_error);
296*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, is_error);
297*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, format);
298*c243e490SMarcel Moolenaar 
299*c243e490SMarcel Moolenaar     /* Add the tests for the "libc" error. */
300*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, libc_new);
301*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, libc_format);
302*c243e490SMarcel Moolenaar 
303*c243e490SMarcel Moolenaar     /* Add the tests for the "no_memory" error. */
304*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, no_memory_new);
305*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, no_memory_format);
306*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, no_memory_twice);
307*c243e490SMarcel Moolenaar 
308*c243e490SMarcel Moolenaar     /* Add the test cases for the header file. */
309*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, include);
310*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, include_fwd);
311*c243e490SMarcel Moolenaar 
312*c243e490SMarcel Moolenaar     return atf_no_error();
313*c243e490SMarcel Moolenaar }
314