1d9f0492fSopenharmony_ci/*
2d9f0492fSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3d9f0492fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4d9f0492fSopenharmony_ci * you may not use this file except in compliance with the License.
5d9f0492fSopenharmony_ci * You may obtain a copy of the License at
6d9f0492fSopenharmony_ci *
7d9f0492fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8d9f0492fSopenharmony_ci *
9d9f0492fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10d9f0492fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11d9f0492fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d9f0492fSopenharmony_ci * See the License for the specific language governing permissions and
13d9f0492fSopenharmony_ci * limitations under the License.
14d9f0492fSopenharmony_ci */
15d9f0492fSopenharmony_ci
16d9f0492fSopenharmony_ci#include <gtest/gtest.h>
17d9f0492fSopenharmony_ci#include <ctime>
18d9f0492fSopenharmony_ci#include <cstdint>
19d9f0492fSopenharmony_ci#include <cstdlib>
20d9f0492fSopenharmony_ci#include <unistd.h>
21d9f0492fSopenharmony_ci#include "le_loop.h"
22d9f0492fSopenharmony_ci#include "loop_event.h"
23d9f0492fSopenharmony_ci#include "le_timer.h"
24d9f0492fSopenharmony_ci
25d9f0492fSopenharmony_ciusing namespace testing::ext;
26d9f0492fSopenharmony_ciusing namespace std;
27d9f0492fSopenharmony_ci
28d9f0492fSopenharmony_cinamespace init_ut {
29d9f0492fSopenharmony_ciclass LoopTimerUnitTest : public testing::Test {
30d9f0492fSopenharmony_cipublic:
31d9f0492fSopenharmony_ci    static void SetUpTestCase(void) {};
32d9f0492fSopenharmony_ci    static void TearDownTestCase(void) {};
33d9f0492fSopenharmony_ci    void SetUp() {};
34d9f0492fSopenharmony_ci    void TearDown() {};
35d9f0492fSopenharmony_ci};
36d9f0492fSopenharmony_ci
37d9f0492fSopenharmony_cistatic LoopHandle g_loop = NULL;
38d9f0492fSopenharmony_ciint32_t g_maxCount = 0;
39d9f0492fSopenharmony_cistatic void Test_ProcessTimer(const TimerHandle taskHandle, void *context)
40d9f0492fSopenharmony_ci{
41d9f0492fSopenharmony_ci    g_maxCount--;
42d9f0492fSopenharmony_ci    if (g_maxCount <= 0) {
43d9f0492fSopenharmony_ci         LE_StopLoop(g_loop);
44d9f0492fSopenharmony_ci    }
45d9f0492fSopenharmony_ci    printf("WaitTimeout count %d\n", g_maxCount);
46d9f0492fSopenharmony_ci}
47d9f0492fSopenharmony_ci
48d9f0492fSopenharmony_cistatic void TimeoutCancel(const TimerHandle taskHandle, void *context)
49d9f0492fSopenharmony_ci{
50d9f0492fSopenharmony_ci    printf("TimeoutCancel count %d", g_maxCount);
51d9f0492fSopenharmony_ci    LE_StopTimer(LE_GetDefaultLoop(), taskHandle);
52d9f0492fSopenharmony_ci}
53d9f0492fSopenharmony_ci
54d9f0492fSopenharmony_ciHWTEST_F(LoopTimerUnitTest, Init_Timer_001, TestSize.Level0)
55d9f0492fSopenharmony_ci{
56d9f0492fSopenharmony_ci    EXPECT_EQ(LE_CreateLoop(&g_loop), 0);
57d9f0492fSopenharmony_ci
58d9f0492fSopenharmony_ci    TimerHandle timer = NULL;
59d9f0492fSopenharmony_ci    int ret = LE_CreateTimer(NULL, &timer, Test_ProcessTimer, NULL);
60d9f0492fSopenharmony_ci    EXPECT_NE(ret, 0);
61d9f0492fSopenharmony_ci
62d9f0492fSopenharmony_ci    ret = LE_CreateTimer(g_loop, NULL, Test_ProcessTimer, NULL);
63d9f0492fSopenharmony_ci    EXPECT_NE(ret, 0);
64d9f0492fSopenharmony_ci
65d9f0492fSopenharmony_ci    ret = LE_CreateTimer(g_loop,  &timer, NULL, NULL);
66d9f0492fSopenharmony_ci    EXPECT_NE(ret, 0);
67d9f0492fSopenharmony_ci
68d9f0492fSopenharmony_ci    CancelTimer(timer);
69d9f0492fSopenharmony_ci
70d9f0492fSopenharmony_ci    uint64_t time = GetCurrentTimespec(0);
71d9f0492fSopenharmony_ci    EXPECT_GT(time, 0);
72d9f0492fSopenharmony_ci
73d9f0492fSopenharmony_ci    time = GetMinTimeoutPeriod(NULL);
74d9f0492fSopenharmony_ci    EXPECT_EQ(time, 0);
75d9f0492fSopenharmony_ci
76d9f0492fSopenharmony_ci    EventLoop *loop = reinterpret_cast<EventLoop *>(g_loop);
77d9f0492fSopenharmony_ci    DestroyTimerList(loop);
78d9f0492fSopenharmony_ci    printf("Init_Timer_001 %d end", g_maxCount);
79d9f0492fSopenharmony_ci}
80d9f0492fSopenharmony_ci
81d9f0492fSopenharmony_ciHWTEST_F(LoopTimerUnitTest, Init_Timer_002, TestSize.Level0)
82d9f0492fSopenharmony_ci{
83d9f0492fSopenharmony_ci    EXPECT_EQ(LE_CreateLoop(&g_loop), 0);
84d9f0492fSopenharmony_ci    EventLoop *loop = reinterpret_cast<EventLoop *>(g_loop);
85d9f0492fSopenharmony_ci
86d9f0492fSopenharmony_ci    TimerHandle timer = NULL;
87d9f0492fSopenharmony_ci    g_maxCount = 1;
88d9f0492fSopenharmony_ci    int ret = LE_CreateTimer(g_loop, &timer, Test_ProcessTimer, NULL);
89d9f0492fSopenharmony_ci    EXPECT_EQ(ret, 0);
90d9f0492fSopenharmony_ci    ret = LE_StartTimer(g_loop, timer, 200, 1);
91d9f0492fSopenharmony_ci    EXPECT_EQ(ret, 0);
92d9f0492fSopenharmony_ci    usleep(200000);
93d9f0492fSopenharmony_ci    CheckTimeoutOfTimer(loop, GetCurrentTimespec(0));
94d9f0492fSopenharmony_ci    EXPECT_EQ(g_maxCount, 0);
95d9f0492fSopenharmony_ci    LE_CloseLoop(g_loop);
96d9f0492fSopenharmony_ci
97d9f0492fSopenharmony_ci    printf("Init_Timer_002 %d end", g_maxCount);
98d9f0492fSopenharmony_ci}
99d9f0492fSopenharmony_ci
100d9f0492fSopenharmony_ciHWTEST_F(LoopTimerUnitTest, Init_Timer_003, TestSize.Level0)
101d9f0492fSopenharmony_ci{
102d9f0492fSopenharmony_ci    EXPECT_EQ(LE_CreateLoop(&g_loop), 0);
103d9f0492fSopenharmony_ci
104d9f0492fSopenharmony_ci    TimerHandle timer = NULL;
105d9f0492fSopenharmony_ci    int ret = LE_CreateTimer(g_loop, &timer, Test_ProcessTimer, NULL);
106d9f0492fSopenharmony_ci    EXPECT_EQ(ret, 0);
107d9f0492fSopenharmony_ci    ret = LE_StartTimer(g_loop, timer, 200, 2);
108d9f0492fSopenharmony_ci    EXPECT_EQ(ret, 0);
109d9f0492fSopenharmony_ci    g_maxCount = 2;
110d9f0492fSopenharmony_ci    LE_RunLoop(g_loop);
111d9f0492fSopenharmony_ci    EXPECT_EQ(g_maxCount, 0);
112d9f0492fSopenharmony_ci    LE_CloseLoop(g_loop);
113d9f0492fSopenharmony_ci
114d9f0492fSopenharmony_ci    printf("Init_Timer_003 %d end", g_maxCount);
115d9f0492fSopenharmony_ci}
116d9f0492fSopenharmony_ci
117d9f0492fSopenharmony_ciHWTEST_F(LoopTimerUnitTest, Init_Timer_004, TestSize.Level0)
118d9f0492fSopenharmony_ci{
119d9f0492fSopenharmony_ci    EXPECT_EQ(LE_CreateLoop(&g_loop), 0);
120d9f0492fSopenharmony_ci
121d9f0492fSopenharmony_ci    g_maxCount = 3;
122d9f0492fSopenharmony_ci    TimerHandle timer = NULL;
123d9f0492fSopenharmony_ci    int ret = LE_CreateTimer(g_loop, &timer, Test_ProcessTimer, NULL);
124d9f0492fSopenharmony_ci    EXPECT_EQ(ret, 0);
125d9f0492fSopenharmony_ci    ret = LE_StartTimer(g_loop, timer, 100, 1);
126d9f0492fSopenharmony_ci    EXPECT_EQ(ret, 0);
127d9f0492fSopenharmony_ci
128d9f0492fSopenharmony_ci    TimerHandle timer1 = NULL;
129d9f0492fSopenharmony_ci    ret = LE_CreateTimer(g_loop, &timer1, Test_ProcessTimer, NULL);
130d9f0492fSopenharmony_ci    EXPECT_EQ(ret, 0);
131d9f0492fSopenharmony_ci    ret = LE_StartTimer(g_loop, timer1, 150, 1);
132d9f0492fSopenharmony_ci    EXPECT_EQ(ret, 0);
133d9f0492fSopenharmony_ci
134d9f0492fSopenharmony_ci    TimerHandle timer2 = NULL;
135d9f0492fSopenharmony_ci    ret = LE_CreateTimer(g_loop, &timer2, Test_ProcessTimer, NULL);
136d9f0492fSopenharmony_ci    EXPECT_EQ(ret, 0);
137d9f0492fSopenharmony_ci    ret = LE_StartTimer(g_loop, timer2, 300, 1);
138d9f0492fSopenharmony_ci    EXPECT_EQ(ret, 0);
139d9f0492fSopenharmony_ci
140d9f0492fSopenharmony_ci    usleep(150);
141d9f0492fSopenharmony_ci    LE_RunLoop(g_loop);
142d9f0492fSopenharmony_ci    EXPECT_EQ(g_maxCount, 0);
143d9f0492fSopenharmony_ci    LE_CloseLoop(g_loop);
144d9f0492fSopenharmony_ci
145d9f0492fSopenharmony_ci    printf("Init_Timer_004 %d end", g_maxCount);
146d9f0492fSopenharmony_ci}
147d9f0492fSopenharmony_ci
148d9f0492fSopenharmony_ciHWTEST_F(LoopTimerUnitTest, Init_Timer_005, TestSize.Level0)
149d9f0492fSopenharmony_ci{
150d9f0492fSopenharmony_ci    EXPECT_EQ(LE_CreateLoop(&g_loop), 0);
151d9f0492fSopenharmony_ci
152d9f0492fSopenharmony_ci    g_maxCount = 3;
153d9f0492fSopenharmony_ci    TimerHandle timer = NULL;
154d9f0492fSopenharmony_ci    int ret = LE_CreateTimer(g_loop, &timer, Test_ProcessTimer, NULL);
155d9f0492fSopenharmony_ci    EXPECT_EQ(ret, 0);
156d9f0492fSopenharmony_ci    ret = LE_StartTimer(g_loop, timer, 100, 2);
157d9f0492fSopenharmony_ci    EXPECT_EQ(ret, 0);
158d9f0492fSopenharmony_ci
159d9f0492fSopenharmony_ci    TimerHandle timer1 = NULL;
160d9f0492fSopenharmony_ci    ret = LE_CreateTimer(g_loop, &timer1, Test_ProcessTimer, NULL);
161d9f0492fSopenharmony_ci    EXPECT_EQ(ret, 0);
162d9f0492fSopenharmony_ci    ret = LE_StartTimer(g_loop, timer1, 150, 2);
163d9f0492fSopenharmony_ci    EXPECT_EQ(ret, 0);
164d9f0492fSopenharmony_ci
165d9f0492fSopenharmony_ci    TimerHandle timer2 = NULL;
166d9f0492fSopenharmony_ci    ret = LE_CreateTimer(g_loop, &timer2, Test_ProcessTimer, NULL);
167d9f0492fSopenharmony_ci    EXPECT_EQ(ret, 0);
168d9f0492fSopenharmony_ci    ret = LE_StartTimer(g_loop, timer2, 300, 1);
169d9f0492fSopenharmony_ci    EXPECT_EQ(ret, 0);
170d9f0492fSopenharmony_ci
171d9f0492fSopenharmony_ci    CancelTimer(timer);
172d9f0492fSopenharmony_ci    LE_RunLoop(g_loop);
173d9f0492fSopenharmony_ci    EXPECT_EQ(g_maxCount, 0);
174d9f0492fSopenharmony_ci    LE_CloseLoop(g_loop);
175d9f0492fSopenharmony_ci
176d9f0492fSopenharmony_ci    printf("Init_Timer_005 %d end", g_maxCount);
177d9f0492fSopenharmony_ci}
178d9f0492fSopenharmony_ci}