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 for (int i = 0; i < clickNum; i++) { 50 touchManager.ChangeState(TouchState::DOWN_STATE); 51 touchManager.ChangeState(TouchState::UP_STATE); 52 } 53 touchManager.ChangeState(TouchState::IDLE_STATE); 54 sleep(1); // wait for 1s for the async task to complete 55 ASSERT_EQ(touchManager.GetState(), TouchState::IDLE_STATE); 56 } 57 58 /** 59 * @tc.name: ChangeState 60 * @tc.desc: Verify the result of ChangeState function 61 * @tc.type: FUNC 62 * @tc.require: 63 */ 64 HWTEST_F(HgmTouchManagerTest, ChangeState, Function | SmallTest | Level1) 65 { 66 PART("CaseDescription") { 67 auto touchManager = HgmTouchManager(); 68 ASSERT_EQ(touchManager.GetState(), TouchState::IDLE_STATE); 69 70 touchManager.ChangeState(TouchState::UP_STATE); 71 ASSERT_EQ(touchManager.GetState(), TouchState::IDLE_STATE); 72 73 touchManager.ChangeState(TouchState::DOWN_STATE); 74 usleep(waitTaskFinishNs); 75 ASSERT_EQ(touchManager.GetState(), TouchState::DOWN_STATE); 76 77 touchManager.ChangeState(TouchState::IDLE_STATE); 78 ASSERT_EQ(touchManager.GetState(), TouchState::DOWN_STATE); 79 80 touchManager.ChangeState(TouchState::UP_STATE); 81 usleep(waitTaskFinishNs); 82 ASSERT_EQ(touchManager.GetState(), TouchState::UP_STATE); 83 84 touchManager.ChangeState(TouchState::DOWN_STATE); 85 usleep(waitTaskFinishNs); 86 ASSERT_EQ(touchManager.GetState(), TouchState::DOWN_STATE); 87 88 touchManager.ChangeState(TouchState::UP_STATE); 89 usleep(waitTaskFinishNs); 90 ASSERT_EQ(touchManager.GetState(), TouchState::UP_STATE); 91 92 touchManager.ChangeState(TouchState::IDLE_STATE); 93 usleep(waitTaskFinishNs); 94 ASSERT_EQ(touchManager.GetState(), TouchState::IDLE_STATE); 95 } 96 } 97 98 /** 99 * @tc.name: Up2IdleState 100 * @tc.desc: Verify the result of Up2IdleState function 101 * @tc.type: FUNC 102 * @tc.require: 103 */ 104 HWTEST_F(HgmTouchManagerTest, Up2IdleState, Function | SmallTest | Level1) 105 { 106 auto touchManager = HgmTouchManager(); 107 const int32_t rsTimeoutUs = 610000; 108 const int32_t handleRsFrameTimeUs = 150000; 109 const int32_t handleRsFrameNum = 20; 110 const int32_t skipTimeUs = 2600000; 111 const int32_t upOffsetTimeUs = 400000; 112 113 // 1. 600ms timeout 114 touchManager.ChangeState(TouchState::DOWN_STATE); 115 touchManager.ChangeState(TouchState::UP_STATE); 116 usleep(waitTaskFinishNs); 117 ASSERT_EQ(touchManager.GetState(), TouchState::UP_STATE); 118 119 usleep(rsTimeoutUs); 120 ASSERT_EQ(touchManager.GetState(), TouchState::IDLE_STATE); 121 122 // 2. 3s timeout 123 touchManager.ChangeState(TouchState::DOWN_STATE); 124 touchManager.ChangeState(TouchState::UP_STATE); 125 auto start = std::chrono::steady_clock::now(); 126 usleep(waitTaskFinishNs); 127 ASSERT_EQ(touchManager.GetState(), TouchState::UP_STATE); 128 129 for (int i = 0; i < handleRsFrameNum; i++) { 130 touchManager.HandleRsFrame(); 131 usleep(handleRsFrameTimeUs); 132 auto end = std::chrono::steady_clock::now(); 133 if (std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() > skipTimeUs) { 134 break; 135 } 136 ASSERT_EQ(touchManager.GetState(), TouchState::UP_STATE); 137 } 138 touchManager.HandleRsFrame(); 139 usleep(upOffsetTimeUs); 140 touchManager.HandleRsFrame(); 141 usleep(upOffsetTimeUs); 142 ASSERT_EQ(touchManager.GetState(), TouchState::IDLE_STATE); 143 } 144 145 /** 146 * @tc.name: Up2IdleState001 147 * @tc.desc: Verify the result of Up2IdleState001 function 148 * @tc.type: FUNC 149 * @tc.require: 150 */ 151 HWTEST_F(HgmTouchManagerTest, Up2IdleState001, Function | SmallTest | Level1) 152 { 153 PART("CaseDescription") { 154 auto touchManager = HgmTouchManager(); 155 const int32_t rsTimeoutUs = 610000; 156 const int32_t handleRsFrameTimeUs = 510000; 157 const int32_t handleRsFrameNum = 5; 158 const TouchState undefinedState = static_cast<TouchState>(100); 159 160 STEP("3s timeout") { 161 touchManager.ChangeState(TouchState::DOWN_STATE); 162 touchManager.ChangeState(TouchState::UP_STATE); 163 usleep(waitTaskFinishNs); 164 ASSERT_EQ(touchManager.GetState(), TouchState::UP_STATE); 165 166 touchManager.OnEvent(TouchEvent::UP_TIMEOUT_EVENT); 167 usleep(rsTimeoutUs); 168 ASSERT_EQ(touchManager.GetState(), TouchState::IDLE_STATE); 169 } 170 STEP("State2String") { 171 touchManager.State2String(undefinedState); 172 } 173 STEP("CheckChangeStateValid") { 174 touchManager.CheckChangeStateValid(TouchState::IDLE_STATE, TouchState::UP_STATE); 175 touchManager.CheckChangeStateValid(TouchState::IDLE_STATE, undefinedState); 176 touchManager.CheckChangeStateValid(undefinedState, TouchState::IDLE_STATE); 177 } 178 STEP("ExecuteCallback") { 179 touchManager.ExecuteCallback(nullptr); __anon2ab8d5080202() 180 touchManager.ExecuteCallback([] () { usleep(1); }); 181 touchManager.ExecuteCallback(nullptr); 182 } 183 } 184 sleep(1); // wait for task finished 185 } 186 } // namespace Rosen 187 } // namespace OHOS