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