1 /*
2 * Copyright (c) 2025-2025 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 <thread>
18
19 #include "res_type.h"
20 #include "res_sched_mgr.h"
21 #include "scene_recognizer_mgr.h"
22 #include "slide_recognizer.h"
23
24 namespace OHOS {
25 namespace ResourceSchedule {
26 using namespace std;
27 using namespace testing::ext;
28 class SlideRecognizeTest : public testing::Test {
29 public:
30 static void SetUpTestCase(void);
31 static void TearDownTestCase(void);
32 void SetUp();
33 void TearDown();
34 static std::shared_ptr<SlideRecognizer> slideRecognizer_;
35 };
36 std::shared_ptr<SlideRecognizer> SlideRecognizeTest::slideRecognizer_ = nullptr;
37
SetUpTestCase(void)38 void SlideRecognizeTest::SetUpTestCase(void)
39 {
40 slideRecognizer_ = std::static_pointer_cast<SlideRecognizer>(SceneRecognizerMgr::GetInstance().
41 sceneRecognizers_[RecognizeType::SLIDE_RECOGNIZER]);
42 }
43
TearDownTestCase()44 void SlideRecognizeTest::TearDownTestCase() {}
45
SetUp()46 void SlideRecognizeTest::SetUp() {}
47
TearDown()48 void SlideRecognizeTest::TearDown() {}
49
50 /**
51 * @tc.name: NormalSlideTest001
52 * @tc.desc: test normal slide scene.
53 * @tc.type: FUNC
54 * @tc.require: #IC5T7D
55 * @tc.author: baiheng
56 */
57 HWTEST_F(SlideRecognizeTest, NormalSlideTest001, Function | MediumTest | Level0)
58 {
59 nlohmann::json payload;
60 payload["clientPid"] = "1000";
61 payload["callingUid"] = "2000";
62 //初始状态 IDLE
63 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::IDLE);
64 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SLIDE_RECOGNIZE,
65 ResType::SlideEventStatus::SLIDE_EVENT_DETECTING, payload);
66 std::this_thread::sleep_for(std::chrono::milliseconds(10));
67 //收到滑动探测事件 状态变化为DETECTING
68 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::SLIDE_NORMAL_DETECTING);
69 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SEND_FRAME_EVENT, 0, payload);
70 std::this_thread::sleep_for(std::chrono::milliseconds(2));
71 //收到送帧上屏事件,且未离手,识别到此次为拖滑,状态变化为拖滑状态
72 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::SLIDE_NORMAL);
73 payload["up_speed"] = "0";
74 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_CLICK_RECOGNIZE,
75 ResType::ClickEventType::TOUCH_EVENT_UP, payload);
76 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_CLICK_RECOGNIZE,
77 ResType::ClickEventType::TOUCH_EVENT_DOWN, payload);
78 std::this_thread::sleep_for(std::chrono::milliseconds(2));
79 //离手速度为0,拖滑结束,状态变化为IDLE
80 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::IDLE);
81 }
82
83 /**
84 * @tc.name: NormalSlideTest002
85 * @tc.desc: test normal slide scene.
86 * @tc.type: FUNC
87 * @tc.require: #IC5T7D
88 * @tc.author: baiheng
89 */
90 HWTEST_F(SlideRecognizeTest, NormalSlideTest002, Function | MediumTest | Level0)
91 {
92 nlohmann::json payload;
93 payload["clientPid"] = "1000";
94 payload["callingUid"] = "2000";
95 //初始状态 IDLE
96 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::IDLE);
97 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SLIDE_RECOGNIZE,
98 ResType::SlideEventStatus::SLIDE_EVENT_DETECTING, payload);
99 std::this_thread::sleep_for(std::chrono::milliseconds(10));
100 //收到滑动探测事件 状态变化为DETECTING
101 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::SLIDE_NORMAL_DETECTING);
102 //离手
103 payload["up_speed"] = "0";
104 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_CLICK_RECOGNIZE,
105 ResType::ClickEventType::TOUCH_EVENT_UP, payload);
106 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SEND_FRAME_EVENT, 0, payload);
107 std::this_thread::sleep_for(std::chrono::milliseconds(2));
108 //收到送帧上屏事件,但已离手,不识别为拖滑,状态变化为IDLE
109 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::IDLE);
110 }
111
112 /**
113 * @tc.name: NormalSlideTest003
114 * @tc.desc: test normal slide scene.
115 * @tc.type: FUNC
116 * @tc.require: #IC5T7D
117 * @tc.author: baiheng
118 */
119 HWTEST_F(SlideRecognizeTest, NormalSlideTest003, Function | MediumTest | Level0)
120 {
121 nlohmann::json payload;
122 payload["clientPid"] = "1000";
123 payload["callingUid"] = "2000";
124 //初始状态 IDLE
125 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::IDLE);
126 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SLIDE_RECOGNIZE,
127 ResType::SlideEventStatus::SLIDE_EVENT_DETECTING, payload);
128 std::this_thread::sleep_for(std::chrono::milliseconds(10));
129 //收到滑动探测事件 状态变化为DETECTING
130 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::SLIDE_NORMAL_DETECTING);
131 payload["up_speed"] = "0";
132 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_CLICK_RECOGNIZE,
133 ResType::ClickEventType::TOUCH_EVENT_UP, payload);
134 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_CLICK_RECOGNIZE,
135 ResType::ClickEventType::TOUCH_EVENT_DOWN, payload);
136 std::this_thread::sleep_for(std::chrono::milliseconds(2));
137 //离手速度为0,中间未收到送帧上屏事件,拖滑结束,状态变化为IDLE
138 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::IDLE);
139 }
140
141 /**
142 * @tc.name: ListFlingTest001
143 * @tc.desc: test list fling scene.
144 * @tc.type: FUNC
145 * @tc.require: #IC5T7D
146 * @tc.author: baiheng
147 */
148 HWTEST_F(SlideRecognizeTest, ListFlingTest001, Function | MediumTest | Level0)
149 {
150 nlohmann::json payload;
151 payload["clientPid"] = "1000";
152 payload["callingUid"] = "2000";
153 //初始状态 IDLE
154 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::IDLE);
155 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SLIDE_RECOGNIZE,
156 ResType::SlideEventStatus::SLIDE_EVENT_DETECTING, payload);
157 std::this_thread::sleep_for(std::chrono::milliseconds(10));
158 //收到滑动探测事件 状态变化为DETECTING
159 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::SLIDE_NORMAL_DETECTING);
160 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SEND_FRAME_EVENT, 0, payload);
161 std::this_thread::sleep_for(std::chrono::milliseconds(2));
162 //收到送帧上屏事件,且未离手,识别到此次为拖滑,状态变化为拖滑状态
163 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::SLIDE_NORMAL);
164 payload["up_speed"] = "10.0";
165 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_CLICK_RECOGNIZE,
166 ResType::ClickEventType::TOUCH_EVENT_UP, payload);
167 std::this_thread::sleep_for(std::chrono::milliseconds(10));
168 //离手速度大于检测阈值,识别为抛滑,状态变化为LIST_FLING
169 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::LIST_FLING);
170 //模拟 2s内一直产生送帧事件
171 for (int i = 0; i < 100; ++i) {
172 std::this_thread::sleep_for(std::chrono::milliseconds(20));
173 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SEND_FRAME_EVENT, 0, payload);
174 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::LIST_FLING);
175 }
176 //100ms内未收到送帧事件 识别未抛滑结束
177 std::this_thread::sleep_for(std::chrono::milliseconds(500));
178 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::IDLE);
179 }
180
181 /**
182 * @tc.name: ListFlingTest002
183 * @tc.desc: test list fling scene.
184 * @tc.type: FUNC
185 * @tc.require: #IC5T7D
186 * @tc.author: baiheng
187 */
188 HWTEST_F(SlideRecognizeTest, ListFlingTest002, Function | MediumTest | Level0)
189 {
190 nlohmann::json payload;
191 payload["clientPid"] = "1000";
192 payload["callingUid"] = "2000";
193 //初始状态 IDLE
194 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::IDLE);
195 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SLIDE_RECOGNIZE,
196 ResType::SlideEventStatus::SLIDE_EVENT_DETECTING, payload);
197 std::this_thread::sleep_for(std::chrono::milliseconds(10));
198 //收到滑动探测事件 状态变化为DETECTING
199 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::SLIDE_NORMAL_DETECTING);
200 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SEND_FRAME_EVENT, 0, payload);
201 std::this_thread::sleep_for(std::chrono::milliseconds(2));
202 //收到送帧上屏事件,且未离手,识别到此次为拖滑,状态变化为拖滑状态
203 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::SLIDE_NORMAL);
204 payload["up_speed"] = "10.0";
205 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_CLICK_RECOGNIZE,
206 ResType::ClickEventType::TOUCH_EVENT_UP, payload);
207 std::this_thread::sleep_for(std::chrono::milliseconds(10));
208 //离手速度大于检测阈值,识别为抛滑,状态变化为LIST_FLING
209 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::LIST_FLING);
210 //模拟 4s内一直产生送帧事件
211 for (int i = 0; i < 400; ++i) {
212 std::this_thread::sleep_for(std::chrono::milliseconds(20));
213 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SEND_FRAME_EVENT, 0, payload);
214 }
215 //单次抛滑超过3s,超时结束
216 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::IDLE);
217 }
218
219 /**
220 * @tc.name: ListFlingTest003
221 * @tc.desc: test list fling scene.
222 * @tc.type: FUNC
223 * @tc.require: #IC5T7D
224 * @tc.author: baiheng
225 */
226 HWTEST_F(SlideRecognizeTest, ListFlingTest003, Function | MediumTest | Level0)
227 {
228 nlohmann::json payload;
229 payload["clientPid"] = "1000";
230 payload["callingUid"] = "2000";
231 //初始状态 IDLE
232 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::IDLE);
233 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SLIDE_RECOGNIZE,
234 ResType::SlideEventStatus::SLIDE_EVENT_DETECTING, payload);
235 std::this_thread::sleep_for(std::chrono::milliseconds(10));
236 //收到滑动探测事件 状态变化为DETECTING
237 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::SLIDE_NORMAL_DETECTING);
238 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SEND_FRAME_EVENT, 0, payload);
239 std::this_thread::sleep_for(std::chrono::milliseconds(2));
240 //收到送帧上屏事件,且未离手,识别到此次为拖滑,状态变化为拖滑状态
241 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::SLIDE_NORMAL);
242 payload["up_speed"] = "10.0";
243 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_CLICK_RECOGNIZE,
244 ResType::ClickEventType::TOUCH_EVENT_UP, payload);
245 std::this_thread::sleep_for(std::chrono::milliseconds(10));
246 //离手速度大于检测阈值,识别为抛滑,状态变化为LIST_FLING
247 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::LIST_FLING);
248 //模拟 1s内一直产生送帧事件
249 for (int i = 0; i < 100; ++i) {
250 std::this_thread::sleep_for(std::chrono::milliseconds(10));
251 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SEND_FRAME_EVENT, 0, payload);
252 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::LIST_FLING);
253 }
254 //模拟连续抛滑场景
255 ResSchedMgr::GetInstance().ReportData(ResType::TOUCH_EVENT_DOWN,
256 ResType::ClickEventType::TOUCH_EVENT_UP, payload);
257 std::this_thread::sleep_for(std::chrono::milliseconds(5));
258 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SLIDE_RECOGNIZE,
259 ResType::SlideEventStatus::SLIDE_EVENT_DETECTING, payload);
260 std::this_thread::sleep_for(std::chrono::milliseconds(5));
261 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::SLIDE_NORMAL_DETECTING);
262 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SEND_FRAME_EVENT, 0, payload);
263 std::this_thread::sleep_for(std::chrono::milliseconds(2));
264 //收到送帧上屏事件,且未离手,识别到此次为拖滑,状态变化为拖滑状态
265 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::SLIDE_NORMAL);
266 payload["up_speed"] = "10.0";
267 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_CLICK_RECOGNIZE,
268 ResType::ClickEventType::TOUCH_EVENT_UP, payload);
269 std::this_thread::sleep_for(std::chrono::milliseconds(10));
270 //离手速度大于检测阈值,识别为抛滑,状态变化为LIST_FLING
271 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::LIST_FLING);
272 std::this_thread::sleep_for(std::chrono::milliseconds(200));
273 //超过100ms未收到送帧,识别抛滑结束
274 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::IDLE);
275 }
276
277 /**
278 * @tc.name: ListFlingTest004
279 * @tc.desc: test list fling scene.
280 * @tc.type: FUNC
281 * @tc.require: #IC5T7D
282 * @tc.author: baiheng
283 */
284 HWTEST_F(SlideRecognizeTest, ListFlingTest004, Function | MediumTest | Level0)
285 {
286 nlohmann::json payload;
287 payload["clientPid"] = "1000";
288 payload["callingUid"] = "2000";
289 //初始状态 IDLE
290 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::IDLE);
291 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SLIDE_RECOGNIZE,
292 ResType::SlideEventStatus::SLIDE_EVENT_DETECTING, payload);
293 std::this_thread::sleep_for(std::chrono::milliseconds(10));
294 //收到滑动探测事件 状态变化为DETECTING
295 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::SLIDE_NORMAL_DETECTING);
296 std::this_thread::sleep_for(std::chrono::milliseconds(2));
297 payload["up_speed"] = "10.0";
298 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_CLICK_RECOGNIZE,
299 ResType::ClickEventType::TOUCH_EVENT_UP, payload);
300 std::this_thread::sleep_for(std::chrono::milliseconds(10));
301 //离手速度大于检测阈值,且未收到送帧,但仍处于滑动探测状态,识别为抛滑,状态变化为LIST_FLING
302 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::LIST_FLING);
303 //模拟 4s内一直产生送帧事件
304 for (int i = 0; i < 400; ++i) {
305 std::this_thread::sleep_for(std::chrono::milliseconds(20));
306 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SEND_FRAME_EVENT, 0, payload);
307 }
308 //单次抛滑超过3s,超时结束
309 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::IDLE);
310 }
311
312 /**
313 * @tc.name: ListFlingTest005
314 * @tc.desc: test list fling scene.
315 * @tc.type: FUNC
316 * @tc.require: #IC5T7D
317 * @tc.author: baiheng
318 */
319 HWTEST_F(SlideRecognizeTest, ListFlingTest005, Function | MediumTest | Level0)
320 {
321 nlohmann::json payload;
322 payload["clientPid"] = "1000";
323 payload["calling_uid"] = "2000";
324 //初始状态 IDLE
325 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::IDLE);
326 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_AXIS_EVENT,
327 ResType::AxisEventStatus::AXIS_EVENT_END, payload);
328 std::this_thread::sleep_for(std::chrono::milliseconds(10));
329 EXPECT_EQ(slideRecognizer_->isInTouching_, false);
330 }
331
332 /**
333 * @tc.name: ListFlingTest006
334 * @tc.desc: test list fling scene.
335 * @tc.type: FUNC
336 * @tc.require: #IC5T7D
337 * @tc.author: baiheng
338 */
339 HWTEST_F(SlideRecognizeTest, ListFlingTest006, Function | MediumTest | Level0)
340 {
341 nlohmann::json payload;
342 payload["clientPid"] = "1000";
343 payload["calling_uid"] = "2000";
344 //初始状态 IDLE
345 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::IDLE);
346 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_CLICK_RECOGNIZE,
347 ResType::ClickEventType::TOUCH_EVENT_PULL_UP, payload);
348 std::this_thread::sleep_for(std::chrono::milliseconds(10));
349 EXPECT_EQ(slideRecognizer_->isInTouching_, false);
350 }
351
352 /**
353 * @tc.name: NormalSlideTest004
354 * @tc.desc: test normal slide scene.
355 * @tc.type: FUNC
356 * @tc.require: #IC5T7D
357 * @tc.author: baiheng
358 */
359 HWTEST_F(SlideRecognizeTest, NormalSlideTest004, Function | MediumTest | Level0)
360 {
361 nlohmann::json payload;
362 //初始状态 IDLE
363 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::IDLE);
364 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SLIDE_RECOGNIZE,
365 ResType::SlideEventStatus::SLIDE_EVENT_DETECTING, payload);
366 std::this_thread::sleep_for(std::chrono::milliseconds(10));
367 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SEND_FRAME_EVENT, 0, payload);
368 std::this_thread::sleep_for(std::chrono::milliseconds(2));
369 payload["up_speed"] = "0";
370 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_CLICK_RECOGNIZE,
371 ResType::ClickEventType::TOUCH_EVENT_UP, payload);
372 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_CLICK_RECOGNIZE,
373 ResType::ClickEventType::TOUCH_EVENT_DOWN, payload);
374 std::this_thread::sleep_for(std::chrono::milliseconds(2));
375 }
376
377 /**
378 * @tc.name: NormalSlideTest005
379 * @tc.desc: test normal slide scene.
380 * @tc.type: FUNC
381 * @tc.require: #IC5T7D
382 * @tc.author: baiheng
383 */
384 HWTEST_F(SlideRecognizeTest, NormalSlideTest005, Function | MediumTest | Level0)
385 {
386 nlohmann::json payload;
387 payload["clientPid"] = 1000;
388 payload["calling_uid"] = 2000;
389 //初始状态 IDLE
390 EXPECT_EQ(slideRecognizer_->GetSlideStatus(), SlideRecognizeStat::IDLE);
391 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SLIDE_RECOGNIZE,
392 ResType::SlideEventStatus::SLIDE_EVENT_DETECTING, payload);
393 std::this_thread::sleep_for(std::chrono::milliseconds(10));
394 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SEND_FRAME_EVENT, 0, payload);
395 std::this_thread::sleep_for(std::chrono::milliseconds(2));
396 payload["up_speed"] = "0";
397 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_CLICK_RECOGNIZE,
398 ResType::ClickEventType::TOUCH_EVENT_UP, payload);
399 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_CLICK_RECOGNIZE,
400 ResType::ClickEventType::TOUCH_EVENT_DOWN, payload);
401 std::this_thread::sleep_for(std::chrono::milliseconds(2));
402 }
403 } // namespace ResourceSchedule
404 } // namespace OHOS