@@ -131,23 +131,20 @@ TEST_F(WindowsTest, LaunchHeadlessEngine) {
131
131
ASSERT_NE (engine, nullptr );
132
132
133
133
std::string view_ids;
134
- bool signaled = false ;
134
+ fml::AutoResetWaitableEvent latch ;
135
135
context.AddNativeFunction (
136
136
" SignalStringValue" , CREATE_NATIVE_ENTRY ([&](Dart_NativeArguments args) {
137
137
auto handle = Dart_GetNativeArgument (args, 0 );
138
138
ASSERT_FALSE (Dart_IsError (handle));
139
139
view_ids = tonic::DartConverter<std::string>::FromDart (handle);
140
- signaled = true ;
140
+ latch. Signal () ;
141
141
}));
142
142
143
143
ViewControllerPtr controller{builder.Run ()};
144
144
ASSERT_NE (controller, nullptr );
145
145
146
- while (!signaled) {
147
- PumpMessage ();
148
- }
149
-
150
146
// Verify a headless app has the implicit view.
147
+ latch.Wait ();
151
148
EXPECT_EQ (view_ids, " View IDs: [0]" );
152
149
}
153
150
@@ -217,18 +214,16 @@ TEST_F(WindowsTest, VerifyNativeFunction) {
217
214
WindowsConfigBuilder builder (context);
218
215
builder.SetDartEntrypoint (" verifyNativeFunction" );
219
216
220
- bool signaled = false ;
217
+ fml::AutoResetWaitableEvent latch ;
221
218
auto native_entry =
222
- CREATE_NATIVE_ENTRY ([&](Dart_NativeArguments args) { signaled = true ; });
219
+ CREATE_NATIVE_ENTRY ([&](Dart_NativeArguments args) { latch. Signal () ; });
223
220
context.AddNativeFunction (" Signal" , native_entry);
224
221
225
222
ViewControllerPtr controller{builder.Run ()};
226
223
ASSERT_NE (controller, nullptr );
227
224
228
225
// Wait until signal has been called.
229
- while (!signaled) {
230
- PumpMessage ();
231
- }
226
+ latch.Wait ();
232
227
}
233
228
234
229
// Verify that native functions that pass parameters can be registered and
@@ -239,21 +234,19 @@ TEST_F(WindowsTest, VerifyNativeFunctionWithParameters) {
239
234
builder.SetDartEntrypoint (" verifyNativeFunctionWithParameters" );
240
235
241
236
bool bool_value = false ;
242
- bool signaled = false ;
237
+ fml::AutoResetWaitableEvent latch ;
243
238
auto native_entry = CREATE_NATIVE_ENTRY ([&](Dart_NativeArguments args) {
244
239
auto handle = Dart_GetNativeBooleanArgument (args, 0 , &bool_value);
245
240
ASSERT_FALSE (Dart_IsError (handle));
246
- signaled = true ;
241
+ latch. Signal () ;
247
242
});
248
243
context.AddNativeFunction (" SignalBoolValue" , native_entry);
249
244
250
245
ViewControllerPtr controller{builder.Run ()};
251
246
ASSERT_NE (controller, nullptr );
252
247
253
248
// Wait until signalBoolValue has been called.
254
- while (!signaled) {
255
- PumpMessage ();
256
- }
249
+ latch.Wait ();
257
250
EXPECT_TRUE (bool_value);
258
251
}
259
252
@@ -264,22 +257,20 @@ TEST_F(WindowsTest, PlatformExecutable) {
264
257
builder.SetDartEntrypoint (" readPlatformExecutable" );
265
258
266
259
std::string executable_name;
267
- bool signaled = false ;
260
+ fml::AutoResetWaitableEvent latch ;
268
261
auto native_entry = CREATE_NATIVE_ENTRY ([&](Dart_NativeArguments args) {
269
262
auto handle = Dart_GetNativeArgument (args, 0 );
270
263
ASSERT_FALSE (Dart_IsError (handle));
271
264
executable_name = tonic::DartConverter<std::string>::FromDart (handle);
272
- signaled = true ;
265
+ latch. Signal () ;
273
266
});
274
267
context.AddNativeFunction (" SignalStringValue" , native_entry);
275
268
276
269
ViewControllerPtr controller{builder.Run ()};
277
270
ASSERT_NE (controller, nullptr );
278
271
279
272
// Wait until signalStringValue has been called.
280
- while (!signaled) {
281
- PumpMessage ();
282
- }
273
+ latch.Wait ();
283
274
EXPECT_EQ (executable_name, " flutter_windows_unittests.exe" );
284
275
}
285
276
@@ -291,28 +282,26 @@ TEST_F(WindowsTest, VerifyNativeFunctionWithReturn) {
291
282
builder.SetDartEntrypoint (" verifyNativeFunctionWithReturn" );
292
283
293
284
bool bool_value_to_return = true ;
294
- int count = 2 ;
285
+ fml::CountDownLatch latch ( 2 ) ;
295
286
auto bool_return_entry = CREATE_NATIVE_ENTRY ([&](Dart_NativeArguments args) {
296
287
Dart_SetBooleanReturnValue (args, bool_value_to_return);
297
- --count ;
288
+ latch. CountDown () ;
298
289
});
299
290
context.AddNativeFunction (" SignalBoolReturn" , bool_return_entry);
300
291
301
292
bool bool_value_passed = false ;
302
293
auto bool_pass_entry = CREATE_NATIVE_ENTRY ([&](Dart_NativeArguments args) {
303
294
auto handle = Dart_GetNativeBooleanArgument (args, 0 , &bool_value_passed);
304
295
ASSERT_FALSE (Dart_IsError (handle));
305
- --count ;
296
+ latch. CountDown () ;
306
297
});
307
298
context.AddNativeFunction (" SignalBoolValue" , bool_pass_entry);
308
299
309
300
ViewControllerPtr controller{builder.Run ()};
310
301
ASSERT_NE (controller, nullptr );
311
302
312
303
// Wait until signalBoolReturn and signalBoolValue have been called.
313
- while (count > 0 ) {
314
- PumpMessage ();
315
- }
304
+ latch.Wait ();
316
305
EXPECT_TRUE (bool_value_passed);
317
306
}
318
307
@@ -625,10 +614,10 @@ TEST_F(WindowsTest, AddRemoveView) {
625
614
WindowsConfigBuilder builder (context);
626
615
builder.SetDartEntrypoint (" onMetricsChangedSignalViewIds" );
627
616
628
- bool ready = false ;
617
+ fml::AutoResetWaitableEvent ready_latch ;
629
618
context.AddNativeFunction (
630
- " Signal" ,
631
- CREATE_NATIVE_ENTRY ( [&](Dart_NativeArguments args) { ready = true ; }));
619
+ " Signal" , CREATE_NATIVE_ENTRY (
620
+ [&](Dart_NativeArguments args) { ready_latch. Signal () ; }));
632
621
633
622
context.AddNativeFunction (
634
623
" SignalStringValue" , CREATE_NATIVE_ENTRY ([&](Dart_NativeArguments args) {
@@ -643,9 +632,7 @@ TEST_F(WindowsTest, AddRemoveView) {
643
632
ViewControllerPtr first_controller{builder.Run ()};
644
633
ASSERT_NE (first_controller, nullptr );
645
634
646
- while (!ready) {
647
- PumpMessage ();
648
- }
635
+ ready_latch.Wait ();
649
636
650
637
// Create a second view.
651
638
FlutterDesktopEngineRef engine =
@@ -683,6 +670,7 @@ TEST_F(WindowsTest, EngineId) {
683
670
WindowsConfigBuilder builder (context);
684
671
builder.SetDartEntrypoint (" testEngineId" );
685
672
673
+ fml::AutoResetWaitableEvent latch;
686
674
std::optional<int64_t > engineId;
687
675
context.AddNativeFunction (
688
676
" NotifyEngineId" , CREATE_NATIVE_ENTRY ([&](Dart_NativeArguments args) {
@@ -691,15 +679,17 @@ TEST_F(WindowsTest, EngineId) {
691
679
const auto handle = tonic::DartConverter<int64_t >::FromDart (argument);
692
680
engineId = handle;
693
681
}
682
+ latch.Signal ();
694
683
}));
695
684
// Create the implicit view.
696
685
ViewControllerPtr first_controller{builder.Run ()};
697
686
ASSERT_NE (first_controller, nullptr );
698
687
699
- while (!engineId.has_value ()) {
700
- PumpMessage ();
688
+ latch.Wait ();
689
+ EXPECT_TRUE (engineId.has_value ());
690
+ if (!engineId.has_value ()) {
691
+ return ;
701
692
}
702
-
703
693
auto engine = FlutterDesktopViewControllerGetEngine (first_controller.get ());
704
694
EXPECT_EQ (engine, FlutterDesktopEngineForId (*engineId));
705
695
}
0 commit comments