1/*
2 * Copyright (c) 2002, Intel Corporation. All rights reserved.
3 * Created by:  julie.n.fleischer REMOVE-THIS AT intel DOT com
4 * This file is licensed under the GPL license.  For the full content
5 * of this license, see the COPYING file at the top level of this
6 * source tree.
7
8 * Test that timer_gettime() sets sets itimerspec.it_value to the
9 * amount of time remaining.
10 * - Create and arm a timer.
11 * - Call timer_gettime().
12 * - Ensure the value returned is within ACCEPTABLEDELTA less than
13 *   the value set.
14 *
15 * Signal SIGCONT will be used so that it will not affect the test if
16 * the timer expires.
17 * Clock CLOCK_REALTIME will be used.
18 */
19
20#include <time.h>
21#include <signal.h>
22#include <stdio.h>
23#include <unistd.h>
24#include <stdlib.h>
25#include "posixtest.h"
26
27#define TIMERSEC 5
28#define ACCEPTABLEDELTA 1
29
30int main(void)
31{
32	struct sigevent ev;
33	timer_t tid;
34	struct itimerspec itsset, itsget;
35	int delta;
36
37	ev.sigev_notify = SIGEV_SIGNAL;
38	ev.sigev_signo = SIGCONT;
39
40	itsset.it_interval.tv_sec = 0;
41	itsset.it_interval.tv_nsec = 0;
42	itsset.it_value.tv_sec = TIMERSEC;
43	itsset.it_value.tv_nsec = 0;
44
45	if (timer_create(CLOCK_REALTIME, &ev, &tid) != 0) {
46		perror("timer_create() did not return success\n");
47		return PTS_UNRESOLVED;
48	}
49
50	if (timer_settime(tid, 0, &itsset, NULL) != 0) {
51		perror("timer_settime() did not return success\n");
52		return PTS_UNRESOLVED;
53	}
54
55	if (timer_gettime(tid, &itsget) != 0) {
56		perror("timer_gettime() did not return success\n");
57		return PTS_UNRESOLVED;
58	}
59
60	delta = itsset.it_value.tv_sec - itsget.it_value.tv_sec;
61
62	if (delta < 0) {
63		printf("FAIL:  timer_gettime() value > timer_settime()\n");
64		printf("%d > %d\n", (int)itsget.it_value.tv_sec,
65		       (int)itsset.it_value.tv_sec);
66		return PTS_FAIL;
67	}
68
69	if (delta <= ACCEPTABLEDELTA) {
70		printf("Test PASSED\n");
71		return PTS_PASS;
72	}
73
74	printf("FAIL:  timer_gettime() value !~= timer_settime()\n");
75	printf("%d !~= %d\n", (int)itsget.it_value.tv_sec,
76	       (int)itsset.it_value.tv_sec);
77	return PTS_FAIL;
78}
79