xref: /src/lib/libc/tests/string/strerror_test.c (revision b3e7694832e81d7a904a10f525f8797b753bf0d3)
1347267dcSEnji Cooper /*-
2347267dcSEnji Cooper  * Copyright (c) 2001 Wes Peters <wes@FreeBSD.org>
3347267dcSEnji Cooper  * All rights reserved.
4347267dcSEnji Cooper  *
5347267dcSEnji Cooper  * Redistribution and use in source and binary forms, with or without
6347267dcSEnji Cooper  * modification, are permitted provided that the following conditions
7347267dcSEnji Cooper  * are met:
8347267dcSEnji Cooper  * 1. Redistributions of source code must retain the above copyright
9347267dcSEnji Cooper  *    notice, this list of conditions and the following disclaimer.
10347267dcSEnji Cooper  * 2. Redistributions in binary form must reproduce the above copyright
11347267dcSEnji Cooper  *    notice, this list of conditions and the following disclaimer in the
12347267dcSEnji Cooper  *    documentation and/or other materials provided with the distribution.
13347267dcSEnji Cooper  *
14347267dcSEnji Cooper  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15347267dcSEnji Cooper  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16347267dcSEnji Cooper  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17347267dcSEnji Cooper  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18347267dcSEnji Cooper  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19347267dcSEnji Cooper  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20347267dcSEnji Cooper  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21347267dcSEnji Cooper  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22347267dcSEnji Cooper  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23347267dcSEnji Cooper  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24347267dcSEnji Cooper  * SUCH DAMAGE.
25347267dcSEnji Cooper  */
26347267dcSEnji Cooper 
27347267dcSEnji Cooper #include <assert.h>
28347267dcSEnji Cooper #include <errno.h>
29347267dcSEnji Cooper #include <limits.h>
30347267dcSEnji Cooper #include <stdio.h>
31347267dcSEnji Cooper #include <stdlib.h>
32347267dcSEnji Cooper #include <string.h>
33347267dcSEnji Cooper 
34347267dcSEnji Cooper #include <atf-c.h>
35347267dcSEnji Cooper 
36347267dcSEnji Cooper static char buf[64];
37347267dcSEnji Cooper static char *sret;
38347267dcSEnji Cooper static int iret;
39347267dcSEnji Cooper 
40347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_unknown_error);
ATF_TC_BODY(strerror_unknown_error,tc)41347267dcSEnji Cooper ATF_TC_BODY(strerror_unknown_error, tc)
42347267dcSEnji Cooper {
43347267dcSEnji Cooper 
44347267dcSEnji Cooper 	errno = 0;
45347267dcSEnji Cooper 	sret = strerror(INT_MAX);
46347267dcSEnji Cooper 	snprintf(buf, sizeof(buf), "Unknown error: %d", INT_MAX);
47347267dcSEnji Cooper 	ATF_CHECK(strcmp(sret, buf) == 0);
48347267dcSEnji Cooper 	ATF_CHECK(errno == EINVAL);
49347267dcSEnji Cooper }
50347267dcSEnji Cooper 
51347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_no_error);
ATF_TC_BODY(strerror_no_error,tc)52347267dcSEnji Cooper ATF_TC_BODY(strerror_no_error, tc)
53347267dcSEnji Cooper {
54347267dcSEnji Cooper 
55347267dcSEnji Cooper 	errno = 0;
56347267dcSEnji Cooper 	sret = strerror(0);
57347267dcSEnji Cooper 	ATF_CHECK(strcmp(sret, "No error: 0") == 0);
58347267dcSEnji Cooper 	ATF_CHECK(errno == 0);
59347267dcSEnji Cooper }
60347267dcSEnji Cooper 
61347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_EPERM_test);
ATF_TC_BODY(strerror_EPERM_test,tc)62347267dcSEnji Cooper ATF_TC_BODY(strerror_EPERM_test, tc)
63347267dcSEnji Cooper {
64347267dcSEnji Cooper 
65347267dcSEnji Cooper 	errno = 0;
66347267dcSEnji Cooper 	sret = strerror(EPERM);
67347267dcSEnji Cooper 	ATF_CHECK(strcmp(sret, "Operation not permitted") == 0);
68347267dcSEnji Cooper 	ATF_CHECK(errno == 0);
69347267dcSEnji Cooper }
70347267dcSEnji Cooper 
71347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_EPFNOSUPPORT_test);
ATF_TC_BODY(strerror_EPFNOSUPPORT_test,tc)72347267dcSEnji Cooper ATF_TC_BODY(strerror_EPFNOSUPPORT_test, tc)
73347267dcSEnji Cooper {
74347267dcSEnji Cooper 
75347267dcSEnji Cooper 	errno = 0;
76347267dcSEnji Cooper 	sret = strerror(EPFNOSUPPORT);
77347267dcSEnji Cooper 	ATF_CHECK(strcmp(sret, "Protocol family not supported") == 0);
78347267dcSEnji Cooper 	ATF_CHECK(errno == 0);
79347267dcSEnji Cooper }
80347267dcSEnji Cooper 
81347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_ELAST_test);
ATF_TC_BODY(strerror_ELAST_test,tc)82347267dcSEnji Cooper ATF_TC_BODY(strerror_ELAST_test, tc)
83347267dcSEnji Cooper {
84347267dcSEnji Cooper 
85347267dcSEnji Cooper 	errno = 0;
86347267dcSEnji Cooper 	sret = strerror(ELAST);
87347267dcSEnji Cooper 	ATF_CHECK(errno == 0);
88347267dcSEnji Cooper }
89347267dcSEnji Cooper 
90347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_r__unknown_error);
ATF_TC_BODY(strerror_r__unknown_error,tc)91347267dcSEnji Cooper ATF_TC_BODY(strerror_r__unknown_error, tc)
92347267dcSEnji Cooper {
93347267dcSEnji Cooper 
94347267dcSEnji Cooper 	memset(buf, '*', sizeof(buf));
95347267dcSEnji Cooper 	iret = strerror_r(-1, buf, sizeof(buf));
96347267dcSEnji Cooper 	ATF_CHECK(strcmp(buf, "Unknown error: -1") == 0);
97347267dcSEnji Cooper 	ATF_CHECK(iret == EINVAL);
98347267dcSEnji Cooper }
99347267dcSEnji Cooper 
100347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_r__EPERM_one_byte_short);
ATF_TC_BODY(strerror_r__EPERM_one_byte_short,tc)101347267dcSEnji Cooper ATF_TC_BODY(strerror_r__EPERM_one_byte_short, tc)
102347267dcSEnji Cooper {
103347267dcSEnji Cooper 
104347267dcSEnji Cooper 	memset(buf, '*', sizeof(buf));
105347267dcSEnji Cooper 	/* One byte too short. */
106347267dcSEnji Cooper 	iret = strerror_r(EPERM, buf, strlen("Operation not permitted"));
107347267dcSEnji Cooper 	ATF_CHECK(strcmp(buf, "Operation not permitte") == 0);
108347267dcSEnji Cooper 	ATF_CHECK(iret == ERANGE);
109347267dcSEnji Cooper }
110347267dcSEnji Cooper 
111347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_r__EPERM_unknown_error_one_byte_short);
ATF_TC_BODY(strerror_r__EPERM_unknown_error_one_byte_short,tc)112347267dcSEnji Cooper ATF_TC_BODY(strerror_r__EPERM_unknown_error_one_byte_short, tc)
113347267dcSEnji Cooper {
114347267dcSEnji Cooper 
115347267dcSEnji Cooper 	memset(buf, '*', sizeof(buf));
116347267dcSEnji Cooper 	/* One byte too short. */
117347267dcSEnji Cooper 	iret = strerror_r(-1, buf, strlen("Unknown error: -1"));
118347267dcSEnji Cooper 	ATF_CHECK(strcmp(buf, "Unknown error: -") == 0);
119347267dcSEnji Cooper 	ATF_CHECK(iret == EINVAL);
120347267dcSEnji Cooper }
121347267dcSEnji Cooper 
122347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_r__EPERM_unknown_error_two_bytes_short);
ATF_TC_BODY(strerror_r__EPERM_unknown_error_two_bytes_short,tc)123347267dcSEnji Cooper ATF_TC_BODY(strerror_r__EPERM_unknown_error_two_bytes_short, tc)
124347267dcSEnji Cooper {
125347267dcSEnji Cooper 
126347267dcSEnji Cooper 	memset(buf, '*', sizeof(buf));
127347267dcSEnji Cooper 	/* Two bytes too short. */
128347267dcSEnji Cooper 	iret = strerror_r(-2, buf, strlen("Unknown error: -2") - 1);
129347267dcSEnji Cooper 	ATF_CHECK(strcmp(buf, "Unknown error: ") == 0);
130347267dcSEnji Cooper 	ATF_CHECK(iret == EINVAL);
131347267dcSEnji Cooper }
132347267dcSEnji Cooper 
133347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_r__EPERM_unknown_error_three_bytes_short);
ATF_TC_BODY(strerror_r__EPERM_unknown_error_three_bytes_short,tc)134347267dcSEnji Cooper ATF_TC_BODY(strerror_r__EPERM_unknown_error_three_bytes_short, tc)
135347267dcSEnji Cooper {
136347267dcSEnji Cooper 
137347267dcSEnji Cooper 	memset(buf, '*', sizeof(buf));
138347267dcSEnji Cooper 	/* Three bytes too short. */
139347267dcSEnji Cooper 	iret = strerror_r(-2, buf, strlen("Unknown error: -2") - 2);
140347267dcSEnji Cooper 	ATF_CHECK(strcmp(buf, "Unknown error:") == 0);
141347267dcSEnji Cooper 	ATF_CHECK(iret == EINVAL);
142347267dcSEnji Cooper }
143347267dcSEnji Cooper 
144347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_r__EPERM_unknown_error_12345_one_byte_short);
ATF_TC_BODY(strerror_r__EPERM_unknown_error_12345_one_byte_short,tc)145347267dcSEnji Cooper ATF_TC_BODY(strerror_r__EPERM_unknown_error_12345_one_byte_short, tc)
146347267dcSEnji Cooper {
147347267dcSEnji Cooper 
148347267dcSEnji Cooper 	memset(buf, '*', sizeof(buf));
149347267dcSEnji Cooper 	/* One byte too short. */
150347267dcSEnji Cooper 	iret = strerror_r(12345, buf, strlen("Unknown error: 12345"));
151347267dcSEnji Cooper 	ATF_CHECK(strcmp(buf, "Unknown error: 1234") == 0);
152347267dcSEnji Cooper 	ATF_CHECK(iret == EINVAL);
153347267dcSEnji Cooper }
154347267dcSEnji Cooper 
155347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_r__no_error);
ATF_TC_BODY(strerror_r__no_error,tc)156347267dcSEnji Cooper ATF_TC_BODY(strerror_r__no_error, tc)
157347267dcSEnji Cooper {
158347267dcSEnji Cooper 
159347267dcSEnji Cooper 	memset(buf, '*', sizeof(buf));
160347267dcSEnji Cooper 	iret = strerror_r(0, buf, sizeof(buf));
161347267dcSEnji Cooper 	ATF_CHECK(strcmp(buf, "No error: 0") == 0);
162347267dcSEnji Cooper 	ATF_CHECK(iret == 0);
163347267dcSEnji Cooper }
164347267dcSEnji Cooper 
165347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_r__EDEADLK);
ATF_TC_BODY(strerror_r__EDEADLK,tc)166347267dcSEnji Cooper ATF_TC_BODY(strerror_r__EDEADLK, tc)
167347267dcSEnji Cooper {
168347267dcSEnji Cooper 
169347267dcSEnji Cooper 	memset(buf, '*', sizeof(buf));
170347267dcSEnji Cooper 	iret = strerror_r(EDEADLK, buf, sizeof(buf));
171347267dcSEnji Cooper 	ATF_CHECK(strcmp(buf, "Resource deadlock avoided") == 0);
172347267dcSEnji Cooper 	ATF_CHECK(iret == 0);
173347267dcSEnji Cooper }
174347267dcSEnji Cooper 
175347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_r__EPROCLIM);
ATF_TC_BODY(strerror_r__EPROCLIM,tc)176347267dcSEnji Cooper ATF_TC_BODY(strerror_r__EPROCLIM, tc)
177347267dcSEnji Cooper {
178347267dcSEnji Cooper 
179347267dcSEnji Cooper 	memset(buf, '*', sizeof(buf));
180347267dcSEnji Cooper 	iret = strerror_r(EPROCLIM, buf, sizeof(buf));
181347267dcSEnji Cooper 	ATF_CHECK(strcmp(buf, "Too many processes") == 0);
182347267dcSEnji Cooper 	ATF_CHECK(iret == 0);
183347267dcSEnji Cooper }
184347267dcSEnji Cooper 
ATF_TP_ADD_TCS(tp)185347267dcSEnji Cooper ATF_TP_ADD_TCS(tp)
186347267dcSEnji Cooper {
187347267dcSEnji Cooper 
188347267dcSEnji Cooper 	ATF_TP_ADD_TC(tp, strerror_unknown_error);
189347267dcSEnji Cooper 	ATF_TP_ADD_TC(tp, strerror_no_error);
190347267dcSEnji Cooper 	ATF_TP_ADD_TC(tp, strerror_EPERM_test);
191347267dcSEnji Cooper 	ATF_TP_ADD_TC(tp, strerror_EPFNOSUPPORT_test);
192347267dcSEnji Cooper 	ATF_TP_ADD_TC(tp, strerror_ELAST_test);
193347267dcSEnji Cooper 	ATF_TP_ADD_TC(tp, strerror_r__unknown_error);
194347267dcSEnji Cooper 	ATF_TP_ADD_TC(tp, strerror_r__EPERM_one_byte_short);
195347267dcSEnji Cooper 	ATF_TP_ADD_TC(tp, strerror_r__EPERM_unknown_error_one_byte_short);
196347267dcSEnji Cooper 	ATF_TP_ADD_TC(tp, strerror_r__EPERM_unknown_error_two_bytes_short);
197347267dcSEnji Cooper 	ATF_TP_ADD_TC(tp, strerror_r__EPERM_unknown_error_three_bytes_short);
198347267dcSEnji Cooper 	ATF_TP_ADD_TC(tp, strerror_r__EPERM_unknown_error_12345_one_byte_short);
199347267dcSEnji Cooper 	ATF_TP_ADD_TC(tp, strerror_r__no_error);
200347267dcSEnji Cooper 	ATF_TP_ADD_TC(tp, strerror_r__EDEADLK);
201347267dcSEnji Cooper 	ATF_TP_ADD_TC(tp, strerror_r__EPROCLIM);
202347267dcSEnji Cooper 
203347267dcSEnji Cooper 	return (atf_no_error());
204347267dcSEnji Cooper }
205