1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <signal.h>
17 #include <stdlib.h>
18 #include <sys/timerfd.h>
19 #include <time.h>
20 #include "test.h"
21
22 #define NANOSECOND (1000000000)
23 #define MICROSECONDS (1000000)
24 #define DATA_TWO (2)
25
26 extern int __timerfd_settime64(int, int, const struct itimerspec *, struct itimerspec *);
27
exception_handler(int sig)28 void exception_handler(int sig)
29 {
30 exit(t_status);
31 }
32
33 /**
34 * @tc.name : timerfd_settime_0100
35 * @tc.desc : Start the timer specified by fd
36 * @tc.level : Level 0
37 */
timerfd_settime_0100(void)38 void timerfd_settime_0100(void)
39 {
40 struct itimerspec its = {{0, 0}, {DATA_TWO, 0}};
41 struct itimerspec val;
42 int fd, result;
43
44 fd = timerfd_create(CLOCK_REALTIME, 0);
45 if (fd < 0) {
46 t_error("%s timerfd_create failed\n", __func__);
47 return;
48 }
49
50 result = timerfd_settime(fd, 0, &its, NULL);
51 if (result != 0) {
52 t_error("%s timerfd_settime failed\n", __func__);
53 return;
54 }
55
56 result = usleep(MICROSECONDS);
57 if (result != 0) {
58 t_error("%s usleep failed\n", __func__);
59 return;
60 }
61
62 result = timerfd_gettime(fd, &val);
63 if (result != 0) {
64 t_error("%s timerfd_gettime failed\n", __func__);
65 return;
66 }
67 if (val.it_value.tv_nsec > NANOSECOND) {
68 t_error("%s timerfd error\n");
69 }
70 }
71
72 /**
73 * @tc.name : timerfd_settime_0200
74 * @tc.desc : arms the timer with invalid parameters
75 * @tc.level : Level 2
76 */
timerfd_settime_0200(void)77 void timerfd_settime_0200(void)
78 {
79 signal(SIGSEGV, exception_handler);
80
81 timerfd_settime(-1, 0, NULL, NULL);
82 }
83
84 /**
85 * @tc.name : timerfd_settime64_0100
86 * @tc.desc : Start the timer specified by fd
87 * @tc.level : Level 0
88 */
timerfd_settime64_0100(void)89 void timerfd_settime64_0100(void)
90 {
91 struct itimerspec its = {{0, 0}, {DATA_TWO, 0}};
92 struct itimerspec val;
93 int fd, result;
94
95 fd = timerfd_create(CLOCK_REALTIME, 0);
96 if (fd < 0) {
97 t_error("%s timerfd_create failed\n", __func__);
98 return;
99 }
100
101 result = __timerfd_settime64(fd, 0, &its, NULL);
102 if (result != 0) {
103 t_error("%s __timerfd_settime64 failed\n", __func__);
104 return;
105 }
106
107 result = usleep(MICROSECONDS);
108 if (result != 0) {
109 t_error("%s usleep failed\n", __func__);
110 return;
111 }
112
113 result = timerfd_gettime(fd, &val);
114 if (result != 0) {
115 t_error("%s timerfd_gettime failed\n", __func__);
116 return;
117 }
118 if (val.it_value.tv_nsec > NANOSECOND) {
119 t_error("%s timerfd error\n");
120 }
121 }
122
main(int argc,char * argv[])123 int main(int argc, char *argv[])
124 {
125 timerfd_settime_0100();
126 timerfd_settime_0200();
127 timerfd_settime64_0100();
128 return t_status;
129 }