9 #include "flutter/fml/macros.h"
12 #include "flutter/shell/platform/windows/testing/engine_modifier.h"
13 #include "flutter/shell/platform/windows/testing/flutter_windows_engine_builder.h"
14 #include "flutter/shell/platform/windows/testing/mock_window_binding_handler.h"
15 #include "flutter/shell/platform/windows/testing/test_binary_messenger.h"
16 #include "flutter/shell/platform/windows/testing/windows_test.h"
17 #include "gmock/gmock.h"
18 #include "gtest/gtest.h"
19 #include "rapidjson/document.h"
26 using ::testing::NiceMock;
27 using ::testing::Return;
29 static constexpr
char kChannelName[] =
"flutter/platform";
31 static constexpr
char kClipboardGetDataMessage[] =
32 "{\"method\":\"Clipboard.getData\",\"args\":\"text/plain\"}";
33 static constexpr
char kClipboardGetDataFakeContentTypeMessage[] =
34 "{\"method\":\"Clipboard.getData\",\"args\":\"text/madeupcontenttype\"}";
35 static constexpr
char kClipboardHasStringsMessage[] =
36 "{\"method\":\"Clipboard.hasStrings\",\"args\":\"text/plain\"}";
37 static constexpr
char kClipboardHasStringsFakeContentTypeMessage[] =
38 "{\"method\":\"Clipboard.hasStrings\",\"args\":\"text/madeupcontenttype\"}";
39 static constexpr
char kClipboardSetDataMessage[] =
40 "{\"method\":\"Clipboard.setData\",\"args\":{\"text\":\"hello\"}}";
41 static constexpr
char kClipboardSetDataNullTextMessage[] =
42 "{\"method\":\"Clipboard.setData\",\"args\":{\"text\":null}}";
43 static constexpr
char kClipboardSetDataUnknownTypeMessage[] =
44 "{\"method\":\"Clipboard.setData\",\"args\":{\"madeuptype\":\"hello\"}}";
45 static constexpr
char kSystemSoundTypeAlertMessage[] =
46 "{\"method\":\"SystemSound.play\",\"args\":\"SystemSoundType.alert\"}";
47 static constexpr
char kSystemExitApplicationRequiredMessage[] =
48 "{\"method\":\"System.exitApplication\",\"args\":{\"type\":\"required\","
50 static constexpr
char kSystemExitApplicationCancelableMessage[] =
51 "{\"method\":\"System.exitApplication\",\"args\":{\"type\":\"cancelable\","
53 static constexpr
char kExitResponseCancelMessage[] =
54 "[{\"response\":\"cancel\"}]";
55 static constexpr
char kExitResponseExitMessage[] =
"[{\"response\":\"exit\"}]";
59 static constexpr
int kArbitraryErrorCode = 1;
63 class MockPlatformHandler :
public PlatformHandler {
65 explicit MockPlatformHandler(
66 BinaryMessenger* messenger,
67 FlutterWindowsEngine* engine,
68 std::optional<std::function<std::unique_ptr<ScopedClipboardInterface>()>>
69 scoped_clipboard_provider = std::nullopt)
70 : PlatformHandler(messenger, engine, scoped_clipboard_provider) {}
72 virtual ~MockPlatformHandler() =
default;
76 (std::unique_ptr<MethodResult<rapidjson::Document>>,
77 std::string_view
key),
81 (std::unique_ptr<MethodResult<rapidjson::Document>>),
86 std::unique_ptr<MethodResult<rapidjson::Document>>),
91 std::unique_ptr<MethodResult<rapidjson::Document>>),
96 (std::optional<HWND> hwnd,
97 std::optional<WPARAM> wparam,
98 std::optional<LPARAM> lparam,
103 FML_DISALLOW_COPY_AND_ASSIGN(MockPlatformHandler);
107 class MockScopedClipboard :
public ScopedClipboardInterface {
109 MockScopedClipboard() =
default;
110 virtual ~MockScopedClipboard() =
default;
112 MOCK_METHOD(
int, Open, (HWND window), (
override));
113 MOCK_METHOD(
bool, HasString, (), (
override));
114 MOCK_METHOD((std::variant<std::wstring, int>), GetString, (), (
override));
115 MOCK_METHOD(
int, SetString, (
const std::wstring
string), (
override));
118 FML_DISALLOW_COPY_AND_ASSIGN(MockScopedClipboard);
121 std::string SimulatePlatformMessage(TestBinaryMessenger* messenger,
124 EXPECT_TRUE(messenger->SimulateEngineMessage(
127 [result = &result](
const uint8_t* reply,
size_t reply_size) {
128 std::string response(reinterpret_cast<const char*>(reply), reply_size);
147 FlutterWindowsEngineBuilder builder{GetContext()};
149 engine_ = builder.Build();
153 std::unique_ptr<FlutterWindowsEngine> engine_;
154 std::unique_ptr<FlutterWindowsView> view_;
162 TestBinaryMessenger messenger;
164 auto clipboard = std::make_unique<MockScopedClipboard>();
166 EXPECT_CALL(*clipboard.get(), Open)
169 EXPECT_CALL(*clipboard.get(), HasString).Times(1).WillOnce(Return(
true));
170 EXPECT_CALL(*clipboard.get(), GetString)
172 .WillOnce(Return(std::wstring(L
"Hello world")));
178 SimulatePlatformMessage(&messenger, kClipboardGetDataMessage);
180 EXPECT_EQ(result,
"[{\"text\":\"Hello world\"}]");
186 TestBinaryMessenger messenger;
190 std::string result = SimulatePlatformMessage(
191 &messenger, kClipboardGetDataFakeContentTypeMessage);
193 EXPECT_EQ(result,
"[\"Clipboard error\",\"Unknown clipboard format\",null]");
199 TestBinaryMessenger messenger;
201 auto clipboard = std::make_unique<MockScopedClipboard>();
203 EXPECT_CALL(*clipboard.get(), Open)
205 .WillOnce(Return(kArbitraryErrorCode));
211 SimulatePlatformMessage(&messenger, kClipboardGetDataMessage);
213 EXPECT_EQ(result,
"[\"Clipboard error\",\"Unable to open clipboard\",1]");
219 TestBinaryMessenger messenger;
221 auto clipboard = std::make_unique<MockScopedClipboard>();
223 EXPECT_CALL(*clipboard.get(), Open)
226 EXPECT_CALL(*clipboard.get(), HasString).Times(1).WillOnce(Return(
true));
227 EXPECT_CALL(*clipboard.get(), GetString)
229 .WillOnce(Return(kArbitraryErrorCode));
235 SimulatePlatformMessage(&messenger, kClipboardGetDataMessage);
237 EXPECT_EQ(result,
"[\"Clipboard error\",\"Unable to get clipboard data\",1]");
243 TestBinaryMessenger messenger;
245 auto clipboard = std::make_unique<MockScopedClipboard>();
247 EXPECT_CALL(*clipboard.get(), Open)
250 EXPECT_CALL(*clipboard.get(), HasString).Times(1).WillOnce(Return(
true));
256 SimulatePlatformMessage(&messenger, kClipboardHasStringsMessage);
258 EXPECT_EQ(result,
"[{\"value\":true}]");
264 TestBinaryMessenger messenger;
266 auto clipboard = std::make_unique<MockScopedClipboard>();
268 EXPECT_CALL(*clipboard.get(), Open)
271 EXPECT_CALL(*clipboard.get(), HasString).Times(1).WillOnce(Return(
false));
277 SimulatePlatformMessage(&messenger, kClipboardHasStringsMessage);
279 EXPECT_EQ(result,
"[{\"value\":false}]");
285 TestBinaryMessenger messenger;
288 std::string result = SimulatePlatformMessage(
289 &messenger, kClipboardHasStringsFakeContentTypeMessage);
291 EXPECT_EQ(result,
"[\"Clipboard error\",\"Unknown clipboard format\",null]");
298 TestBinaryMessenger messenger;
300 auto clipboard = std::make_unique<MockScopedClipboard>();
302 EXPECT_CALL(*clipboard.get(), Open)
310 SimulatePlatformMessage(&messenger, kClipboardHasStringsMessage);
312 EXPECT_EQ(result,
"[{\"value\":false}]");
318 TestBinaryMessenger messenger;
320 auto clipboard = std::make_unique<MockScopedClipboard>();
322 EXPECT_CALL(*clipboard.get(), Open)
324 .WillOnce(Return(kArbitraryErrorCode));
330 SimulatePlatformMessage(&messenger, kClipboardHasStringsMessage);
332 EXPECT_EQ(result,
"[\"Clipboard error\",\"Unable to open clipboard\",1]");
338 TestBinaryMessenger messenger;
340 auto clipboard = std::make_unique<MockScopedClipboard>();
342 EXPECT_CALL(*clipboard.get(), Open)
345 EXPECT_CALL(*clipboard.get(), SetString)
347 .WillOnce([](std::wstring
string) {
348 EXPECT_EQ(
string, L
"hello");
356 SimulatePlatformMessage(&messenger, kClipboardSetDataMessage);
358 EXPECT_EQ(result,
"[null]");
365 TestBinaryMessenger messenger;
369 SimulatePlatformMessage(&messenger, kClipboardSetDataNullTextMessage);
371 EXPECT_EQ(result,
"[\"Clipboard error\",\"Unknown clipboard format\",null]");
377 TestBinaryMessenger messenger;
381 SimulatePlatformMessage(&messenger, kClipboardSetDataUnknownTypeMessage);
383 EXPECT_EQ(result,
"[\"Clipboard error\",\"Unknown clipboard format\",null]");
389 TestBinaryMessenger messenger;
391 auto clipboard = std::make_unique<MockScopedClipboard>();
393 EXPECT_CALL(*clipboard.get(), Open)
395 .WillOnce(Return(kArbitraryErrorCode));
401 SimulatePlatformMessage(&messenger, kClipboardSetDataMessage);
403 EXPECT_EQ(result,
"[\"Clipboard error\",\"Unable to open clipboard\",1]");
409 TestBinaryMessenger messenger;
411 auto clipboard = std::make_unique<MockScopedClipboard>();
413 EXPECT_CALL(*clipboard.get(), Open)
416 EXPECT_CALL(*clipboard.get(), SetString)
418 .WillOnce(Return(kArbitraryErrorCode));
424 SimulatePlatformMessage(&messenger, kClipboardSetDataMessage);
426 EXPECT_EQ(result,
"[\"Clipboard error\",\"Unable to set clipboard data\",1]");
432 TestBinaryMessenger messenger;
433 MockPlatformHandler platform_handler(&messenger, engine());
435 EXPECT_CALL(platform_handler, SystemSoundPlay(
"SystemSoundType.alert", _))
436 .WillOnce([](
const std::string& sound,
442 SimulatePlatformMessage(&messenger, kSystemSoundTypeAlertMessage);
444 EXPECT_EQ(result,
"[null]");
451 TestBinaryMessenger messenger([](
const std::string& channel,
452 const uint8_t*
message,
size_t size,
454 MockPlatformHandler platform_handler(&messenger, engine());
456 ON_CALL(platform_handler, QuitApplication)
457 .WillByDefault([&exit_code](std::optional<HWND> hwnd,
458 std::optional<WPARAM> wparam,
459 std::optional<LPARAM> lparam,
460 UINT ec) { exit_code = ec; });
461 EXPECT_CALL(platform_handler, QuitApplication).Times(1);
463 std::string result = SimulatePlatformMessage(
464 &messenger, kSystemExitApplicationRequiredMessage);
465 EXPECT_EQ(result,
"[{\"response\":\"exit\"}]");
466 EXPECT_EQ(exit_code, 1);
471 bool called_cancel =
false;
473 TestBinaryMessenger messenger(
474 [&called_cancel](
const std::string& channel,
const uint8_t*
message,
476 reply(
reinterpret_cast<const uint8_t*
>(kExitResponseCancelMessage),
477 sizeof(kExitResponseCancelMessage));
478 called_cancel =
true;
480 MockPlatformHandler platform_handler(&messenger, engine());
482 EXPECT_CALL(platform_handler, QuitApplication).Times(0);
484 std::string result = SimulatePlatformMessage(
485 &messenger, kSystemExitApplicationCancelableMessage);
486 EXPECT_EQ(result,
"[{\"response\":\"cancel\"}]");
487 EXPECT_TRUE(called_cancel);
492 bool called_cancel =
false;
495 TestBinaryMessenger messenger(
496 [&called_cancel](
const std::string& channel,
const uint8_t*
message,
498 reply(
reinterpret_cast<const uint8_t*
>(kExitResponseExitMessage),
499 sizeof(kExitResponseExitMessage));
500 called_cancel =
true;
502 MockPlatformHandler platform_handler(&messenger, engine());
504 ON_CALL(platform_handler, QuitApplication)
505 .WillByDefault([&exit_code](std::optional<HWND> hwnd,
506 std::optional<WPARAM> wparam,
507 std::optional<LPARAM> lparam,
508 UINT ec) { exit_code = ec; });
509 EXPECT_CALL(platform_handler, QuitApplication).Times(1);
511 std::string result = SimulatePlatformMessage(
512 &messenger, kSystemExitApplicationCancelableMessage);
513 EXPECT_EQ(result,
"[{\"response\":\"cancel\"}]");
514 EXPECT_TRUE(called_cancel);
515 EXPECT_EQ(exit_code, 2);
static constexpr char kChannelName[]
TEST_F(CompositorOpenGLTest, CreateBackingStore)
std::function< void(const uint8_t *reply, size_t reply_size)> BinaryReply