88#include " flutter/shell/platform/embedder/test_utils/proc_table_replacement.h"
99#include " flutter/shell/platform/windows/testing/engine_modifier.h"
1010#include " flutter/shell/platform/windows/testing/test_keyboard.h"
11+ #include " flutter/shell/platform/windows/testing/windows_test.h"
12+ #include " fml/synchronization/waitable_event.h"
1113#include " gtest/gtest.h"
1214
1315// winbase.h defines GetCurrentTime as a macro.
@@ -40,7 +42,9 @@ std::unique_ptr<FlutterWindowsEngine> GetTestEngine() {
4042}
4143} // namespace
4244
43- TEST (FlutterWindowsEngine, RunDoesExpectedInitialization) {
45+ class FlutterWindowsEngineTest : public WindowsTest {};
46+
47+ TEST_F (FlutterWindowsEngineTest, RunDoesExpectedInitialization) {
4448 std::unique_ptr<FlutterWindowsEngine> engine = GetTestEngine ();
4549 EngineModifier modifier (engine.get ());
4650
@@ -148,7 +152,7 @@ TEST(FlutterWindowsEngine, RunDoesExpectedInitialization) {
148152 modifier.ReleaseSurfaceManager ();
149153}
150154
151- TEST (FlutterWindowsEngine , ConfiguresFrameVsync) {
155+ TEST_F (FlutterWindowsEngineTest , ConfiguresFrameVsync) {
152156 std::unique_ptr<FlutterWindowsEngine> engine = GetTestEngine ();
153157 EngineModifier modifier (engine.get ());
154158 bool on_vsync_called = false ;
@@ -174,7 +178,7 @@ TEST(FlutterWindowsEngine, ConfiguresFrameVsync) {
174178 EXPECT_TRUE (on_vsync_called);
175179}
176180
177- TEST (FlutterWindowsEngine , RunWithoutANGLEUsesSoftware) {
181+ TEST_F (FlutterWindowsEngineTest , RunWithoutANGLEUsesSoftware) {
178182 std::unique_ptr<FlutterWindowsEngine> engine = GetTestEngine ();
179183 EngineModifier modifier (engine.get ());
180184
@@ -226,7 +230,7 @@ TEST(FlutterWindowsEngine, RunWithoutANGLEUsesSoftware) {
226230 modifier.embedder_api ().Shutdown = [](auto engine) { return kSuccess ; };
227231}
228232
229- TEST (FlutterWindowsEngine , SendPlatformMessageWithoutResponse) {
233+ TEST_F (FlutterWindowsEngineTest , SendPlatformMessageWithoutResponse) {
230234 std::unique_ptr<FlutterWindowsEngine> engine = GetTestEngine ();
231235 EngineModifier modifier (engine.get ());
232236
@@ -252,7 +256,56 @@ TEST(FlutterWindowsEngine, SendPlatformMessageWithoutResponse) {
252256 EXPECT_TRUE (called);
253257}
254258
255- TEST (FlutterWindowsEngine, SendPlatformMessageWithResponse) {
259+ TEST_F (FlutterWindowsEngineTest, PlatformMessageRoundTrip) {
260+ FlutterDesktopEngineProperties properties = {};
261+ properties.assets_path = GetContext ().GetAssetsPath ().c_str ();
262+ properties.icu_data_path = GetContext ().GetIcuDataPath ().c_str ();
263+ properties.dart_entrypoint = " hiPlatformChannels" ;
264+
265+ FlutterProjectBundle project (properties);
266+ auto engine = std::make_unique<FlutterWindowsEngine>(project);
267+
268+ EngineModifier modifier (engine.get ());
269+ modifier.embedder_api ().RunsAOTCompiledDartCode = []() { return false ; };
270+
271+ auto binary_messenger =
272+ std::make_unique<BinaryMessengerImpl>(engine->messenger ());
273+
274+ engine->Run ();
275+ bool did_call_callback = false ;
276+ bool did_call_reply = false ;
277+ bool did_call_dart_reply = false ;
278+ std::string channel = " hi" ;
279+ binary_messenger->SetMessageHandler (
280+ channel,
281+ [&did_call_callback, &did_call_dart_reply](
282+ const uint8_t * message, size_t message_size, BinaryReply reply) {
283+ if (message_size == 5 ) {
284+ EXPECT_EQ (message[0 ], static_cast <uint8_t >(' h' ));
285+ char response[] = {' b' , ' y' , ' e' };
286+ reply (reinterpret_cast <uint8_t *>(response), 3 );
287+ did_call_callback = true ;
288+ } else {
289+ EXPECT_EQ (message_size, 3 );
290+ EXPECT_EQ (message[0 ], static_cast <uint8_t >(' b' ));
291+ did_call_dart_reply = true ;
292+ }
293+ });
294+ char payload[] = {' h' , ' e' , ' l' , ' l' , ' o' };
295+ binary_messenger->Send (
296+ channel, reinterpret_cast <uint8_t *>(payload), 5 ,
297+ [&did_call_reply](const uint8_t * reply, size_t reply_size) {
298+ EXPECT_EQ (reply_size, 3 );
299+ EXPECT_EQ (reply[0 ], static_cast <uint8_t >(' b' ));
300+ did_call_reply = true ;
301+ });
302+ // Rely on timeout mechanism in CI.
303+ while (!did_call_callback && !did_call_reply && !did_call_dart_reply) {
304+ engine->task_runner ()->ProcessTasks ();
305+ }
306+ }
307+
308+ TEST_F (FlutterWindowsEngineTest, SendPlatformMessageWithResponse) {
256309 std::unique_ptr<FlutterWindowsEngine> engine = GetTestEngine ();
257310 EngineModifier modifier (engine.get ());
258311
@@ -310,7 +363,7 @@ TEST(FlutterWindowsEngine, SendPlatformMessageWithResponse) {
310363 EXPECT_TRUE (send_message_called);
311364}
312365
313- TEST (FlutterWindowsEngine , DispatchSemanticsAction) {
366+ TEST_F (FlutterWindowsEngineTest , DispatchSemanticsAction) {
314367 std::unique_ptr<FlutterWindowsEngine> engine = GetTestEngine ();
315368 EngineModifier modifier (engine.get ());
316369
@@ -334,7 +387,7 @@ TEST(FlutterWindowsEngine, DispatchSemanticsAction) {
334387 EXPECT_TRUE (called);
335388}
336389
337- TEST (FlutterWindowsEngine , SetsThreadPriority) {
390+ TEST_F (FlutterWindowsEngineTest , SetsThreadPriority) {
338391 WindowsPlatformThreadPrioritySetter (FlutterThreadPriority::kBackground );
339392 EXPECT_EQ (GetThreadPriority (GetCurrentThread ()),
340393 THREAD_PRIORITY_BELOW_NORMAL);
@@ -355,7 +408,7 @@ TEST(FlutterWindowsEngine, SetsThreadPriority) {
355408 EXPECT_EQ (GetThreadPriority (GetCurrentThread ()), THREAD_PRIORITY_NORMAL);
356409}
357410
358- TEST (FlutterWindowsEngine , AddPluginRegistrarDestructionCallback) {
411+ TEST_F (FlutterWindowsEngineTest , AddPluginRegistrarDestructionCallback) {
359412 std::unique_ptr<FlutterWindowsEngine> engine = GetTestEngine ();
360413 EngineModifier modifier (engine.get ());
361414
@@ -385,7 +438,7 @@ TEST(FlutterWindowsEngine, AddPluginRegistrarDestructionCallback) {
385438 EXPECT_EQ (result2, 2 );
386439}
387440
388- TEST (FlutterWindowsEngine , ScheduleFrame) {
441+ TEST_F (FlutterWindowsEngineTest , ScheduleFrame) {
389442 std::unique_ptr<FlutterWindowsEngine> engine = GetTestEngine ();
390443 EngineModifier modifier (engine.get ());
391444
@@ -400,7 +453,7 @@ TEST(FlutterWindowsEngine, ScheduleFrame) {
400453 EXPECT_TRUE (called);
401454}
402455
403- TEST (FlutterWindowsEngine , SetNextFrameCallback) {
456+ TEST_F (FlutterWindowsEngineTest , SetNextFrameCallback) {
404457 std::unique_ptr<FlutterWindowsEngine> engine = GetTestEngine ();
405458 EngineModifier modifier (engine.get ());
406459
@@ -415,14 +468,14 @@ TEST(FlutterWindowsEngine, SetNextFrameCallback) {
415468 EXPECT_TRUE (called);
416469}
417470
418- TEST (FlutterWindowsEngine , GetExecutableName) {
471+ TEST_F (FlutterWindowsEngineTest , GetExecutableName) {
419472 std::unique_ptr<FlutterWindowsEngine> engine = GetTestEngine ();
420473 EXPECT_EQ (engine->GetExecutableName (), " flutter_windows_unittests.exe" );
421474}
422475
423476// Ensure that after setting or resetting the high contrast feature,
424477// the corresponding status flag can be retrieved from the engine.
425- TEST (FlutterWindowsEngine , UpdateHighContrastFeature) {
478+ TEST_F (FlutterWindowsEngineTest , UpdateHighContrastFeature) {
426479 std::unique_ptr<FlutterWindowsEngine> engine = GetTestEngine ();
427480 EngineModifier modifier (engine.get ());
428481
@@ -447,7 +500,7 @@ TEST(FlutterWindowsEngine, UpdateHighContrastFeature) {
447500 EXPECT_FALSE (engine->high_contrast_enabled ());
448501}
449502
450- TEST (FlutterWindowsEngine , PostRasterThreadTask) {
503+ TEST_F (FlutterWindowsEngineTest , PostRasterThreadTask) {
451504 std::unique_ptr<FlutterWindowsEngine> engine = GetTestEngine ();
452505 EngineModifier modifier (engine.get ());
453506
0 commit comments