1/*
2 * Copyright (C) 2024 HiHope Open Source Organization.
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 <csignal>
17#include <ctime>
18#include <iostream>
19#include <unistd.h>
20#include <gtest/gtest.h>
21#include <sys/timerfd.h>
22#include "securec.h"
23
24using namespace testing::ext;
25
26class TimerFdCreateApiTest : public testing::Test {
27public:
28static void SetUpTestCase();
29static void TearDownTestCase();
30void SetUp();
31void TearDown();
32private:
33};
34void TimerFdCreateApiTest::SetUp()
35{
36}
37void TimerFdCreateApiTest::TearDown()
38{
39}
40void TimerFdCreateApiTest::SetUpTestCase()
41{
42}
43void TimerFdCreateApiTest::TearDownTestCase()
44{
45}
46
47/*
48 * @tc.number : SUB_KERNEL_SYSCALL_TIMERFD_SETTIME_0100
49 * @tc.name   : TimerfdSetTimeClockRealTimeSuccess_0001
50 * @tc.desc   : Test the timerfd_settime with CLOCK_REALTIME.
51 * @tc.size   : MediumTest
52 * @tc.type   : Function
53 * @tc.level  : Level 1
54 */
55HWTEST_F(TimerFdCreateApiTest, TimerfdSetTimeClockRealTimeSuccess_0001, Function | MediumTest | Level1)
56{
57    int timerfd = timerfd_create(CLOCK_REALTIME, 0);
58    EXPECT_NE(timerfd, -1);
59
60    struct itimerspec newValue;
61    struct itimerspec oldValue;
62    newValue.it_value.tv_sec = 0;
63    newValue.it_value.tv_nsec = 100;
64    newValue.it_interval.tv_sec = 0;
65
66    EXPECT_EQ(timerfd_settime(timerfd, 0, &newValue, nullptr), 0);
67
68    uint64_t expirations;
69    EXPECT_EQ(read(timerfd, &expirations, sizeof(expirations)), sizeof(expirations));
70    EXPECT_EQ(expirations, 1);
71
72    int ret = timerfd_gettime(timerfd, &oldValue);
73    EXPECT_GE(ret, 0);
74    EXPECT_GE(newValue.it_value.tv_nsec, 0);
75
76    close(timerfd);
77}
78
79/*
80 * @tc.number : SUB_KERNEL_SYSCALL_TIMERFD_SETTIME_0200
81 * @tc.name   : TimerfdSetTimeClockMonotonicSuccess_0002
82 * @tc.desc   : Test the timerfd_settime with CLOCK_MONOTONIC.
83 * @tc.size   : MediumTest
84 * @tc.type   : Function
85 * @tc.level  : Level 1
86 */
87HWTEST_F(TimerFdCreateApiTest, TimerfdCreateClockMonotonicSuccess_0002, Function | MediumTest | Level1)
88{
89    int timerfd = timerfd_create(CLOCK_MONOTONIC, 0);
90    EXPECT_NE(timerfd, -1);
91
92    struct itimerspec newValue;
93    newValue.it_value.tv_nsec = 100;
94    newValue.it_interval.tv_nsec = 0;
95
96    EXPECT_EQ(timerfd_settime(timerfd, 0, &newValue, nullptr), 0);
97
98    uint64_t expirations;
99    EXPECT_EQ(read(timerfd, &expirations, sizeof(expirations)), sizeof(expirations));
100    EXPECT_EQ(expirations, 1);
101
102    close(timerfd);
103}
104
105/*
106 * @tc.number : SUB_KERNEL_SYSCALL_TIMERFD_SETTIME_0300
107 * @tc.name   : TimerfdSetTimeClockBoottimeSuccess_0003
108 * @tc.desc   : Test the timerfd_settime with CLOCK_BOOTTIME.
109 * @tc.size   : MediumTest
110 * @tc.type   : Function
111 * @tc.level  : Level 1
112 */
113HWTEST_F(TimerFdCreateApiTest, TimerfdSetTimeClockBoottimeSuccess_0003, Function | MediumTest | Level1)
114{
115    int timerfd = timerfd_create(CLOCK_BOOTTIME, 0);
116    EXPECT_NE(timerfd, -1);
117
118    struct itimerspec newValue;
119    newValue.it_value.tv_sec = 0;
120    newValue.it_value.tv_nsec = 100;
121    newValue.it_interval.tv_sec = 0;
122
123    EXPECT_EQ(timerfd_settime(timerfd, 0, &newValue, nullptr), 0);
124
125    uint64_t expirations;
126    EXPECT_EQ(read(timerfd, &expirations, sizeof(expirations)), sizeof(expirations));
127    EXPECT_EQ(expirations, 1);
128
129    close(timerfd);
130}
131
132/*
133 * @tc.number : SUB_KERNEL_SYSCALL_TIMERFD_SETTIME_0400
134 * @tc.name   : TimerfdSetTimeClockRealTimeAlarmSuccess_0004
135 * @tc.desc   : Test the timerfd_settime with CLOCK_REALTIME_ALARM.
136 * @tc.size   : MediumTest
137 * @tc.type   : Function
138 * @tc.level  : Level 1
139 */
140HWTEST_F(TimerFdCreateApiTest, TimerfdSetTimeClockRealTimeAlarmSuccess_0004, Function | MediumTest | Level1)
141{
142    int timerfd = timerfd_create(CLOCK_REALTIME_ALARM, 0);
143    EXPECT_NE(timerfd, -1);
144
145    struct itimerspec newValue;
146    newValue.it_value.tv_sec = 0;
147    newValue.it_value.tv_nsec = 100;
148    newValue.it_interval.tv_nsec = 0;
149
150    EXPECT_EQ(timerfd_settime(timerfd, 0, &newValue, nullptr), 0);
151
152    uint64_t expirations;
153    EXPECT_EQ(read(timerfd, &expirations, sizeof(expirations)), sizeof(expirations));
154    EXPECT_EQ(expirations, 1);
155
156    close(timerfd);
157}
158
159/*
160 * @tc.number : SUB_KERNEL_SYSCALL_TIMERFD_SETTIME_0500
161 * @tc.name   : TimerfdSetTimeClockBoottimeAlarmSuccess_0005
162 * @tc.desc   : Test the timerfd_settime with CLOCK_BOOTTIME_ALARM.
163 * @tc.size   : MediumTest
164 * @tc.type   : Function
165 * @tc.level  : Level 1
166 */
167HWTEST_F(TimerFdCreateApiTest, TimerfdSetTimeClockBoottimeAlarmSuccess_0005, Function | MediumTest | Level1)
168{
169    int timerfd = timerfd_create(CLOCK_BOOTTIME_ALARM, 0);
170    EXPECT_NE(timerfd, -1);
171
172    struct itimerspec newValue;
173    newValue.it_value.tv_nsec = 500;
174    newValue.it_interval.tv_nsec = 0;
175
176    EXPECT_EQ(timerfd_settime(timerfd, 0, &newValue, nullptr), 0);
177
178    uint64_t expirations;
179    EXPECT_EQ(read(timerfd, &expirations, sizeof(expirations)), sizeof(expirations));
180    EXPECT_EQ(expirations, 1);
181
182    close(timerfd);
183}
184
185/*
186 * @tc.number : SUB_KERNEL_SYSCALL_TIMERFD_CREATE_0600
187 * @tc.name   : TimerfdCreateTFdNonBlockTest_0006
188 * @tc.desc   : Test the timerfd_create with TFD_NONBLOCK.
189 * @tc.size   : MediumTest
190 * @tc.type   : Function
191 * @tc.level  : Level 2
192 */
193HWTEST_F(TimerFdCreateApiTest, TimerfdCreateTFdNonBlockTest_0006, Function | MediumTest | Level2)
194{
195    int timerfd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK);
196    EXPECT_NE(timerfd, -1);
197    errno = 0;
198
199    struct itimerspec newValue;
200    newValue.it_value.tv_sec = 0;
201    newValue.it_value.tv_nsec = 10000;
202    newValue.it_interval.tv_sec = 0;
203
204    EXPECT_EQ(timerfd_settime(timerfd, 0, &newValue, nullptr), 0);
205
206    uint64_t expirations;
207    ssize_t result = read(timerfd, &expirations, sizeof(expirations));
208    EXPECT_EQ(result, -1);
209    EXPECT_EQ(errno, EAGAIN);
210
211    close(timerfd);
212}
213
214/*
215 * @tc.number : SUB_KERNEL_SYSCALL_TIMERFD_SETTIME_0700
216 * @tc.name   : TimerfdSetTimeTFdTimerAbstimeSuccess_0007
217 * @tc.desc   : Test the timerfd_settime with TFD_TIMER_ABSTIME.
218 * @tc.size   : MediumTest
219 * @tc.type   : Function
220 * @tc.level  : Level 1
221 */
222HWTEST_F(TimerFdCreateApiTest, TimerfdSetTimeTFdTimerAbstimeSuccess_0007, Function | MediumTest | Level1)
223{
224    int timerfd = timerfd_create(CLOCK_REALTIME, 0);
225    EXPECT_NE(timerfd, -1);
226
227    struct itimerspec newValue;
228    newValue.it_value.tv_sec = 1;
229    newValue.it_value.tv_nsec = 0;
230    newValue.it_interval.tv_sec = 0;
231
232    EXPECT_EQ(timerfd_settime(timerfd, TFD_TIMER_ABSTIME, &newValue, nullptr), 0);
233
234    uint64_t expirations;
235    EXPECT_EQ(read(timerfd, &expirations, sizeof(expirations)), sizeof(expirations));
236    EXPECT_EQ(expirations, 1);
237
238    close(timerfd);
239}