1 /******************************************************************************
2  * Copyright (c) Crackerjack Project., 2007-2008 ,Hitachi, Ltd                *
3  *   Author(s): Takahiro Yasui <takahiro.yasui.mp@hitachi.com>,               *
4  *              Yumiko Sugita <yumiko.sugita.yf@hitachi.com>,                 *
5  *              Satoshi Fujiwara <sa-fuji@sdl.hitachi.co.jp>                  *
6  *   LTP authors:                                                             *
7  *              Manas Kumar Nayak maknayak@in.ibm.com>                        *
8  *              Zeng Linggang <zenglg.jy@cn.fujitsu.com>                      *
9  *              Cyril Hrubis <chrubis@suse.cz>                                *
10  *                                                                            *
11  * This program is free software;  you can redistribute it and/or modify      *
12  * it under the terms of the GNU General Public License as published by       *
13  * the Free Software Foundation; either version 2 of the License, or          *
14  * (at your option) any later version.                                        *
15  *                                                                            *
16  * This program is distributed in the hope that it will be useful,            *
17  * but WITHOUT ANY WARRANTY;  without even the implied warranty of            *
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See                  *
19  * the GNU General Public License for more details.                           *
20  *                                                                            *
21  * You should have received a copy of the GNU General Public License          *
22  * along with this program;  if not, write to the Free Software Foundation,   *
23  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA           *
24  *                                                                            *
25  ******************************************************************************/
26 /*
27  * Description: This tests the clock_getres() syscall
28  */
29 
30 #include <sys/syscall.h>
31 #include <sys/types.h>
32 #include <getopt.h>
33 #include <string.h>
34 #include <stdlib.h>
35 #include <libgen.h>
36 #include <errno.h>
37 #include <stdio.h>
38 #include <time.h>
39 #include "config.h"
40 #include "include_j_h.h"
41 
42 #include "test.h"
43 #include "lapi/posix_clocks.h"
44 
45 #define NORMAL		1
46 #define NULL_POINTER	0
47 
48 static struct test_case {
49 	char *name;
50 	clockid_t clk_id;
51 	int ttype;
52 	int ret;
53 	int err;
54 } tcase[] = {
55 	{"REALTIME", CLOCK_REALTIME, NORMAL, 0, 0},
56 	{"MONOTONIC", CLOCK_MONOTONIC, NORMAL, 0, 0},
57 	{"PROCESS_CPUTIME_ID", CLOCK_PROCESS_CPUTIME_ID, NORMAL, 0, 0},
58 	{"THREAD_CPUTIME_ID", CLOCK_THREAD_CPUTIME_ID, NORMAL, 0, 0},
59 	{"REALTIME", CLOCK_REALTIME, NULL_POINTER, 0, 0},
60 	{"CLOCK_MONOTONIC_RAW", CLOCK_MONOTONIC_RAW, NORMAL, 0, 0,},
61 	{"CLOCK_REALTIME_COARSE", CLOCK_REALTIME_COARSE, NORMAL, 0, 0,},
62 	{"CLOCK_MONOTONIC_COARSE", CLOCK_MONOTONIC_COARSE, NORMAL, 0, 0,},
63 	{"CLOCK_BOOTTIME", CLOCK_BOOTTIME, NORMAL, 0, 0,},
64 	{"CLOCK_REALTIME_ALARM", CLOCK_REALTIME_ALARM, NORMAL, 0, 0,},
65 	{"CLOCK_BOOTTIME_ALARM", CLOCK_BOOTTIME_ALARM, NORMAL, 0, 0,},
66 	{"-1", -1, NORMAL, -1, EINVAL},
67 };
68 
69 static void setup(void);
70 static void cleanup(void);
71 
72 char *TCID = "clock_getres01";
73 int TST_TOTAL = ARRAY_SIZE(tcase);
74 
main(int ac,char ** av)75 int main(int ac, char **av)
76 {
77 	int i;
78 	int lc;
79 	struct timespec res;
80 
81 	tst_parse_opts(ac, av, NULL, NULL);
82 
83 	setup();
84 
85 	for (lc = 0; TEST_LOOPING(lc); ++lc) {
86 
87 		tst_count = 0;
88 
89 		for (i = 0; i < TST_TOTAL; ++i) {
90 			if (tcase[i].ttype == NULL_POINTER)
91 				TEST(clock_getres(tcase[i].clk_id, NULL));
92 			else
93 				TEST(clock_getres(tcase[i].clk_id, &res));
94 
95 			if (TEST_RETURN != tcase[i].ret) {
96 				if (TEST_ERRNO != EINVAL) {
97 					tst_resm(TFAIL | TTERRNO,
98 						 "clock_getres %s failed",
99 						 tcase[i].name);
100 				} else {
101 					tst_resm(TCONF,
102 						 "clock_getres %s NO SUPPORTED",
103 						 tcase[i].name);
104 				}
105 			} else {
106 				if (TEST_ERRNO != tcase[i].err) {
107 					tst_resm(TFAIL,
108 						 "clock_getres %s failed with "
109 						 "unexpect errno: %d",
110 						 tcase[i].name, TEST_ERRNO);
111 				} else {
112 					tst_resm(TPASS,
113 						 "clock_getres %s succeeded",
114 						 tcase[i].name);
115 				}
116 			}
117 
118 		}
119 	}
120 
121 	cleanup();
122 	tst_exit();
123 }
124 
setup(void)125 static void setup(void)
126 {
127 	TEST_PAUSE;
128 }
129 
cleanup(void)130 static void cleanup(void)
131 {
132 }
133