• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_frame_rate_manager.h"
21 #include "hgm_test_base.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 
32 class HgmTouchManagerTest : public HgmTestBase {
33 public:
SetUpTestCase()34     static void SetUpTestCase()
35     {
36         HgmTestBase::SetUpTestCase();
37     }
TearDownTestCase()38     static void TearDownTestCase() {}
SetUp()39     void SetUp() {}
TearDown()40     void TearDown() {}
41 };
42 
43 /**
44  * @tc.name: QuickTouch
45  * @tc.desc: Verify the result of QuickTouch function
46  * @tc.type: FUNC
47  * @tc.require:
48  */
49 HWTEST_F(HgmTouchManagerTest, QuickTouch, Function | SmallTest | Level0)
50 {
51     int32_t clickNum = 100;
52     auto touchManager = HgmTouchManager();
53     for (int i = 0; i < clickNum; i++) {
54         touchManager.ChangeState(TouchState::DOWN_STATE);
55         touchManager.ChangeState(TouchState::UP_STATE);
56     }
57     touchManager.ChangeState(TouchState::IDLE_STATE);
58     sleep(1); // wait for 1s for the async task to complete
59     ASSERT_EQ(touchManager.GetState(), TouchState::IDLE_STATE);
60 }
61 
62 /**
63  * @tc.name: ChangeState
64  * @tc.desc: Verify the result of ChangeState function
65  * @tc.type: FUNC
66  * @tc.require:
67  */
68 HWTEST_F(HgmTouchManagerTest, ChangeState, Function | SmallTest | Level0)
69 {
70     PART("CaseDescription") {
71         auto touchManager = HgmTouchManager();
72         ASSERT_EQ(touchManager.GetState(), TouchState::IDLE_STATE);
73 
74         touchManager.ChangeState(TouchState::UP_STATE);
75         ASSERT_EQ(touchManager.GetState(), TouchState::IDLE_STATE);
76 
77         touchManager.ChangeState(TouchState::DOWN_STATE);
78         usleep(waitTaskFinishNs);
79         ASSERT_EQ(touchManager.GetState(), TouchState::DOWN_STATE);
80 
81         touchManager.ChangeState(TouchState::IDLE_STATE);
82         ASSERT_EQ(touchManager.GetState(), TouchState::DOWN_STATE);
83 
84         touchManager.ChangeState(TouchState::UP_STATE);
85         usleep(waitTaskFinishNs);
86         ASSERT_EQ(touchManager.GetState(), TouchState::UP_STATE);
87 
88         touchManager.ChangeState(TouchState::DOWN_STATE);
89         usleep(waitTaskFinishNs);
90         ASSERT_EQ(touchManager.GetState(), TouchState::DOWN_STATE);
91 
92         touchManager.ChangeState(TouchState::UP_STATE);
93         usleep(waitTaskFinishNs);
94         ASSERT_EQ(touchManager.GetState(), TouchState::UP_STATE);
95 
96         touchManager.ChangeState(TouchState::IDLE_STATE);
97         usleep(waitTaskFinishNs);
98         ASSERT_EQ(touchManager.GetState(), TouchState::IDLE_STATE);
99     }
100 }
101 
102 /**
103  * @tc.name: Up2IdleState
104  * @tc.desc: Verify the result of Up2IdleState function
105  * @tc.type: FUNC
106  * @tc.require:
107  */
108 HWTEST_F(HgmTouchManagerTest, Up2IdleState, Function | SmallTest | Level0)
109 {
110     auto touchManager = HgmTouchManager();
111     const int32_t rsTimeoutUs = 610000;
112     const int32_t handleRsFrameTimeUs = 150000;
113     const int32_t handleRsFrameNum = 20;
114     const int32_t skipTimeUs = 2600000;
115     const int32_t upOffsetTimeUs = 400000;
116 
117     // 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     // 2. 3s timeout
127     touchManager.ChangeState(TouchState::DOWN_STATE);
128     touchManager.ChangeState(TouchState::UP_STATE);
129     auto start  = std::chrono::steady_clock::now();
130     usleep(waitTaskFinishNs);
131     ASSERT_EQ(touchManager.GetState(), TouchState::UP_STATE);
132 
133     for (int i = 0; i < handleRsFrameNum; i++) {
134         touchManager.HandleRsFrame();
135         usleep(handleRsFrameTimeUs);
136         auto end  = std::chrono::steady_clock::now();
137         if (std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() > skipTimeUs) {
138             break;
139         }
140         ASSERT_EQ(touchManager.GetState(), TouchState::UP_STATE);
141     }
142     touchManager.HandleRsFrame();
143     usleep(upOffsetTimeUs);
144     touchManager.HandleRsFrame();
145     usleep(upOffsetTimeUs);
146     ASSERT_EQ(touchManager.GetState(), TouchState::IDLE_STATE);
147 }
148 
149 /**
150  * @tc.name: Up2IdleState001
151  * @tc.desc: Verify the result of Up2IdleState001 function
152  * @tc.type: FUNC
153  * @tc.require:
154  */
155 HWTEST_F(HgmTouchManagerTest, Up2IdleState001, Function | SmallTest | Level0)
156 {
157     PART("CaseDescription") {
158         auto touchManager = HgmTouchManager();
159         const int32_t rsTimeoutUs = 610000;
160         const int32_t handleRsFrameTimeUs = 510000;
161         const int32_t handleRsFrameNum = 5;
162         const TouchState undefinedState = static_cast<TouchState>(100);
163 
164         STEP("3s timeout") {
165             touchManager.ChangeState(TouchState::DOWN_STATE);
166             touchManager.ChangeState(TouchState::UP_STATE);
167             usleep(waitTaskFinishNs);
168             ASSERT_EQ(touchManager.GetState(), TouchState::UP_STATE);
169 
170             touchManager.OnEvent(TouchEvent::UP_TIMEOUT_EVENT);
171             usleep(rsTimeoutUs);
172             ASSERT_EQ(touchManager.GetState(), TouchState::IDLE_STATE);
173             touchManager.OnEvent(TouchEvent::RS_IDLE_TIMEOUT_EVENT);
174             usleep(rsTimeoutUs);
175             ASSERT_EQ(touchManager.GetState(), TouchState::IDLE_STATE);
176         }
177         STEP("State2String") {
178             touchManager.State2String(undefinedState);
179         }
180         STEP("CheckChangeStateValid") {
181             touchManager.CheckChangeStateValid(TouchState::IDLE_STATE, TouchState::UP_STATE);
182             touchManager.CheckChangeStateValid(TouchState::IDLE_STATE, undefinedState);
183             touchManager.CheckChangeStateValid(undefinedState, TouchState::IDLE_STATE);
184         }
185         STEP("ExecuteCallback") {
186             touchManager.ExecuteCallback(nullptr);
__anonc8e68e6a0202() 187             touchManager.ExecuteCallback([]() { usleep(1); });
188             touchManager.ExecuteCallback(nullptr);
189         }
190     }
191     sleep(1); // wait for task finished
192 }
193 
194 /**
195  * @tc.name: TestInitTouchManager
196  * @tc.desc: Verify the result of InitTouchManager
197  * @tc.type: FUNC
198  * @tc.require:
199  */
200 HWTEST_F(HgmTouchManagerTest, TestInitTouchManager, Function | SmallTest | Level1)
201 {
202     const int32_t upTimeUs = 120000;
203 
204     HgmFrameRateManager mgr;
205     mgr.InitTouchManager();
206     mgr.touchManager_.ChangeState(TouchState::DOWN_STATE);
207     EXPECT_EQ(mgr.voterTouchEffective_.load(), true);
208 
209     mgr.touchManager_.ChangeState(TouchState::UP_STATE);
210     EXPECT_EQ(mgr.frameVoter_.isTouchUpLTPOFirstPeriod_, true);
211 
212     mgr.touchManager_.ChangeState(TouchState::DOWN_STATE);
213     EXPECT_EQ(mgr.frameVoter_.isTouchUpLTPOFirstPeriod_, false);
214 
215     mgr.touchManager_.ChangeState(TouchState::UP_STATE);
216     EXPECT_EQ(mgr.frameVoter_.isTouchUpLTPOFirstPeriod_, true);
217 
218     usleep(upTimeUs);
219     EXPECT_EQ(mgr.frameVoter_.isTouchUpLTPOFirstPeriod_, false);
220 
221     mgr.touchManager_.ChangeState(TouchState::IDLE_STATE);
222     EXPECT_EQ(mgr.voterTouchEffective_, false);
223 }
224 } // namespace Rosen
225 } // namespace OHOS