18bf80f4bSopenharmony_ci/*
28bf80f4bSopenharmony_ci * Copyright (C) 2024 Huawei Device Co., Ltd.
38bf80f4bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
48bf80f4bSopenharmony_ci * you may not use this file except in compliance with the License.
58bf80f4bSopenharmony_ci * You may obtain a copy of the License at
68bf80f4bSopenharmony_ci *
78bf80f4bSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
88bf80f4bSopenharmony_ci *
98bf80f4bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
108bf80f4bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
118bf80f4bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
128bf80f4bSopenharmony_ci * See the License for the specific language governing permissions and
138bf80f4bSopenharmony_ci * limitations under the License.
148bf80f4bSopenharmony_ci */
158bf80f4bSopenharmony_ci
168bf80f4bSopenharmony_ci#include <thread>
178bf80f4bSopenharmony_ci
188bf80f4bSopenharmony_ci#include <meta/api/timer.h>
198bf80f4bSopenharmony_ci#include <meta/interface/intf_object_registry.h>
208bf80f4bSopenharmony_ci#include <meta/interface/intf_task_queue.h>
218bf80f4bSopenharmony_ci#include <meta/interface/intf_task_queue_registry.h>
228bf80f4bSopenharmony_ci
238bf80f4bSopenharmony_ci#include "src/test_runner.h"
248bf80f4bSopenharmony_ci#include "src/test_macros.h"
258bf80f4bSopenharmony_ci
268bf80f4bSopenharmony_ciusing namespace testing::ext;
278bf80f4bSopenharmony_ci
288bf80f4bSopenharmony_ciMETA_BEGIN_NAMESPACE()
298bf80f4bSopenharmony_ci
308bf80f4bSopenharmony_ciclass TimerTest : public testing::Test {
318bf80f4bSopenharmony_cipublic:
328bf80f4bSopenharmony_ci    static void SetUpTestSuite()
338bf80f4bSopenharmony_ci    {
348bf80f4bSopenharmony_ci        SetTest();
358bf80f4bSopenharmony_ci    }
368bf80f4bSopenharmony_ci    static void TearDownTestSuite()
378bf80f4bSopenharmony_ci    {
388bf80f4bSopenharmony_ci        ResetTest();
398bf80f4bSopenharmony_ci    }
408bf80f4bSopenharmony_ci    void SetUp() override
418bf80f4bSopenharmony_ci    {
428bf80f4bSopenharmony_ci        queue_ = GetObjectRegistry().Create<IThreadedTaskQueue>(ClassId::ThreadedTaskQueue);
438bf80f4bSopenharmony_ci        queueId_ = interface_cast<IObjectInstance>(queue_)->GetInstanceId();
448bf80f4bSopenharmony_ci        GetTaskQueueRegistry().RegisterTaskQueue(queue_, queueId_.ToUid());
458bf80f4bSopenharmony_ci    }
468bf80f4bSopenharmony_ci    void TearDown() override
478bf80f4bSopenharmony_ci    {
488bf80f4bSopenharmony_ci        GetTaskQueueRegistry().UnregisterTaskQueue(queueId_.ToUid());
498bf80f4bSopenharmony_ci    }
508bf80f4bSopenharmony_ci
518bf80f4bSopenharmony_ciprotected:
528bf80f4bSopenharmony_ci    ITaskQueue::Ptr queue_;
538bf80f4bSopenharmony_ci    InstanceId queueId_;
548bf80f4bSopenharmony_ci};
558bf80f4bSopenharmony_ci
568bf80f4bSopenharmony_ci
578bf80f4bSopenharmony_ci/**
588bf80f4bSopenharmony_ci * @tc.name: TimerTest
598bf80f4bSopenharmony_ci * @tc.desc: test Ctor function
608bf80f4bSopenharmony_ci * @tc.type: FUNC
618bf80f4bSopenharmony_ci * @tc.require: I7DMS1
628bf80f4bSopenharmony_ci */
638bf80f4bSopenharmony_ciHWTEST_F(TimerTest, Ctor, TestSize.Level1)
648bf80f4bSopenharmony_ci{
658bf80f4bSopenharmony_ci    {
668bf80f4bSopenharmony_ci        std::atomic<int> count = 0;
678bf80f4bSopenharmony_ci        Timer t (
688bf80f4bSopenharmony_ci            TimeSpan::Milliseconds(100), [&count] { ++count; }, Timer::RECURRING, queueId_.ToUid());
698bf80f4bSopenharmony_ci        EXPECT_TRUE(t.IsRunning());
708bf80f4bSopenharmony_ci        EXPECT_EQ_TIMED(350, count, 3);
718bf80f4bSopenharmony_ci    }
728bf80f4bSopenharmony_ci    {
738bf80f4bSopenharmony_ci        std::atomic<int> count = 0;
748bf80f4bSopenharmony_ci        Timer t (
758bf80f4bSopenharmony_ci            TimeSpan::Milliseconds(100), [&count] { ++count; }, Timer::RECURRING, queue_);
768bf80f4bSopenharmony_ci        EXPECT_TRUE(t.IsRunning());
778bf80f4bSopenharmony_ci        EXPECT_EQ_TIMED(350, count, 3);
788bf80f4bSopenharmony_ci    }
798bf80f4bSopenharmony_ci}
808bf80f4bSopenharmony_ci
818bf80f4bSopenharmony_ci/**
828bf80f4bSopenharmony_ci * @tc.name: TimerTest
838bf80f4bSopenharmony_ci * @tc.desc: test Moving function
848bf80f4bSopenharmony_ci * @tc.type: FUNC
858bf80f4bSopenharmony_ci * @tc.require: I7DMS1
868bf80f4bSopenharmony_ci */
878bf80f4bSopenharmony_ciHWTEST_F(TimerTest, Moving, TestSize.Level1)
888bf80f4bSopenharmony_ci{
898bf80f4bSopenharmony_ci    Timer t (
908bf80f4bSopenharmony_ci        TimeSpan::Milliseconds(20), [] {}, Timer::RECURRING, queueId_.ToUid());
918bf80f4bSopenharmony_ci    EXPECT_TRUE(t.IsRunning());
928bf80f4bSopenharmony_ci    Timer t2 = BASE_NS::move(t);
938bf80f4bSopenharmony_ci    EXPECT_FALSE(t.IsRunning());
948bf80f4bSopenharmony_ci    EXPECT_TRUE(t2.IsRunning());
958bf80f4bSopenharmony_ci}
968bf80f4bSopenharmony_ci
978bf80f4bSopenharmony_ci/**
988bf80f4bSopenharmony_ci * @tc.name: TimerTest
998bf80f4bSopenharmony_ci * @tc.desc: test Start function
1008bf80f4bSopenharmony_ci * @tc.type: FUNC
1018bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1028bf80f4bSopenharmony_ci */
1038bf80f4bSopenharmony_ciHWTEST_F(TimerTest, Start, TestSize.Level1)
1048bf80f4bSopenharmony_ci{
1058bf80f4bSopenharmony_ci    {
1068bf80f4bSopenharmony_ci        std::atomic<int> count = 0;
1078bf80f4bSopenharmony_ci        Timer t;
1088bf80f4bSopenharmony_ci        EXPECT_TRUE(t.Start(
1098bf80f4bSopenharmony_ci            TimeSpan::Milliseconds(100), [&count] { ++count; }, Timer::RECURRING, queueId_.ToUid()));
1108bf80f4bSopenharmony_ci        EXPECT_TRUE(t.IsRunning());
1118bf80f4bSopenharmony_ci        EXPECT_EQ_TIMED(350, count, 3);
1128bf80f4bSopenharmony_ci    }
1138bf80f4bSopenharmony_ci    {
1148bf80f4bSopenharmony_ci        std::atomic<int> count = 0;
1158bf80f4bSopenharmony_ci        Timer t;
1168bf80f4bSopenharmony_ci        EXPECT_TRUE(t.Start(
1178bf80f4bSopenharmony_ci            TimeSpan::Milliseconds(100), [&count] { ++count; }, Timer::RECURRING, queue_));
1188bf80f4bSopenharmony_ci        EXPECT_TRUE(t.IsRunning());
1198bf80f4bSopenharmony_ci        EXPECT_EQ_TIMED(350, count, 3);
1208bf80f4bSopenharmony_ci    }
1218bf80f4bSopenharmony_ci}
1228bf80f4bSopenharmony_ci
1238bf80f4bSopenharmony_ci/**
1248bf80f4bSopenharmony_ci * @tc.name: TimerTest
1258bf80f4bSopenharmony_ci * @tc.desc: test Stop function
1268bf80f4bSopenharmony_ci * @tc.type: FUNC
1278bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1288bf80f4bSopenharmony_ci */
1298bf80f4bSopenharmony_ciHWTEST_F(TimerTest, Stop, TestSize.Level1)
1308bf80f4bSopenharmony_ci{
1318bf80f4bSopenharmony_ci    {
1328bf80f4bSopenharmony_ci        std::atomic<int> count = 0;
1338bf80f4bSopenharmony_ci        Timer t;
1348bf80f4bSopenharmony_ci        EXPECT_TRUE(t.Start(
1358bf80f4bSopenharmony_ci            TimeSpan::Milliseconds(100), [&count] { ++count; }, Timer::RECURRING, queueId_.ToUid()));
1368bf80f4bSopenharmony_ci        EXPECT_TRUE(t.IsRunning());
1378bf80f4bSopenharmony_ci        EXPECT_EQ_TIMED(150, count, 1);
1388bf80f4bSopenharmony_ci        t.Stop();
1398bf80f4bSopenharmony_ci        META_WAIT_TIMED(150);
1408bf80f4bSopenharmony_ci        EXPECT_EQ(count, 1);
1418bf80f4bSopenharmony_ci        EXPECT_FALSE(t.IsRunning());
1428bf80f4bSopenharmony_ci    }
1438bf80f4bSopenharmony_ci    {
1448bf80f4bSopenharmony_ci        std::atomic<int> count = 0;
1458bf80f4bSopenharmony_ci        {
1468bf80f4bSopenharmony_ci            Timer t;
1478bf80f4bSopenharmony_ci            EXPECT_TRUE(t.Start(
1488bf80f4bSopenharmony_ci                TimeSpan::Milliseconds(100), [&count] { ++count; }, Timer::RECURRING, queueId_.ToUid()));
1498bf80f4bSopenharmony_ci            EXPECT_TRUE(t.IsRunning());
1508bf80f4bSopenharmony_ci            EXPECT_EQ_TIMED(150, count, 1);
1518bf80f4bSopenharmony_ci        }
1528bf80f4bSopenharmony_ci        META_WAIT_TIMED(150);
1538bf80f4bSopenharmony_ci        EXPECT_EQ(count, 1);
1548bf80f4bSopenharmony_ci    }
1558bf80f4bSopenharmony_ci}
1568bf80f4bSopenharmony_ci
1578bf80f4bSopenharmony_ci/**
1588bf80f4bSopenharmony_ci * @tc.name: TimerTest
1598bf80f4bSopenharmony_ci * @tc.desc: test SingleShot function
1608bf80f4bSopenharmony_ci * @tc.type: FUNC
1618bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1628bf80f4bSopenharmony_ci */
1638bf80f4bSopenharmony_ciHWTEST_F(TimerTest, SingleShot, TestSize.Level1)
1648bf80f4bSopenharmony_ci{
1658bf80f4bSopenharmony_ci    {
1668bf80f4bSopenharmony_ci        std::atomic<int> count = 0;
1678bf80f4bSopenharmony_ci        Timer t;
1688bf80f4bSopenharmony_ci        EXPECT_TRUE(t.Start(
1698bf80f4bSopenharmony_ci            TimeSpan::Milliseconds(100), [&count] { ++count; }, Timer::SINGLE_SHOT, queueId_.ToUid()));
1708bf80f4bSopenharmony_ci        EXPECT_TRUE(t.IsRunning());
1718bf80f4bSopenharmony_ci        EXPECT_EQ_TIMED(150, count, 1);
1728bf80f4bSopenharmony_ci        META_WAIT_TIMED(150);
1738bf80f4bSopenharmony_ci        EXPECT_EQ(count, 1);
1748bf80f4bSopenharmony_ci        EXPECT_FALSE(t.IsRunning());
1758bf80f4bSopenharmony_ci    }
1768bf80f4bSopenharmony_ci    {
1778bf80f4bSopenharmony_ci        std::atomic<int> count = 0;
1788bf80f4bSopenharmony_ci        SingleShotTimer(
1798bf80f4bSopenharmony_ci            TimeSpan::Milliseconds(100), [&count] { ++count; }, queueId_.ToUid());
1808bf80f4bSopenharmony_ci        EXPECT_EQ_TIMED(150, count, 1);
1818bf80f4bSopenharmony_ci        META_WAIT_TIMED(150);
1828bf80f4bSopenharmony_ci        EXPECT_EQ(count, 1);
1838bf80f4bSopenharmony_ci    }
1848bf80f4bSopenharmony_ci}
1858bf80f4bSopenharmony_ci
1868bf80f4bSopenharmony_ci/**
1878bf80f4bSopenharmony_ci * @tc.name: TimerTest
1888bf80f4bSopenharmony_ci * @tc.desc: test Detach function
1898bf80f4bSopenharmony_ci * @tc.type: FUNC
1908bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1918bf80f4bSopenharmony_ci */
1928bf80f4bSopenharmony_ciHWTEST_F(TimerTest, Detach, TestSize.Level1)
1938bf80f4bSopenharmony_ci{
1948bf80f4bSopenharmony_ci    std::atomic<int> count = 0;
1958bf80f4bSopenharmony_ci    {
1968bf80f4bSopenharmony_ci        Timer t;
1978bf80f4bSopenharmony_ci        EXPECT_TRUE(t.Start(
1988bf80f4bSopenharmony_ci            TimeSpan::Milliseconds(100), [&count] { ++count; }, Timer::SINGLE_SHOT, queueId_.ToUid()));
1998bf80f4bSopenharmony_ci        t.Detach();
2008bf80f4bSopenharmony_ci        EXPECT_FALSE(t.IsRunning());
2018bf80f4bSopenharmony_ci    }
2028bf80f4bSopenharmony_ci    EXPECT_EQ_TIMED(150, count, 1);
2038bf80f4bSopenharmony_ci    META_WAIT_TIMED(150);
2048bf80f4bSopenharmony_ci    EXPECT_EQ(count, 1);
2058bf80f4bSopenharmony_ci}
2068bf80f4bSopenharmony_ci
2078bf80f4bSopenharmony_ci/**
2088bf80f4bSopenharmony_ci * @tc.name: TimerTest
2098bf80f4bSopenharmony_ci * @tc.desc: test BadQueue function
2108bf80f4bSopenharmony_ci * @tc.type: FUNC
2118bf80f4bSopenharmony_ci * @tc.require: I7DMS1
2128bf80f4bSopenharmony_ci */
2138bf80f4bSopenharmony_ciHWTEST_F(TimerTest, BadQueue, TestSize.Level1)
2148bf80f4bSopenharmony_ci{
2158bf80f4bSopenharmony_ci    {
2168bf80f4bSopenharmony_ci        Timer t(
2178bf80f4bSopenharmony_ci            TimeSpan::Milliseconds(20), [] {}, Timer::RECURRING,
2188bf80f4bSopenharmony_ci            BASE_NS::Uid { "b63ceb45-bdb3-4f23-bd95-bb640eba9144" });
2198bf80f4bSopenharmony_ci        EXPECT_TRUE(!t.IsRunning());
2208bf80f4bSopenharmony_ci    }
2218bf80f4bSopenharmony_ci    {
2228bf80f4bSopenharmony_ci        Timer t;
2238bf80f4bSopenharmony_ci        EXPECT_FALSE(t.Start(
2248bf80f4bSopenharmony_ci            TimeSpan::Milliseconds(20), [] {}, Timer::RECURRING,
2258bf80f4bSopenharmony_ci            BASE_NS::Uid { "b63ceb45-bdb3-4f23-bd95-bb640eba9144" }));
2268bf80f4bSopenharmony_ci        EXPECT_TRUE(!t.IsRunning());
2278bf80f4bSopenharmony_ci    }
2288bf80f4bSopenharmony_ci    {
2298bf80f4bSopenharmony_ci        Timer t(
2308bf80f4bSopenharmony_ci            TimeSpan::Milliseconds(20), [] {}, Timer::RECURRING, nullptr);
2318bf80f4bSopenharmony_ci        EXPECT_TRUE(!t.IsRunning());
2328bf80f4bSopenharmony_ci    }
2338bf80f4bSopenharmony_ci    {
2348bf80f4bSopenharmony_ci        Timer t;
2358bf80f4bSopenharmony_ci        EXPECT_FALSE(t.Start(
2368bf80f4bSopenharmony_ci            TimeSpan::Milliseconds(20), [] {}, Timer::RECURRING, nullptr));
2378bf80f4bSopenharmony_ci        EXPECT_TRUE(!t.IsRunning());
2388bf80f4bSopenharmony_ci    }
2398bf80f4bSopenharmony_ci}
2408bf80f4bSopenharmony_ci
2418bf80f4bSopenharmony_ciMETA_END_NAMESPACE()