xref: /netbsd-src/tests/lib/libc/gen/t_alarm.c (revision 34c8ff420909c0c462e8563f3800288ba7412fab)
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