19762338dSopenharmony_ci/* 29762338dSopenharmony_ci * Copyright (C) 2024 HiHope Open Source Organization. 39762338dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 49762338dSopenharmony_ci * you may not use this file except in compliance with the License. 59762338dSopenharmony_ci * You may obtain a copy of the License at 69762338dSopenharmony_ci * 79762338dSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 89762338dSopenharmony_ci * 99762338dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 109762338dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 119762338dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 129762338dSopenharmony_ci * See the License for the specific language governing permissions and 139762338dSopenharmony_ci * limitations under the License. 149762338dSopenharmony_ci */ 159762338dSopenharmony_ci 169762338dSopenharmony_ci#include <csignal> 179762338dSopenharmony_ci#include <ctime> 189762338dSopenharmony_ci#include <iostream> 199762338dSopenharmony_ci#include <unistd.h> 209762338dSopenharmony_ci#include <gtest/gtest.h> 219762338dSopenharmony_ci#include "securec.h" 229762338dSopenharmony_ci 239762338dSopenharmony_ciusing namespace testing::ext; 249762338dSopenharmony_cistatic bool g_timerExpired = false; 259762338dSopenharmony_cistatic bool g_sigalRm = false; 269762338dSopenharmony_cistatic const int DELAY_TIME = 100; 279762338dSopenharmony_ci 289762338dSopenharmony_civoid TimeHandler(union sigval sv) 299762338dSopenharmony_ci{ 309762338dSopenharmony_ci g_timerExpired = true; 319762338dSopenharmony_ci} 329762338dSopenharmony_civoid SigalrmHandler(int sig) 339762338dSopenharmony_ci{ 349762338dSopenharmony_ci g_sigalRm = true; 359762338dSopenharmony_ci} 369762338dSopenharmony_ci 379762338dSopenharmony_ciclass TimerCreateApiTest : public testing::Test { 389762338dSopenharmony_cipublic: 399762338dSopenharmony_cistatic void SetUpTestCase(); 409762338dSopenharmony_cistatic void TearDownTestCase(); 419762338dSopenharmony_civoid SetUp(); 429762338dSopenharmony_civoid TearDown(); 439762338dSopenharmony_ciprivate: 449762338dSopenharmony_ci}; 459762338dSopenharmony_civoid TimerCreateApiTest::SetUp() 469762338dSopenharmony_ci{ 479762338dSopenharmony_ci g_timerExpired = false; 489762338dSopenharmony_ci g_sigalRm = false; 499762338dSopenharmony_ci} 509762338dSopenharmony_civoid TimerCreateApiTest::TearDown() 519762338dSopenharmony_ci{ 529762338dSopenharmony_ci sighandler_t oldHandler = signal(SIGRTMIN, SIG_DFL); 539762338dSopenharmony_ci EXPECT_NE(oldHandler, SIG_ERR); 549762338dSopenharmony_ci} 559762338dSopenharmony_civoid TimerCreateApiTest::SetUpTestCase() 569762338dSopenharmony_ci{ 579762338dSopenharmony_ci} 589762338dSopenharmony_civoid TimerCreateApiTest::TearDownTestCase() 599762338dSopenharmony_ci{ 609762338dSopenharmony_ci} 619762338dSopenharmony_ci 629762338dSopenharmony_ci/* 639762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_TIMER_CREATE_0100 649762338dSopenharmony_ci * @tc.name : TimerCreateRealtimeAndGetoverrunSuccess_0001 659762338dSopenharmony_ci * @tc.desc : Test the timer_create and timer_getoverrun with CLOCK_REALTIME. 669762338dSopenharmony_ci * @tc.size : MediumTest 679762338dSopenharmony_ci * @tc.type : Function 689762338dSopenharmony_ci * @tc.level : Level 1 699762338dSopenharmony_ci */ 709762338dSopenharmony_ciHWTEST_F(TimerCreateApiTest, TimerCreateRealtimeAndGetoverrunSuccess_0001, Function | MediumTest | Level1) 719762338dSopenharmony_ci{ 729762338dSopenharmony_ci timer_t timerId; 739762338dSopenharmony_ci struct sigevent sev; 749762338dSopenharmony_ci const clockid_t CLOCK_ID = CLOCK_REALTIME; 759762338dSopenharmony_ci struct itimerspec its = { 769762338dSopenharmony_ci .it_interval = { 779762338dSopenharmony_ci .tv_sec = 0, 789762338dSopenharmony_ci .tv_nsec = 4000, 799762338dSopenharmony_ci }, 809762338dSopenharmony_ci .it_value = { 819762338dSopenharmony_ci .tv_sec = 0, 829762338dSopenharmony_ci .tv_nsec = 5000, 839762338dSopenharmony_ci }, 849762338dSopenharmony_ci }; 859762338dSopenharmony_ci 869762338dSopenharmony_ci sev.sigev_notify = SIGEV_THREAD; 879762338dSopenharmony_ci sev.sigev_signo = SIGRTMIN; 889762338dSopenharmony_ci sev.sigev_notify_function = TimeHandler; 899762338dSopenharmony_ci 909762338dSopenharmony_ci EXPECT_EQ(timer_create(CLOCK_ID, &sev, &timerId), 0); 919762338dSopenharmony_ci EXPECT_EQ(timer_settime(timerId, 0, &its, nullptr), 0); 929762338dSopenharmony_ci 939762338dSopenharmony_ci usleep(DELAY_TIME); 949762338dSopenharmony_ci EXPECT_TRUE(g_timerExpired); 959762338dSopenharmony_ci 969762338dSopenharmony_ci int overruns = timer_getoverrun(timerId); 979762338dSopenharmony_ci EXPECT_TRUE(overruns >= 0); 989762338dSopenharmony_ci 999762338dSopenharmony_ci int timerRes = timer_delete(timerId); 1009762338dSopenharmony_ci EXPECT_EQ(timerRes, 0); 1019762338dSopenharmony_ci} 1029762338dSopenharmony_ci 1039762338dSopenharmony_ci/* 1049762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_TIMER_CREATE_0200 1059762338dSopenharmony_ci * @tc.name : TimerCreateMonotonicSuccess_0002 1069762338dSopenharmony_ci * @tc.desc : Test the timer_create with CLOCK_MONOTONIC. 1079762338dSopenharmony_ci * @tc.size : MediumTest 1089762338dSopenharmony_ci * @tc.type : Function 1099762338dSopenharmony_ci * @tc.level : Level 1 1109762338dSopenharmony_ci */ 1119762338dSopenharmony_ciHWTEST_F(TimerCreateApiTest, TimerCreateMonotonicSuccess_0002, Function | MediumTest | Level1) 1129762338dSopenharmony_ci{ 1139762338dSopenharmony_ci timer_t timerId; 1149762338dSopenharmony_ci struct itimerspec currValue; 1159762338dSopenharmony_ci const clockid_t CLOCK_ID = CLOCK_MONOTONIC; 1169762338dSopenharmony_ci signal(SIGALRM, SigalrmHandler); 1179762338dSopenharmony_ci struct itimerspec its = { 1189762338dSopenharmony_ci .it_interval = { 1199762338dSopenharmony_ci .tv_sec = 0, 1209762338dSopenharmony_ci .tv_nsec = 0, 1219762338dSopenharmony_ci }, 1229762338dSopenharmony_ci .it_value = { 1239762338dSopenharmony_ci .tv_sec = 0, 1249762338dSopenharmony_ci .tv_nsec = 5000, 1259762338dSopenharmony_ci }, 1269762338dSopenharmony_ci }; 1279762338dSopenharmony_ci 1289762338dSopenharmony_ci struct sigevent sev = { 1299762338dSopenharmony_ci .sigev_signo = SIGALRM, 1309762338dSopenharmony_ci .sigev_notify = SIGEV_SIGNAL, 1319762338dSopenharmony_ci .sigev_notify_function = TimeHandler, 1329762338dSopenharmony_ci }; 1339762338dSopenharmony_ci 1349762338dSopenharmony_ci EXPECT_EQ(timer_create(CLOCK_ID, &sev, &timerId), 0); 1359762338dSopenharmony_ci EXPECT_EQ(timer_settime(timerId, 0, &its, nullptr), 0); 1369762338dSopenharmony_ci 1379762338dSopenharmony_ci usleep(DELAY_TIME); 1389762338dSopenharmony_ci EXPECT_EQ(timer_gettime(timerId, &currValue), 0); 1399762338dSopenharmony_ci EXPECT_TRUE(currValue.it_value.tv_sec < 1 && currValue.it_value.tv_nsec < 5000); 1409762338dSopenharmony_ci 1419762338dSopenharmony_ci int timerRes = timer_delete(timerId); 1429762338dSopenharmony_ci EXPECT_EQ(timerRes, 0); 1439762338dSopenharmony_ci} 1449762338dSopenharmony_ci 1459762338dSopenharmony_ci/* 1469762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_TIMER_CREATE_0300 1479762338dSopenharmony_ci * @tc.name : TimerCreateRealTimeAlarmSuccess_0003 1489762338dSopenharmony_ci * @tc.desc : Test the timer_create with CLOCK_REALTIME_ALARM. 1499762338dSopenharmony_ci * @tc.size : MediumTest 1509762338dSopenharmony_ci * @tc.type : Function 1519762338dSopenharmony_ci * @tc.level : Level 1 1529762338dSopenharmony_ci */ 1539762338dSopenharmony_ciHWTEST_F(TimerCreateApiTest, TimerCreateRealTimeAlarmSuccess_0003, Function | MediumTest | Level1) 1549762338dSopenharmony_ci{ 1559762338dSopenharmony_ci timer_t timerId; 1569762338dSopenharmony_ci const clockid_t CLOCK_ID = CLOCK_REALTIME_ALARM; 1579762338dSopenharmony_ci sighandler_t oldHandler = signal(SIGALRM, SigalrmHandler); 1589762338dSopenharmony_ci EXPECT_NE(oldHandler, SIG_ERR); 1599762338dSopenharmony_ci struct sigevent sev = { 1609762338dSopenharmony_ci .sigev_signo = SIGALRM, 1619762338dSopenharmony_ci .sigev_notify = SIGEV_SIGNAL, 1629762338dSopenharmony_ci .sigev_notify_function = TimeHandler, 1639762338dSopenharmony_ci }; 1649762338dSopenharmony_ci struct itimerspec its = { 1659762338dSopenharmony_ci .it_interval = { 1669762338dSopenharmony_ci .tv_sec = 0, 1679762338dSopenharmony_ci .tv_nsec = 0, 1689762338dSopenharmony_ci }, 1699762338dSopenharmony_ci .it_value = { 1709762338dSopenharmony_ci .tv_sec = 0, 1719762338dSopenharmony_ci .tv_nsec = 50, 1729762338dSopenharmony_ci }, 1739762338dSopenharmony_ci }; 1749762338dSopenharmony_ci 1759762338dSopenharmony_ci EXPECT_EQ(timer_create(CLOCK_ID, &sev, &timerId), 0); 1769762338dSopenharmony_ci EXPECT_EQ(timer_settime(timerId, 0, &its, nullptr), 0); 1779762338dSopenharmony_ci 1789762338dSopenharmony_ci usleep(DELAY_TIME); 1799762338dSopenharmony_ci 1809762338dSopenharmony_ci EXPECT_FALSE(g_timerExpired); 1819762338dSopenharmony_ci EXPECT_TRUE(g_sigalRm); 1829762338dSopenharmony_ci 1839762338dSopenharmony_ci int timerRes = timer_delete(timerId); 1849762338dSopenharmony_ci EXPECT_EQ(timerRes, 0); 1859762338dSopenharmony_ci} 1869762338dSopenharmony_ci 1879762338dSopenharmony_ci/* 1889762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_TIMER_CREATE_0400 1899762338dSopenharmony_ci * @tc.name : TimeSetTimeOldValueSuccess_0004 1909762338dSopenharmony_ci * @tc.desc : Test the timer_settime get the old value. 1919762338dSopenharmony_ci * @tc.size : MediumTest 1929762338dSopenharmony_ci * @tc.type : Function 1939762338dSopenharmony_ci * @tc.level : Level 1 1949762338dSopenharmony_ci */ 1959762338dSopenharmony_ciHWTEST_F(TimerCreateApiTest, TimeSetTimeOldValueSuccess_0004, Function | MediumTest | Level1) 1969762338dSopenharmony_ci{ 1979762338dSopenharmony_ci timer_t timerId; 1989762338dSopenharmony_ci struct itimerspec oldValue; 1999762338dSopenharmony_ci struct itimerspec oldValue2; 2009762338dSopenharmony_ci struct itimerspec newValue = { 2019762338dSopenharmony_ci .it_interval = { 2029762338dSopenharmony_ci .tv_sec = 1, 2039762338dSopenharmony_ci .tv_nsec = 0, 2049762338dSopenharmony_ci }, 2059762338dSopenharmony_ci .it_value = { 2069762338dSopenharmony_ci .tv_sec = 0, 2079762338dSopenharmony_ci .tv_nsec = 50, 2089762338dSopenharmony_ci }, 2099762338dSopenharmony_ci }; 2109762338dSopenharmony_ci EXPECT_EQ(timer_create(CLOCK_REALTIME, nullptr, &timerId), 0); 2119762338dSopenharmony_ci 2129762338dSopenharmony_ci EXPECT_EQ(timer_settime(timerId, 0, &newValue, &oldValue), 0); 2139762338dSopenharmony_ci EXPECT_EQ(oldValue.it_value.tv_sec, 0); 2149762338dSopenharmony_ci EXPECT_EQ(oldValue.it_value.tv_nsec, 0); 2159762338dSopenharmony_ci EXPECT_EQ(oldValue.it_interval.tv_sec, 0); 2169762338dSopenharmony_ci EXPECT_EQ(oldValue.it_interval.tv_nsec, 0); 2179762338dSopenharmony_ci 2189762338dSopenharmony_ci newValue.it_value.tv_sec = 0; 2199762338dSopenharmony_ci newValue.it_value.tv_nsec = 50; 2209762338dSopenharmony_ci newValue.it_interval.tv_sec = 1; 2219762338dSopenharmony_ci newValue.it_interval.tv_nsec = 0; 2229762338dSopenharmony_ci EXPECT_EQ(timer_settime(timerId, 0, &newValue, &oldValue2), 0); 2239762338dSopenharmony_ci EXPECT_EQ(oldValue2.it_interval.tv_sec, 1); 2249762338dSopenharmony_ci EXPECT_EQ(oldValue2.it_interval.tv_nsec, 0); 2259762338dSopenharmony_ci 2269762338dSopenharmony_ci int timerRes = timer_delete(timerId); 2279762338dSopenharmony_ci EXPECT_EQ(timerRes, 0); 2289762338dSopenharmony_ci} 2299762338dSopenharmony_ci 2309762338dSopenharmony_ci/* 2319762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_TIMER_SETTIME_0500 2329762338dSopenharmony_ci * @tc.name : TimerSetTimeAbstimeSuccess_0005 2339762338dSopenharmony_ci * @tc.desc : Test the timer_settime with TIMER_ABSTIME. 2349762338dSopenharmony_ci * @tc.size : MediumTest 2359762338dSopenharmony_ci * @tc.type : Function 2369762338dSopenharmony_ci * @tc.level : Level 1 2379762338dSopenharmony_ci */ 2389762338dSopenharmony_ciHWTEST_F(TimerCreateApiTest, TimerSetTimeAbstimeSuccess_0005, Function | MediumTest | Level1) 2399762338dSopenharmony_ci{ 2409762338dSopenharmony_ci timer_t timerId; 2419762338dSopenharmony_ci struct itimerspec newValue; 2429762338dSopenharmony_ci struct itimerspec oldValue; 2439762338dSopenharmony_ci const clockid_t CLOCK_ID = CLOCK_REALTIME; 2449762338dSopenharmony_ci 2459762338dSopenharmony_ci // Set the timer current time plus 50 nsec 2469762338dSopenharmony_ci struct timespec now; 2479762338dSopenharmony_ci clock_gettime(CLOCK_ID, &now); 2489762338dSopenharmony_ci newValue.it_value.tv_sec = now.tv_sec; 2499762338dSopenharmony_ci newValue.it_value.tv_nsec = now.tv_nsec + 50; 2509762338dSopenharmony_ci if (newValue.it_value.tv_nsec >= 1000000000) { 2519762338dSopenharmony_ci newValue.it_value.tv_nsec -= 1000000000; 2529762338dSopenharmony_ci newValue.it_value.tv_sec += 1; 2539762338dSopenharmony_ci } 2549762338dSopenharmony_ci newValue.it_interval.tv_sec = 0; 2559762338dSopenharmony_ci newValue.it_interval.tv_nsec = 0; 2569762338dSopenharmony_ci 2579762338dSopenharmony_ci struct sigevent sev; 2589762338dSopenharmony_ci sev.sigev_notify = SIGEV_THREAD; 2599762338dSopenharmony_ci sev.sigev_notify_function = TimeHandler; 2609762338dSopenharmony_ci sev.sigev_value.sival_ptr = &g_timerExpired; 2619762338dSopenharmony_ci 2629762338dSopenharmony_ci EXPECT_EQ(timer_create(CLOCK_ID, &sev, &timerId), 0); 2639762338dSopenharmony_ci 2649762338dSopenharmony_ci EXPECT_EQ(timer_settime(timerId, TIMER_ABSTIME, &newValue, &oldValue), 0); 2659762338dSopenharmony_ci 2669762338dSopenharmony_ci usleep(DELAY_TIME); 2679762338dSopenharmony_ci EXPECT_TRUE(g_timerExpired); 2689762338dSopenharmony_ci 2699762338dSopenharmony_ci int timerRes = timer_delete(timerId); 2709762338dSopenharmony_ci EXPECT_EQ(timerRes, 0); 2719762338dSopenharmony_ci} 2729762338dSopenharmony_ci 2739762338dSopenharmony_ci/* 2749762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_TIMER_CREATE_0600 2759762338dSopenharmony_ci * @tc.name : TimerCreateBoottimeAlarmSuccess_0006 2769762338dSopenharmony_ci * @tc.desc : Test the timer_create with CLOCK_BOOTTIME_ALARM. 2779762338dSopenharmony_ci * @tc.size : MediumTest 2789762338dSopenharmony_ci * @tc.type : Function 2799762338dSopenharmony_ci * @tc.level : Level 1 2809762338dSopenharmony_ci */ 2819762338dSopenharmony_ciHWTEST_F(TimerCreateApiTest, TimerCreateBoottimeAlarmSuccess_0006, Function | MediumTest | Level1) 2829762338dSopenharmony_ci{ 2839762338dSopenharmony_ci timer_t timerId; 2849762338dSopenharmony_ci const clockid_t CLOCK_ID = CLOCK_BOOTTIME_ALARM; 2859762338dSopenharmony_ci sighandler_t oldHandler = signal(SIGALRM, SigalrmHandler); 2869762338dSopenharmony_ci EXPECT_NE(oldHandler, SIG_ERR); 2879762338dSopenharmony_ci struct sigevent sev = { 2889762338dSopenharmony_ci .sigev_notify = SIGEV_SIGNAL, 2899762338dSopenharmony_ci .sigev_signo = SIGALRM, 2909762338dSopenharmony_ci }; 2919762338dSopenharmony_ci struct itimerspec its = { 2929762338dSopenharmony_ci .it_interval = { 2939762338dSopenharmony_ci .tv_sec = 0, 2949762338dSopenharmony_ci .tv_nsec = 0, 2959762338dSopenharmony_ci }, 2969762338dSopenharmony_ci .it_value = { 2979762338dSopenharmony_ci .tv_sec = 0, 2989762338dSopenharmony_ci .tv_nsec = 50, 2999762338dSopenharmony_ci }, 3009762338dSopenharmony_ci }; 3019762338dSopenharmony_ci 3029762338dSopenharmony_ci EXPECT_EQ(timer_create(CLOCK_ID, &sev, &timerId), 0); 3039762338dSopenharmony_ci EXPECT_EQ(timer_settime(timerId, 0, &its, nullptr), 0); 3049762338dSopenharmony_ci 3059762338dSopenharmony_ci usleep(DELAY_TIME); 3069762338dSopenharmony_ci 3079762338dSopenharmony_ci EXPECT_TRUE(g_sigalRm); 3089762338dSopenharmony_ci 3099762338dSopenharmony_ci int timerRes = timer_delete(timerId); 3109762338dSopenharmony_ci EXPECT_EQ(timerRes, 0); 3119762338dSopenharmony_ci 3129762338dSopenharmony_ci signal(SIGALRM, oldHandler); 3139762338dSopenharmony_ci} 314