xref: /netbsd-src/external/bsd/atf/dist/atf-c/error_test.c (revision a551a20f66d65b75aa4c2dddf3e2e6f08dbfaf61)
1edebbb8eSjmmv /*
2edebbb8eSjmmv  * Automated Testing Framework (atf)
3edebbb8eSjmmv  *
4*a551a20fSjmmv  * Copyright (c) 2008 The NetBSD Foundation, Inc.
5edebbb8eSjmmv  * All rights reserved.
6edebbb8eSjmmv  *
7edebbb8eSjmmv  * Redistribution and use in source and binary forms, with or without
8edebbb8eSjmmv  * modification, are permitted provided that the following conditions
9edebbb8eSjmmv  * are met:
10edebbb8eSjmmv  * 1. Redistributions of source code must retain the above copyright
11edebbb8eSjmmv  *    notice, this list of conditions and the following disclaimer.
12edebbb8eSjmmv  * 2. Redistributions in binary form must reproduce the above copyright
13edebbb8eSjmmv  *    notice, this list of conditions and the following disclaimer in the
14edebbb8eSjmmv  *    documentation and/or other materials provided with the distribution.
15edebbb8eSjmmv  *
16edebbb8eSjmmv  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17edebbb8eSjmmv  * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18edebbb8eSjmmv  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19edebbb8eSjmmv  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20edebbb8eSjmmv  * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21edebbb8eSjmmv  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22edebbb8eSjmmv  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23edebbb8eSjmmv  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24edebbb8eSjmmv  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25edebbb8eSjmmv  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26edebbb8eSjmmv  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27edebbb8eSjmmv  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28edebbb8eSjmmv  */
29edebbb8eSjmmv 
30edebbb8eSjmmv #include <errno.h>
31edebbb8eSjmmv #include <stdint.h>
32edebbb8eSjmmv #include <stdio.h>
33edebbb8eSjmmv #include <string.h>
34edebbb8eSjmmv 
35edebbb8eSjmmv #include <atf-c.h>
36edebbb8eSjmmv 
37*a551a20fSjmmv #include "atf-c/defs.h"
38edebbb8eSjmmv #include "atf-c/error.h"
39edebbb8eSjmmv 
40895f502bSjmmv #include "detail/test_helpers.h"
41edebbb8eSjmmv 
42edebbb8eSjmmv /* ---------------------------------------------------------------------
43edebbb8eSjmmv  * Auxiliary functions.
44edebbb8eSjmmv  * --------------------------------------------------------------------- */
45edebbb8eSjmmv 
46edebbb8eSjmmv static
47edebbb8eSjmmv void
test_format(const atf_error_t err ATF_DEFS_ATTRIBUTE_UNUSED,char * buf,size_t buflen)48*a551a20fSjmmv test_format(const atf_error_t err ATF_DEFS_ATTRIBUTE_UNUSED,
49*a551a20fSjmmv             char *buf, size_t buflen)
50edebbb8eSjmmv {
51edebbb8eSjmmv     snprintf(buf, buflen, "Test formatting function");
52edebbb8eSjmmv }
53edebbb8eSjmmv 
54edebbb8eSjmmv /* ---------------------------------------------------------------------
55edebbb8eSjmmv  * Tests for the "atf_error" type.
56edebbb8eSjmmv  * --------------------------------------------------------------------- */
57edebbb8eSjmmv 
58edebbb8eSjmmv ATF_TC(error_new);
ATF_TC_HEAD(error_new,tc)59edebbb8eSjmmv ATF_TC_HEAD(error_new, tc)
60edebbb8eSjmmv {
61edebbb8eSjmmv     atf_tc_set_md_var(tc, "descr", "Checks the construction of an error "
62edebbb8eSjmmv                       "object");
63edebbb8eSjmmv }
ATF_TC_BODY(error_new,tc)64edebbb8eSjmmv ATF_TC_BODY(error_new, tc)
65edebbb8eSjmmv {
66edebbb8eSjmmv     atf_error_t err;
67edebbb8eSjmmv     int data;
68edebbb8eSjmmv 
69edebbb8eSjmmv     err = atf_error_new("test_error", NULL, 0, NULL);
70edebbb8eSjmmv     ATF_REQUIRE(atf_error_is(err, "test_error"));
71edebbb8eSjmmv     ATF_REQUIRE(!atf_error_is(err, "unknown_error"));
72edebbb8eSjmmv     ATF_REQUIRE(atf_error_data(err) == NULL);
73edebbb8eSjmmv     atf_error_free(err);
74edebbb8eSjmmv 
75edebbb8eSjmmv     data = 5;
76edebbb8eSjmmv     err = atf_error_new("test_data_error", &data, sizeof(data), NULL);
77edebbb8eSjmmv     ATF_REQUIRE(atf_error_is(err, "test_data_error"));
78edebbb8eSjmmv     ATF_REQUIRE(!atf_error_is(err, "unknown_error"));
79edebbb8eSjmmv     ATF_REQUIRE(atf_error_data(err) != NULL);
80edebbb8eSjmmv     ATF_REQUIRE_EQ(*((const int *)atf_error_data(err)), 5);
81edebbb8eSjmmv     atf_error_free(err);
82edebbb8eSjmmv }
83edebbb8eSjmmv 
84edebbb8eSjmmv ATF_TC(error_new_wo_memory);
ATF_TC_HEAD(error_new_wo_memory,tc)85edebbb8eSjmmv ATF_TC_HEAD(error_new_wo_memory, tc)
86edebbb8eSjmmv {
87edebbb8eSjmmv     atf_tc_set_md_var(tc, "descr", "Checks that an unavailable memory error "
88edebbb8eSjmmv                       "raised when constructing an error object "
89edebbb8eSjmmv                             "is properly converted to the no_memory "
90edebbb8eSjmmv                             "static error type");
91edebbb8eSjmmv }
ATF_TC_BODY(error_new_wo_memory,tc)92edebbb8eSjmmv ATF_TC_BODY(error_new_wo_memory, tc)
93edebbb8eSjmmv {
94edebbb8eSjmmv     atf_error_t err;
95edebbb8eSjmmv     void *invalid;
96edebbb8eSjmmv 
97edebbb8eSjmmv     invalid = (void *)1;
98edebbb8eSjmmv 
99edebbb8eSjmmv     err = atf_error_new("test_error", invalid, SIZE_MAX, NULL);
100edebbb8eSjmmv     ATF_REQUIRE(atf_error_is(err, "no_memory"));
101edebbb8eSjmmv     ATF_REQUIRE(atf_error_data(err) == NULL);
102edebbb8eSjmmv     atf_error_free(err);
103edebbb8eSjmmv }
104edebbb8eSjmmv 
105edebbb8eSjmmv ATF_TC(no_error);
ATF_TC_HEAD(no_error,tc)106edebbb8eSjmmv ATF_TC_HEAD(no_error, tc)
107edebbb8eSjmmv {
108edebbb8eSjmmv     atf_tc_set_md_var(tc, "descr", "Checks that constructing a non-error "
109edebbb8eSjmmv                       "object works");
110edebbb8eSjmmv }
ATF_TC_BODY(no_error,tc)111edebbb8eSjmmv ATF_TC_BODY(no_error, tc)
112edebbb8eSjmmv {
113edebbb8eSjmmv     atf_error_t err;
114edebbb8eSjmmv 
115edebbb8eSjmmv     err = atf_no_error();
116edebbb8eSjmmv     ATF_REQUIRE(!atf_is_error(err));
117edebbb8eSjmmv }
118edebbb8eSjmmv 
119edebbb8eSjmmv ATF_TC(is_error);
ATF_TC_HEAD(is_error,tc)120edebbb8eSjmmv ATF_TC_HEAD(is_error, tc)
121edebbb8eSjmmv {
122edebbb8eSjmmv     atf_tc_set_md_var(tc, "descr", "Checks the is_error method to determine "
123edebbb8eSjmmv                       "if an error object holds success or an error");
124edebbb8eSjmmv }
ATF_TC_BODY(is_error,tc)125edebbb8eSjmmv ATF_TC_BODY(is_error, tc)
126edebbb8eSjmmv {
127edebbb8eSjmmv     atf_error_t err;
128edebbb8eSjmmv 
129edebbb8eSjmmv     err = atf_no_error();
130edebbb8eSjmmv     ATF_REQUIRE(!atf_is_error(err));
131edebbb8eSjmmv 
132edebbb8eSjmmv     err = atf_error_new("test_error", NULL, 0, NULL);
133edebbb8eSjmmv     ATF_REQUIRE(atf_is_error(err));
134edebbb8eSjmmv     atf_error_free(err);
135edebbb8eSjmmv }
136edebbb8eSjmmv 
137edebbb8eSjmmv ATF_TC(format);
ATF_TC_HEAD(format,tc)138edebbb8eSjmmv ATF_TC_HEAD(format, tc)
139edebbb8eSjmmv {
140edebbb8eSjmmv     atf_tc_set_md_var(tc, "descr", "Checks the default formatting function "
141edebbb8eSjmmv                       "and the ability to change it");
142edebbb8eSjmmv }
ATF_TC_BODY(format,tc)143edebbb8eSjmmv ATF_TC_BODY(format, tc)
144edebbb8eSjmmv {
145edebbb8eSjmmv     atf_error_t err;
146edebbb8eSjmmv     char buf[1024];
147edebbb8eSjmmv 
148edebbb8eSjmmv     printf("Testing default formatting function\n");
149edebbb8eSjmmv     err = atf_error_new("test_error", NULL, 0, NULL);
150edebbb8eSjmmv     atf_error_format(err, buf, sizeof(buf));
151edebbb8eSjmmv     printf("Error string is: %s\n", buf);
152edebbb8eSjmmv     ATF_REQUIRE(strcmp(buf, "Error 'test_error'") == 0);
153edebbb8eSjmmv     atf_error_free(err);
154edebbb8eSjmmv 
155edebbb8eSjmmv     printf("Testing custom formatting function\n");
156edebbb8eSjmmv     err = atf_error_new("test_error", NULL, 0, test_format);
157edebbb8eSjmmv     atf_error_format(err, buf, sizeof(buf));
158edebbb8eSjmmv     printf("Error string is: %s\n", buf);
159edebbb8eSjmmv     ATF_REQUIRE(strcmp(buf, "Test formatting function") == 0);
160edebbb8eSjmmv     atf_error_free(err);
161edebbb8eSjmmv }
162edebbb8eSjmmv 
163edebbb8eSjmmv /* ---------------------------------------------------------------------
164edebbb8eSjmmv  * Tests for the "libc" error.
165edebbb8eSjmmv  * --------------------------------------------------------------------- */
166edebbb8eSjmmv 
167edebbb8eSjmmv ATF_TC(libc_new);
ATF_TC_HEAD(libc_new,tc)168edebbb8eSjmmv ATF_TC_HEAD(libc_new, tc)
169edebbb8eSjmmv {
170edebbb8eSjmmv     atf_tc_set_md_var(tc, "descr", "Checks the construction of libc errors");
171edebbb8eSjmmv }
ATF_TC_BODY(libc_new,tc)172edebbb8eSjmmv ATF_TC_BODY(libc_new, tc)
173edebbb8eSjmmv {
174edebbb8eSjmmv     atf_error_t err;
175edebbb8eSjmmv 
176edebbb8eSjmmv     err = atf_libc_error(ENOMEM, "Test message 1");
177edebbb8eSjmmv     ATF_REQUIRE(atf_error_is(err, "libc"));
178edebbb8eSjmmv     ATF_REQUIRE_EQ(atf_libc_error_code(err), ENOMEM);
179edebbb8eSjmmv     ATF_REQUIRE(strcmp(atf_libc_error_msg(err), "Test message 1") == 0);
180edebbb8eSjmmv     atf_error_free(err);
181edebbb8eSjmmv 
182edebbb8eSjmmv     err = atf_libc_error(EPERM, "%s message %d", "Test", 2);
183edebbb8eSjmmv     ATF_REQUIRE(atf_error_is(err, "libc"));
184edebbb8eSjmmv     ATF_REQUIRE_EQ(atf_libc_error_code(err), EPERM);
185edebbb8eSjmmv     ATF_REQUIRE(strcmp(atf_libc_error_msg(err), "Test message 2") == 0);
186edebbb8eSjmmv     atf_error_free(err);
187edebbb8eSjmmv }
188edebbb8eSjmmv 
189edebbb8eSjmmv ATF_TC(libc_format);
ATF_TC_HEAD(libc_format,tc)190edebbb8eSjmmv ATF_TC_HEAD(libc_format, tc)
191edebbb8eSjmmv {
192edebbb8eSjmmv     atf_tc_set_md_var(tc, "descr", "Checks the formatting of libc errors");
193edebbb8eSjmmv }
ATF_TC_BODY(libc_format,tc)194edebbb8eSjmmv ATF_TC_BODY(libc_format, tc)
195edebbb8eSjmmv {
196edebbb8eSjmmv     atf_error_t err;
197edebbb8eSjmmv     char buf[1024];
198edebbb8eSjmmv 
199edebbb8eSjmmv     err = atf_libc_error(ENOMEM, "Test message 1");
200edebbb8eSjmmv     atf_error_format(err, buf, sizeof(buf));
201edebbb8eSjmmv     ATF_REQUIRE(strstr(buf, strerror(ENOMEM)) != NULL);
202edebbb8eSjmmv     ATF_REQUIRE(strstr(buf, "Test message 1") != NULL);
203edebbb8eSjmmv     atf_error_free(err);
204edebbb8eSjmmv 
205edebbb8eSjmmv     err = atf_libc_error(EPERM, "Test message 2");
206edebbb8eSjmmv     atf_error_format(err, buf, sizeof(buf));
207edebbb8eSjmmv     ATF_REQUIRE(strstr(buf, strerror(EPERM)) != NULL);
208edebbb8eSjmmv     ATF_REQUIRE(strstr(buf, "Test message 2") != NULL);
209edebbb8eSjmmv     atf_error_free(err);
210edebbb8eSjmmv 
211edebbb8eSjmmv     err = atf_libc_error(EPERM, "%s message %d", "Test", 3);
212edebbb8eSjmmv     atf_error_format(err, buf, sizeof(buf));
213edebbb8eSjmmv     ATF_REQUIRE(strstr(buf, strerror(EPERM)) != NULL);
214edebbb8eSjmmv     ATF_REQUIRE(strstr(buf, "Test message 3") != NULL);
215edebbb8eSjmmv     atf_error_free(err);
216edebbb8eSjmmv }
217edebbb8eSjmmv 
218edebbb8eSjmmv /* ---------------------------------------------------------------------
219edebbb8eSjmmv  * Tests for the "no_memory" error.
220edebbb8eSjmmv  * --------------------------------------------------------------------- */
221edebbb8eSjmmv 
222edebbb8eSjmmv ATF_TC(no_memory_new);
ATF_TC_HEAD(no_memory_new,tc)223edebbb8eSjmmv ATF_TC_HEAD(no_memory_new, tc)
224edebbb8eSjmmv {
225edebbb8eSjmmv     atf_tc_set_md_var(tc, "descr", "Checks the construction of no_memory "
226edebbb8eSjmmv                       "errors");
227edebbb8eSjmmv }
ATF_TC_BODY(no_memory_new,tc)228edebbb8eSjmmv ATF_TC_BODY(no_memory_new, tc)
229edebbb8eSjmmv {
230edebbb8eSjmmv     atf_error_t err;
231edebbb8eSjmmv 
232edebbb8eSjmmv     err = atf_no_memory_error();
233edebbb8eSjmmv     ATF_REQUIRE(atf_error_is(err, "no_memory"));
234edebbb8eSjmmv     ATF_REQUIRE(atf_error_data(err) == NULL);
235edebbb8eSjmmv     atf_error_free(err);
236edebbb8eSjmmv }
237edebbb8eSjmmv 
238edebbb8eSjmmv ATF_TC(no_memory_format);
ATF_TC_HEAD(no_memory_format,tc)239edebbb8eSjmmv ATF_TC_HEAD(no_memory_format, tc)
240edebbb8eSjmmv {
241edebbb8eSjmmv     atf_tc_set_md_var(tc, "descr", "Checks the formatting of no_memory "
242edebbb8eSjmmv                       "errors");
243edebbb8eSjmmv }
ATF_TC_BODY(no_memory_format,tc)244edebbb8eSjmmv ATF_TC_BODY(no_memory_format, tc)
245edebbb8eSjmmv {
246edebbb8eSjmmv     atf_error_t err;
247edebbb8eSjmmv     char buf[1024];
248edebbb8eSjmmv 
249edebbb8eSjmmv     err = atf_no_memory_error();
250edebbb8eSjmmv     atf_error_format(err, buf, sizeof(buf));
251edebbb8eSjmmv     ATF_REQUIRE(strcmp(buf, "Not enough memory") == 0);
252edebbb8eSjmmv     atf_error_free(err);
253edebbb8eSjmmv }
254edebbb8eSjmmv 
255edebbb8eSjmmv ATF_TC(no_memory_twice);
ATF_TC_HEAD(no_memory_twice,tc)256edebbb8eSjmmv ATF_TC_HEAD(no_memory_twice, tc)
257edebbb8eSjmmv {
258edebbb8eSjmmv     atf_tc_set_md_var(tc, "descr", "Checks the construction of no_memory "
259edebbb8eSjmmv                       "errors multiple times, as this error is initialized "
260edebbb8eSjmmv                       "statically");
261edebbb8eSjmmv }
ATF_TC_BODY(no_memory_twice,tc)262edebbb8eSjmmv ATF_TC_BODY(no_memory_twice, tc)
263edebbb8eSjmmv {
264edebbb8eSjmmv     {
265edebbb8eSjmmv         atf_error_t err = atf_no_memory_error();
266edebbb8eSjmmv         ATF_REQUIRE(atf_error_is(err, "no_memory"));
267edebbb8eSjmmv         ATF_REQUIRE(atf_error_data(err) == NULL);
268edebbb8eSjmmv         atf_error_free(err);
269edebbb8eSjmmv     }
270edebbb8eSjmmv 
271edebbb8eSjmmv     {
272edebbb8eSjmmv         atf_error_t err = atf_no_memory_error();
273edebbb8eSjmmv         ATF_REQUIRE(atf_error_is(err, "no_memory"));
274edebbb8eSjmmv         ATF_REQUIRE(atf_error_data(err) == NULL);
275edebbb8eSjmmv         atf_error_free(err);
276edebbb8eSjmmv     }
277edebbb8eSjmmv }
278edebbb8eSjmmv 
279edebbb8eSjmmv /* ---------------------------------------------------------------------
280edebbb8eSjmmv  * Tests cases for the header file.
281edebbb8eSjmmv  * --------------------------------------------------------------------- */
282edebbb8eSjmmv 
283edebbb8eSjmmv HEADER_TC(include, "atf-c/error.h");
284edebbb8eSjmmv HEADER_TC(include_fwd, "atf-c/error_fwd.h");
285edebbb8eSjmmv 
286edebbb8eSjmmv /* ---------------------------------------------------------------------
287edebbb8eSjmmv  * Main.
288edebbb8eSjmmv  * --------------------------------------------------------------------- */
289edebbb8eSjmmv 
ATF_TP_ADD_TCS(tp)290edebbb8eSjmmv ATF_TP_ADD_TCS(tp)
291edebbb8eSjmmv {
292edebbb8eSjmmv     /* Add the tests for the "atf_error" type. */
293edebbb8eSjmmv     ATF_TP_ADD_TC(tp, error_new);
294edebbb8eSjmmv     ATF_TP_ADD_TC(tp, error_new_wo_memory);
295edebbb8eSjmmv     ATF_TP_ADD_TC(tp, no_error);
296edebbb8eSjmmv     ATF_TP_ADD_TC(tp, is_error);
297edebbb8eSjmmv     ATF_TP_ADD_TC(tp, format);
298edebbb8eSjmmv 
299edebbb8eSjmmv     /* Add the tests for the "libc" error. */
300edebbb8eSjmmv     ATF_TP_ADD_TC(tp, libc_new);
301edebbb8eSjmmv     ATF_TP_ADD_TC(tp, libc_format);
302edebbb8eSjmmv 
303edebbb8eSjmmv     /* Add the tests for the "no_memory" error. */
304edebbb8eSjmmv     ATF_TP_ADD_TC(tp, no_memory_new);
305edebbb8eSjmmv     ATF_TP_ADD_TC(tp, no_memory_format);
306edebbb8eSjmmv     ATF_TP_ADD_TC(tp, no_memory_twice);
307edebbb8eSjmmv 
308edebbb8eSjmmv     /* Add the test cases for the header file. */
309edebbb8eSjmmv     ATF_TP_ADD_TC(tp, include);
310edebbb8eSjmmv     ATF_TP_ADD_TC(tp, include_fwd);
311edebbb8eSjmmv 
312edebbb8eSjmmv     return atf_no_error();
313edebbb8eSjmmv }
314