t_strerror.c revision 1.4
11.4Schristos/* $NetBSD: t_strerror.c,v 1.4 2017/01/10 20:35:49 christos Exp $ */
21.1Sjruoho
31.1Sjruoho/*-
41.1Sjruoho * Copyright (c) 2011 The NetBSD Foundation, Inc.
51.1Sjruoho * All rights reserved.
61.1Sjruoho *
71.1Sjruoho * This code is derived from software contributed to The NetBSD Foundation
81.1Sjruoho * by Jukka Ruohonen.
91.1Sjruoho *
101.1Sjruoho * Redistribution and use in source and binary forms, with or without
111.1Sjruoho * modification, are permitted provided that the following conditions
121.1Sjruoho * are met:
131.1Sjruoho * 1. Redistributions of source code must retain the above copyright
141.1Sjruoho *    notice, this list of conditions and the following disclaimer.
151.1Sjruoho * 2. Redistributions in binary form must reproduce the above copyright
161.1Sjruoho *    notice, this list of conditions and the following disclaimer in the
171.1Sjruoho *    documentation and/or other materials provided with the distribution.
181.1Sjruoho *
191.1Sjruoho * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
201.1Sjruoho * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
211.1Sjruoho * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
221.1Sjruoho * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
231.1Sjruoho * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
241.1Sjruoho * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
251.1Sjruoho * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
261.1Sjruoho * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
271.1Sjruoho * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
281.1Sjruoho * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
291.1Sjruoho * POSSIBILITY OF SUCH DAMAGE.
301.1Sjruoho */
311.1Sjruoho#include <sys/cdefs.h>
321.4Schristos__RCSID("$NetBSD: t_strerror.c,v 1.4 2017/01/10 20:35:49 christos Exp $");
331.1Sjruoho
341.1Sjruoho#include <atf-c.h>
351.1Sjruoho#include <errno.h>
361.4Schristos#include <stdio.h>	/* Needed for sys_nerr on FreeBSD */
371.1Sjruoho#include <limits.h>
381.1Sjruoho#include <locale.h>
391.1Sjruoho#include <string.h>
401.1Sjruoho
411.1SjruohoATF_TC(strerror_basic);
421.1SjruohoATF_TC_HEAD(strerror_basic, tc)
431.1Sjruoho{
441.1Sjruoho	atf_tc_set_md_var(tc, "descr", "A basic test of strerror(3)");
451.1Sjruoho}
461.1Sjruoho
471.2SjruohoATF_TC_BODY(strerror_basic, tc)
481.2Sjruoho{
491.2Sjruoho	int i;
501.2Sjruoho
511.2Sjruoho	for (i = 1; i < sys_nerr; i++)
521.2Sjruoho		ATF_REQUIRE(strstr(strerror(i), "Unknown error:") == NULL);
531.2Sjruoho
541.2Sjruoho	for (; i < sys_nerr + 10; i++)
551.2Sjruoho		ATF_REQUIRE(strstr(strerror(i), "Unknown error:") != NULL);
561.2Sjruoho}
571.2Sjruoho
581.1SjruohoATF_TC(strerror_err);
591.1SjruohoATF_TC_HEAD(strerror_err, tc)
601.1Sjruoho{
611.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test errors from strerror(3)");
621.1Sjruoho}
631.1Sjruoho
641.1SjruohoATF_TC_BODY(strerror_err, tc)
651.1Sjruoho{
661.1Sjruoho
671.1Sjruoho	errno = 0;
681.1Sjruoho
691.1Sjruoho	ATF_REQUIRE(strstr(strerror(INT_MAX), "Unknown error:") != NULL);
701.1Sjruoho	ATF_REQUIRE(errno == EINVAL);
711.1Sjruoho
721.1Sjruoho	errno = 0;
731.1Sjruoho
741.1Sjruoho	ATF_REQUIRE(strstr(strerror(INT_MIN), "Unknown error:") != NULL);
751.1Sjruoho	ATF_REQUIRE(errno == EINVAL);
761.1Sjruoho}
771.1Sjruoho
781.1SjruohoATF_TC(strerror_r_basic);
791.1SjruohoATF_TC_HEAD(strerror_r_basic, tc)
801.1Sjruoho{
811.3Sjruoho	atf_tc_set_md_var(tc, "descr", "A basic test of strerror_r(3)");
821.1Sjruoho}
831.1Sjruoho
841.1SjruohoATF_TC_BODY(strerror_r_basic, tc)
851.1Sjruoho{
861.1Sjruoho	char buf[512];
871.1Sjruoho	int i;
881.1Sjruoho
891.1Sjruoho	for (i = 1; i < sys_nerr; i++) {
901.1Sjruoho		ATF_REQUIRE(strerror_r(i, buf, sizeof(buf)) == 0);
911.1Sjruoho		ATF_REQUIRE(strstr(buf, "Unknown error:") == NULL);
921.1Sjruoho	}
931.1Sjruoho
941.1Sjruoho	for (; i < sys_nerr + 10; i++) {
951.1Sjruoho		ATF_REQUIRE(strerror_r(i, buf, sizeof(buf)) == EINVAL);
961.1Sjruoho		ATF_REQUIRE(strstr(buf, "Unknown error:") != NULL);
971.1Sjruoho	}
981.1Sjruoho}
991.1Sjruoho
1001.1SjruohoATF_TC(strerror_r_err);
1011.1SjruohoATF_TC_HEAD(strerror_r_err, tc)
1021.1Sjruoho{
1031.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test errors from strerror_r(3)");
1041.1Sjruoho}
1051.1Sjruoho
1061.1SjruohoATF_TC_BODY(strerror_r_err, tc)
1071.1Sjruoho{
1081.1Sjruoho	char buf[512];
1091.1Sjruoho	int rv;
1101.1Sjruoho
1111.1Sjruoho	rv = strerror_r(EPERM, buf, 1);
1121.1Sjruoho	ATF_REQUIRE(rv == ERANGE);
1131.1Sjruoho
1141.1Sjruoho	rv = strerror_r(INT_MAX, buf, sizeof(buf));
1151.1Sjruoho
1161.1Sjruoho	ATF_REQUIRE(rv == EINVAL);
1171.1Sjruoho	ATF_REQUIRE(strstr(buf, "Unknown error:") != NULL);
1181.1Sjruoho
1191.1Sjruoho	rv = strerror_r(INT_MIN, buf, sizeof(buf));
1201.1Sjruoho
1211.1Sjruoho	ATF_REQUIRE(rv == EINVAL);
1221.1Sjruoho	ATF_REQUIRE(strstr(buf, "Unknown error:") != NULL);
1231.1Sjruoho}
1241.1Sjruoho
1251.1SjruohoATF_TP_ADD_TCS(tp)
1261.1Sjruoho{
1271.1Sjruoho
1281.1Sjruoho	(void)setlocale(LC_ALL, "C");
1291.1Sjruoho
1301.1Sjruoho	ATF_TP_ADD_TC(tp, strerror_basic);
1311.1Sjruoho	ATF_TP_ADD_TC(tp, strerror_err);
1321.1Sjruoho	ATF_TP_ADD_TC(tp, strerror_r_basic);
1331.1Sjruoho	ATF_TP_ADD_TC(tp, strerror_r_err);
1341.1Sjruoho
1351.1Sjruoho	return atf_no_error();
1361.1Sjruoho}
137