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