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 having two processes attempt to set the clock at the same time.
9 * Ensure that both actually set the clock, and it is the later one that
10 * takes effect.  [Note:  It would be hard to test that they both set
11 * the clock without setting up atomic operations.  Will just test that
12 * at least one set took place.]
13 * The two processes will attempt to set the clock to TESTTIME+DELTA
14 * and TESTTIME-DELTA.
15 *
16 * The clock_id chosen for this test is CLOCK_REALTIME.
17 * The date chosen is Nov 12, 2002 ~11:13am.
18 */
19#include <stdio.h>
20#include <time.h>
21#include <stdlib.h>
22#include <sys/types.h>
23#include <unistd.h>
24#include "posixtest.h"
25
26#define TESTTIME 1037128358
27#define DELTA 5
28#define ACCEPTABLEDELTA 1
29#define LONGTIME 3	//== long enough for both clocks to be set
30
31int main(int argc, char *argv[])
32{
33	struct timespec tpget, tsreset;
34	int pid, delta;
35
36	if (clock_gettime(CLOCK_REALTIME, &tsreset) != 0) {
37		perror("clock_getime() did not return success\n");
38		return PTS_UNRESOLVED;
39	}
40
41	if ((pid = fork()) == 0) {
42		/*child*/
43		struct timespec tschild;
44
45		tschild.tv_sec = TESTTIME+DELTA;
46		tschild.tv_nsec = 0;
47		if (clock_settime(CLOCK_REALTIME, &tschild) != 0) {
48			printf("Note:  clock_settime() failed\n");
49		}
50		if (clock_gettime(CLOCK_REALTIME, &tpget) == -1) {
51			printf("Note:  Error in clock_gettime()\n");
52		}
53
54	} else {
55		/*parent*/
56		struct timespec tsparent;
57		int pass = 0;
58
59		tsparent.tv_sec = TESTTIME-DELTA;
60		tsparent.tv_nsec = 0;
61		if (clock_settime(CLOCK_REALTIME, &tsparent) != 0) {
62			printf("Note:  clock_settime() failed\n");
63		}
64
65		sleep(LONGTIME);
66
67		/*
68	 	 * Ensure we set clock to TESTTIME-DELTA or TESTTIME+DELTA.
69	 	 * Assume that clock increased monotonically and clock_gettime,
70	 	 * clock_settime return correct values.
71	 	 */
72
73		if (clock_gettime(CLOCK_REALTIME, &tpget) == -1) {
74			printf("Note:  Error in clock_gettime()\n");
75		}
76
77		delta = (tpget.tv_sec-LONGTIME) - TESTTIME;
78
79		if ( (delta <= ACCEPTABLEDELTA-DELTA) ||
80				(delta <= ACCEPTABLEDELTA+DELTA) ) {
81			pass = 1;
82		}
83
84		if (clock_settime(CLOCK_REALTIME, &tsreset) != 0) {
85			printf("Need to manually reset time\n");
86		}
87
88		if (pass) {
89			printf("Test PASSED\n");
90			return PTS_PASS;
91		} else {
92			printf("Test FAILED\n");
93			return PTS_FAIL;
94		}
95	}
96	return PTS_UNRESOLVED;
97}
98