xref: /netbsd-src/tests/lib/libc/string/t_strerror.c (revision 7c2c9f2e62ea2b31b03030dcbb28ebdb7ff8b5f9)
1*7c2c9f2eSchristos /* $NetBSD: t_strerror.c,v 1.4 2017/01/10 20:35:49 christos Exp $ */
248b4c060Sjruoho 
348b4c060Sjruoho /*-
448b4c060Sjruoho  * Copyright (c) 2011 The NetBSD Foundation, Inc.
548b4c060Sjruoho  * All rights reserved.
648b4c060Sjruoho  *
748b4c060Sjruoho  * This code is derived from software contributed to The NetBSD Foundation
848b4c060Sjruoho  * by Jukka Ruohonen.
948b4c060Sjruoho  *
1048b4c060Sjruoho  * Redistribution and use in source and binary forms, with or without
1148b4c060Sjruoho  * modification, are permitted provided that the following conditions
1248b4c060Sjruoho  * are met:
1348b4c060Sjruoho  * 1. Redistributions of source code must retain the above copyright
1448b4c060Sjruoho  *    notice, this list of conditions and the following disclaimer.
1548b4c060Sjruoho  * 2. Redistributions in binary form must reproduce the above copyright
1648b4c060Sjruoho  *    notice, this list of conditions and the following disclaimer in the
1748b4c060Sjruoho  *    documentation and/or other materials provided with the distribution.
1848b4c060Sjruoho  *
1948b4c060Sjruoho  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2048b4c060Sjruoho  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2148b4c060Sjruoho  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2248b4c060Sjruoho  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2348b4c060Sjruoho  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2448b4c060Sjruoho  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2548b4c060Sjruoho  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2648b4c060Sjruoho  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2748b4c060Sjruoho  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2848b4c060Sjruoho  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2948b4c060Sjruoho  * POSSIBILITY OF SUCH DAMAGE.
3048b4c060Sjruoho  */
3148b4c060Sjruoho #include <sys/cdefs.h>
32*7c2c9f2eSchristos __RCSID("$NetBSD: t_strerror.c,v 1.4 2017/01/10 20:35:49 christos Exp $");
3348b4c060Sjruoho 
3448b4c060Sjruoho #include <atf-c.h>
3548b4c060Sjruoho #include <errno.h>
36*7c2c9f2eSchristos #include <stdio.h>	/* Needed for sys_nerr on FreeBSD */
3748b4c060Sjruoho #include <limits.h>
3848b4c060Sjruoho #include <locale.h>
3948b4c060Sjruoho #include <string.h>
4048b4c060Sjruoho 
4148b4c060Sjruoho ATF_TC(strerror_basic);
ATF_TC_HEAD(strerror_basic,tc)4248b4c060Sjruoho ATF_TC_HEAD(strerror_basic, tc)
4348b4c060Sjruoho {
4448b4c060Sjruoho 	atf_tc_set_md_var(tc, "descr", "A basic test of strerror(3)");
4548b4c060Sjruoho }
4648b4c060Sjruoho 
ATF_TC_BODY(strerror_basic,tc)47aab71b6eSjruoho ATF_TC_BODY(strerror_basic, tc)
48aab71b6eSjruoho {
49aab71b6eSjruoho 	int i;
50aab71b6eSjruoho 
51aab71b6eSjruoho 	for (i = 1; i < sys_nerr; i++)
52aab71b6eSjruoho 		ATF_REQUIRE(strstr(strerror(i), "Unknown error:") == NULL);
53aab71b6eSjruoho 
54aab71b6eSjruoho 	for (; i < sys_nerr + 10; i++)
55aab71b6eSjruoho 		ATF_REQUIRE(strstr(strerror(i), "Unknown error:") != NULL);
56aab71b6eSjruoho }
57aab71b6eSjruoho 
5848b4c060Sjruoho ATF_TC(strerror_err);
ATF_TC_HEAD(strerror_err,tc)5948b4c060Sjruoho ATF_TC_HEAD(strerror_err, tc)
6048b4c060Sjruoho {
6148b4c060Sjruoho 	atf_tc_set_md_var(tc, "descr", "Test errors from strerror(3)");
6248b4c060Sjruoho }
6348b4c060Sjruoho 
ATF_TC_BODY(strerror_err,tc)6448b4c060Sjruoho ATF_TC_BODY(strerror_err, tc)
6548b4c060Sjruoho {
6648b4c060Sjruoho 
6748b4c060Sjruoho 	errno = 0;
6848b4c060Sjruoho 
6948b4c060Sjruoho 	ATF_REQUIRE(strstr(strerror(INT_MAX), "Unknown error:") != NULL);
7048b4c060Sjruoho 	ATF_REQUIRE(errno == EINVAL);
7148b4c060Sjruoho 
7248b4c060Sjruoho 	errno = 0;
7348b4c060Sjruoho 
7448b4c060Sjruoho 	ATF_REQUIRE(strstr(strerror(INT_MIN), "Unknown error:") != NULL);
7548b4c060Sjruoho 	ATF_REQUIRE(errno == EINVAL);
7648b4c060Sjruoho }
7748b4c060Sjruoho 
7848b4c060Sjruoho ATF_TC(strerror_r_basic);
ATF_TC_HEAD(strerror_r_basic,tc)7948b4c060Sjruoho ATF_TC_HEAD(strerror_r_basic, tc)
8048b4c060Sjruoho {
81ac31bc57Sjruoho 	atf_tc_set_md_var(tc, "descr", "A basic test of strerror_r(3)");
8248b4c060Sjruoho }
8348b4c060Sjruoho 
ATF_TC_BODY(strerror_r_basic,tc)8448b4c060Sjruoho ATF_TC_BODY(strerror_r_basic, tc)
8548b4c060Sjruoho {
8648b4c060Sjruoho 	char buf[512];
8748b4c060Sjruoho 	int i;
8848b4c060Sjruoho 
8948b4c060Sjruoho 	for (i = 1; i < sys_nerr; i++) {
9048b4c060Sjruoho 		ATF_REQUIRE(strerror_r(i, buf, sizeof(buf)) == 0);
9148b4c060Sjruoho 		ATF_REQUIRE(strstr(buf, "Unknown error:") == NULL);
9248b4c060Sjruoho 	}
9348b4c060Sjruoho 
9448b4c060Sjruoho 	for (; i < sys_nerr + 10; i++) {
9548b4c060Sjruoho 		ATF_REQUIRE(strerror_r(i, buf, sizeof(buf)) == EINVAL);
9648b4c060Sjruoho 		ATF_REQUIRE(strstr(buf, "Unknown error:") != NULL);
9748b4c060Sjruoho 	}
9848b4c060Sjruoho }
9948b4c060Sjruoho 
10048b4c060Sjruoho ATF_TC(strerror_r_err);
ATF_TC_HEAD(strerror_r_err,tc)10148b4c060Sjruoho ATF_TC_HEAD(strerror_r_err, tc)
10248b4c060Sjruoho {
10348b4c060Sjruoho 	atf_tc_set_md_var(tc, "descr", "Test errors from strerror_r(3)");
10448b4c060Sjruoho }
10548b4c060Sjruoho 
ATF_TC_BODY(strerror_r_err,tc)10648b4c060Sjruoho ATF_TC_BODY(strerror_r_err, tc)
10748b4c060Sjruoho {
10848b4c060Sjruoho 	char buf[512];
10948b4c060Sjruoho 	int rv;
11048b4c060Sjruoho 
11148b4c060Sjruoho 	rv = strerror_r(EPERM, buf, 1);
11248b4c060Sjruoho 	ATF_REQUIRE(rv == ERANGE);
11348b4c060Sjruoho 
11448b4c060Sjruoho 	rv = strerror_r(INT_MAX, buf, sizeof(buf));
11548b4c060Sjruoho 
11648b4c060Sjruoho 	ATF_REQUIRE(rv == EINVAL);
11748b4c060Sjruoho 	ATF_REQUIRE(strstr(buf, "Unknown error:") != NULL);
11848b4c060Sjruoho 
11948b4c060Sjruoho 	rv = strerror_r(INT_MIN, buf, sizeof(buf));
12048b4c060Sjruoho 
12148b4c060Sjruoho 	ATF_REQUIRE(rv == EINVAL);
12248b4c060Sjruoho 	ATF_REQUIRE(strstr(buf, "Unknown error:") != NULL);
12348b4c060Sjruoho }
12448b4c060Sjruoho 
ATF_TP_ADD_TCS(tp)12548b4c060Sjruoho ATF_TP_ADD_TCS(tp)
12648b4c060Sjruoho {
12748b4c060Sjruoho 
12848b4c060Sjruoho 	(void)setlocale(LC_ALL, "C");
12948b4c060Sjruoho 
13048b4c060Sjruoho 	ATF_TP_ADD_TC(tp, strerror_basic);
13148b4c060Sjruoho 	ATF_TP_ADD_TC(tp, strerror_err);
13248b4c060Sjruoho 	ATF_TP_ADD_TC(tp, strerror_r_basic);
13348b4c060Sjruoho 	ATF_TP_ADD_TC(tp, strerror_r_err);
13448b4c060Sjruoho 
13548b4c060Sjruoho 	return atf_no_error();
13648b4c060Sjruoho }
137