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 "securec.h"
22
23 using namespace testing::ext;
24
25 static bool g_timerExpired = false;
26 static const int DELAY_TIME = 100;
27
TimerHandler(int sig)28 void TimerHandler(int sig)
29 {
30 g_timerExpired = true;
31 }
32
33 class SetiTimerApiTest : public testing::Test {
34 public:
35 static void SetUpTestCase();
36 static void TearDownTestCase();
37 void SetUp();
38 void TearDown();
39 private:
40 };
SetUp()41 void SetiTimerApiTest::SetUp()
42 {
43 g_timerExpired = false;
44 sighandler_t oldHandler = signal(SIGALRM, TimerHandler);
45 EXPECT_NE(oldHandler, SIG_ERR);
46 }
TearDown()47 void SetiTimerApiTest::TearDown()
48 {
49 sighandler_t oldHandler = signal(SIGALRM, SIG_DFL);
50 EXPECT_NE(oldHandler, SIG_ERR);
51 }
SetUpTestCase()52 void SetiTimerApiTest::SetUpTestCase()
53 {
54 }
TearDownTestCase()55 void SetiTimerApiTest::TearDownTestCase()
56 {
57 }
58
59 /*
60 * @tc.number : SUB_KERNEL_SYSCALL_SETITIMER_0100
61 * @tc.name : SetiTimerAndGetitimerGetRealTimeSuccess_0001
62 * @tc.desc : Test setitimer and getitimer the ITIMER_REAL timer.
63 * @tc.size : MediumTest
64 * @tc.type : Function
65 * @tc.level : Level 1
66 */
HWTEST_F(SetiTimerApiTest, SetiTimerAndGetitimerGetRealTimeSuccess_0001, Function | MediumTest | Level1)67 HWTEST_F(SetiTimerApiTest, SetiTimerAndGetitimerGetRealTimeSuccess_0001, Function | MediumTest | Level1)
68 {
69 struct itimerval timer_val = {
70 .it_interval = {
71 .tv_sec = 0,
72 .tv_usec = 0,
73 },
74 .it_value = {
75 .tv_sec = 0,
76 .tv_usec = 50,
77 },
78 };
79 struct itimerval remaining;
80 struct itimerval fetched;
81
82 EXPECT_EQ(setitimer(ITIMER_REAL, &timer_val, &remaining), 0);
83
84 EXPECT_EQ(getitimer(ITIMER_REAL, &fetched), 0);
85
86 EXPECT_NEAR(fetched.it_value.tv_sec, timer_val.it_value.tv_sec, 1);
87 EXPECT_NEAR(fetched.it_value.tv_usec, timer_val.it_value.tv_usec, 1000);
88 EXPECT_EQ(fetched.it_interval.tv_sec, timer_val.it_interval.tv_sec);
89 EXPECT_EQ(fetched.it_interval.tv_usec, timer_val.it_interval.tv_usec);
90
91 usleep(DELAY_TIME);
92 EXPECT_TRUE(g_timerExpired);
93 EXPECT_EQ(signal(SIGALRM, SIG_DFL), TimerHandler);
94 }
95