1*34c8ff42Sjruoho /* $NetBSD: t_alarm.c,v 1.2 2011/05/10 06:58:17 jruoho Exp $ */
20bd56749Sjruoho
30bd56749Sjruoho /*-
40bd56749Sjruoho * Copyright (c) 2011 The NetBSD Foundation, Inc.
50bd56749Sjruoho * All rights reserved.
60bd56749Sjruoho *
70bd56749Sjruoho * This code is derived from software contributed to The NetBSD Foundation
80bd56749Sjruoho * by Jukka Ruohonen.
90bd56749Sjruoho *
100bd56749Sjruoho * Redistribution and use in source and binary forms, with or without
110bd56749Sjruoho * modification, are permitted provided that the following conditions
120bd56749Sjruoho * are met:
130bd56749Sjruoho * 1. Redistributions of source code must retain the above copyright
140bd56749Sjruoho * notice, this list of conditions and the following disclaimer.
150bd56749Sjruoho * 2. Redistributions in binary form must reproduce the above copyright
160bd56749Sjruoho * notice, this list of conditions and the following disclaimer in the
170bd56749Sjruoho * documentation and/or other materials provided with the distribution.
180bd56749Sjruoho *
190bd56749Sjruoho * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
200bd56749Sjruoho * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
210bd56749Sjruoho * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
220bd56749Sjruoho * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
230bd56749Sjruoho * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
240bd56749Sjruoho * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
250bd56749Sjruoho * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
260bd56749Sjruoho * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
270bd56749Sjruoho * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
280bd56749Sjruoho * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
290bd56749Sjruoho * POSSIBILITY OF SUCH DAMAGE.
300bd56749Sjruoho */
310bd56749Sjruoho #include <sys/cdefs.h>
32*34c8ff42Sjruoho __RCSID("$NetBSD: t_alarm.c,v 1.2 2011/05/10 06:58:17 jruoho Exp $");
330bd56749Sjruoho
340bd56749Sjruoho #include <sys/wait.h>
350bd56749Sjruoho
360bd56749Sjruoho #include <atf-c.h>
370bd56749Sjruoho #include <stdlib.h>
380bd56749Sjruoho #include <signal.h>
390bd56749Sjruoho #include <unistd.h>
400bd56749Sjruoho
410bd56749Sjruoho static bool fail;
420bd56749Sjruoho static void handler(int);
430bd56749Sjruoho
440bd56749Sjruoho static void
handler(int signo)450bd56749Sjruoho handler(int signo)
460bd56749Sjruoho {
470bd56749Sjruoho
480bd56749Sjruoho if (signo == SIGALRM)
490bd56749Sjruoho fail = false;
500bd56749Sjruoho }
510bd56749Sjruoho
520bd56749Sjruoho ATF_TC(alarm_basic);
ATF_TC_HEAD(alarm_basic,tc)530bd56749Sjruoho ATF_TC_HEAD(alarm_basic, tc)
540bd56749Sjruoho {
55*34c8ff42Sjruoho atf_tc_set_md_var(tc, "descr", "A basic test of alarm(3)");
560bd56749Sjruoho }
570bd56749Sjruoho
ATF_TC_BODY(alarm_basic,tc)580bd56749Sjruoho ATF_TC_BODY(alarm_basic, tc)
590bd56749Sjruoho {
600bd56749Sjruoho
610bd56749Sjruoho ATF_REQUIRE(signal(SIGALRM, handler) == 0);
620bd56749Sjruoho
630bd56749Sjruoho fail = true;
640bd56749Sjruoho
650bd56749Sjruoho (void)alarm(1);
660bd56749Sjruoho (void)sleep(2);
670bd56749Sjruoho
680bd56749Sjruoho if (fail != false)
690bd56749Sjruoho atf_tc_fail("alarm(3) failed to deliver signal");
700bd56749Sjruoho }
710bd56749Sjruoho
720bd56749Sjruoho ATF_TC(alarm_fork);
ATF_TC_HEAD(alarm_fork,tc)730bd56749Sjruoho ATF_TC_HEAD(alarm_fork, tc)
740bd56749Sjruoho {
750bd56749Sjruoho atf_tc_set_md_var(tc, "descr", "Does fork(2) clear a pending alarm?");
760bd56749Sjruoho }
770bd56749Sjruoho
ATF_TC_BODY(alarm_fork,tc)780bd56749Sjruoho ATF_TC_BODY(alarm_fork, tc)
790bd56749Sjruoho {
800bd56749Sjruoho unsigned int rv;
810bd56749Sjruoho pid_t pid;
820bd56749Sjruoho int sta;
830bd56749Sjruoho
840bd56749Sjruoho /*
850bd56749Sjruoho * Any pending alarms should be
860bd56749Sjruoho * cleared in the child process.
870bd56749Sjruoho */
880bd56749Sjruoho (void)alarm(60);
890bd56749Sjruoho
900bd56749Sjruoho pid = fork();
910bd56749Sjruoho ATF_REQUIRE(pid >= 0);
920bd56749Sjruoho
930bd56749Sjruoho if (pid == 0) {
940bd56749Sjruoho
950bd56749Sjruoho rv = alarm(0);
960bd56749Sjruoho
970bd56749Sjruoho if (rv != 0)
980bd56749Sjruoho _exit(EXIT_FAILURE);
990bd56749Sjruoho
1000bd56749Sjruoho _exit(EXIT_SUCCESS);
1010bd56749Sjruoho }
1020bd56749Sjruoho
1030bd56749Sjruoho (void)alarm(0);
1040bd56749Sjruoho (void)wait(&sta);
1050bd56749Sjruoho
1060bd56749Sjruoho if (WIFEXITED(sta) == 0 || WEXITSTATUS(sta) != EXIT_SUCCESS)
1070bd56749Sjruoho atf_tc_fail("pending alarm was not cleared for child");
1080bd56749Sjruoho }
1090bd56749Sjruoho
1100bd56749Sjruoho ATF_TC(alarm_previous);
ATF_TC_HEAD(alarm_previous,tc)1110bd56749Sjruoho ATF_TC_HEAD(alarm_previous, tc)
1120bd56749Sjruoho {
113*34c8ff42Sjruoho atf_tc_set_md_var(tc, "descr", "Test return value from alarm(3)");
1140bd56749Sjruoho }
1150bd56749Sjruoho
ATF_TC_BODY(alarm_previous,tc)1160bd56749Sjruoho ATF_TC_BODY(alarm_previous, tc)
1170bd56749Sjruoho {
1180bd56749Sjruoho unsigned int rv;
1190bd56749Sjruoho
1200bd56749Sjruoho /*
121*34c8ff42Sjruoho * See that alarm(3) returns the amount
1220bd56749Sjruoho * left on the timer from the previous call.
1230bd56749Sjruoho */
1240bd56749Sjruoho rv = alarm(60);
1250bd56749Sjruoho
1260bd56749Sjruoho if (rv != 0)
1270bd56749Sjruoho goto fail;
1280bd56749Sjruoho
1290bd56749Sjruoho rv = alarm(0);
1300bd56749Sjruoho
1310bd56749Sjruoho if (rv < 50)
1320bd56749Sjruoho goto fail;
1330bd56749Sjruoho
1340bd56749Sjruoho (void)alarm(0);
1350bd56749Sjruoho
1360bd56749Sjruoho return;
1370bd56749Sjruoho
1380bd56749Sjruoho fail:
139*34c8ff42Sjruoho atf_tc_fail("invalid return value from alarm(3)");
1400bd56749Sjruoho }
1410bd56749Sjruoho
ATF_TP_ADD_TCS(tp)1420bd56749Sjruoho ATF_TP_ADD_TCS(tp)
1430bd56749Sjruoho {
1440bd56749Sjruoho
1450bd56749Sjruoho ATF_TP_ADD_TC(tp, alarm_basic);
1460bd56749Sjruoho ATF_TP_ADD_TC(tp, alarm_fork);
1470bd56749Sjruoho ATF_TP_ADD_TC(tp, alarm_previous);
1480bd56749Sjruoho
1490bd56749Sjruoho return atf_no_error();
1500bd56749Sjruoho }
151