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