17#include "gmock/gmock.h"
18#include "gtest/gtest.h"
19#include "rapidjson/document.h"
26using ::testing::NiceMock;
27using ::testing::Return;
29static constexpr char kChannelName[] =
"flutter/platform";
31static constexpr char kClipboardGetDataMessage[] =
32 "{\"method\":\"Clipboard.getData\",\"args\":\"text/plain\"}";
33static constexpr char kClipboardGetDataFakeContentTypeMessage[] =
34 "{\"method\":\"Clipboard.getData\",\"args\":\"text/madeupcontenttype\"}";
35static constexpr char kClipboardHasStringsMessage[] =
36 "{\"method\":\"Clipboard.hasStrings\",\"args\":\"text/plain\"}";
37static constexpr char kClipboardHasStringsFakeContentTypeMessage[] =
38 "{\"method\":\"Clipboard.hasStrings\",\"args\":\"text/madeupcontenttype\"}";
39static constexpr char kClipboardSetDataMessage[] =
40 "{\"method\":\"Clipboard.setData\",\"args\":{\"text\":\"hello\"}}";
41static constexpr char kClipboardSetDataNullTextMessage[] =
42 "{\"method\":\"Clipboard.setData\",\"args\":{\"text\":null}}";
43static constexpr char kClipboardSetDataUnknownTypeMessage[] =
44 "{\"method\":\"Clipboard.setData\",\"args\":{\"madeuptype\":\"hello\"}}";
45static constexpr char kSystemSoundTypeAlertMessage[] =
46 "{\"method\":\"SystemSound.play\",\"args\":\"SystemSoundType.alert\"}";
47static constexpr char kSystemExitApplicationRequiredMessage[] =
48 "{\"method\":\"System.exitApplication\",\"args\":{\"type\":\"required\","
50static constexpr char kSystemExitApplicationCancelableMessage[] =
51 "{\"method\":\"System.exitApplication\",\"args\":{\"type\":\"cancelable\","
53static constexpr char kExitResponseCancelMessage[] =
54 "[{\"response\":\"cancel\"}]";
55static constexpr char kExitResponseExitMessage[] =
"[{\"response\":\"exit\"}]";
59static constexpr int kArbitraryErrorCode = 1;
63class 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,
107class 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));
121std::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);
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,
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);
WindowsTestContext & GetContext()
G_BEGIN_DECLS GBytes * message
#define FML_DISALLOW_COPY_AND_ASSIGN(TypeName)
TEST_F(DisplayListTest, Defaults)
it will be possible to load the file into Perfetto s trace viewer use test Running tests that layout and measure text will not yield consistent results across various platforms Enabling this option will make font resolution default to the Ahem test font on all disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size
std::function< void(const uint8_t *reply, size_t reply_size)> BinaryReply