1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
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 <gtest/gtest.h>
17 #include <limits>
18 #include <test_header.h>
19 
20 #include "hgm_core.h"
21 #include "hgm_frame_rate_manager.h"
22 
23 using namespace testing;
24 using namespace testing::ext;
25 
26 namespace OHOS {
27 namespace Rosen {
28 namespace {
29     constexpr int32_t waitTaskFinishNs = 100000;
30 }
31 class HgmTouchManagerTest : public testing::Test {
32 public:
SetUpTestCase()33     static void SetUpTestCase() {}
TearDownTestCase()34     static void TearDownTestCase() {}
SetUp()35     void SetUp() {}
TearDown()36     void TearDown() {}
37 };
38 
39 /**
40  * @tc.name: QuickTouch
41  * @tc.desc: Verify the result of QuickTouch function
42  * @tc.type: FUNC
43  * @tc.require:
44  */
45 HWTEST_F(HgmTouchManagerTest, QuickTouch, Function | SmallTest | Level1)
46 {
47     int32_t clickNum = 100;
48     auto touchManager = HgmTouchManager();
49     std::vector<std::thread> testThreads;
50     for (int i = 0; i < clickNum; i++) {
__anoned3c07000202() 51         testThreads.push_back(std::thread([&] () { touchManager.ChangeState(TouchState::DOWN_STATE); }));
__anoned3c07000302() 52         testThreads.push_back(std::thread([&] () { touchManager.ChangeState(TouchState::UP_STATE); }));
53     }
54     for (auto &testThread : testThreads) {
55         if (testThread.joinable()) {
56             testThread.join();
57         }
58     }
59     touchManager.ChangeState(TouchState::IDLE_STATE);
60     sleep(1); // wait for 1s for the async task to complete
61 }
62 
63 /**
64  * @tc.name: ChangeState
65  * @tc.desc: Verify the result of ChangeState function
66  * @tc.type: FUNC
67  * @tc.require:
68  */
69 HWTEST_F(HgmTouchManagerTest, ChangeState, Function | SmallTest | Level1)
70 {
71     PART("CaseDescription") {
72         auto touchManager = HgmTouchManager();
73         ASSERT_EQ(touchManager.GetState(), TouchState::IDLE_STATE);
74 
75         touchManager.ChangeState(TouchState::UP_STATE);
76         ASSERT_EQ(touchManager.GetState(), TouchState::IDLE_STATE);
77 
78         touchManager.ChangeState(TouchState::DOWN_STATE);
79         usleep(waitTaskFinishNs);
80         ASSERT_EQ(touchManager.GetState(), TouchState::DOWN_STATE);
81 
82         touchManager.ChangeState(TouchState::IDLE_STATE);
83         ASSERT_EQ(touchManager.GetState(), TouchState::DOWN_STATE);
84 
85         touchManager.ChangeState(TouchState::UP_STATE);
86         usleep(waitTaskFinishNs);
87         ASSERT_EQ(touchManager.GetState(), TouchState::UP_STATE);
88 
89         touchManager.ChangeState(TouchState::DOWN_STATE);
90         usleep(waitTaskFinishNs);
91         ASSERT_EQ(touchManager.GetState(), TouchState::DOWN_STATE);
92 
93         touchManager.ChangeState(TouchState::UP_STATE);
94         usleep(waitTaskFinishNs);
95         ASSERT_EQ(touchManager.GetState(), TouchState::UP_STATE);
96 
97         touchManager.ChangeState(TouchState::IDLE_STATE);
98         usleep(waitTaskFinishNs);
99         ASSERT_EQ(touchManager.GetState(), TouchState::IDLE_STATE);
100     }
101 }
102 
103 /**
104  * @tc.name: Up2IdleState
105  * @tc.desc: Verify the result of Up2IdleState function
106  * @tc.type: FUNC
107  * @tc.require:
108  */
109 HWTEST_F(HgmTouchManagerTest, Up2IdleState, Function | SmallTest | Level1)
110 {
111     PART("CaseDescription") {
112         auto touchManager = HgmTouchManager();
113         const int32_t rsTimeoutUs = 610000;
114         const int32_t handleRsFrameTimeUs = 510000;
115         const int32_t handleRsFrameNum = 5;
116 
117         STEP("1. 600ms timeout") {
118             touchManager.ChangeState(TouchState::DOWN_STATE);
119             touchManager.ChangeState(TouchState::UP_STATE);
120             usleep(waitTaskFinishNs);
121             ASSERT_EQ(touchManager.GetState(), TouchState::UP_STATE);
122 
123             usleep(rsTimeoutUs);
124             ASSERT_EQ(touchManager.GetState(), TouchState::IDLE_STATE);
125         }
126         STEP("2. 3s timeout") {
127             touchManager.ChangeState(TouchState::DOWN_STATE);
128             touchManager.ChangeState(TouchState::UP_STATE);
129             usleep(waitTaskFinishNs);
130             ASSERT_EQ(touchManager.GetState(), TouchState::UP_STATE);
131 
132             for (int i = 0; i < handleRsFrameNum; i++) {
133                 touchManager.HandleRsFrame();
134                 usleep(handleRsFrameTimeUs);
135                 ASSERT_EQ(touchManager.GetState(), TouchState::UP_STATE);
136             }
137             usleep(handleRsFrameTimeUs);
138             ASSERT_EQ(touchManager.GetState(), TouchState::IDLE_STATE);
139         }
140     }
141 }
142 } // namespace Rosen
143 } // namespace OHOS