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