Path: blob/main/lib/libc/tests/gen/sig2str_test.c
105377 views
/*-1* SPDX-License-Identifier: BSD-2-Clause2*3* Copyright (c) 2025 Ricardo Branco <[email protected]>4* All rights reserved.5*6* Redistribution and use in source and binary forms, with or without7* modification, are permitted provided that the following conditions8* are met:9* 1. Redistributions of source code must retain the above copyright10* notice, this list of conditions and the following disclaimer.11* 2. Redistributions in binary form must reproduce the above copyright12* notice, this list of conditions and the following disclaimer in the13* documentation and/or other materials provided with the distribution.14*15* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND16* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE17* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE18* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE19* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL20* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS21* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)22* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT23* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY24* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF25* SUCH DAMAGE.26*/2728#include <ctype.h>29#include <errno.h>30#include <signal.h>31#include <stdio.h>32#include <string.h>3334#include <atf-c.h>3536static void37test_roundtrip(int signum)38{39char str[SIG2STR_MAX];40int sig;4142ATF_REQUIRE_EQ_MSG(sig2str(signum, str), 0,43"sig2str(%d) failed", signum);44ATF_REQUIRE_EQ_MSG(str2sig(str, &sig), 0,45"str2sig(\"%s\") failed", str);46ATF_REQUIRE_INTEQ_MSG(sig, signum,47"Mismatch: roundtrip conversion gave %d instead of %d",48sig, signum);49}5051ATF_TC_WITHOUT_HEAD(sig2str_valid);52ATF_TC_BODY(sig2str_valid, tc)53{54int sig;5556for (sig = 1; sig < sys_nsig; sig++) {57test_roundtrip(sig);58}59}6061ATF_TC_WITHOUT_HEAD(sig2str_invalid);62ATF_TC_BODY(sig2str_invalid, tc)63{64char buf[SIG2STR_MAX];6566ATF_CHECK(sig2str(0, buf) != 0);67ATF_CHECK(sig2str(-1, buf) != 0);68ATF_CHECK(sig2str(SIGRTMAX + 1, buf) != 0);69}7071ATF_TC_WITHOUT_HEAD(str2sig_rtmin_rtmax);72ATF_TC_BODY(str2sig_rtmin_rtmax, tc)73{74int sig;7576ATF_CHECK_MSG(str2sig("RTMIN", &sig) == 0,77"str2sig(\"RTMIN\") failed");78ATF_CHECK_INTEQ_MSG(sig, SIGRTMIN,79"RTMIN mapped to %d, expected %d", sig, SIGRTMIN);8081ATF_CHECK_MSG(str2sig("RTMAX", &sig) == 0,82"str2sig(\"RTMAX\") failed");83ATF_CHECK_INTEQ_MSG(sig, SIGRTMAX,84"RTMAX mapped to %d, expected %d", sig, SIGRTMAX);8586ATF_CHECK_MSG(str2sig("RTMIN+1", &sig) == 0,87"str2sig(\"RTMIN+1\") failed");88ATF_CHECK_INTEQ_MSG(sig, SIGRTMIN + 1,89"RTMIN+1 mapped to %d, expected %d", sig, SIGRTMIN + 1);9091ATF_CHECK_MSG(str2sig("RTMAX-1", &sig) == 0,92"str2sig(\"RTMAX-1\") failed");93ATF_CHECK_INTEQ_MSG(sig, SIGRTMAX - 1,94"RTMAX-1 mapped to %d, expected %d", sig, SIGRTMAX - 1);95}9697ATF_TC_WITHOUT_HEAD(str2sig_invalid_rt);98ATF_TC_BODY(str2sig_invalid_rt, tc)99{100int i, sig;101102const char *invalid[] = {103"RTMIN+0",104"RTMAX-0",105"RTMIN-777",106"RTMIN+777",107"RTMAX-777",108"RTMAX+777",109"RTMIN-",110"RTMAX-",111"RTMIN0",112"RTMAX1",113"RTMIN+abc",114"RTMIN-abc",115NULL116};117118for (i = 0; invalid[i] != NULL; i++) {119ATF_CHECK_MSG(str2sig(invalid[i], &sig) != 0,120"str2sig(\"%s\") unexpectedly succeeded", invalid[i]);121}122}123124ATF_TC_WITHOUT_HEAD(str2sig_fullname);125ATF_TC_BODY(str2sig_fullname, tc)126{127char fullname[SIG2STR_MAX + 3];128int n, sig;129130for (sig = 1; sig < sys_nsig; sig++) {131snprintf(fullname, sizeof(fullname), "SIG%s", sys_signame[sig]);132133ATF_CHECK_MSG(str2sig(fullname, &n) == 0,134"str2sig(\"%s\") failed with errno %d (%s)",135fullname, errno, strerror(errno));136137ATF_CHECK_INTEQ_MSG(n, sig,138"Mismatch: %s = %d, str2sig(\"%s\") = %d",139sys_signame[sig], sig, fullname, n);140}141}142143ATF_TC_WITHOUT_HEAD(str2sig_lowercase);144ATF_TC_BODY(str2sig_lowercase, tc)145{146char fullname[SIG2STR_MAX + 3];147int n, sig;148149for (sig = 1; sig < sys_nsig; sig++) {150snprintf(fullname, sizeof(fullname), "sig%s", sys_signame[sig]);151for (size_t i = 3; i < strlen(fullname); i++)152fullname[i] = toupper((unsigned char)fullname[i]);153154ATF_CHECK_MSG(str2sig(fullname, &n) == 0,155"str2sig(\"%s\") failed with errno %d (%s)",156fullname, errno, strerror(errno));157158ATF_CHECK_INTEQ_MSG(n, sig,159"Mismatch: %s = %d, str2sig(\"%s\") = %d",160sys_signame[sig], sig, fullname, n);161}162}163164ATF_TC_WITHOUT_HEAD(str2sig_numeric);165ATF_TC_BODY(str2sig_numeric, tc)166{167char buf[16];168int n, sig;169170for (sig = NSIG; sig < SIGRTMIN; sig++) {171snprintf(buf, sizeof(buf), "%d", sig);172ATF_CHECK_MSG(str2sig(buf, &n) == 0,173"str2sig(\"%s\") failed", buf);174ATF_CHECK_INTEQ_MSG(n, sig,175"Mismatch: str2sig(\"%s\") = %d, expected %d",176buf, n, sig);177}178}179180ATF_TC_WITHOUT_HEAD(str2sig_invalid);181ATF_TC_BODY(str2sig_invalid, tc)182{183const char *invalid[] = {184"SIGDOESNOTEXIST",185"DOESNOTEXIST",186"INTERRUPT",187"",188"SIG",189"123abc",190"sig1extra",191NULL192};193int i, sig;194195for (i = 0; invalid[i] != NULL; i++) {196ATF_CHECK_MSG(str2sig(invalid[i], &sig) != 0,197"str2sig(\"%s\") unexpectedly succeeded", invalid[i]);198}199}200201ATF_TP_ADD_TCS(tp)202{203ATF_TP_ADD_TC(tp, sig2str_valid);204ATF_TP_ADD_TC(tp, sig2str_invalid);205ATF_TP_ADD_TC(tp, str2sig_rtmin_rtmax);206ATF_TP_ADD_TC(tp, str2sig_invalid_rt);207ATF_TP_ADD_TC(tp, str2sig_fullname);208ATF_TP_ADD_TC(tp, str2sig_lowercase);209ATF_TP_ADD_TC(tp, str2sig_numeric);210ATF_TP_ADD_TC(tp, str2sig_invalid);211return (atf_no_error());212}213214215