• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 <future>
17 #include <optional>
18 #include <utility>
19 #include <vector>
20 
21 #include <unistd.h>
22 
23 #include "accesstoken_kit.h"
24 #include "display_manager.h"
25 #include "display_info.h"
26 #include <gtest/gtest.h>
27 #include "input_device.h"
28 #include "input_manager.h"
29 #include "parcel.h"
30 #include "pointer_event.h"
31 #include "securec.h"
32 
33 #include "coordination_message.h"
34 #include "devicestatus_define.h"
35 #include "devicestatus_errors.h"
36 #include "drag_data_util.h"
37 #include "interaction_manager.h"
38 #include "nativetoken_kit.h"
39 #include "token_setproc.h"
40 
41 #undef LOG_TAG
42 #define LOG_TAG "InteractionManagerTest"
43 
44 namespace OHOS {
45 namespace Msdp {
46 namespace DeviceStatus {
47 using namespace testing::ext;
48 namespace {
49 constexpr int32_t TIME_WAIT_FOR_OP_MS { 20 };
50 constexpr int32_t TIME_WAIT_FOR_INJECT_MS { 80 };
51 constexpr int32_t TIME_WAIT_FOR_TOUCH_DOWN_MS { 1000 };
52 constexpr int32_t PROMISE_WAIT_SPAN_MS { 2000 };
53 constexpr int32_t TEST_PIXEL_MAP_WIDTH { 200 };
54 constexpr int32_t TEST_PIXEL_MAP_HEIGHT { 200 };
55 constexpr int32_t MAX_PIXEL_MAP_WIDTH { 600 };
56 constexpr int32_t MAX_PIXEL_MAP_HEIGHT { 600 };
57 constexpr int32_t MOUSE_POINTER_ID { 0 };
58 constexpr int32_t TOUCH_POINTER_ID { 1 };
59 constexpr int32_t TOUCH_POINTER_ID_INJECT { 20001 };
60 constexpr int32_t DISPLAY_ID { 0 };
61 constexpr int32_t DRAG_SRC_X { 0 };
62 constexpr int32_t DRAG_SRC_Y { 0 };
63 constexpr int32_t DRAG_DST_X { 500 };
64 constexpr int32_t DRAG_DST_Y { 500 };
65 constexpr int32_t DRAG_NUM { 1 };
66 constexpr int32_t INT32_BYTE { 4 };
67 constexpr int32_t SUBSTR_UDKEY_LEN { 6 };
68 constexpr int32_t WINDOW_ID { -1 };
69 constexpr int32_t HOT_AREA_COOR { 220 };
70 constexpr int32_t HOT_AREA_STEP { 150 };
71 constexpr int32_t HOT_AREA_SPAN { 70 };
72 constexpr uint32_t RECIVE_LOOP_COUNT { 5 };
73 constexpr uint32_t DEFAULT_ICON_COLOR { 0xFF };
74 constexpr bool HAS_CANCELED_ANIMATION { true };
75 constexpr bool HAS_CUSTOM_ANIMATION { true };
76 constexpr int32_t MOVE_STEP { 10 };
77 constexpr int32_t FOREGROUND_COLOR_IN { 0x33FF0000 };
78 constexpr int32_t FOREGROUND_COLOR_OUT { 0x00000000 };
79 constexpr int32_t ANIMATION_DURATION { 500 };
80 constexpr int32_t SRC_MAIN_WINDOW { 0 };
81 constexpr int32_t TARGET_MAIN_WINDOW { 0 };
82 constexpr int64_t DOWN_TIME { 1 };
83 const std::string UD_KEY { "Unified data key" };
84 const std::string SYSTEM_CORE { "system_core" };
85 const std::string SYSTEM_BASIC { "system_basic" };
86 const std::string CURVE_NAME { "cubic-bezier" };
87 const std::string EXTRA_INFO { "{ \"drag_corner_radius\": 20, \"drag_allow_distributed\": false }" };
88 const std::string FILTER_INFO { "{ \"dip_scale\": 3.5 }" };
89 int32_t g_deviceMouseId { -1 };
90 int32_t g_deviceTouchId { -1 };
91 int32_t g_screenWidth { 720 };
92 int32_t g_screenHeight { 1280 };
93 uint64_t g_tokenID { 0 };
94 const char* g_cores[] = { "ohos.permission.INPUT_MONITORING" };
95 const char* g_basics[] = { "ohos.permission.COOPERATE_MANAGER" };
96 const char* g_coresInject[] = { "ohos.permission.INJECT_INPUT_EVENT" };
97 std::shared_ptr<MMI::KeyEvent> g_keyEvent = MMI::KeyEvent::Create();
98 } // namespace
99 
100 class InteractionManagerTest : public testing::Test {
101 public:
102     void SetUp();
103     void TearDown();
104     static void SetUpTestCase();
105     static std::vector<int32_t> GetInputDeviceIds();
106     static std::shared_ptr<MMI::InputDevice> GetDevice(int32_t deviceId);
107     static std::pair<int32_t, int32_t> GetMouseAndTouch();
108     static std::shared_ptr<Media::PixelMap> CreatePixelMap(int32_t width, int32_t height);
109     static std::optional<DragData> CreateDragData(const std::pair<int32_t, int32_t> &pixelMapSize, int32_t sourceType,
110         int32_t pointerId, int32_t displayId, const std::pair<int32_t, int32_t> &location);
111     static MMI::PointerEvent::PointerItem CreatePointerItem(int32_t pointerId,
112         int32_t deviceId, const std::pair<int32_t, int32_t> &displayLocation, bool isPressed);
113     static std::shared_ptr<MMI::PointerEvent> SetupPointerEvent(const std::pair<int32_t, int32_t> &displayLocation,
114         int32_t action, int32_t sourceType, int32_t pointerId, bool isPressed);
115     static void SimulateDownPointerEvent(
116         const std::pair<int32_t, int32_t> &location, int32_t sourceType, int32_t pointerId);
117     static void SimulateUpPointerEvent(
118         const std::pair<int32_t, int32_t> &location, int32_t sourceType, int32_t pointerId);
119     static void SimulateMovePointerEvent(const std::pair<int32_t, int32_t> &srcLocation,
120         const std::pair<int32_t, int32_t> &dstLocation, int32_t sourceType, int32_t pointerId, bool isPressed);
121     static int32_t TestAddMonitor(std::shared_ptr<MMI::IInputEventConsumer> consumer);
122     static void TestRemoveMonitor(int32_t monitorId);
123     static void PrintDragData(const DragData &dragData);
124     static void SetPermission(const std::string &level, const char** perms, size_t permAmount);
125     static void RemovePermission();
126     static void SetupKeyEvent(int32_t action, int32_t key, bool isPressed);
127     static void ClearUpKeyEvent();
128     static void SimulateDownKeyEvent(int32_t key);
129     static void SimulateUpKeyEvent(int32_t key);
130     static void PrintDragAction(DragAction dragAction);
131     static void AssignToAnimation(PreviewAnimation &animation);
132     static void EnableCooperate();
133 };
134 
SetPermission(const std::string & level,const char ** perms,size_t permAmount)135 void InteractionManagerTest::SetPermission(const std::string &level, const char** perms, size_t permAmount)
136 {
137     CALL_DEBUG_ENTER;
138     if (perms == nullptr || permAmount == 0) {
139         FI_HILOGE("The perms is empty");
140         return;
141     }
142 
143     NativeTokenInfoParams infoInstance = {
144         .dcapsNum = 0,
145         .permsNum = permAmount,
146         .aclsNum = 0,
147         .dcaps = nullptr,
148         .perms = perms,
149         .acls = nullptr,
150         .processName = "InteractionManagerTest",
151         .aplStr = level.c_str(),
152     };
153     g_tokenID = GetAccessTokenId(&infoInstance);
154     SetSelfTokenID(g_tokenID);
155     OHOS::Security::AccessToken::AccessTokenKit::AccessTokenKit::ReloadNativeTokenInfo();
156 }
157 
RemovePermission()158 void InteractionManagerTest::RemovePermission()
159 {
160     CALL_DEBUG_ENTER;
161     int32_t ret = OHOS::Security::AccessToken::AccessTokenKit::DeleteToken(g_tokenID);
162     if (ret != RET_OK) {
163         FI_HILOGE("Failed to remove permission");
164         return;
165     }
166 }
167 
168 class DragListenerTest : public IDragListener {
169 public:
DragListenerTest()170     DragListenerTest() {}
DragListenerTest(const std::string & name)171     explicit DragListenerTest(const std::string& name) : moduleName_(name) {}
OnDragMessage(DragState state)172     void OnDragMessage(DragState state) override
173     {
174         if (moduleName_.empty()) {
175             moduleName_ = std::string("DragListenerTest");
176         }
177         FI_HILOGD("%{public}s, state:%{public}s", moduleName_.c_str(), PrintDragMessage(state).c_str());
178     }
179 private:
PrintDragMessage(DragState state)180     std::string PrintDragMessage(DragState state)
181     {
182         std::string type = "unknow";
183         const std::map<DragState, std::string> stateType = {
184             { DragState::ERROR, "error"},
185             { DragState::START, "start"},
186             { DragState::STOP, "stop"},
187             { DragState::CANCEL, "cancel"}
188         };
189         auto item = stateType.find(state);
190         if (item != stateType.end()) {
191             type = item->second;
192         }
193         return type;
194     }
195 private:
196     std::string moduleName_;
197 };
198 
199 class SubscriptListenerTest : public ISubscriptListener {
200 public:
SubscriptListenerTest()201     SubscriptListenerTest() {}
SubscriptListenerTest(const std::string & name)202     explicit SubscriptListenerTest(const std::string& name) : moduleName_(name) {}
OnMessage(DragCursorStyle style)203     void OnMessage(DragCursorStyle style) override
204     {
205         SetDragSyle(style);
206         if (moduleName_.empty()) {
207             moduleName_ = std::string("SubscriptListenerTest");
208         }
209         FI_HILOGD("Received notification event for subscriptListener, %{public}s, state:%{public}s",
210             moduleName_.c_str(), PrintStyleMessage(style).c_str());
211     }
212 
GetDragStyle()213     DragCursorStyle GetDragStyle()
214     {
215         return dragStyle_;
216     }
217 
218 private:
SetDragSyle(DragCursorStyle style)219     void SetDragSyle(DragCursorStyle style)
220     {
221         dragStyle_ = style;
222     }
223 
PrintStyleMessage(DragCursorStyle style)224     std::string PrintStyleMessage(DragCursorStyle style)
225     {
226         std::string type = "unknow";
227         const std::map<DragCursorStyle, std::string> cursorStyles = {
228             { DragCursorStyle::DEFAULT, "default"},
229             { DragCursorStyle::FORBIDDEN, "forbidden"},
230             { DragCursorStyle::COPY, "copy"},
231             { DragCursorStyle::MOVE, "move"}
232         };
233         auto item = cursorStyles.find(style);
234         if (item != cursorStyles.end()) {
235             type = item->second;
236         }
237         return type;
238     }
239 
240 private:
241     DragCursorStyle dragStyle_ { DragCursorStyle::DEFAULT };
242     std::string moduleName_;
243 };
244 
245 class UnitTestStartDragListener : public IStartDragListener {
246 public:
UnitTestStartDragListener(std::function<void (const DragNotifyMsg &)> function)247     explicit UnitTestStartDragListener(std::function<void(const DragNotifyMsg&)> function) : function_(function) { }
OnDragEndMessage(const DragNotifyMsg & msg)248     void OnDragEndMessage(const DragNotifyMsg &msg) override
249     {
250         FI_HILOGD("DisplayX:%{public}d, displayY:%{public}d, targetPid:%{public}d, result:%{public}d",
251             msg.displayX, msg.displayY, msg.targetPid, static_cast<int32_t>(msg.result));
252         if (function_ != nullptr) {
253             function_(msg);
254         }
255         FI_HILOGD("Unit test OnDragEndMessage");
256     }
257 
OnHideIconMessage()258     void OnHideIconMessage() override
259     {
260         FI_HILOGI("Unit test OnHideIconMessage");
261     }
262 private:
263     std::function<void(const DragNotifyMsg&)> function_;
264 };
265 
GetInputDeviceIds()266 std::vector<int32_t> InteractionManagerTest::GetInputDeviceIds()
267 {
268     std::vector<int32_t> realDeviceIds;
269     auto callback = [&realDeviceIds](std::vector<int32_t>& deviceIds) {
270         realDeviceIds = deviceIds;
271     };
272     int32_t ret = MMI::InputManager::GetInstance()->GetDeviceIds(callback);
273     if (ret != RET_OK) {
274         FI_HILOGE("Get device ids failed");
275         return {};
276     }
277     return realDeviceIds;
278 }
279 
GetDevice(int32_t deviceId)280 std::shared_ptr<MMI::InputDevice> InteractionManagerTest::GetDevice(int32_t deviceId)
281 {
282     std::shared_ptr<MMI::InputDevice> inputDevice;
283     auto callback = [&inputDevice](std::shared_ptr<MMI::InputDevice> device) {
284         inputDevice = device;
285     };
286     int32_t ret = MMI::InputManager::GetInstance()->GetDevice(deviceId, callback);
287     if (ret != RET_OK || inputDevice == nullptr) {
288         FI_HILOGE("Get device failed");
289         return nullptr;
290     }
291     return inputDevice;
292 }
293 
GetMouseAndTouch()294 std::pair<int32_t, int32_t> InteractionManagerTest::GetMouseAndTouch()
295 {
296     std::vector<int32_t> deviceIds = GetInputDeviceIds();
297     std::pair<int32_t, int32_t> mouseAndTouch { -1, -1 };
298     for (const auto& id : deviceIds) {
299         std::shared_ptr<MMI::InputDevice> device = GetDevice(id);
300         CHKPC(device);
301         if (device->HasCapability(MMI::InputDeviceCapability::INPUT_DEV_CAP_POINTER)) {
302             mouseAndTouch.first = device->GetId();
303         }
304         if (device->HasCapability(MMI::InputDeviceCapability::INPUT_DEV_CAP_TOUCH)) {
305             mouseAndTouch.second = device->GetId();
306         }
307     }
308     return mouseAndTouch;
309 }
310 
SetUpTestCase()311 void InteractionManagerTest::SetUpTestCase()
312 {
313     auto mouseAndTouch = GetMouseAndTouch();
314     g_deviceMouseId = mouseAndTouch.first;
315     g_deviceTouchId = mouseAndTouch.second;
316 }
317 
SetUp()318 void InteractionManagerTest::SetUp()
319 {
320     EnableCooperate();
321 }
322 
TearDown()323 void InteractionManagerTest::TearDown()
324 {
325     std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_OP_MS));
326 }
327 
EnableCooperate()328 void InteractionManagerTest::EnableCooperate()
329 {
330     SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
331     std::promise<bool> promiseFlag;
332     std::future<bool> futureFlag = promiseFlag.get_future();
333     auto fun = [&promiseFlag](const std::string &listener, const CoordinationMsgInfo &coordinationMessages) {
334         FI_HILOGD("Prepare coordination success, listener:%{public}s", listener.c_str());
335         promiseFlag.set_value(true);
336     };
337     bool isCompatible = true;
338     int32_t ret = InteractionManager::GetInstance()->PrepareCoordination(fun, isCompatible);
339 #ifdef OHOS_BUILD_ENABLE_COORDINATION
340     if (ret == RET_OK) {
341         FI_HILOGI("PrepareCoordination successfully");
342     } else {
343         FI_HILOGE("PrepareCoordination failed");
344     }
345     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) != std::future_status::timeout);
346 #else
347     ASSERT_EQ(ret, ERROR_UNSUPPORT);
348 #endif // OHOS_BUILD_ENABLE_COORDINATION
349     RemovePermission();
350 }
351 
CreatePixelMap(int32_t width,int32_t height)352 std::shared_ptr<Media::PixelMap> InteractionManagerTest::CreatePixelMap(int32_t width, int32_t height)
353 {
354     CALL_DEBUG_ENTER;
355     OHOS::Media::InitializationOptions opts;
356     opts.size.width = width;
357     opts.size.height = height;
358     opts.pixelFormat = Media::PixelFormat::BGRA_8888;
359     opts.alphaType = Media::AlphaType::IMAGE_ALPHA_TYPE_OPAQUE;
360     opts.scaleMode = Media::ScaleMode::FIT_TARGET_SIZE;
361 
362     int32_t colorLen = width * height;
363     uint32_t* colors = new (std::nothrow) uint32_t[colorLen];
364     CHKPP(colors);
365     int32_t colorByteCount = colorLen * INT32_BYTE;
366     if (memset_s(colors, colorByteCount, DEFAULT_ICON_COLOR, colorByteCount) != EOK) {
367         delete[] colors;
368         FI_HILOGE("memset_s failed");
369         return nullptr;
370     }
371     std::shared_ptr<Media::PixelMap> pixelMap = Media::PixelMap::Create(colors, colorLen, opts);
372     if (pixelMap == nullptr) {
373         delete[] colors;
374         FI_HILOGE("Create pixelMap failed");
375         return nullptr;
376     }
377     delete[] colors;
378     return pixelMap;
379 }
380 
CreateDragData(const std::pair<int32_t,int32_t> & pixelMapSize,int32_t sourceType,int32_t pointerId,int32_t displayId,const std::pair<int32_t,int32_t> & location)381 std::optional<DragData> InteractionManagerTest::CreateDragData(const std::pair<int32_t, int32_t> &pixelMapSize,
382     int32_t sourceType, int32_t pointerId, int32_t displayId, const std::pair<int32_t, int32_t> &location)
383 {
384     CALL_DEBUG_ENTER;
385     std::shared_ptr<Media::PixelMap> pixelMap = CreatePixelMap(pixelMapSize.first, pixelMapSize.second);
386     if (pixelMap == nullptr) {
387         FI_HILOGE("Create pixelmap failed");
388         return std::nullopt;
389     }
390     ShadowInfo shadowInfo { pixelMap, 0, 0 };
391     DragData dragData;
392     dragData.shadowInfos.push_back(shadowInfo);
393     dragData.buffer = std::vector<uint8_t>(MAX_BUFFER_SIZE, 0);
394     dragData.udKey = UD_KEY;
395     dragData.sourceType = sourceType;
396     dragData.pointerId = pointerId;
397     dragData.dragNum = DRAG_NUM;
398     dragData.displayX = location.first;
399     dragData.displayY = location.second;
400     dragData.displayId = displayId;
401     dragData.hasCanceledAnimation = HAS_CANCELED_ANIMATION;
402     dragData.extraInfo = EXTRA_INFO;
403     dragData.filterInfo = FILTER_INFO;
404     dragData.mainWindow = SRC_MAIN_WINDOW;
405     return dragData;
406 }
407 
CreatePointerItem(int32_t pointerId,int32_t deviceId,const std::pair<int32_t,int32_t> & displayLocation,bool isPressed)408 MMI::PointerEvent::PointerItem InteractionManagerTest::CreatePointerItem(int32_t pointerId, int32_t deviceId,
409     const std::pair<int32_t, int32_t> &displayLocation, bool isPressed)
410 {
411     MMI::PointerEvent::PointerItem item;
412     item.SetPointerId(pointerId);
413     item.SetDeviceId(deviceId);
414     item.SetDisplayX(displayLocation.first);
415     item.SetDisplayY(displayLocation.second);
416     item.SetPressed(isPressed);
417     return item;
418 }
419 
SetupPointerEvent(const std::pair<int32_t,int32_t> & displayLocation,int32_t action,int32_t sourceType,int32_t pointerId,bool isPressed)420 std::shared_ptr<MMI::PointerEvent> InteractionManagerTest::SetupPointerEvent(const std::pair<int32_t, int32_t>
421     &displayLocation, int32_t action, int32_t sourceType, int32_t pointerId, bool isPressed)
422 {
423     CALL_DEBUG_ENTER;
424     auto pointerEvent = MMI::PointerEvent::Create();
425     CHKPP(pointerEvent);
426     pointerEvent->SetPointerAction(action);
427     pointerEvent->SetSourceType(sourceType);
428     pointerEvent->SetPointerId(pointerId);
429     MMI::PointerEvent::PointerItem curPointerItem;
430     if (sourceType == MMI::PointerEvent::SOURCE_TYPE_MOUSE) {
431         curPointerItem = CreatePointerItem(pointerId, g_deviceMouseId, displayLocation, isPressed);
432     } else if (sourceType == MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
433         curPointerItem = CreatePointerItem(pointerId, g_deviceTouchId, displayLocation, isPressed);
434     } else {
435         FI_HILOGE("Unknow sourceType:%{public}d", sourceType);
436         return nullptr;
437     }
438     pointerEvent->AddPointerItem(curPointerItem);
439     return pointerEvent;
440 }
441 
SimulateDownPointerEvent(const std::pair<int32_t,int32_t> & location,int32_t sourceType,int32_t pointerId)442 void InteractionManagerTest::SimulateDownPointerEvent(const std::pair<int32_t, int32_t> &location, int32_t sourceType,
443     int32_t pointerId)
444 {
445     CALL_DEBUG_ENTER;
446     SetPermission(SYSTEM_CORE, g_coresInject, sizeof(g_coresInject) / sizeof(g_coresInject[0]));
447     std::shared_ptr<MMI::PointerEvent> pointerEvent =
448         SetupPointerEvent(location, MMI::PointerEvent::POINTER_ACTION_DOWN, sourceType, pointerId, true);
449     CHKPV(pointerEvent);
450     FI_HILOGD("TEST:sourceType:%{public}d, pointerId:%{public}d, pointerAction:%{public}d",
451         pointerEvent->GetSourceType(), pointerEvent->GetPointerId(), pointerEvent->GetPointerAction());
452     MMI::InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
453     RemovePermission();
454 }
455 
SimulateUpPointerEvent(const std::pair<int32_t,int32_t> & location,int32_t sourceType,int32_t pointerId)456 void InteractionManagerTest::SimulateUpPointerEvent(const std::pair<int32_t, int32_t> &location, int32_t sourceType,
457     int32_t pointerId)
458 {
459     CALL_DEBUG_ENTER;
460     SetPermission(SYSTEM_CORE, g_coresInject, sizeof(g_coresInject) / sizeof(g_coresInject[0]));
461     std::shared_ptr<MMI::PointerEvent> pointerEvent = SetupPointerEvent(location,
462         MMI::PointerEvent::POINTER_ACTION_UP, sourceType, pointerId, false);
463     CHKPV(pointerEvent);
464     FI_HILOGD("TEST:sourceType:%{public}d, pointerId:%{public}d, pointerAction:%{public}d",
465         pointerEvent->GetSourceType(), pointerEvent->GetPointerId(), pointerEvent->GetPointerAction());
466     MMI::InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
467     RemovePermission();
468 }
469 
SimulateMovePointerEvent(const std::pair<int32_t,int32_t> & srcLocation,const std::pair<int32_t,int32_t> & dstLocation,int32_t sourceType,int32_t pointerId,bool isPressed)470 void InteractionManagerTest::SimulateMovePointerEvent(const std::pair<int32_t, int32_t> &srcLocation,
471     const std::pair<int32_t, int32_t> &dstLocation, int32_t sourceType, int32_t pointerId, bool isPressed)
472 {
473     CALL_DEBUG_ENTER;
474     SetPermission(SYSTEM_CORE, g_coresInject, sizeof(g_coresInject) / sizeof(g_coresInject[0]));
475     int32_t srcX = srcLocation.first;
476     int32_t srcY = srcLocation.second;
477     int32_t dstX = dstLocation.first;
478     int32_t dstY = dstLocation.second;
479     std::vector<std::pair<int32_t, int32_t>> coordinates;
480     if (dstX == srcX) {
481         for (int32_t y = srcY; y <= dstY; y += MOVE_STEP) {
482             coordinates.push_back({srcX, y});
483         }
484         for (int32_t y = srcY; y > dstY; y -= MOVE_STEP) {
485             coordinates.push_back({srcX, y});
486         }
487     } else {
488         double ratio = (dstY - srcY) * 1.0 / (dstX - srcX);
489         for (int32_t x = srcX; x < dstX; x += MOVE_STEP) {
490             coordinates.push_back({x, srcY + static_cast<int32_t>(ratio * (x - srcX))});
491         }
492         for (int32_t x = srcX; x >= dstX; x -= MOVE_STEP) {
493             coordinates.push_back({x, srcY + static_cast<int32_t>(ratio * (x - srcX))});
494         }
495         coordinates.push_back({dstX, dstY});
496     }
497     for (const auto& pointer : coordinates) {
498         std::shared_ptr<MMI::PointerEvent> pointerEvent =
499             SetupPointerEvent(pointer, MMI::PointerEvent::POINTER_ACTION_MOVE, sourceType, pointerId, isPressed);
500         CHKPC(pointerEvent);
501         FI_HILOGD("TEST:sourceType:%{public}d, pointerId:%{public}d, pointerAction:%{public}d",
502             pointerEvent->GetSourceType(), pointerEvent->GetPointerId(), pointerEvent->GetPointerAction());
503         MMI::InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
504         std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
505     }
506     RemovePermission();
507 }
508 
TestAddMonitor(std::shared_ptr<MMI::IInputEventConsumer> consumer)509 int32_t InteractionManagerTest::TestAddMonitor(std::shared_ptr<MMI::IInputEventConsumer> consumer)
510 {
511     CHKPR(consumer, RET_ERR);
512     return MMI::InputManager::GetInstance()->AddMonitor(consumer);
513 }
514 
TestRemoveMonitor(int32_t monitorId)515 void InteractionManagerTest::TestRemoveMonitor(int32_t monitorId)
516 {
517     MMI::InputManager::GetInstance()->RemoveMonitor(monitorId);
518 }
519 
PrintDragData(const DragData & dragData)520 void InteractionManagerTest::PrintDragData(const DragData &dragData)
521 {
522     CALL_DEBUG_ENTER;
523     for (const auto &shadowInfo : dragData.shadowInfos) {
524         CHKPV(shadowInfo.pixelMap);
525         FI_HILOGD("PixelFormat:%{public}d, PixelAlphaType:%{public}d, PixelAllocatorType:%{public}d,"
526             " PixelWidth:%{public}d, PixelHeight:%{public}d, shadowX:%{public}d, shadowY:%{public}d",
527             static_cast<int32_t>(shadowInfo.pixelMap->GetPixelFormat()),
528             static_cast<int32_t>(shadowInfo.pixelMap->GetAlphaType()),
529             static_cast<int32_t>(shadowInfo.pixelMap->GetAllocatorType()),
530             shadowInfo.pixelMap->GetWidth(), shadowInfo.pixelMap->GetHeight(), shadowInfo.x, shadowInfo.y);
531     }
532     FI_HILOGD("SourceType:%{public}d, pointerId:%{public}d, displayId:%{public}d, displayX:%{public}d,"
533         " displayY:%{public}d, dragNum:%{public}d, hasCanceledAnimation:%{public}d, udKey:%{public}s",
534         dragData.sourceType, dragData.pointerId, dragData.displayId, dragData.displayX, dragData.displayY,
535         dragData.dragNum, dragData.hasCanceledAnimation, dragData.udKey.substr(0, SUBSTR_UDKEY_LEN).c_str());
536 }
537 
SetupKeyEvent(int32_t action,int32_t key,bool isPressed)538 void InteractionManagerTest::SetupKeyEvent(
539     int32_t action, int32_t key, bool isPressed)
540 {
541     CALL_DEBUG_ENTER;
542     CHKPV(g_keyEvent);
543     MMI::KeyEvent::KeyItem keyItem;
544     keyItem.SetKeyCode(key);
545     keyItem.SetDeviceId(1);
546     keyItem.SetDownTime(DOWN_TIME);
547     g_keyEvent->SetKeyAction(action);
548     g_keyEvent->SetKeyCode(key);
549     if (action == MMI::KeyEvent::KEY_ACTION_DOWN) {
550         keyItem.SetPressed(isPressed);
551     } else if (action == MMI::KeyEvent::KEY_ACTION_UP) {
552         g_keyEvent->RemoveReleasedKeyItems(keyItem);
553     }
554     g_keyEvent->AddPressedKeyItems(keyItem);
555 }
556 
ClearUpKeyEvent()557 void InteractionManagerTest::ClearUpKeyEvent()
558 {
559     CALL_DEBUG_ENTER;
560     CHKPV(g_keyEvent);
561     for (const auto& iter : g_keyEvent->GetKeyItems()) {
562         if (!iter.IsPressed()) {
563             FI_HILOGD("TEST:Clean keyItem, keyCode:%{public}d", iter.GetKeyCode());
564             g_keyEvent->RemoveReleasedKeyItems(iter);
565             return;
566         }
567     }
568 }
569 
SimulateDownKeyEvent(int32_t key)570 void InteractionManagerTest::SimulateDownKeyEvent(int32_t key)
571 {
572     CALL_DEBUG_ENTER;
573     SetPermission(SYSTEM_CORE, g_coresInject, sizeof(g_coresInject) / sizeof(g_coresInject[0]));
574     SetupKeyEvent(MMI::KeyEvent::KEY_ACTION_DOWN, key, true);
575     FI_HILOGD("TEST:keyCode:%{public}d, keyAction: KEY_ACTION_DOWN", key);
576     MMI::InputManager::GetInstance()->SimulateInputEvent(g_keyEvent);
577     std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
578     RemovePermission();
579 }
580 
SimulateUpKeyEvent(int32_t key)581 void InteractionManagerTest::SimulateUpKeyEvent(int32_t key)
582 {
583     CALL_DEBUG_ENTER;
584     SetPermission(SYSTEM_CORE, g_coresInject, sizeof(g_coresInject) / sizeof(g_coresInject[0]));
585     SetupKeyEvent(MMI::KeyEvent::KEY_ACTION_UP, key, false);
586     FI_HILOGD("TEST:keyCode:%{public}d, keyAction: KEY_ACTION_UP", key);
587     MMI::InputManager::GetInstance()->SimulateInputEvent(g_keyEvent);
588     std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
589     RemovePermission();
590 }
591 
PrintDragAction(DragAction dragAction)592 void InteractionManagerTest::PrintDragAction(DragAction dragAction)
593 {
594     switch (dragAction) {
595         case DragAction::MOVE:{
596             FI_HILOGD("drag action: MOVE");
597             break;
598         }
599         case DragAction::COPY:{
600             FI_HILOGD("drag action: COPY");
601             break;
602         }
603         default:{
604             FI_HILOGD("drag action: UNKNOWN");
605             break;
606         }
607     }
608 }
609 
AssignToAnimation(PreviewAnimation & animation)610 void InteractionManagerTest::AssignToAnimation(PreviewAnimation &animation)
611 {
612     animation.duration = ANIMATION_DURATION;
613     animation.curveName = CURVE_NAME;
614     animation.curve = { 0.33, 0, 0.67, 1 };
615 }
616 
617 class InputEventCallbackTest : public MMI::IInputEventConsumer {
618 public:
InputEventCallbackTest()619     InputEventCallbackTest() {}
InputEventCallbackTest(std::function<void ()> callback)620     explicit InputEventCallbackTest(std::function<void()> callback) : callback_(callback) {}
OnInputEvent(std::shared_ptr<MMI::KeyEvent> keyEvent) const621     void OnInputEvent(std::shared_ptr<MMI::KeyEvent> keyEvent) const override {};
622     void OnInputEvent(std::shared_ptr<MMI::PointerEvent> pointerEvent) const override;
OnInputEvent(std::shared_ptr<MMI::AxisEvent> axisEvent) const623     void OnInputEvent(std::shared_ptr<MMI::AxisEvent> axisEvent) const override {};
624 private:
625     std::function<void()> callback_ { nullptr };
626 };
627 
OnInputEvent(std::shared_ptr<MMI::PointerEvent> pointerEvent) const628 void InputEventCallbackTest::OnInputEvent(std::shared_ptr<MMI::PointerEvent> pointerEvent) const
629 {
630     CALL_DEBUG_ENTER;
631     ASSERT_TRUE(pointerEvent != nullptr);
632     auto pointerAction = pointerEvent->GetPointerAction();
633     ASSERT_TRUE(pointerAction == MMI::PointerEvent::POINTER_ACTION_PULL_MOVE ||
634                 pointerAction == MMI::PointerEvent::POINTER_ACTION_PULL_UP ||
635                 pointerAction == MMI::PointerEvent::POINTER_ACTION_PULL_IN_WINDOW ||
636                 pointerAction == MMI::PointerEvent::POINTER_ACTION_PULL_OUT_WINDOW);
637     ASSERT_TRUE(!pointerEvent->GetBuffer().empty());
638     MMI::PointerEvent::PointerItem pointerItem;
639     pointerEvent->GetPointerItem(pointerEvent->GetPointerId(), pointerItem);
640     if (callback_ != nullptr && pointerItem.GetDisplayX() == DRAG_DST_X && pointerItem.GetDisplayY() == DRAG_DST_Y) {
641         callback_();
642     }
643 }
644 
645 /**
646  * @tc.name: InteractionManagerTest_PrepareCoordination
647  * @tc.desc: Prepare coordination
648  * @tc.type: FUNC
649  * @tc.require:
650  */
651 HWTEST_F(InteractionManagerTest, InteractionManagerTest_PrepareCoordination, TestSize.Level1)
652 {
653     CALL_TEST_DEBUG;
654     SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
655     std::promise<bool> promiseFlag;
656     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a70502(const std::string &listener, const CoordinationMsgInfo &coordinationMessages) 657     auto fun = [&promiseFlag](const std::string &listener, const CoordinationMsgInfo &coordinationMessages) {
658         FI_HILOGD("Prepare coordination success, listener:%{public}s", listener.c_str());
659         promiseFlag.set_value(true);
660     };
661     bool isCompatible = true;
662     int32_t ret = InteractionManager::GetInstance()->PrepareCoordination(fun, isCompatible);
663 #ifdef OHOS_BUILD_ENABLE_COORDINATION
664     ASSERT_EQ(ret, RET_OK);
665     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) != std::future_status::timeout);
666 #else
667     ASSERT_EQ(ret, ERROR_UNSUPPORT);
668 #endif // OHOS_BUILD_ENABLE_COORDINATION
669     RemovePermission();
670 }
671 
672 /**
673  * @tc.name: InteractionManagerTest_RegisterCoordinationListener_001
674  * @tc.desc: Register coordination listener
675  * @tc.type: FUNC
676  * @tc.require:
677  */
678 HWTEST_F(InteractionManagerTest, InteractionManagerTest_RegisterCoordinationListener_001, TestSize.Level1)
679 {
680     CALL_TEST_DEBUG;
681     SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
682     std::shared_ptr<ICoordinationListener> consumer = nullptr;
683     bool isCompatible = true;
684     int32_t ret = InteractionManager::GetInstance()->RegisterCoordinationListener(consumer, isCompatible);
685 #ifdef OHOS_BUILD_ENABLE_COORDINATION
686     ASSERT_EQ(ret, RET_ERR);
687 #else
688     ASSERT_EQ(ret, ERROR_UNSUPPORT);
689 #endif // OHOS_BUILD_ENABLE_COORDINATION
690     RemovePermission();
691 }
692 
693 /**
694  * @tc.name: InteractionManagerTest_RegisterCoordinationListener_002
695  * @tc.desc: Register coordination listener
696  * @tc.type: FUNC
697  * @tc.require:
698  */
699 HWTEST_F(InteractionManagerTest, InteractionManagerTest_RegisterCoordinationListener_002, TestSize.Level1)
700 {
701     CALL_DEBUG_ENTER;
702     SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
703     class CoordinationListenerTest : public ICoordinationListener {
704     public:
CoordinationListenerTest()705         CoordinationListenerTest() : ICoordinationListener() {}
OnCoordinationMessage(const std::string & networkId,CoordinationMessage msg)706         void OnCoordinationMessage(const std::string &networkId, CoordinationMessage msg) override
707         {
708             FI_HILOGD("Register coordination listener test");
709             (void) networkId;
710         };
711     };
712     std::shared_ptr<CoordinationListenerTest> consumer =
713         std::make_shared<CoordinationListenerTest>();
714     bool isCompatible = true;
715     int32_t ret = InteractionManager::GetInstance()->RegisterCoordinationListener(consumer, isCompatible);
716 #ifdef OHOS_BUILD_ENABLE_COORDINATION
717     ASSERT_EQ(ret, RET_OK);
718 #else
719     ASSERT_EQ(ret, ERROR_UNSUPPORT);
720 #endif // OHOS_BUILD_ENABLE_COORDINATION
721     ret = InteractionManager::GetInstance()->UnregisterCoordinationListener(consumer, isCompatible);
722 #ifdef OHOS_BUILD_ENABLE_COORDINATION
723     ASSERT_EQ(ret, RET_OK);
724 #else
725     ASSERT_EQ(ret, ERROR_UNSUPPORT);
726 #endif // OHOS_BUILD_ENABLE_COORDINATION
727     RemovePermission();
728 }
729 
730 /**
731  * @tc.name: InteractionManagerTest_RegisterCoordinationListener_003
732  * @tc.desc: Register coordination listener
733  * @tc.type: FUNC
734  * @tc.require:
735  */
736 HWTEST_F(InteractionManagerTest, InteractionManagerTest_RegisterCoordinationListener_003, TestSize.Level1)
737 {
738     CALL_TEST_DEBUG;
739     FI_HILOGD("InteractionManagerTest_RegisterCoordinationListener_003 enter");
740     SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
741     class CoordinationListenerTest : public ICoordinationListener {
742     public:
CoordinationListenerTest()743         CoordinationListenerTest() : ICoordinationListener() {}
OnCoordinationMessage(const std::string & networkId,CoordinationMessage msg)744         void OnCoordinationMessage(const std::string &networkId, CoordinationMessage msg) override
745         {
746             FI_HILOGD("Register coordination listener test");
747             (void) networkId;
748         };
749     };
750     std::shared_ptr<CoordinationListenerTest> consumer =
751         std::make_shared<CoordinationListenerTest>();
752     bool isCompatible = true;
753     int32_t ret = InteractionManager::GetInstance()->RegisterCoordinationListener(consumer, isCompatible);
754     #ifdef OHOS_BUILD_ENABLE_COORDINATION
755         ASSERT_EQ(ret, RET_OK);
756     #else
757         ASSERT_EQ(ret, ERROR_UNSUPPORT);
758     #endif // OHOS_BUILD_ENABLE_COORDINATION
759         ret = InteractionManager::GetInstance()->RegisterCoordinationListener(consumer, isCompatible);
760     #ifdef OHOS_BUILD_ENABLE_COORDINATION
761         ASSERT_EQ(ret, RET_ERR);
762     #else
763         ASSERT_EQ(ret, ERROR_UNSUPPORT);
764     #endif // OHOS_BUILD_ENABLE_COORDINATION
765         ret = InteractionManager::GetInstance()->UnregisterCoordinationListener(consumer, isCompatible);
766     #ifdef OHOS_BUILD_ENABLE_COORDINATION
767         ASSERT_EQ(ret, RET_OK);
768     #else
769         ASSERT_EQ(ret, ERROR_UNSUPPORT);
770     #endif // OHOS_BUILD_ENABLE_COORDINATION
771     RemovePermission();
772     FI_HILOGD("InteractionManagerTest_RegisterCoordinationListener_003 finish");
773 }
774 
775 /**
776  * @tc.name: InteractionManagerTest_ActivateCoordination
777  * @tc.desc: Activate coordination
778  * @tc.type: FUNC
779  * @tc.require:
780  */
781 HWTEST_F(InteractionManagerTest, InteractionManagerTest_ActivateCoordination, TestSize.Level1)
782 {
783     CALL_TEST_DEBUG;
784     SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
785     std::string remoteNetworkId("");
786     int32_t startDeviceId = -1;
__anond638f0a70602(const std::string &listener, const CoordinationMsgInfo &coordinationMessages) 787     auto fun = [](const std::string &listener, const CoordinationMsgInfo &coordinationMessages) {
788         FI_HILOGD("Start coordination success");
789         (void) listener;
790     };
791     bool isCompatible = true;
792     int32_t ret = InteractionManager::GetInstance()->ActivateCoordination(remoteNetworkId, startDeviceId,
793         fun, isCompatible);
794 #ifdef OHOS_BUILD_ENABLE_COORDINATION
795     ASSERT_TRUE((ret == RET_OK || ret == COMMON_PERMISSION_CHECK_ERROR || ret == COMMON_NOT_ALLOWED_DISTRIBUTED));
796 #else
797     ASSERT_EQ(ret, ERROR_UNSUPPORT);
798 #endif // OHOS_BUILD_ENABLE_COORDINATION
799     RemovePermission();
800 }
801 
802 /**
803  * @tc.name: InteractionManagerTest_DeactivateCoordination
804  * @tc.desc: Deactivate coordination
805  * @tc.type: FUNC
806  * @tc.require:
807  */
808 HWTEST_F(InteractionManagerTest, InteractionManagerTest_DeactivateCoordination, TestSize.Level1)
809 {
810     CALL_TEST_DEBUG;
811     SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
__anond638f0a70702(const std::string &listener, const CoordinationMsgInfo &coordinationMessages) 812     auto fun = [](const std::string &listener, const CoordinationMsgInfo &coordinationMessages) {
813         FI_HILOGD("Stop coordination success");
814         (void) listener;
815     };
816     bool isCompatible = true;
817     int32_t ret = InteractionManager::GetInstance()->DeactivateCoordination(false, fun, isCompatible);
818 #ifdef OHOS_BUILD_ENABLE_COORDINATION
819     ASSERT_EQ(ret, RET_OK);
820 #else
821     ASSERT_EQ(ret, ERROR_UNSUPPORT);
822     ret = InteractionManager::GetInstance()->DeactivateCoordination(true, fun, isCompatible);
823     ASSERT_EQ(ret, ERROR_UNSUPPORT);
824 #endif // OHOS_BUILD_ENABLE_COORDINATION
825     RemovePermission();
826 }
827 
828 /**
829  * @tc.name: InteractionManagerTest_GetCoordinationState_Abnormal
830  * @tc.desc: Get coordination state
831  * @tc.type: FUNC
832  * @tc.require:
833  */
834 HWTEST_F(InteractionManagerTest, InteractionManagerTest_GetCoordinationState_Abnormal, TestSize.Level1)
835 {
836     CALL_TEST_DEBUG;
837     SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
838     const std::string networkId("");
__anond638f0a70802(bool state) 839     auto fun = [](bool state) {
840         FI_HILOGD("Get coordination state failed, state:%{public}d", state);
841     };
842     bool isCompatible = true;
843     int32_t ret = InteractionManager::GetInstance()->GetCoordinationState(networkId, fun, isCompatible);
844 #ifdef OHOS_BUILD_ENABLE_COORDINATION
845     ASSERT_EQ(ret, RET_OK);
846 #else
847     ASSERT_EQ(ret, ERROR_UNSUPPORT);
848 #endif // OHOS_BUILD_ENABLE_COORDINATION
849     RemovePermission();
850 }
851 
852 /**
853  * @tc.name: InteractionManagerTest_GetCoordinationState_Normal
854  * @tc.desc: Get coordination state
855  * @tc.type: FUNC
856  * @tc.require:
857  */
858 HWTEST_F(InteractionManagerTest, InteractionManagerTest_GetCoordinationState_Normal, TestSize.Level1)
859 {
860     CALL_TEST_DEBUG;
861     SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
862     std::promise<bool> promiseFlag;
863     std::future<bool> futureFlag = promiseFlag.get_future();
864     const std::string networkId("networkId");
__anond638f0a70902(bool state) 865     auto fun = [&promiseFlag](bool state) {
866         FI_HILOGD("Get coordination state success, state:%{public}d", state);
867         promiseFlag.set_value(true);
868     };
869     bool isCompatible = true;
870     int32_t ret = InteractionManager::GetInstance()->GetCoordinationState(networkId, fun, isCompatible);
871 #ifdef OHOS_BUILD_ENABLE_COORDINATION
872     ASSERT_EQ(ret, RET_OK);
873     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) != std::future_status::timeout);
874 #else
875     ASSERT_EQ(ret, ERROR_UNSUPPORT);
876 #endif // OHOS_BUILD_ENABLE_COORDINATION
877     RemovePermission();
878 }
879 
880 /**
881  * @tc.name: InteractionManagerTest_GetCoordinationState_Sync
882  * @tc.desc: Get coordination state
883  * @tc.type: FUNC
884  * @tc.require:
885  */
886 HWTEST_F(InteractionManagerTest, InteractionManagerTest_GetCoordinationState_Sync, TestSize.Level1)
887 {
888     CALL_TEST_DEBUG;
889     SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
890     const std::string udId("Default");
891     bool state { false };
892     int32_t ret = InteractionManager::GetInstance()->GetCoordinationState(udId, state);
893 #ifdef OHOS_BUILD_ENABLE_COORDINATION
894     ASSERT_EQ(ret, RET_OK);
895 #else
896     ASSERT_EQ(ret, ERROR_UNSUPPORT);
897 #endif // OHOS_BUILD_ENABLE_COORDINATION
898     RemovePermission();
899 }
900 
901 /**
902  * @tc.name: InteractionManagerTest_UnregisterCoordinationListener
903  * @tc.desc: Unregister coordination listener
904  * @tc.type: FUNC
905  * @tc.require:
906  */
907 HWTEST_F(InteractionManagerTest, InteractionManagerTest_UnregisterCoordinationListener, TestSize.Level1)
908 {
909     CALL_TEST_DEBUG;
910     SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
911     std::shared_ptr<ICoordinationListener> consumer = nullptr;
912     bool isCompatible = true;
913     int32_t ret = InteractionManager::GetInstance()->UnregisterCoordinationListener(consumer, isCompatible);
914 #ifdef OHOS_BUILD_ENABLE_COORDINATION
915     ASSERT_EQ(ret, RET_OK);
916 #else
917     ASSERT_EQ(ret, ERROR_UNSUPPORT);
918 #endif // OHOS_BUILD_ENABLE_COORDINATION
919     RemovePermission();
920 }
921 
922 /**
923  * @tc.name: InteractionManagerTest_UnprepareCoordination
924  * @tc.desc: Prepare coordination
925  * @tc.type: FUNC
926  * @tc.require:
927  */
928 HWTEST_F(InteractionManagerTest, InteractionManagerTest_UnprepareCoordination, TestSize.Level1)
929 {
930     CALL_TEST_DEBUG;
931     SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
932     std::promise<bool> promiseFlag;
933     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a70a02(const std::string &listener, const CoordinationMsgInfo &coordinationMessages) 934     auto fun = [&promiseFlag](const std::string &listener, const CoordinationMsgInfo &coordinationMessages) {
935         FI_HILOGD("Prepare coordination success, listener:%{public}s", listener.c_str());
936         promiseFlag.set_value(true);
937     };
938     bool isCompatible = true;
939     int32_t ret = InteractionManager::GetInstance()->UnprepareCoordination(fun, isCompatible);
940 #ifdef OHOS_BUILD_ENABLE_COORDINATION
941     ASSERT_EQ(ret, RET_OK);
942     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) != std::future_status::timeout);
943 #else
944     ASSERT_EQ(ret, ERROR_UNSUPPORT);
945 #endif // OHOS_BUILD_ENABLE_COORDINATION
946     RemovePermission();
947 }
948 
949 
950 class HotAreaListenerTest : public IHotAreaListener {
951 public:
HotAreaListenerTest()952     HotAreaListenerTest() {}
HotAreaListenerTest(std::string name)953     explicit HotAreaListenerTest(std::string name) : testName_(name) {}
OnHotAreaMessage(int32_t displayX,int32_t displayY,HotAreaType msg,bool isEdge)954     void OnHotAreaMessage(int32_t displayX, int32_t displayY, HotAreaType msg, bool isEdge) override
955     {
956         if (testName_.empty()) {
957             testName_ = std::string("HOT_AREA");
958         }
959         FI_HILOGD("%{public}s, type:%{public}s, isEdge:%{public}d, displayX:%{public}d, displayY:%{public}d",
960             testName_.c_str(), ShowMessage(msg).c_str(), isEdge, displayX, displayY);
961     };
962 
963 private:
ShowMessage(HotAreaType msg)964     std::string ShowMessage(HotAreaType msg)
965     {
966         std::string type = "none-area";
967         const std::map<HotAreaType, std::string> areaType = {
968             { HotAreaType::AREA_LEFT, "left-area"},
969             { HotAreaType::AREA_RIGHT, "right-area"},
970             { HotAreaType::AREA_TOP, "top-area"},
971             { HotAreaType::AREA_BOTTOM, "bottom-area"}
972         };
973         auto item = areaType.find(msg);
974         if (item != areaType.end()) {
975             type = item->second;
976         }
977         return type;
978     }
979 
980 private:
981     std::string testName_;
982 };
983 
984 /**
985  * @tc.name: AddHotAreaListener_001
986  * @tc.desc: Add hot area listener
987  * @tc.type: FUNC
988  * @tc.require:
989  */
990 HWTEST_F(InteractionManagerTest, AddHotAreaListener_001, TestSize.Level1)
991 {
992     CALL_TEST_DEBUG;
993     SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
994     auto listener = std::make_shared<HotAreaListenerTest>(std::string("HOT_AREA"));
995     int32_t ret = InteractionManager::GetInstance()->AddHotAreaListener(listener);
996 #ifdef OHOS_BUILD_ENABLE_COORDINATION
997     ASSERT_EQ(ret, RET_OK);
998 #else
999     ASSERT_EQ(ret, ERROR_UNSUPPORT);
1000 #endif // OHOS_BUILD_ENABLE_COORDINATION
1001     ret = InteractionManager::GetInstance()->RemoveHotAreaListener(listener);
1002 #ifdef OHOS_BUILD_ENABLE_COORDINATION
1003     ASSERT_EQ(ret, RET_OK);
1004 #else
1005     ASSERT_EQ(ret, ERROR_UNSUPPORT);
1006 #endif // OHOS_BUILD_ENABLE_COORDINATION
1007     RemovePermission();
1008 }
1009 
1010 /**
1011  * @tc.name: AddHotAreaListener_002
1012  * @tc.desc: Add hot area listener
1013  * @tc.type: FUNC
1014  * @tc.require:
1015  */
1016 HWTEST_F(InteractionManagerTest, AddHotAreaListener_002, TestSize.Level1)
1017 {
1018     CALL_DEBUG_ENTER;
1019     SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
1020 #ifndef OHOS_BUILD_PC_PRODUCT
1021     sptr<Rosen::Display> display = Rosen::DisplayManager::GetInstance().GetDisplayById(0);
1022 #else
1023     sptr<Rosen::DisplayInfo> display = Rosen::DisplayManager::GetInstance().GetVisibleAreaDisplayInfoById(0);
1024 #endif // OHOS_BUILD_PC_PRODUCT
1025     CHKPV(display);
1026     g_screenWidth = display->GetWidth();
1027     g_screenHeight = display->GetHeight();
1028     auto listener = std::make_shared<HotAreaListenerTest>(std::string("HOT_AREA"));
1029     int32_t ret = InteractionManager::GetInstance()->AddHotAreaListener(listener);
1030 #ifdef OHOS_BUILD_ENABLE_COORDINATION
1031     ASSERT_EQ(ret, RET_OK);
1032 #else
1033     ASSERT_EQ(ret, ERROR_UNSUPPORT);
1034 #endif // OHOS_BUILD_ENABLE_COORDINATION
1035     SimulateMovePointerEvent({ HOT_AREA_STEP, HOT_AREA_COOR }, { HOT_AREA_STEP - HOT_AREA_SPAN, HOT_AREA_COOR },
1036         MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
1037     SimulateMovePointerEvent({ HOT_AREA_COOR, HOT_AREA_STEP }, { HOT_AREA_COOR, HOT_AREA_STEP - HOT_AREA_SPAN },
1038         MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
1039     SimulateMovePointerEvent({ g_screenWidth - HOT_AREA_STEP, HOT_AREA_COOR },
1040         { g_screenWidth - HOT_AREA_SPAN, HOT_AREA_COOR },
1041         MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
1042     SimulateMovePointerEvent({ HOT_AREA_COOR, g_screenHeight - HOT_AREA_STEP },
1043         { HOT_AREA_COOR, g_screenHeight - HOT_AREA_SPAN },
1044         MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
1045     std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_TOUCH_DOWN_MS));
1046     SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
1047     ret = InteractionManager::GetInstance()->RemoveHotAreaListener(listener);
1048 #ifdef OHOS_BUILD_ENABLE_COORDINATION
1049     ASSERT_EQ(ret, RET_OK);
1050 #else
1051     ASSERT_EQ(ret, ERROR_UNSUPPORT);
1052 #endif // OHOS_BUILD_ENABLE_COORDINATION
1053     RemovePermission();
1054 }
1055 
1056 /**
1057  * @tc.name: Set
1058  * @tc.desc: Set dampling coefficient.
1059  * @tc.type: FUNC
1060  * @tc.require:
1061  */
1062 HWTEST_F(InteractionManagerTest, InteractionManagerTest_SetDamplingCoefficient, TestSize.Level1)
1063 {
1064     CALL_TEST_DEBUG;
1065     SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
1066     constexpr double damplingCoefficient { 0.1 };
1067     auto ret = InteractionManager::GetInstance()->SetDamplingCoefficient(
1068         COORDINATION_DAMPLING_RIGHT, damplingCoefficient);
1069     ASSERT_NE(ret, RET_OK);
1070 }
1071 
1072 /**
1073  * @tc.name: InteractionManagerTest_Draglistener_Mouse
1074  * @tc.desc: Drag listener
1075  * @tc.type: FUNC
1076  * @tc.require:
1077  */
1078 HWTEST_F(InteractionManagerTest, InteractionManagerTest_Draglistener_Mouse, TestSize.Level1)
1079 {
1080     CALL_TEST_DEBUG;
1081     if (g_deviceMouseId < 0) {
1082         ASSERT_TRUE(g_deviceMouseId < 0);
1083     } else {
1084         auto listener = std::make_shared<DragListenerTest>(std::string("Draglistener_Mouse"));
1085         int32_t ret = InteractionManager::GetInstance()->AddDraglistener(listener);
1086         ASSERT_EQ(ret, RET_OK);
1087         SimulateDownPointerEvent(
1088             { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, 0);
1089         std::promise<bool> promiseFlag;
1090         std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a70b02(const DragNotifyMsg& notifyMessage) 1091         auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1092             FI_HILOGD("DisplayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1093                 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1094             promiseFlag.set_value(true);
1095         };
1096         std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
1097         std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1098             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID,
1099             { DRAG_SRC_X, DRAG_SRC_Y });
1100         ASSERT_TRUE(dragData);
1101         ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1102             std::make_shared<UnitTestStartDragListener>(callback));
1103         ASSERT_EQ(ret, RET_OK);
1104         ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
1105         EXPECT_EQ(ret, RET_OK);
1106         SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
1107             MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
1108         DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1109         InteractionManager::GetInstance()->StopDrag(dropResult);
1110         ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1111             std::future_status::timeout);
1112         ret = InteractionManager::GetInstance()->RemoveDraglistener(listener);
1113         ASSERT_EQ(ret, RET_OK);
1114     }
1115 }
1116 
1117 /**
1118  * @tc.name: InteractionManagerTest_Draglistener_Touch
1119  * @tc.desc: Drag listener
1120  * @tc.type: FUNC
1121  * @tc.require:
1122  */
1123 HWTEST_F(InteractionManagerTest, InteractionManagerTest_Draglistener_Touch, TestSize.Level1)
1124 {
1125     CALL_TEST_DEBUG;
1126     if (g_deviceTouchId < 0) {
1127         ASSERT_TRUE(g_deviceTouchId < 0);
1128     } else {
1129         auto dragListener = std::make_shared<DragListenerTest>(std::string("Draglistener_Touch"));
1130         int32_t ret = InteractionManager::GetInstance()->AddDraglistener(dragListener);
1131         ASSERT_EQ(ret, RET_OK);
1132         std::promise<bool> promiseFlag;
1133         std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a70c02(const DragNotifyMsg& notifyMessage) 1134         auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1135             FI_HILOGD("displayX:%{public}d, displayY:%{public}d, target:%{public}d, result:%{public}d",
1136                 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.targetPid, notifyMessage.result);
1137             promiseFlag.set_value(true);
1138         };
1139         SimulateDownPointerEvent(
1140             { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1141         std::optional<DragData> dragData = CreateDragData({ MAX_PIXEL_MAP_WIDTH, MAX_PIXEL_MAP_HEIGHT },
1142             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1143         ASSERT_TRUE(dragData);
1144         ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1145             std::make_shared<UnitTestStartDragListener>(callback));
1146         ASSERT_EQ(ret, RET_OK);
1147         SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
1148             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
1149         DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1150         InteractionManager::GetInstance()->StopDrag(dropResult);
1151         ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1152             std::future_status::timeout);
1153         ret = InteractionManager::GetInstance()->RemoveDraglistener(dragListener);
1154         ASSERT_EQ(ret, RET_OK);
1155     }
1156 }
1157 
1158 /**
1159  * @tc.name: InteractionManagerTest_Draglistener
1160  * @tc.desc: Drag listener
1161  * @tc.type: FUNC
1162  * @tc.require:
1163  */
1164 HWTEST_F(InteractionManagerTest, InteractionManagerTest_Draglistener, TestSize.Level1)
1165 {
1166     CALL_TEST_DEBUG;
1167     if (g_deviceTouchId < 0) {
1168         ASSERT_TRUE(g_deviceTouchId < 0);
1169     } else {
1170         int32_t ret = RET_ERR;
1171         std::vector<std::shared_ptr<DragListenerTest>> dragListeners;
1172         constexpr size_t listenerCount = 5;
1173         for (size_t i = 0; i < listenerCount; ++i) {
1174             std::string moduleName = "Draglistener_" + std::to_string(i);
1175             auto listener = std::make_shared<DragListenerTest>(moduleName);
1176             ret = InteractionManager::GetInstance()->AddDraglistener(listener);
1177             if (ret == RET_OK) {
1178                 dragListeners.push_back(listener);
1179             }
1180         }
1181         SimulateDownPointerEvent(
1182             { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1183         std::optional<DragData> dragData = CreateDragData({ MAX_PIXEL_MAP_WIDTH, MAX_PIXEL_MAP_HEIGHT },
1184             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1185         ASSERT_TRUE(dragData);
1186         std::promise<bool> promiseFlag;
1187         std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a70d02(const DragNotifyMsg& notifyMessage) 1188         auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1189             FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1190                 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1191             promiseFlag.set_value(true);
1192         };
1193         ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1194             std::make_shared<UnitTestStartDragListener>(callback));
1195         ASSERT_EQ(ret, RET_OK);
1196         SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
1197             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
1198         DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1199         InteractionManager::GetInstance()->StopDrag(dropResult);
1200         ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1201             std::future_status::timeout);
1202         for (const auto &listener : dragListeners) {
1203             ret = InteractionManager::GetInstance()->RemoveDraglistener(listener);
1204             EXPECT_EQ(ret, RET_OK);
1205         }
1206     }
1207 }
1208 
1209 /**
1210  * @tc.name: InteractionManagerTest_SubscriptListener_001
1211  * @tc.desc: SubscriptListener
1212  * @tc.type: FUNC
1213  * @tc.require:
1214  */
1215 HWTEST_F(InteractionManagerTest, InteractionManagerTest_SubscriptListener_001, TestSize.Level1)
1216 {
1217     CALL_TEST_DEBUG;
1218     if (g_deviceTouchId < 0) {
1219         ASSERT_TRUE(g_deviceTouchId < 0);
1220     } else {
1221         int32_t ret = RET_ERR;
1222         std::vector<std::shared_ptr<SubscriptListenerTest>> subscriptListeners;
1223         for (size_t i = 0; i < RECIVE_LOOP_COUNT; ++i) {
1224             std::string moduleName = "SubscriptListener_" + std::to_string(i);
1225             auto listener = std::make_shared<SubscriptListenerTest>(moduleName);
1226             ret = InteractionManager::GetInstance()->AddSubscriptListener(listener);
1227             EXPECT_EQ(ret, RET_OK);
1228             subscriptListeners.push_back(listener);
1229         }
1230         std::promise<bool> promiseFlag;
1231         std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a70e02(const DragNotifyMsg& notifyMessage) 1232         auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1233             FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1234                 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1235             promiseFlag.set_value(true);
1236         };
1237         std::optional<DragData> dragData = CreateDragData({ MAX_PIXEL_MAP_WIDTH, MAX_PIXEL_MAP_HEIGHT },
1238             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1239         ASSERT_TRUE(dragData);
1240         ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1241             std::make_shared<UnitTestStartDragListener>(callback));
1242         ASSERT_EQ(ret, RET_OK);
1243         SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
1244             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
1245         DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1246         InteractionManager::GetInstance()->StopDrag(dropResult);
1247         ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1248             std::future_status::timeout);
1249         for (auto listener : subscriptListeners) {
1250             ret = InteractionManager::GetInstance()->RemoveSubscriptListener(listener);
1251             EXPECT_EQ(ret, RET_OK);
1252         }
1253     }
1254 }
1255 
1256 /**
1257  * @tc.name: InteractionManagerTest_SubscriptListener_002
1258  * @tc.desc: SubscriptListener
1259  * @tc.type: FUNC
1260  * @tc.require:
1261  */
1262 HWTEST_F(InteractionManagerTest, InteractionManagerTest_SubscriptListener_002, TestSize.Level1)
1263 {
1264     CALL_TEST_DEBUG;
1265     if (g_deviceTouchId < 0) {
1266         ASSERT_TRUE(g_deviceTouchId < 0);
1267     } else {
1268         int32_t ret = RET_ERR;
1269         auto listener = std::make_shared<SubscriptListenerTest>("SubscriptListener");
1270         ret = InteractionManager::GetInstance()->AddSubscriptListener(listener);
1271         ASSERT_EQ(ret, RET_OK);
1272         std::promise<bool> promiseFlag;
1273         std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a70f02(const DragNotifyMsg& notifyMessage) 1274         auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1275             FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1276                 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1277             promiseFlag.set_value(true);
1278         };
1279         std::optional<DragData> dragData = CreateDragData({ MAX_PIXEL_MAP_WIDTH, MAX_PIXEL_MAP_HEIGHT },
1280             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1281         ASSERT_TRUE(dragData);
1282         ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1283             std::make_shared<UnitTestStartDragListener>(callback));
1284         ASSERT_EQ(ret, RET_OK);
1285         ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
1286         ASSERT_EQ(ret, RET_OK);
1287         DragCursorStyle style = DragCursorStyle::COPY;
1288         ret = InteractionManager::GetInstance()->UpdateDragStyle(style);
1289         ASSERT_EQ(ret, RET_OK);
1290         style = DragCursorStyle::MOVE;
1291         ret = InteractionManager::GetInstance()->UpdateDragStyle(style);
1292         ASSERT_EQ(ret, RET_OK);
1293         SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
1294             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
1295         DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1296         InteractionManager::GetInstance()->StopDrag(dropResult);
1297         ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1298             std::future_status::timeout);
1299         DragCursorStyle recvStyle = listener->GetDragStyle();
1300         FI_HILOGD("Recived style:%{public}d, expected style:%{public}d", static_cast<int32_t>(recvStyle),
1301             static_cast<int32_t>(style));
1302         ret = InteractionManager::GetInstance()->RemoveSubscriptListener(listener);
1303         ASSERT_EQ(ret, RET_OK);
1304     }
1305 }
1306 
1307 /**
1308  * @tc.name: InteractionManagerTest_StartDrag_Mouse
1309  * @tc.desc: Start Drag
1310  * @tc.type: FUNC
1311  * @tc.require:
1312  */
1313 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_Mouse, TestSize.Level1)
1314 {
1315     CALL_TEST_DEBUG;
1316     if (g_deviceMouseId < 0) {
1317         ASSERT_TRUE(g_deviceMouseId < 0);
1318     } else {
1319         SimulateDownPointerEvent(
1320             { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, 0);
1321         std::promise<bool> promiseFlag;
1322         std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71002(const DragNotifyMsg& notifyMessage) 1323         auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1324             FI_HILOGD("DisplayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1325                 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1326             promiseFlag.set_value(true);
1327         };
1328         std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
1329         std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1330             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID,
1331             { DRAG_SRC_X, DRAG_SRC_Y });
1332         ASSERT_TRUE(dragData);
1333         int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1334             std::make_shared<UnitTestStartDragListener>(callback));
1335         ASSERT_EQ(ret, RET_OK);
1336         ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
1337         InteractionManager::GetInstance()->SetDragWindowScreenId(TOUCH_POINTER_ID, TOUCH_POINTER_ID);
1338         EXPECT_EQ(ret, RET_OK);
1339         SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
1340             MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
1341         DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1342         InteractionManager::GetInstance()->StopDrag(dropResult);
1343         ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1344             std::future_status::timeout);
1345     }
1346 }
1347 
1348 /**
1349  * @tc.name: InteractionManagerTest_StartDrag_Failed_Mouse
1350  * @tc.desc: Start Drag
1351  * @tc.type: FUNC
1352  * @tc.require:
1353  */
1354 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_Failed_Mouse, TestSize.Level1)
1355 {
1356     CALL_TEST_DEBUG;
1357     if (g_deviceMouseId < 0) {
1358         ASSERT_TRUE(g_deviceMouseId < 0);
1359     } else {
1360         std::promise<bool> promiseFlag;
1361         std::future<bool> futureFlag = promiseFlag.get_future();
1362         SimulateDownPointerEvent(
1363             { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
__anond638f0a71102(const DragNotifyMsg& notifyMessage) 1364         auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1365             FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1366                 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1367             promiseFlag.set_value(true);
1368         };
1369         std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1370             MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1371         ASSERT_TRUE(dragData);
1372 
1373         int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(), nullptr);
1374         ASSERT_EQ(ret, RET_ERR);
1375         dragData->shadowInfos = {};
1376         ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1377             std::make_shared<UnitTestStartDragListener>(callback));
1378         ASSERT_EQ(ret, ERR_INVALID_VALUE);
1379     }
1380 }
1381 
1382 /**
1383  * @tc.name: InteractionManagerTest_StopDrag_Mouse
1384  * @tc.desc: Stop drag
1385  * @tc.type: FUNC
1386  * @tc.require:
1387  */
1388 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StopDrag_Mouse, TestSize.Level1)
1389 {
1390     CALL_TEST_DEBUG;
1391     if (g_deviceMouseId < 0) {
1392         ASSERT_TRUE(g_deviceMouseId < 0);
1393     } else {
1394         SimulateDownPointerEvent(
1395             { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, 0);
1396         std::promise<bool> promiseFlag;
1397         std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71202(const DragNotifyMsg& notifyMessage) 1398         auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1399             FI_HILOGD("DisplayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1400                 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1401             promiseFlag.set_value(true);
1402         };
1403         std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
1404         std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1405             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID,
1406             { DRAG_SRC_X, DRAG_SRC_Y });
1407         ASSERT_TRUE(dragData);
1408         int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1409             std::make_shared<UnitTestStartDragListener>(callback));
1410         ASSERT_EQ(ret, RET_OK);
1411         DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1412         InteractionManager::GetInstance()->StopDrag(dropResult);
1413         ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1414             std::future_status::timeout);
1415     }
1416 }
1417 
1418 /**
1419  * @tc.name: InteractionManagerTest_StopDrag_Failed_Mouse
1420  * @tc.desc: Stop drag
1421  * @tc.type: FUNC
1422  * @tc.require:
1423  */
1424 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StopDrag_Failed_Mouse, TestSize.Level1)
1425 {
1426     CALL_TEST_DEBUG;
1427     if (g_deviceMouseId < 0) {
1428         ASSERT_TRUE(g_deviceMouseId < 0);
1429     } else {
1430         SimulateDownPointerEvent(
1431             { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
1432         std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1433             MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1434         ASSERT_TRUE(dragData);
1435         int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(), nullptr);
1436         ASSERT_EQ(ret, RET_ERR);
1437         DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1438         ret = InteractionManager::GetInstance()->StopDrag(dropResult);
1439         ASSERT_EQ(ret, RET_ERR);
1440     }
1441 }
1442 
1443 /**
1444  * @tc.name: InteractionManagerTest_StartDrag_Touch
1445  * @tc.desc: Start Drag
1446  * @tc.type: FUNC
1447  * @tc.require:
1448  */
1449 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_Touch, TestSize.Level1)
1450 {
1451     CALL_TEST_DEBUG;
1452     if (g_deviceTouchId < 0) {
1453         ASSERT_TRUE(g_deviceTouchId < 0);
1454     } else {
1455         SimulateDownPointerEvent(
1456             { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1457         std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_TOUCH_DOWN_MS));
1458         std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1459             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1460         ASSERT_TRUE(dragData);
1461         std::promise<bool> promiseFlag;
1462         std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71302(const DragNotifyMsg& notifyMessage) 1463         auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1464             FI_HILOGD("Start drag, displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1465                 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1466             promiseFlag.set_value(true);
1467         };
1468         int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1469             std::make_shared<UnitTestStartDragListener>(callback));
1470         ASSERT_EQ(ret, RET_OK);
1471         ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
1472         EXPECT_EQ(ret, RET_OK);
1473         SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
1474             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
1475         DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1476         InteractionManager::GetInstance()->StopDrag(dropResult);
1477         ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1478             std::future_status::timeout);
1479     }
1480 }
1481 
1482 /**
1483  * @tc.name: InteractionManagerTest_StopDrag_Touch
1484  * @tc.desc: Stop drag
1485  * @tc.type: FUNC
1486  * @tc.require:
1487  */
1488 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StopDrag_Touch, TestSize.Level1)
1489 {
1490     CALL_TEST_DEBUG;
1491     if (g_deviceTouchId < 0) {
1492         ASSERT_TRUE(g_deviceTouchId < 0);
1493     } else {
1494         std::promise<bool> promiseFlag;
1495         std::future<bool> future = promiseFlag.get_future();
__anond638f0a71402(const DragNotifyMsg& notifyMessage) 1496         auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1497             FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1498                 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1499             promiseFlag.set_value(true);
1500         };
1501         SimulateDownPointerEvent(
1502             { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1503         std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_TOUCH_DOWN_MS));
1504         std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1505             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1506         ASSERT_TRUE(dragData);
1507         int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1508             std::make_shared<UnitTestStartDragListener>(callback));
1509         ASSERT_EQ(ret, RET_OK);
1510         DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1511         InteractionManager::GetInstance()->StopDrag(dropResult);
1512         ASSERT_TRUE(future.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1513             std::future_status::timeout);
1514     }
1515 }
1516 
1517 /**
1518  * @tc.name: GetDragTargetPid_Mouse
1519  * @tc.desc: Get the target pid dragged by the mouse
1520  * @tc.type: FUNC
1521  * @tc.require:
1522  */
1523 HWTEST_F(InteractionManagerTest, GetDragTargetPid_Mouse, TestSize.Level1)
1524 {
1525     CALL_TEST_DEBUG;
1526     if (g_deviceMouseId < 0) {
1527         ASSERT_TRUE(g_deviceMouseId < 0);
1528     } else {
1529         SimulateDownPointerEvent(
1530             { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, 0);
1531         std::promise<bool> promiseFlag;
1532         std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71502(const DragNotifyMsg& notifyMessage) 1533         auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1534             FI_HILOGD("DisplayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1535                 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1536             promiseFlag.set_value(true);
1537         };
1538         std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
1539         std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1540             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID,
1541             { DRAG_SRC_X, DRAG_SRC_Y });
1542         ASSERT_TRUE(dragData);
1543         int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1544             std::make_shared<UnitTestStartDragListener>(callback));
1545         ASSERT_EQ(ret, RET_OK);
1546         ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
1547         EXPECT_EQ(ret, RET_OK);
1548         ret = InteractionManager::GetInstance()->UpdateDragStyle(DragCursorStyle::DEFAULT);
1549         ASSERT_EQ(ret, RET_OK);
1550         int32_t pid = InteractionManager::GetInstance()->GetDragTargetPid();
1551         FI_HILOGI("Target pid:%{public}d", pid);
1552         ASSERT_TRUE(pid > 0);
1553         DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1554         InteractionManager::GetInstance()->StopDrag(dropResult);
1555         ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1556             std::future_status::timeout);
1557     }
1558 }
1559 
1560 /**
1561  * @tc.name: GetDragTargetPid_Touch
1562  * @tc.desc: Get the target pid dragged by the touchscreen
1563  * @tc.type: FUNC
1564  * @tc.require:
1565  */
1566 HWTEST_F(InteractionManagerTest, GetDragTargetPid_Touch, TestSize.Level1)
1567 {
1568     CALL_TEST_DEBUG;
1569     if (g_deviceTouchId < 0) {
1570         ASSERT_TRUE(g_deviceTouchId < 0);
1571     } else {
1572         std::promise<bool> promiseStopFlag;
1573         std::future<bool> futureStopFlag = promiseStopFlag.get_future();
__anond638f0a71602(const DragNotifyMsg& notifyMessage) 1574         auto callback = [&promiseStopFlag](const DragNotifyMsg& notifyMessage) {
1575             FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1576                 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1577             promiseStopFlag.set_value(true);
1578         };
1579         SimulateDownPointerEvent(
1580             { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1581         std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_TOUCH_DOWN_MS));
1582         std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1583             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1584         ASSERT_TRUE(dragData);
1585         int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1586             std::make_shared<UnitTestStartDragListener>(callback));
1587         ASSERT_EQ(ret, RET_OK);
1588         ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
1589         EXPECT_EQ(ret, RET_OK);
1590         ret = InteractionManager::GetInstance()->UpdateDragStyle(DragCursorStyle::COPY);
1591         ASSERT_EQ(ret, RET_OK);
1592         int32_t pid = InteractionManager::GetInstance()->GetDragTargetPid();
1593         FI_HILOGI("Target pid:%{public}d", pid);
1594         ASSERT_TRUE(pid > 0);
1595         DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1596         InteractionManager::GetInstance()->StopDrag(dropResult);
1597         ASSERT_TRUE(futureStopFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1598             std::future_status::timeout);
1599     }
1600 }
1601 
1602 /**
1603  * @tc.name: TouchEventDispatch
1604  * @tc.desc: Dispatch the touchscreen events
1605  * @tc.type: FUNC
1606  * @tc.require:
1607  */
1608 HWTEST_F(InteractionManagerTest, TouchEventDispatch, TestSize.Level1)
1609 {
1610     CALL_TEST_DEBUG;
1611     if (g_deviceTouchId < 0) {
1612         ASSERT_TRUE(g_deviceTouchId < 0);
1613     } else {
1614         std::promise<bool> promiseFlag;
1615         std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71702(const DragNotifyMsg& notifyMessage) 1616         auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1617             FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1618                 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1619             promiseFlag.set_value(true);
1620         };
1621         SimulateDownPointerEvent(
1622             { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1623         std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_TOUCH_DOWN_MS));
1624         std::optional<DragData> dragDataInfo = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1625             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID,
1626             { DRAG_SRC_X, DRAG_SRC_Y });
1627         ASSERT_TRUE(dragDataInfo);
1628         int32_t result = InteractionManager::GetInstance()->StartDrag(dragDataInfo.value(),
1629             std::make_shared<UnitTestStartDragListener>(callback));
1630         ASSERT_EQ(result, RET_OK);
1631         result = InteractionManager::GetInstance()->SetDragWindowVisible(true);
1632         EXPECT_EQ(result, RET_OK);
1633         SetPermission(SYSTEM_CORE, g_cores, sizeof(g_cores) / sizeof(g_cores[0]));
1634         std::promise<bool> promiseEventFlag;
1635         std::future<bool> futureEventFlag = promiseEventFlag.get_future();
1636         auto callbackPtr = std::make_shared<InputEventCallbackTest>(
__anond638f0a71802null1637             [&promiseEventFlag]{promiseEventFlag.set_value(true);});
1638         int32_t monitorId = TestAddMonitor(callbackPtr);
1639         SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
1640             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
1641         ASSERT_TRUE(futureEventFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1642             std::future_status::timeout);
1643         SetPermission(SYSTEM_CORE, g_cores, sizeof(g_cores) / sizeof(g_cores[0]));
1644         TestRemoveMonitor(monitorId);
1645         DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1646         result = InteractionManager::GetInstance()->StopDrag(dropResult);
1647         ASSERT_EQ(result, RET_OK);
1648         ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1649             std::future_status::timeout);
1650         RemovePermission();
1651     }
1652 }
1653 
1654 /**
1655  * @tc.name: InteractionManagerTest_SetDragWindowVisible
1656  * @tc.desc: Set Drag Window Visible
1657  * @tc.type: FUNC
1658  * @tc.require:
1659  */
1660 HWTEST_F(InteractionManagerTest, InteractionManagerTest_SetDragWindowVisible, TestSize.Level1)
1661 {
1662     CALL_TEST_DEBUG;
1663     int32_t ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
1664     FI_HILOGD("ret:%{public}d", ret);
1665     ASSERT_EQ(ret, RET_ERR);
1666     ret = InteractionManager::GetInstance()->SetDragWindowVisible(false);
1667     FI_HILOGD("ret:%{public}d", ret);
1668     ASSERT_EQ(ret, RET_ERR);
1669 }
1670 
1671 /**
1672  * @tc.name: InteractionManagerTest_GetShadowOffset
1673  * @tc.desc: Get Shadow Offset
1674  * @tc.type: FUNC
1675  * @tc.require:
1676  */
1677 HWTEST_F(InteractionManagerTest, InteractionManagerTest_GetShadowOffset, TestSize.Level1)
1678 {
1679     CALL_TEST_DEBUG;
1680     int32_t offsetX = 0;
1681     int32_t offsetY = 0;
1682     int32_t width = 0;
1683     int32_t height = 0;
1684     std::promise<bool> promise;
1685     std::future<bool> futureFlag = promise.get_future();
__anond638f0a71902(const DragNotifyMsg& notifyMessage) 1686     auto callback = [&promise](const DragNotifyMsg& notifyMessage) {
1687         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1688             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1689         promise.set_value(true);
1690     };
1691     SimulateDownPointerEvent(
1692         { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1693     std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_TOUCH_DOWN_MS));
1694     std::optional<DragData> dragDataInfo = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1695         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1696     ASSERT_TRUE(dragDataInfo);
1697     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragDataInfo.value(),
1698         std::make_shared<UnitTestStartDragListener>(callback));
1699     ASSERT_EQ(ret, RET_OK);
1700     ret = InteractionManager::GetInstance()->GetShadowOffset(offsetX, offsetY, width, height);
1701     FI_HILOGD("offsetX:%{public}d, offsetY:%{public}d, width:%{public}d, height:%{public}d",
1702         offsetX, offsetY, width, height);
1703     ASSERT_EQ(ret, RET_OK);
1704     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1705     ret = InteractionManager::GetInstance()->StopDrag(dropResult);
1706     ASSERT_EQ(ret, RET_OK);
1707     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) != std::future_status::timeout);
1708 }
1709 
1710 /**
1711  * @tc.name: GetUdKey_Mouse
1712  * @tc.desc: Get the udKey dragged by the mouse
1713  * @tc.type: FUNC
1714  * @tc.require:
1715  */
1716 HWTEST_F(InteractionManagerTest, GetUdKey_Mouse, TestSize.Level1)
1717 {
1718     CALL_TEST_DEBUG;
1719     if (g_deviceMouseId < 0) {
1720         ASSERT_TRUE(g_deviceMouseId < 0);
1721     } else {
1722         SimulateDownPointerEvent(
1723             { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
1724         std::promise<bool> promiseFlag;
1725         std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71a02(const DragNotifyMsg& notifyMessage) 1726         auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1727             FI_HILOGD("DisplayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1728                 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1729             promiseFlag.set_value(true);
1730         };
1731         std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
1732         std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1733             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID,
1734             { DRAG_SRC_X, DRAG_SRC_Y });
1735         ASSERT_TRUE(dragData);
1736         int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1737             std::make_shared<UnitTestStartDragListener>(callback));
1738         ASSERT_EQ(ret, RET_OK);
1739         std::string udKey;
1740         ret = InteractionManager::GetInstance()->GetUdKey(udKey);
1741         ASSERT_EQ(ret, RET_OK);
1742         ASSERT_EQ(udKey, UD_KEY);
1743         DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1744         ret = InteractionManager::GetInstance()->StopDrag(dropResult);
1745         ASSERT_EQ(ret, RET_OK);
1746         ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1747             std::future_status::timeout);
1748     }
1749 }
1750 
1751 /**
1752  * @tc.name: GetUdKey_Touch
1753  * @tc.desc: Get the udKey dragged by the touchscreen
1754  * @tc.type: FUNC
1755  * @tc.require:
1756  */
1757 HWTEST_F(InteractionManagerTest, GetUdKey_Touch, TestSize.Level1)
1758 {
1759     CALL_TEST_DEBUG;
1760     if (g_deviceTouchId < 0) {
1761         ASSERT_TRUE(g_deviceTouchId < 0);
1762     } else {
1763         std::promise<bool> promiseFlag;
1764         std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71b02(const DragNotifyMsg& notifyMessage) 1765         auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1766             FI_HILOGD("displayX:%{public}d, displayY:%{public}d, target:%{public}d, result:%{public}d",
1767                 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.targetPid, notifyMessage.result);
1768             promiseFlag.set_value(true);
1769         };
1770         SimulateDownPointerEvent(
1771             { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1772         std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_TOUCH_DOWN_MS));
1773         std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1774             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1775         ASSERT_TRUE(dragData);
1776         int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1777             std::make_shared<UnitTestStartDragListener>(callback));
1778         ASSERT_EQ(ret, RET_OK);
1779         std::string udKey;
1780         ret = InteractionManager::GetInstance()->GetUdKey(udKey);
1781         ASSERT_EQ(ret, RET_OK);
1782         ASSERT_EQ(udKey, UD_KEY);
1783         DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1784         ret = InteractionManager::GetInstance()->StopDrag(dropResult);
1785         ASSERT_EQ(ret, RET_OK);
1786         ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1787             std::future_status::timeout);
1788     }
1789 }
1790 
1791 /**
1792  * @tc.name: GetDragData_Success
1793  * @tc.desc: Get the dragData from interface successfully
1794  * @tc.type: FUNC
1795  * @tc.require:
1796  */
1797 HWTEST_F(InteractionManagerTest, GetDragData_Success, TestSize.Level1)
1798 {
1799     CALL_TEST_DEBUG;
1800     if (g_deviceTouchId < 0) {
1801         ASSERT_TRUE(g_deviceTouchId < 0);
1802     } else {
1803         std::promise<bool> promiseFlag;
1804         std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71c02(const DragNotifyMsg& notifyMessage) 1805         auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1806             FI_HILOGD("DisplayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1807                 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1808             promiseFlag.set_value(true);
1809         };
1810         std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
1811         std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1812             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID,
1813             { DRAG_SRC_X, DRAG_SRC_Y });
1814         ASSERT_TRUE(dragData);
1815         int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1816             std::make_shared<UnitTestStartDragListener>(callback));
1817         ASSERT_EQ(ret, RET_OK);
1818 
1819         DragData replyDragData;
1820         ret = InteractionManager::GetInstance()->GetDragData(replyDragData);
1821         ASSERT_EQ(ret, RET_OK);
1822         ASSERT_EQ(replyDragData, dragData.value());
1823         PrintDragData(replyDragData);
1824         SimulateUpPointerEvent(
1825             { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
1826         DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1827         InteractionManager::GetInstance()->StopDrag(dropResult);
1828         ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1829             std::future_status::timeout);
1830     }
1831 }
1832 
1833 /**
1834  * @tc.name: GetDragData_Failed
1835  * @tc.desc: Get the dragData from interface failed
1836  * @tc.type: FUNC
1837  * @tc.require:
1838  */
1839 HWTEST_F(InteractionManagerTest, GetDragData_Failed, TestSize.Level1)
1840 {
1841     CALL_TEST_DEBUG;
1842     if (g_deviceTouchId < 0) {
1843         ASSERT_TRUE(g_deviceTouchId < 0);
1844     } else {
1845         SimulateDownPointerEvent(
1846             { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1847         std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_TOUCH_DOWN_MS));
1848         DragData dragData;
1849         int32_t ret = InteractionManager::GetInstance()->GetDragData(dragData);
1850         SimulateUpPointerEvent(
1851             { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1852         ASSERT_EQ(ret, RET_ERR);
1853     }
1854 }
1855 
1856 /**
1857  * @tc.name: GetDragState
1858  * @tc.desc: Get the dragState from interface
1859  * @tc.type: FUNC
1860  * @tc.require:
1861  */
1862 HWTEST_F(InteractionManagerTest, GetDragState, TestSize.Level1)
1863 {
1864     CALL_TEST_DEBUG;
1865     std::promise<bool> promiseFlag;
1866     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71d02(const DragNotifyMsg& notifyMessage) 1867     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1868         FI_HILOGD("DisplayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1869             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1870         promiseFlag.set_value(true);
1871     };
1872     std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
1873     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1874         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1875     ASSERT_TRUE(dragData);
1876     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1877         std::make_shared<UnitTestStartDragListener>(callback));
1878     ASSERT_EQ(ret, RET_OK);
1879 
1880     DragState dragState;
1881     ret = InteractionManager::GetInstance()->GetDragState(dragState);
1882     FI_HILOGD("InteractionManager::dragState:%{public}d", dragState);
1883     EXPECT_EQ(ret, RET_OK);
1884     EXPECT_EQ(dragState, DragState::START);
1885 
1886     SimulateUpPointerEvent(
1887         { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1888     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1889     ret = InteractionManager::GetInstance()->StopDrag(dropResult);
1890     ASSERT_EQ(ret, RET_OK);
1891     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1892         std::future_status::timeout);
1893     ret = InteractionManager::GetInstance()->GetDragState(dragState);
1894     FI_HILOGD("dragState:%{public}d", dragState);
1895     EXPECT_EQ(ret, RET_OK);
1896     EXPECT_EQ(dragState, DragState::STOP);
1897 }
1898 
1899 /**
1900  * @tc.name: InteractionManagerTest_GetDragSummary
1901  * @tc.desc: Get drag summarys
1902  * @tc.type: FUNC
1903  * @tc.require:
1904  */
1905 HWTEST_F(InteractionManagerTest, InteractionManagerTest_GetDragSummary, TestSize.Level1)
1906 {
1907     CALL_TEST_DEBUG;
1908     std::promise<bool> promiseFlag;
1909     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71e02(const DragNotifyMsg& notifyMessage) 1910     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1911         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1912             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1913         promiseFlag.set_value(true);
1914     };
1915     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1916         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1917     ASSERT_TRUE(dragData);
1918     const std::string udType = "general.message";
1919     constexpr int64_t recordSize = 20;
1920     std::map<std::string, int64_t> summarys = { { udType, recordSize } };
1921     dragData.value().summarys = summarys;
1922     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1923         std::make_shared<UnitTestStartDragListener>(callback));
1924     ASSERT_EQ(ret, RET_OK);
1925     summarys.clear();
1926     ret = InteractionManager::GetInstance()->GetDragSummary(summarys);
1927     EXPECT_EQ(ret, RET_OK);
1928     EXPECT_EQ(summarys[udType], recordSize);
1929     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1930     InteractionManager::GetInstance()->StopDrag(dropResult);
1931     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1932         std::future_status::timeout);
1933 }
1934 
1935 /**
1936  * @tc.name: InteractionManagerTest_UpdatePreviewStyle
1937  * @tc.desc: Update drag item style
1938  * @tc.type: FUNC
1939  * @tc.require:
1940  */
1941 HWTEST_F(InteractionManagerTest, InteractionManagerTest_UpdatePreviewStyle, TestSize.Level1)
1942 {
1943     CALL_TEST_DEBUG;
1944     std::promise<bool> promiseFlag;
1945     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71f02(const DragNotifyMsg& notifyMessage) 1946     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1947         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1948             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1949         promiseFlag.set_value(true);
1950     };
1951     SimulateDownPointerEvent(
1952         { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
1953     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1954         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1955     ASSERT_TRUE(dragData);
1956     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1957         std::make_shared<UnitTestStartDragListener>(callback));
1958     ASSERT_EQ(ret, RET_OK);
1959     ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
1960     EXPECT_EQ(ret, RET_OK);
1961     std::pair<int32_t, int32_t> enterPos { 500, 50 };
1962     std::pair<int32_t, int32_t> leavePos { 500, 200 };
1963     SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { enterPos.first, enterPos.second },
1964         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
1965     PreviewStyle previewStyleIn;
1966     previewStyleIn.types = { PreviewType::FOREGROUND_COLOR };
1967     previewStyleIn.foregroundColor = FOREGROUND_COLOR_IN;
1968     ret = InteractionManager::GetInstance()->UpdatePreviewStyle(previewStyleIn);
1969     EXPECT_EQ(ret, RET_OK);
1970     SimulateMovePointerEvent({ enterPos.first, enterPos.second }, { leavePos.first, leavePos.second },
1971         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
1972     PreviewStyle previewStyleOut;
1973     previewStyleOut.types = { PreviewType::FOREGROUND_COLOR };
1974     previewStyleOut.foregroundColor = FOREGROUND_COLOR_OUT;
1975     ret = InteractionManager::GetInstance()->UpdatePreviewStyle(previewStyleOut);
1976     EXPECT_EQ(ret, RET_OK);
1977     SimulateMovePointerEvent({ leavePos.first, leavePos.second }, { DRAG_DST_X, DRAG_DST_Y },
1978         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
1979     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1980     InteractionManager::GetInstance()->StopDrag(dropResult);
1981     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1982         std::future_status::timeout);
1983 }
1984 
1985 
1986 /**
1987  * @tc.name: InteractionManagerTest_UpdatePreviewStyleWithAnimation
1988  * @tc.desc: Update drag item style with animation
1989  * @tc.type: FUNC
1990  * @tc.require:
1991  */
1992 HWTEST_F(InteractionManagerTest, InteractionManagerTest_UpdatePreviewStyleWithAnimation, TestSize.Level1)
1993 {
1994     CALL_TEST_DEBUG;
1995     std::promise<bool> promiseFlag;
1996     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72002(const DragNotifyMsg& notifyMessage) 1997     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1998         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1999             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2000         promiseFlag.set_value(true);
2001     };
2002     SimulateDownPointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
2003     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2004         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2005     ASSERT_TRUE(dragData);
2006     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2007         std::make_shared<UnitTestStartDragListener>(callback));
2008     ASSERT_EQ(ret, RET_OK);
2009     ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
2010     EXPECT_EQ(ret, RET_OK);
2011     std::pair<int32_t, int32_t> enterPos { 500, 50 };
2012     std::pair<int32_t, int32_t> leavePos { 500, 200 };
2013     SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { enterPos.first, enterPos.second },
2014         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
2015     PreviewStyle previewStyleIn;
2016     previewStyleIn.types = { PreviewType::FOREGROUND_COLOR };
2017     previewStyleIn.foregroundColor = FOREGROUND_COLOR_IN;
2018     PreviewAnimation animationIn;
2019     AssignToAnimation(animationIn);
2020     ret = InteractionManager::GetInstance()->UpdatePreviewStyleWithAnimation(previewStyleIn, animationIn);
2021     EXPECT_EQ(ret, RET_OK);
2022     SimulateMovePointerEvent({ enterPos.first, enterPos.second }, { leavePos.first, leavePos.second },
2023         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
2024     PreviewStyle previewStyleOut;
2025     previewStyleOut.types = { PreviewType::FOREGROUND_COLOR };
2026     previewStyleOut.foregroundColor = FOREGROUND_COLOR_OUT;
2027     PreviewAnimation animationOut;
2028     AssignToAnimation(animationOut);
2029     ret = InteractionManager::GetInstance()->UpdatePreviewStyleWithAnimation(previewStyleOut, animationOut);
2030     EXPECT_EQ(ret, RET_OK);
2031     SimulateMovePointerEvent({ leavePos.first, leavePos.second }, { DRAG_DST_X, DRAG_DST_Y },
2032         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
2033     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2034     InteractionManager::GetInstance()->StopDrag(dropResult);
2035     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2036         std::future_status::timeout);
2037 }
2038 
2039 /**
2040  * @tc.name: InteractionManagerTest_GetExtraInfo
2041  * @tc.desc: Get extraInfo
2042  * @tc.type: FUNC
2043  * @tc.require:
2044  */
2045 HWTEST_F(InteractionManagerTest, InteractionManagerTest_GetExtraInfo, TestSize.Level1)
2046 {
2047     CALL_TEST_DEBUG;
2048     if (g_deviceMouseId >= 0) {
2049         SimulateDownPointerEvent(
2050             { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
2051         std::promise<bool> promiseFlag;
2052         std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72102(const DragNotifyMsg& notifyMessage) 2053         auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2054             FI_HILOGD("DisplayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2055                 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2056         promiseFlag.set_value(true);
2057         };
2058         std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
2059         std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2060             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID,
2061             { DRAG_SRC_X, DRAG_SRC_Y });
2062         ASSERT_TRUE(dragData);
2063         int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2064             std::make_shared<UnitTestStartDragListener>(callback));
2065         ASSERT_EQ(ret, RET_OK);
2066         std::string extraInfo;
2067         ret = InteractionManager::GetInstance()->GetExtraInfo(extraInfo);
2068         ASSERT_EQ(ret, RET_OK);
2069         ASSERT_EQ(extraInfo, EXTRA_INFO);
2070         DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2071         ret = InteractionManager::GetInstance()->StopDrag(dropResult);
2072         ASSERT_EQ(ret, RET_OK);
2073         ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2074             std::future_status::timeout);
2075     }
2076 }
2077 
2078 /**
2079  * @tc.name: TestDragDataUtil_Packer
2080  * @tc.desc: Pack up dragData
2081  * @tc.type: FUNC
2082  * @tc.require:
2083  */
2084 HWTEST_F(InteractionManagerTest, TestDragDataUtil_Packer, TestSize.Level1)
2085 {
2086     CALL_TEST_DEBUG;
2087     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2088         MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2089     ASSERT_TRUE(dragData);
2090     Parcel parcel;
2091     int32_t ret = DragDataUtil::Marshalling(dragData.value(), parcel, false);
2092     ASSERT_EQ(ret, RET_OK);
2093     DragData dragDataFromParcel;
2094     ret = DragDataUtil::UnMarshalling(parcel, dragDataFromParcel, false);
2095     ASSERT_EQ(ret, RET_OK);
2096     ASSERT_EQ(dragData.value(), dragDataFromParcel);
2097 }
2098 
2099 /**
2100  * @tc.name: TestDragDataUtil_Packer_Cross
2101  * @tc.desc: Pack up dragData
2102  * @tc.type: FUNC
2103  * @tc.require:
2104  */
2105 HWTEST_F(InteractionManagerTest, TestDragDataUtil_Packer_Cross, TestSize.Level1)
2106 {
2107     CALL_TEST_DEBUG;
2108     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2109         MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2110     ASSERT_TRUE(dragData);
2111     Parcel parcel;
2112     int32_t ret = DragDataUtil::Marshalling(dragData.value(), parcel, true);
2113     ASSERT_EQ(ret, RET_OK);
2114     DragData dragDataFromParcel;
2115     ret = DragDataUtil::UnMarshalling(parcel, dragDataFromParcel, true);
2116     ASSERT_EQ(ret, RET_OK);
2117     ASSERT_EQ(dragData.value(), dragDataFromParcel);
2118 }
2119 
2120 /**
2121  * @tc.name: InteractionManagerTest_GetDragAction_001
2122  * @tc.desc: Get drag action with no keyboard events of keys in dragging
2123  * @tc.type: FUNC
2124  * @tc.require:
2125  */
2126 HWTEST_F(InteractionManagerTest, GetDragAction_001, TestSize.Level1)
2127 {
2128     CALL_TEST_DEBUG;
2129     std::promise<bool> promiseFlag;
2130     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72202(const DragNotifyMsg& notifyMessage) 2131     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2132         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2133             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2134         promiseFlag.set_value(true);
2135     };
2136     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2137         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2138     ASSERT_TRUE(dragData);
2139     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2140         std::make_shared<UnitTestStartDragListener>(callback));
2141     ASSERT_EQ(ret, RET_OK);
2142     DragAction dragAction { DragAction::INVALID };
2143     ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2144     EXPECT_EQ(ret, RET_OK);
2145     EXPECT_EQ(dragAction, DragAction::MOVE);
2146     PrintDragAction(dragAction);
2147     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2148     InteractionManager::GetInstance()->StopDrag(dropResult);
2149     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2150         std::future_status::timeout);
2151     ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2152     EXPECT_EQ(ret, RET_ERR);
2153 }
2154 
2155 /**
2156  * @tc.name: InteractionManagerTest_GetDragAction_002
2157  * @tc.desc: Get drag action with simple press and release keyboard events of keys in dragging
2158  * @tc.type: FUNC
2159  * @tc.require:
2160  */
2161 HWTEST_F(InteractionManagerTest, GetDragAction_002, TestSize.Level1)
2162 {
2163     CALL_TEST_DEBUG;
2164     std::promise<bool> promiseFlag;
2165     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72302(const DragNotifyMsg& notifyMessage) 2166     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2167         FI_HILOGD("DisplayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2168             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2169         promiseFlag.set_value(true);
2170     };
2171     std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
2172     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2173         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2174     ASSERT_TRUE(dragData);
2175     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2176         std::make_shared<UnitTestStartDragListener>(callback));
2177     ASSERT_EQ(ret, RET_OK);
2178     ret = InteractionManager::GetInstance()->UpdateDragStyle(DragCursorStyle::MOVE);
2179     ASSERT_EQ(ret, RET_OK);
2180     SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2181         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
2182     SimulateDownKeyEvent(MMI::KeyEvent::KEYCODE_CTRL_LEFT);
2183     DragAction dragAction { DragAction::INVALID };
2184     ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2185     EXPECT_EQ(ret, RET_OK);
2186     EXPECT_EQ(dragAction, DragAction::COPY);
2187     PrintDragAction(dragAction);
2188     SimulateUpKeyEvent(MMI::KeyEvent::KEYCODE_CTRL_LEFT);
2189     ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2190     EXPECT_EQ(ret, RET_OK);
2191     EXPECT_EQ(dragAction, DragAction::MOVE);
2192     PrintDragAction(dragAction);
2193     ClearUpKeyEvent();
2194     SimulateDownKeyEvent(MMI::KeyEvent::KEYCODE_A);
2195     ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2196     EXPECT_EQ(ret, RET_OK);
2197     EXPECT_EQ(dragAction, DragAction::MOVE);
2198     PrintDragAction(dragAction);
2199     SimulateUpKeyEvent(MMI::KeyEvent::KEYCODE_A);
2200     ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2201     EXPECT_EQ(ret, RET_OK);
2202     EXPECT_EQ(dragAction, DragAction::MOVE);
2203     PrintDragAction(dragAction);
2204     ClearUpKeyEvent();
2205     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2206     InteractionManager::GetInstance()->StopDrag(dropResult);
2207     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2208         std::future_status::timeout);
2209     ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2210     EXPECT_EQ(ret, RET_ERR);
2211 }
2212 
2213 /**
2214  * @tc.name: InteractionManagerTest_GetDragAction_003
2215  * @tc.desc: Get drag action with simple press and release keyboard events of keys in start drag
2216  * @tc.type: FUNC
2217  * @tc.require:
2218  */
2219 HWTEST_F(InteractionManagerTest, GetDragAction_003, TestSize.Level1)
2220 {
2221     CALL_TEST_DEBUG;
2222     if (g_deviceMouseId < 0) {
2223         ASSERT_TRUE(g_deviceMouseId < 0);
2224     } else {
2225         int32_t ret = RET_ERR;
2226         std::promise<bool> promiseFlag;
2227         std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72402(const DragNotifyMsg& notifyMessage) 2228         auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2229             FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2230                 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2231             promiseFlag.set_value(true);
2232         };
2233         std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2234             MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2235         ASSERT_TRUE(dragData);
2236         ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2237             std::make_shared<UnitTestStartDragListener>(callback));
2238         ASSERT_EQ(ret, RET_OK);
2239         ret = InteractionManager::GetInstance()->UpdateDragStyle(DragCursorStyle::MOVE);
2240         ASSERT_EQ(ret, RET_OK);
2241         DragAction dragAction { DragAction::INVALID };
2242         ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2243         EXPECT_EQ(ret, RET_OK);
2244         EXPECT_EQ(dragAction, DragAction::MOVE);
2245         PrintDragAction(dragAction);
2246         DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2247         InteractionManager::GetInstance()->StopDrag(dropResult);
2248         ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2249             std::future_status::timeout);
2250         ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2251         EXPECT_EQ(ret, RET_ERR);
2252     }
2253 }
2254 
2255 /**
2256  * @tc.name: InteractionManagerTest_GetDragAction_004
2257  * @tc.desc: Get drag action with multiple press and release keyboard events of keys in dragging
2258  * @tc.type: FUNC
2259  * @tc.require:
2260  */
2261 HWTEST_F(InteractionManagerTest, GetDragAction_004, TestSize.Level1)
2262 {
2263     CALL_TEST_DEBUG;
2264     std::promise<bool> promiseFlag;
2265     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72502(const DragNotifyMsg& notifyMessage) 2266     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2267         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2268             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2269         promiseFlag.set_value(true);
2270     };
2271     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2272         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2273     ASSERT_TRUE(dragData);
2274     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2275         std::make_shared<UnitTestStartDragListener>(callback));
2276     ASSERT_EQ(ret, RET_OK);
2277     ret = InteractionManager::GetInstance()->UpdateDragStyle(DragCursorStyle::MOVE);
2278     ASSERT_EQ(ret, RET_OK);
2279     SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2280         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
2281     SimulateDownKeyEvent(MMI::KeyEvent::KEYCODE_CTRL_LEFT);
2282     SimulateDownKeyEvent(MMI::KeyEvent::KEYCODE_A);
2283     DragAction dragAction { DragAction::INVALID };
2284     ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2285     EXPECT_EQ(ret, RET_OK);
2286     EXPECT_EQ(dragAction, DragAction::COPY);
2287     SimulateUpKeyEvent(MMI::KeyEvent::KEYCODE_A);
2288     ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2289     EXPECT_EQ(ret, RET_OK);
2290     EXPECT_EQ(dragAction, DragAction::COPY);
2291     ClearUpKeyEvent();
2292     SimulateDownKeyEvent(MMI::KeyEvent::KEYCODE_B);
2293     ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2294     EXPECT_EQ(ret, RET_OK);
2295     EXPECT_EQ(dragAction, DragAction::COPY);
2296     SimulateUpKeyEvent(MMI::KeyEvent::KEYCODE_CTRL_LEFT);
2297     ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2298     EXPECT_EQ(ret, RET_OK);
2299     EXPECT_EQ(dragAction, DragAction::MOVE);
2300     ClearUpKeyEvent();
2301     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2302     InteractionManager::GetInstance()->StopDrag(dropResult);
2303     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2304         std::future_status::timeout);
2305     ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2306     EXPECT_EQ(ret, RET_ERR);
2307 }
2308 
2309 /**
2310  * @tc.name: InteractionManagerTest_GetDragAction_005
2311  * @tc.desc: Get style notification with multiple press and release keyboard events of keys in dragging
2312  * @tc.type: FUNC
2313  * @tc.require:
2314  */
2315 HWTEST_F(InteractionManagerTest, GetDragAction_005, TestSize.Level1)
2316 {
2317     CALL_TEST_DEBUG;
2318     auto listener = std::make_shared<SubscriptListenerTest>("SubscriptListener");
2319     int32_t ret = InteractionManager::GetInstance()->AddSubscriptListener(listener);
2320     ASSERT_EQ(ret, RET_OK);
2321     std::promise<bool> promiseFlag;
2322     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72602(const DragNotifyMsg& notifyMessage) 2323     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2324         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2325             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2326         promiseFlag.set_value(true);
2327     };
2328     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2329         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2330     ASSERT_TRUE(dragData);
2331     ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2332         std::make_shared<UnitTestStartDragListener>(callback));
2333     ASSERT_EQ(ret, RET_OK);
2334     ret = InteractionManager::GetInstance()->UpdateDragStyle(DragCursorStyle::MOVE);
2335     ASSERT_EQ(ret, RET_OK);
2336     SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2337         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
2338     DragCursorStyle recvStyle = listener->GetDragStyle();
2339     EXPECT_EQ(recvStyle, DragCursorStyle::MOVE);
2340     SimulateDownKeyEvent(MMI::KeyEvent::KEYCODE_CTRL_LEFT);
2341     SimulateDownKeyEvent(MMI::KeyEvent::KEYCODE_B);
2342     recvStyle = listener->GetDragStyle();
2343     EXPECT_EQ(recvStyle, DragCursorStyle::COPY);
2344     SimulateUpKeyEvent(MMI::KeyEvent::KEYCODE_CTRL_LEFT);
2345     ClearUpKeyEvent();
2346     recvStyle = listener->GetDragStyle();
2347     EXPECT_EQ(recvStyle, DragCursorStyle::MOVE);
2348     SimulateDownKeyEvent(MMI::KeyEvent::KEYCODE_CTRL_RIGHT);
2349     recvStyle = listener->GetDragStyle();
2350     EXPECT_EQ(recvStyle, DragCursorStyle::COPY);
2351     SimulateUpKeyEvent(MMI::KeyEvent::KEYCODE_B);
2352     ClearUpKeyEvent();
2353     recvStyle = listener->GetDragStyle();
2354     EXPECT_EQ(recvStyle, DragCursorStyle::COPY);
2355     SimulateUpKeyEvent(MMI::KeyEvent::KEYCODE_CTRL_RIGHT);
2356     ClearUpKeyEvent();
2357     recvStyle = listener->GetDragStyle();
2358     EXPECT_EQ(recvStyle, DragCursorStyle::MOVE);
2359     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2360     InteractionManager::GetInstance()->StopDrag(dropResult);
2361     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2362         std::future_status::timeout);
2363     ret = InteractionManager::GetInstance()->RemoveSubscriptListener(listener);
2364     ASSERT_EQ(ret, RET_OK);
2365 }
2366 
2367 /**
2368  * @tc.name: InteractionManagerTest_CheckDragBehavior_001
2369  * @tc.desc: Check drag behavior
2370  * @tc.type: FUNC
2371  * @tc.require:
2372  */
2373 HWTEST_F(InteractionManagerTest, CheckDragBehavior_001, TestSize.Level1)
2374 {
2375     CALL_TEST_DEBUG;
2376     std::promise<bool> promiseFlag;
2377     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72702(const DragNotifyMsg& notifyMessage) 2378     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2379         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, dragBehavior:%{public}d",
2380             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.dragBehavior);
2381         ASSERT_EQ(notifyMessage.dragBehavior, DragBehavior::COPY);
2382         promiseFlag.set_value(true);
2383     };
2384     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2385         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2386     ASSERT_TRUE(dragData);
2387     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2388         std::make_shared<UnitTestStartDragListener>(callback));
2389     ASSERT_EQ(ret, RET_OK);
2390     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION,
2391         TARGET_MAIN_WINDOW, DragBehavior::COPY };
2392     InteractionManager::GetInstance()->StopDrag(dropResult);
2393     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2394         std::future_status::timeout);
2395 }
2396 
2397 /**
2398  * @tc.name: InteractionManagerTest_CheckDragBehavior_002
2399  * @tc.desc: Check drag behavior
2400  * @tc.type: FUNC
2401  * @tc.require:
2402  */
2403 HWTEST_F(InteractionManagerTest, CheckDragBehavior_002, TestSize.Level1)
2404 {
2405     CALL_TEST_DEBUG;
2406     std::promise<bool> promiseFlag;
2407     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72802(const DragNotifyMsg& notifyMessage) 2408     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2409         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, dragBehavior:%{public}d",
2410             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.dragBehavior);
2411         ASSERT_EQ(notifyMessage.dragBehavior, DragBehavior::MOVE);
2412         promiseFlag.set_value(true);
2413     };
2414     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2415         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2416     ASSERT_TRUE(dragData);
2417     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2418         std::make_shared<UnitTestStartDragListener>(callback));
2419     ASSERT_EQ(ret, RET_OK);
2420     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION,
2421         TARGET_MAIN_WINDOW, DragBehavior::MOVE };
2422     InteractionManager::GetInstance()->StopDrag(dropResult);
2423     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2424         std::future_status::timeout);
2425 }
2426 
2427 /**
2428  * @tc.name: InteractionManagerTest_CheckDragBehavior_003
2429  * @tc.desc: Check drag behavior
2430  * @tc.type: FUNC
2431  * @tc.require:
2432  */
2433 HWTEST_F(InteractionManagerTest, CheckDragBehavior_003, TestSize.Level1)
2434 {
2435     CALL_TEST_DEBUG;
2436     std::promise<bool> promiseFlag;
2437     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72902(const DragNotifyMsg& notifyMessage) 2438     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2439         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, dragBehavior:%{public}d",
2440             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.dragBehavior);
2441         ASSERT_EQ(notifyMessage.dragBehavior, DragBehavior::COPY);
2442         promiseFlag.set_value(true);
2443     };
2444     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2445         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2446     ASSERT_TRUE(dragData);
2447     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2448         std::make_shared<UnitTestStartDragListener>(callback));
2449     ASSERT_EQ(ret, RET_OK);
2450     ret = InteractionManager::GetInstance()->UpdateDragStyle(DragCursorStyle::COPY);
2451     ASSERT_EQ(ret, RET_OK);
2452     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, TARGET_MAIN_WINDOW };
2453     InteractionManager::GetInstance()->StopDrag(dropResult);
2454     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2455         std::future_status::timeout);
2456 }
2457 
2458 /**
2459  * @tc.name: InteractionManagerTest_CheckDragBehavior_004
2460  * @tc.desc: Check drag behavior
2461  * @tc.type: FUNC
2462  * @tc.require:
2463  */
2464 HWTEST_F(InteractionManagerTest, CheckDragBehavior_004, TestSize.Level1)
2465 {
2466     CALL_TEST_DEBUG;
2467     std::promise<bool> promiseFlag;
2468     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72a02(const DragNotifyMsg& notifyMessage) 2469     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2470         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, dragBehavior:%{public}d",
2471             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.dragBehavior);
2472         ASSERT_EQ(notifyMessage.dragBehavior, DragBehavior::MOVE);
2473         promiseFlag.set_value(true);
2474     };
2475     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2476         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2477     ASSERT_TRUE(dragData);
2478     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2479         std::make_shared<UnitTestStartDragListener>(callback));
2480     ASSERT_EQ(ret, RET_OK);
2481     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, TARGET_MAIN_WINDOW };
2482     InteractionManager::GetInstance()->StopDrag(dropResult);
2483     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2484         std::future_status::timeout);
2485 }
2486 
2487 /**
2488  * @tc.name: InteractionManagerTest_CheckDragBehavior_005
2489  * @tc.desc: Check drag behavior
2490  * @tc.type: FUNC
2491  * @tc.require:
2492  */
2493 HWTEST_F(InteractionManagerTest, CheckDragBehavior_005, TestSize.Level1)
2494 {
2495     CALL_TEST_DEBUG;
2496     std::promise<bool> promiseFlag;
2497     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72b02(const DragNotifyMsg& notifyMessage) 2498     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2499         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, dragBehavior:%{public}d",
2500             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.dragBehavior);
2501         ASSERT_EQ(notifyMessage.dragBehavior, DragBehavior::COPY);
2502         promiseFlag.set_value(true);
2503     };
2504     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2505         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2506     ASSERT_TRUE(dragData);
2507     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2508         std::make_shared<UnitTestStartDragListener>(callback));
2509     ASSERT_EQ(ret, RET_OK);
2510     int32_t targetMainWindow = 1;
2511     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, targetMainWindow };
2512     InteractionManager::GetInstance()->StopDrag(dropResult);
2513     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2514         std::future_status::timeout);
2515 }
2516 
2517 /**
2518  * @tc.name: InteractionManagerTest_CheckDragBehavior_006
2519  * @tc.desc: Check drag behavior
2520  * @tc.type: FUNC
2521  * @tc.require:
2522  */
2523 HWTEST_F(InteractionManagerTest, CheckDragBehavior_006, TestSize.Level1)
2524 {
2525     CALL_TEST_DEBUG;
2526     std::promise<bool> promiseFlag;
2527     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72c02(const DragNotifyMsg& notifyMessage) 2528     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2529         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, dragBehavior:%{public}d",
2530             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.dragBehavior);
2531         ASSERT_EQ(notifyMessage.dragBehavior, DragBehavior::UNKNOWN);
2532         promiseFlag.set_value(true);
2533     };
2534     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2535         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2536     ASSERT_TRUE(dragData);
2537     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2538         std::make_shared<UnitTestStartDragListener>(callback));
2539     ASSERT_EQ(ret, RET_OK);
2540     DragDropResult dropResult { DragResult::DRAG_FAIL, HAS_CUSTOM_ANIMATION, TARGET_MAIN_WINDOW };
2541     InteractionManager::GetInstance()->StopDrag(dropResult);
2542     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2543         std::future_status::timeout);
2544 }
2545 
2546 /**
2547  * @tc.name: InteractionManagerTest_StartDrag_Shadow
2548  * @tc.desc: Check drag shadow
2549  * @tc.type: FUNC
2550  * @tc.require:
2551  */
2552 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_Shadow, TestSize.Level1)
2553 {
2554     CALL_TEST_DEBUG;
2555     std::promise<bool> promiseFlag;
2556     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72d02(const DragNotifyMsg& notifyMessage) 2557     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2558         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2559             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2560         promiseFlag.set_value(true);
2561     };
2562     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2563         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2564     SimulateDownPointerEvent(
2565         { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
2566     ASSERT_TRUE(dragData);
2567     dragData->filterInfo = "{ \"dip_scale\": 3.5, \"drag_shadow_offsetX\": 50, \"drag_shadow_offsetY\": 50, "
2568         "\"drag_shadow_argb\": 872415231, "
2569 		"\"shadow_color_strategy\": 0, \"shadow_is_hardwareacceleration\": true, \"shadow_elevation\": 120, "
2570 		"\"drag_type\": \"non-text\", \"shadow_enable\": true }";
2571     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2572         std::make_shared<UnitTestStartDragListener>(callback));
2573     ASSERT_EQ(ret, RET_OK);
2574     ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
2575     EXPECT_EQ(ret, RET_OK);
2576     SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2577         MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
2578     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2579     InteractionManager::GetInstance()->StopDrag(dropResult);
2580     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2581         std::future_status::timeout);
2582 }
2583 
2584 /**
2585  * @tc.name: InteractionManagerTest_StartDrag_ShadowAlpha
2586  * @tc.desc: Check drag shadow alpha
2587  * @tc.type: FUNC
2588  * @tc.require:
2589  */
2590 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_ShadowAlpha, TestSize.Level1)
2591 {
2592     CALL_TEST_DEBUG;
2593     std::promise<bool> promiseFlag;
2594     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72e02(const DragNotifyMsg& notifyMessage) 2595     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2596         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2597             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2598         promiseFlag.set_value(true);
2599     };
2600     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2601         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2602     SimulateDownPointerEvent(
2603         { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
2604     ASSERT_TRUE(dragData);
2605     dragData->filterInfo = "{ \"dip_scale\": 3.5, \"drag_shadow_offsetX\": 50, \"drag_shadow_offsetY\": 50, "
2606         "\"drag_shadow_argb\": 872415231, "
2607 		"\"shadow_color_strategy\": 0, \"shadow_is_hardwareacceleration\": true, \"shadow_elevation\": 120, "
2608 		"\"drag_type\": \"non-text\", \"shadow_enable\": true }";
2609     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2610         std::make_shared<UnitTestStartDragListener>(callback));
2611     ASSERT_EQ(ret, RET_OK);
2612     ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
2613     EXPECT_EQ(ret, RET_OK);
2614     SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2615         MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
2616     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2617     InteractionManager::GetInstance()->StopDrag(dropResult);
2618     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2619         std::future_status::timeout);
2620 }
2621 
2622 /**
2623  * @tc.name: InteractionManagerTest_StartDrag_ShadowColor
2624  * @tc.desc: Check drag shadow color
2625  * @tc.type: FUNC
2626  * @tc.require:
2627  */
2628 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_ShadowColor, TestSize.Level1)
2629 {
2630     CALL_TEST_DEBUG;
2631     std::promise<bool> promiseFlag;
2632     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72f02(const DragNotifyMsg& notifyMessage) 2633     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2634         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2635             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2636         promiseFlag.set_value(true);
2637     };
2638     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2639         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2640     SimulateDownPointerEvent(
2641         { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
2642     ASSERT_TRUE(dragData);
2643     dragData->filterInfo = "{ \"dip_scale\": 3.5, \"drag_shadow_offsetX\": 50, \"drag_shadow_offsetY\": 50, "
2644         "\"drag_shadow_argb\": 872415231, "
2645 		"\"shadow_color_strategy\": 0, \"shadow_is_hardwareacceleration\": true, \"shadow_elevation\": 120, "
2646 		"\"drag_type\": \"non-text\", \"shadow_enable\": true }";
2647     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2648         std::make_shared<UnitTestStartDragListener>(callback));
2649     ASSERT_EQ(ret, RET_OK);
2650     ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
2651     EXPECT_EQ(ret, RET_OK);
2652     SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2653         MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
2654     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2655     InteractionManager::GetInstance()->StopDrag(dropResult);
2656     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2657         std::future_status::timeout);
2658 }
2659 
2660 /**
2661  * @tc.name: InteractionManagerTest_StartDrag_ShadowOffset
2662  * @tc.desc: Check drag shadow offset
2663  * @tc.type: FUNC
2664  * @tc.require:
2665  */
2666 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_ShadowOffset, TestSize.Level1)
2667 {
2668     CALL_TEST_DEBUG;
2669     std::promise<bool> promiseFlag;
2670     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a73002(const DragNotifyMsg& notifyMessage) 2671     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2672         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2673             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2674         promiseFlag.set_value(true);
2675     };
2676     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2677         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2678     SimulateDownPointerEvent(
2679         { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
2680     ASSERT_TRUE(dragData);
2681     dragData->filterInfo = "{ \"dip_scale\": 3.5, \"drag_shadow_offsetX\": 50, \"drag_shadow_offsetY\": 50, "
2682         "\"drag_shadow_argb\": 872415231, "
2683 		"\"shadow_color_strategy\": 0, \"shadow_is_hardwareacceleration\": true, \"shadow_elevation\": 120, "
2684 		"\"drag_type\": \"non-text\", \"shadow_enable\": true }";
2685     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2686         std::make_shared<UnitTestStartDragListener>(callback));
2687     ASSERT_EQ(ret, RET_OK);
2688     ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
2689     EXPECT_EQ(ret, RET_OK);
2690     SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2691         MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
2692     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2693     InteractionManager::GetInstance()->StopDrag(dropResult);
2694     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2695         std::future_status::timeout);
2696 }
2697 
2698 /**
2699  * @tc.name: InteractionManagerTest_StartDrag_ShadowCornerRadius
2700  * @tc.desc: Check drag shadow corner radius
2701  * @tc.type: FUNC
2702  * @tc.require:
2703  */
2704 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_ShadowCornerRadius, TestSize.Level1)
2705 {
2706     CALL_TEST_DEBUG;
2707     std::promise<bool> promiseFlag;
2708     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a73102(const DragNotifyMsg& notifyMessage) 2709     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2710         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2711             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2712         promiseFlag.set_value(true);
2713     };
2714     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2715         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2716     SimulateDownPointerEvent(
2717         { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
2718     ASSERT_TRUE(dragData);
2719     dragData->filterInfo = "{ \"dip_scale\": 3.5, \"drag_shadow_offsetX\": 50, \"drag_shadow_offsetY\": 50, "
2720         "\"drag_shadow_argb\": 872415231, "
2721 		"\"shadow_color_strategy\": 0, \"shadow_is_hardwareacceleration\": true, \"shadow_elevation\": 120, "
2722 		"\"drag_type\": \"non-text\", \"shadow_enable\": true }";
2723     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2724         std::make_shared<UnitTestStartDragListener>(callback));
2725     ASSERT_EQ(ret, RET_OK);
2726     ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
2727     EXPECT_EQ(ret, RET_OK);
2728     SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2729         MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
2730     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2731     InteractionManager::GetInstance()->StopDrag(dropResult);
2732     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2733         std::future_status::timeout);
2734 }
2735 
2736 /**
2737  * @tc.name: InteractionManagerTest_StartDrag_ShadowPath001
2738  * @tc.desc: Check drag shadow path
2739  * @tc.type: FUNC
2740  * @tc.require:
2741  */
2742 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_ShadowPath001, TestSize.Level1)
2743 {
2744     CALL_TEST_DEBUG;
2745     std::promise<bool> promiseFlag;
2746     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a73202(const DragNotifyMsg& notifyMessage) 2747     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2748         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2749             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2750         promiseFlag.set_value(true);
2751     };
2752     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2753         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2754     SimulateDownPointerEvent(
2755         { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
2756     ASSERT_TRUE(dragData);
2757     dragData->filterInfo = "{ \"dip_scale\": 3.5, \"drag_shadow_offsetX\": 50, \"drag_shadow_offsetY\": 50, "
2758         "\"drag_shadow_argb\": 872415231, "
2759 		"\"shadow_color_strategy\": 0, \"shadow_is_hardwareacceleration\": true, \"shadow_elevation\": 120, "
2760 		"\"drag_type\": \"non-text\", \"shadow_enable\": true }";
2761     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2762         std::make_shared<UnitTestStartDragListener>(callback));
2763     ASSERT_EQ(ret, RET_OK);
2764     ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
2765     EXPECT_EQ(ret, RET_OK);
2766     SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2767         MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
2768     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2769     InteractionManager::GetInstance()->StopDrag(dropResult);
2770     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2771         std::future_status::timeout);
2772 }
2773 
2774 /**
2775  * @tc.name: InteractionManagerTest_StartDrag_ShadowPath002
2776  * @tc.desc: Check drag shadow path
2777  * @tc.type: FUNC
2778  * @tc.require:
2779  */
2780 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_ShadowPath002, TestSize.Level1)
2781 {
2782     CALL_TEST_DEBUG;
2783     std::promise<bool> promiseFlag;
2784     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a73302(const DragNotifyMsg& notifyMessage) 2785     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2786         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2787             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2788         promiseFlag.set_value(true);
2789     };
2790     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2791         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2792     SimulateDownPointerEvent(
2793         { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
2794     ASSERT_TRUE(dragData);
2795     dragData->filterInfo = "{ \"dip_scale\": 3.5, \"drag_shadow_offsetX\": 50, \"drag_shadow_offsetY\": 50, "
2796         "\"drag_shadow_argb\": 872415231, "
2797 		"\"shadow_color_strategy\": 0, \"shadow_is_hardwareacceleration\": true, \"shadow_elevation\": 120, "
2798 		"\"drag_type\": \"non-text\", \"shadow_enable\": true }";
2799     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2800         std::make_shared<UnitTestStartDragListener>(callback));
2801     ASSERT_EQ(ret, RET_OK);
2802     ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
2803     EXPECT_EQ(ret, RET_OK);
2804     SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2805         MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
2806     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2807     InteractionManager::GetInstance()->StopDrag(dropResult);
2808     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2809         std::future_status::timeout);
2810 }
2811 
2812 /**
2813  * @tc.name: InteractionManagerTest_StartDrag_NonTextShadow
2814  * @tc.desc: Check non-text drag shadow
2815  * @tc.type: FUNC
2816  * @tc.require:
2817  */
2818 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_NonTextShadow, TestSize.Level1)
2819 {
2820     CALL_TEST_DEBUG;
2821     std::promise<bool> promiseFlag;
2822     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a73402(const DragNotifyMsg& notifyMessage) 2823     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2824         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2825             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2826         promiseFlag.set_value(true);
2827     };
2828     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2829         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2830     SimulateDownPointerEvent(
2831         { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
2832     ASSERT_TRUE(dragData);
2833     dragData->filterInfo = "{ \"dip_scale\": 3.5, \"drag_shadow_offsetX\": 50, \"drag_shadow_offsetY\": 50, "
2834         "\"drag_shadow_argb\": 872415231, "
2835 		"\"shadow_color_strategy\": 0, \"shadow_is_hardwareacceleration\": true, \"shadow_elevation\": 120, "
2836 		"\"drag_type\": \"non-text\", \"shadow_enable\": true }";
2837     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2838         std::make_shared<UnitTestStartDragListener>(callback));
2839     ASSERT_EQ(ret, RET_OK);
2840     ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
2841     EXPECT_EQ(ret, RET_OK);
2842     SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2843         MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
2844     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2845     InteractionManager::GetInstance()->StopDrag(dropResult);
2846     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2847         std::future_status::timeout);
2848     ret = InteractionManager::GetInstance()->EraseMouseIcon();
2849     EXPECT_NE(ret, RET_OK);
2850     ret = InteractionManager::GetInstance()->SetMouseDragMonitorState(0);
2851     EXPECT_EQ(ret, RET_OK);
2852 }
2853 
2854 /**
2855  * @tc.name: InteractionManagerTest_SetDragSwitchState
2856  * @tc.desc: Get drag summarys
2857  * @tc.type: FUNC
2858  * @tc.require:
2859  */
2860 HWTEST_F(InteractionManagerTest, InteractionManagerTest_SetDragSwitchState, TestSize.Level1)
2861 {
2862     CALL_TEST_DEBUG;
2863     std::promise<bool> promiseFlag;
2864     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a73502(const DragNotifyMsg& notifyMessage) 2865     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2866         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2867             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2868         promiseFlag.set_value(true);
2869     };
2870     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2871         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2872     ASSERT_TRUE(dragData);
2873     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2874         std::make_shared<UnitTestStartDragListener>(callback));
2875     ASSERT_EQ(ret, RET_OK);
2876     ret = InteractionManager::GetInstance()->SetDragSwitchState(true, true);
2877     EXPECT_EQ(ret, RET_OK);
2878     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2879     InteractionManager::GetInstance()->StopDrag(dropResult);
2880     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2881         std::future_status::timeout);
2882 }
2883 
2884 /**
2885  * @tc.name: InteractionManagerTest_SetDraggableState
2886  * @tc.desc: Get drag summarys
2887  * @tc.type: FUNC
2888  * @tc.require:
2889  */
2890 HWTEST_F(InteractionManagerTest, InteractionManagerTest_SetDraggableState, TestSize.Level1)
2891 {
2892     CALL_TEST_DEBUG;
2893     std::promise<bool> promiseFlag;
2894     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a73602(const DragNotifyMsg& notifyMessage) 2895     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2896         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2897             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2898         promiseFlag.set_value(true);
2899     };
2900     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2901         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2902     ASSERT_TRUE(dragData);
2903     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2904         std::make_shared<UnitTestStartDragListener>(callback));
2905     ASSERT_EQ(ret, RET_OK);
2906 
2907     ret = InteractionManager::GetInstance()->SetDraggableState(true);
2908     EXPECT_EQ(ret, RET_OK);
2909     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2910     InteractionManager::GetInstance()->StopDrag(dropResult);
2911     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2912         std::future_status::timeout);
2913 }
2914 
2915 /**
2916  * @tc.name: InteractionManagerTest_SetAppDragSwitchState
2917  * @tc.desc: Get drag summarys
2918  * @tc.type: FUNC
2919  * @tc.require:
2920  */
2921 HWTEST_F(InteractionManagerTest, InteractionManagerTest_SetAppDragSwitchState, TestSize.Level1)
2922 {
2923     CALL_TEST_DEBUG;
2924     std::promise<bool> promiseFlag;
2925     std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a73702(const DragNotifyMsg& notifyMessage) 2926     auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2927         FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2928             notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2929         promiseFlag.set_value(true);
2930     };
2931     std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2932         MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2933     ASSERT_TRUE(dragData);
2934     int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2935         std::make_shared<UnitTestStartDragListener>(callback));
2936     ASSERT_EQ(ret, RET_OK);
2937     const std::string pkgName = "testpkgName";
2938     ret = InteractionManager::GetInstance()->SetAppDragSwitchState(true, pkgName, true);
2939     EXPECT_EQ(ret, RET_OK);
2940     DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2941     InteractionManager::GetInstance()->StopDrag(dropResult);
2942     ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2943         std::future_status::timeout);
2944 }
2945 
2946 /**
2947  * @tc.name: InteractionManagerTest_ActivateCooperateWithOptions
2948  * @tc.desc: Activate coordination
2949  * @tc.type: FUNC
2950  * @tc.require:
2951  */
2952 HWTEST_F(InteractionManagerTest, InteractionManagerTest_ActivateCooperateWithOptions, TestSize.Level1)
2953 {
2954     CALL_TEST_DEBUG;
2955     SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
2956     std::string remoteNetworkId("");
2957     int32_t startDeviceId = -1;
__anond638f0a73802(const std::string &listener, const CoordinationMsgInfo &coordinationMessages) 2958     auto fun = [](const std::string &listener, const CoordinationMsgInfo &coordinationMessages) {
2959         FI_HILOGD("Start coordination success");
2960         (void) listener;
2961     };
2962     CooperateOptions withOptions;
2963     withOptions.displayX = 500;
2964     withOptions.displayY = 500;
2965     withOptions.displayId = 0;
2966     int32_t ret = InteractionManager::GetInstance()->ActivateCooperateWithOptions(remoteNetworkId, startDeviceId,
2967         fun, withOptions);
2968 #ifdef OHOS_BUILD_ENABLE_COORDINATION
2969     ASSERT_TRUE((ret == RET_OK || ret == COMMON_PERMISSION_CHECK_ERROR || ret == COMMON_NOT_ALLOWED_DISTRIBUTED));
2970 #else
2971     ASSERT_EQ(ret, ERROR_UNSUPPORT);
2972 #endif // OHOS_BUILD_ENABLE_COORDINATION
2973     RemovePermission();
2974 }
2975 } // namespace DeviceStatus
2976 } // namespace Msdp
2977 } // namespace OHOS
2978