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