Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
fl_engine_test.cc File Reference

Go to the source code of this file.

Classes

class  FlEngineTest
 

Functions

 TEST_F (FlEngineTest, NotifyDisplayUpdate)
 
 TEST_F (FlEngineTest, WindowMetrics)
 
 TEST_F (FlEngineTest, MousePointer)
 
 TEST_F (FlEngineTest, MousePointerDeviceState)
 
 TEST_F (FlEngineTest, PointerPanZoom)
 
 TEST_F (FlEngineTest, DispatchSemanticsAction)
 
 TEST_F (FlEngineTest, PlatformMessage)
 
 TEST_F (FlEngineTest, PlatformMessageResponse)
 
 TEST_F (FlEngineTest, SettingsHandler)
 
void on_pre_engine_restart_cb (FlEngine *engine, gpointer user_data)
 
 TEST_F (FlEngineTest, OnPreEngineRestart)
 
 TEST_F (FlEngineTest, DartEntrypointArgs)
 
 TEST_F (FlEngineTest, EngineId)
 
 TEST_F (FlEngineTest, UIIsolateDefaultThreadPolicy)
 
 TEST_F (FlEngineTest, UIIsolateOnPlatformTaskRunner)
 
 TEST_F (FlEngineTest, UIIsolateOnSeparateThread)
 
 TEST_F (FlEngineTest, Locales)
 
 TEST_F (FlEngineTest, CLocale)
 
 TEST_F (FlEngineTest, DuplicateLocale)
 
 TEST_F (FlEngineTest, EmptyLocales)
 
static void add_view_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 
 TEST_F (FlEngineTest, AddView)
 
static void add_view_error_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 
 TEST_F (FlEngineTest, AddViewError)
 
static void add_view_engine_error_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 
 TEST_F (FlEngineTest, AddViewEngineError)
 
static void remove_view_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 
 TEST_F (FlEngineTest, RemoveView)
 
static void remove_view_error_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 
 TEST_F (FlEngineTest, RemoveViewError)
 
static void remove_view_engine_error_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 
 TEST_F (FlEngineTest, RemoveViewEngineError)
 
 TEST_F (FlEngineTest, SendKeyEvent)
 
 TEST_F (FlEngineTest, SendKeyEventNotHandled)
 
 TEST_F (FlEngineTest, SendKeyEventError)
 
 TEST_F (FlEngineTest, EnableImpellerDefault)
 
 TEST_F (FlEngineTest, DisableImpeller)
 
 TEST_F (FlEngineTest, ChildObjects)
 

Function Documentation

◆ add_view_cb()

static void add_view_cb ( GObject *  object,
GAsyncResult *  result,
gpointer  user_data 
)
static

Definition at line 646 of file fl_engine_test.cc.

648 {
649 g_autoptr(GError) error = nullptr;
650 gboolean r = fl_engine_add_view_finish(FL_ENGINE(object), result, &error);
651 EXPECT_TRUE(r);
652 EXPECT_EQ(error, nullptr);
653
654 g_main_loop_quit(static_cast<GMainLoop*>(user_data));
655}
g_autoptr(FlEngine) engine
gboolean fl_engine_add_view_finish(FlEngine *self, GAsyncResult *result, GError **error)
Definition fl_engine.cc:994
const uint8_t uint32_t uint32_t GError ** error

References error, fl_engine_add_view_finish(), g_autoptr(), and user_data.

Referenced by TEST_F().

◆ add_view_engine_error_cb()

static void add_view_engine_error_cb ( GObject *  object,
GAsyncResult *  result,
gpointer  user_data 
)
static

Definition at line 724 of file fl_engine_test.cc.

726 {
727 g_autoptr(GError) error = nullptr;
728 gboolean r = fl_engine_add_view_finish(FL_ENGINE(object), result, &error);
729 EXPECT_FALSE(r);
730 EXPECT_NE(error, nullptr);
731
732 g_main_loop_quit(static_cast<GMainLoop*>(user_data));
733}

References error, fl_engine_add_view_finish(), g_autoptr(), and user_data.

Referenced by TEST_F().

◆ add_view_error_cb()

static void add_view_error_cb ( GObject *  object,
GAsyncResult *  result,
gpointer  user_data 
)
static

Definition at line 691 of file fl_engine_test.cc.

693 {
694 g_autoptr(GError) error = nullptr;
695 gboolean r = fl_engine_add_view_finish(FL_ENGINE(object), result, &error);
696 EXPECT_FALSE(r);
697 EXPECT_NE(error, nullptr);
698
699 g_main_loop_quit(static_cast<GMainLoop*>(user_data));
700}

References error, fl_engine_add_view_finish(), g_autoptr(), and user_data.

Referenced by TEST_F().

◆ on_pre_engine_restart_cb()

void on_pre_engine_restart_cb ( FlEngine *  engine,
gpointer  user_data 
)

Definition at line 328 of file fl_engine_test.cc.

328 {
329 int* count = reinterpret_cast<int*>(user_data);
330 *count += 1;
331}

References user_data.

Referenced by TEST_F().

◆ remove_view_cb()

static void remove_view_cb ( GObject *  object,
GAsyncResult *  result,
gpointer  user_data 
)
static

Definition at line 751 of file fl_engine_test.cc.

753 {
754 g_autoptr(GError) error = nullptr;
755 gboolean r = fl_engine_remove_view_finish(FL_ENGINE(object), result, &error);
756 EXPECT_TRUE(r);
757 EXPECT_EQ(error, nullptr);
758
759 g_main_loop_quit(static_cast<GMainLoop*>(user_data));
760}
gboolean fl_engine_remove_view_finish(FlEngine *self, GAsyncResult *result, GError **error)

References error, fl_engine_remove_view_finish(), g_autoptr(), and user_data.

Referenced by TEST_F().

◆ remove_view_engine_error_cb()

static void remove_view_engine_error_cb ( GObject *  object,
GAsyncResult *  result,
gpointer  user_data 
)
static

Definition at line 814 of file fl_engine_test.cc.

816 {
817 g_autoptr(GError) error = nullptr;
818 gboolean r = fl_engine_remove_view_finish(FL_ENGINE(object), result, &error);
819 EXPECT_FALSE(r);
820 EXPECT_NE(error, nullptr);
821
822 g_main_loop_quit(static_cast<GMainLoop*>(user_data));
823}

References error, fl_engine_remove_view_finish(), g_autoptr(), and user_data.

Referenced by TEST_F().

◆ remove_view_error_cb()

static void remove_view_error_cb ( GObject *  object,
GAsyncResult *  result,
gpointer  user_data 
)
static

Definition at line 785 of file fl_engine_test.cc.

787 {
788 g_autoptr(GError) error = nullptr;
789 gboolean r = fl_engine_remove_view_finish(FL_ENGINE(object), result, &error);
790 EXPECT_FALSE(r);
791 EXPECT_NE(error, nullptr);
792
793 g_main_loop_quit(static_cast<GMainLoop*>(user_data));
794}

References error, fl_engine_remove_view_finish(), g_autoptr(), and user_data.

Referenced by TEST_F().

◆ TEST_F() [1/31]

TEST_F ( FlEngineTest  ,
AddView   
)

Definition at line 657 of file fl_engine_test.cc.

657 {
658 bool called = false;
660 AddView, ([&called](auto engine, const FlutterAddViewInfo* info) {
661 called = true;
662 EXPECT_EQ(info->view_metrics->width, 123u);
663 EXPECT_EQ(info->view_metrics->height, 456u);
664 EXPECT_TRUE(info->view_metrics->has_constraints);
665 EXPECT_EQ(info->view_metrics->min_width_constraint, 123u);
666 EXPECT_EQ(info->view_metrics->min_height_constraint, 456u);
667 EXPECT_EQ(info->view_metrics->max_width_constraint, 888u);
668 EXPECT_EQ(info->view_metrics->max_height_constraint, 999u);
669 EXPECT_EQ(info->view_metrics->pixel_ratio, 2.0);
670
672 result.struct_size = sizeof(FlutterAddViewResult);
673 result.added = true;
674 result.user_data = info->user_data;
675 info->add_view_callback(&result);
676
677 return kSuccess;
678 }));
679
680 g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
682 fl_engine_add_view(engine, FL_RENDERABLE(renderable), 123, 456, 888, 999,
683 2.0, nullptr, add_view_cb, loop);
684 EXPECT_GT(view_id, 0);
685 EXPECT_TRUE(called);
686
687 // Blocks here until add_view_cb is called.
688 g_main_loop_run(loop);
689}
@ kSuccess
Definition embedder.h:73
int64_t FlutterViewId
Definition embedder.h:393
FlutterEngine engine
Definition main.cc:84
FlRenderable * renderable
FlutterViewId fl_engine_add_view(FlEngine *self, FlRenderable *renderable, size_t min_width, size_t min_height, size_t max_width, size_t max_height, double pixel_ratio, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
Definition fl_engine.cc:941
FlutterEngineProcTable * fl_engine_get_embedder_api(FlEngine *self)
Definition fl_engine.cc:920
static void add_view_cb(GObject *object, GAsyncResult *result, gpointer user_data)
G_BEGIN_DECLS FlutterViewId view_id
#define MOCK_ENGINE_PROC(proc, mock_impl)
FlutterAddViewCallback add_view_callback
Definition embedder.h:1147
const FlutterWindowMetricsEvent * view_metrics
Definition embedder.h:1132
void * user_data
The |FlutterAddViewInfo.user_data|.
Definition embedder.h:1111
bool added
True if the add view operation succeeded.
Definition embedder.h:1108
FlutterEngineAddViewFnPtr AddView
Definition embedder.h:3807
size_t height
Physical height of the window.
Definition embedder.h:1058
double pixel_ratio
Scale factor for the physical screen.
Definition embedder.h:1060
size_t width
Physical width of the window.
Definition embedder.h:1056

References FlutterAddViewInfo::add_view_callback, add_view_cb(), FlutterAddViewResult::added, FlutterEngineProcTable::AddView, engine, fl_engine_add_view(), fl_engine_get_embedder_api(), g_autoptr(), FlutterWindowMetricsEvent::has_constraints, FlutterWindowMetricsEvent::height, kSuccess, FlutterWindowMetricsEvent::max_height_constraint, FlutterWindowMetricsEvent::max_width_constraint, FlutterWindowMetricsEvent::min_height_constraint, FlutterWindowMetricsEvent::min_width_constraint, MOCK_ENGINE_PROC, FlutterWindowMetricsEvent::pixel_ratio, renderable, FlutterAddViewResult::struct_size, FlutterAddViewResult::user_data, FlutterAddViewInfo::user_data, view_id, FlutterAddViewInfo::view_metrics, and FlutterWindowMetricsEvent::width.

◆ TEST_F() [2/31]

TEST_F ( FlEngineTest  ,
AddViewEngineError   
)

Definition at line 735 of file fl_engine_test.cc.

735 {
737 AddView, ([](auto engine, const FlutterAddViewInfo* info) {
738 return kInvalidArguments;
739 }));
740
741 g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
743 fl_engine_add_view(engine, FL_RENDERABLE(renderable), 123, 456, 123, 456,
744 2.0, nullptr, add_view_engine_error_cb, loop);
745 EXPECT_GT(view_id, 0);
746
747 // Blocks here until remove_view_engine_error_cb is called.
748 g_main_loop_run(loop);
749}
@ kInvalidArguments
Definition embedder.h:75
static void add_view_engine_error_cb(GObject *object, GAsyncResult *result, gpointer user_data)

References add_view_engine_error_cb(), FlutterEngineProcTable::AddView, engine, fl_engine_add_view(), fl_engine_get_embedder_api(), g_autoptr(), kInvalidArguments, MOCK_ENGINE_PROC, renderable, and view_id.

◆ TEST_F() [3/31]

TEST_F ( FlEngineTest  ,
AddViewError   
)

Definition at line 702 of file fl_engine_test.cc.

702 {
704 AddView, ([](auto engine, const FlutterAddViewInfo* info) {
706 result.struct_size = sizeof(FlutterAddViewResult);
707 result.added = false;
708 result.user_data = info->user_data;
709 info->add_view_callback(&result);
710
711 return kSuccess;
712 }));
713
714 g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
716 fl_engine_add_view(engine, FL_RENDERABLE(renderable), 123, 456, 123, 456,
717 2.0, nullptr, add_view_error_cb, loop);
718 EXPECT_GT(view_id, 0);
719
720 // Blocks here until add_view_error_cb is called.
721 g_main_loop_run(loop);
722}
static void add_view_error_cb(GObject *object, GAsyncResult *result, gpointer user_data)

References FlutterAddViewInfo::add_view_callback, add_view_error_cb(), FlutterAddViewResult::added, FlutterEngineProcTable::AddView, engine, fl_engine_add_view(), fl_engine_get_embedder_api(), g_autoptr(), kSuccess, MOCK_ENGINE_PROC, renderable, FlutterAddViewResult::struct_size, FlutterAddViewResult::user_data, FlutterAddViewInfo::user_data, and view_id.

◆ TEST_F() [4/31]

TEST_F ( FlEngineTest  ,
ChildObjects   
)

Definition at line 1011 of file fl_engine_test.cc.

1011 {
1012 // Check objects exist before engine started.
1013 EXPECT_NE(fl_engine_get_binary_messenger(engine), nullptr);
1014 EXPECT_NE(fl_engine_get_display_monitor(engine), nullptr);
1015 EXPECT_NE(fl_engine_get_task_runner(engine), nullptr);
1016 EXPECT_NE(fl_engine_get_keyboard_manager(engine), nullptr);
1017 EXPECT_NE(fl_engine_get_mouse_cursor_handler(engine), nullptr);
1018}
FlTaskRunner * fl_engine_get_task_runner(FlEngine *self)
FlMouseCursorHandler * fl_engine_get_mouse_cursor_handler(FlEngine *self)
FlDisplayMonitor * fl_engine_get_display_monitor(FlEngine *self)
Definition fl_engine.cc:754
FlKeyboardManager * fl_engine_get_keyboard_manager(FlEngine *self)
G_MODULE_EXPORT FlBinaryMessenger * fl_engine_get_binary_messenger(FlEngine *self)

References engine, fl_engine_get_binary_messenger(), fl_engine_get_display_monitor(), fl_engine_get_keyboard_manager(), fl_engine_get_mouse_cursor_handler(), and fl_engine_get_task_runner().

◆ TEST_F() [5/31]

TEST_F ( FlEngineTest  ,
CLocale   
)

Definition at line 533 of file fl_engine_test.cc.

533 {
534 g_autofree gchar* initial_language = g_strdup(g_getenv("LANGUAGE"));
535 g_setenv("LANGUAGE", "C", TRUE);
536
537 bool called = false;
539 UpdateLocales, ([&called](auto engine, const FlutterLocale** locales,
540 size_t locales_count) {
541 called = true;
542
543 EXPECT_EQ(locales_count, static_cast<size_t>(1));
544
545 EXPECT_STREQ(locales[0]->language_code, "C");
546 EXPECT_STREQ(locales[0]->country_code, nullptr);
547 EXPECT_STREQ(locales[0]->script_code, nullptr);
548 EXPECT_STREQ(locales[0]->variant_code, nullptr);
549
550 return kSuccess;
551 }));
552
553 StartEngine();
554
555 EXPECT_TRUE(called);
556
557 if (initial_language) {
558 g_setenv("LANGUAGE", initial_language, TRUE);
559 } else {
560 g_unsetenv("LANGUAGE");
561 }
562}
return TRUE
FlutterEngineUpdateLocalesFnPtr UpdateLocales
Definition embedder.h:3798

References engine, fl_engine_get_embedder_api(), kSuccess, MOCK_ENGINE_PROC, TRUE, and FlutterEngineProcTable::UpdateLocales.

◆ TEST_F() [6/31]

TEST_F ( FlEngineTest  ,
DartEntrypointArgs   
)

Definition at line 374 of file fl_engine_test.cc.

374 {
375 GPtrArray* args_array = g_ptr_array_new();
376 g_ptr_array_add(args_array, const_cast<char*>("arg_one"));
377 g_ptr_array_add(args_array, const_cast<char*>("arg_two"));
378 g_ptr_array_add(args_array, const_cast<char*>("arg_three"));
379 g_ptr_array_add(args_array, nullptr);
380 gchar** args = reinterpret_cast<gchar**>(g_ptr_array_free(args_array, false));
381
383
384 bool called = false;
386 Initialize, ([&called, &set_args = args](
387 size_t version, const FlutterRendererConfig* config,
388 const FlutterProjectArgs* args, void* user_data,
389 FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
390 called = true;
391 EXPECT_NE(set_args, args->dart_entrypoint_argv);
392 EXPECT_EQ(args->dart_entrypoint_argc, 3);
393
394 return kSuccess;
395 }));
397 MOCK_ENGINE_PROC(RunInitialized, ([](auto engine) { return kSuccess; }));
398
399 StartEngine();
400
401 EXPECT_TRUE(called);
402}
#define FLUTTER_API_SYMBOL(symbol)
Definition embedder.h:67
G_MODULE_EXPORT void fl_dart_project_set_dart_entrypoint_arguments(FlDartProject *self, char **argv)
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
FlutterEngineInitializeFnPtr Initialize
Definition embedder.h:3771
FlutterEngineRunInitializedFnPtr RunInitialized
Definition embedder.h:3773

References args, engine, fl_dart_project_set_dart_entrypoint_arguments(), fl_engine_get_embedder_api(), FLUTTER_API_SYMBOL, FlutterEngineProcTable::Initialize, kSuccess, MOCK_ENGINE_PROC, FlutterEngineProcTable::RunInitialized, and user_data.

◆ TEST_F() [7/31]

TEST_F ( FlEngineTest  ,
DisableImpeller   
)

Definition at line 983 of file fl_engine_test.cc.

983 {
985
986 bool called = false;
988 Initialize,
989 ([&called](size_t version, const FlutterRendererConfig* config,
990 const FlutterProjectArgs* args, void* user_data,
991 FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
992 called = true;
993 bool has_impeller_switch = false;
994 for (int i = 0; i < args->command_line_argc; i++) {
995 if (strcmp(args->command_line_argv[i], "--enable-impeller") == 0) {
996 has_impeller_switch = true;
997 }
998 }
999 EXPECT_FALSE(has_impeller_switch);
1000 return kSuccess;
1001 }));
1003 MOCK_ENGINE_PROC(RunInitialized, ([](auto engine) { return kSuccess; }));
1004
1005 g_autoptr(GError) error = nullptr;
1006 EXPECT_TRUE(fl_engine_start(engine, &error));
1007 EXPECT_EQ(error, nullptr);
1008 EXPECT_TRUE(called);
1009}
G_MODULE_EXPORT void fl_dart_project_set_enable_impeller(FlDartProject *project, gboolean enable_impeller)
gboolean fl_engine_start(FlEngine *self, GError **error)
Definition fl_engine.cc:759

References args, engine, error, fl_dart_project_set_enable_impeller(), fl_engine_get_embedder_api(), fl_engine_start(), FLUTTER_API_SYMBOL, g_autoptr(), i, FlutterEngineProcTable::Initialize, kSuccess, MOCK_ENGINE_PROC, FlutterEngineProcTable::RunInitialized, and user_data.

◆ TEST_F() [8/31]

TEST_F ( FlEngineTest  ,
DispatchSemanticsAction   
)

Definition at line 192 of file fl_engine_test.cc.

192 {
193 bool called = false;
195 SendSemanticsAction,
196 ([&called](auto engine, const FlutterSendSemanticsActionInfo* info) {
197 EXPECT_EQ(info->view_id, static_cast<int64_t>(456));
198 EXPECT_EQ(info->node_id, static_cast<uint64_t>(42));
199 EXPECT_EQ(info->action, kFlutterSemanticsActionTap);
200 EXPECT_EQ(info->data_length, static_cast<size_t>(4));
201 EXPECT_EQ(info->data[0], 't');
202 EXPECT_EQ(info->data[1], 'e');
203 EXPECT_EQ(info->data[2], 's');
204 EXPECT_EQ(info->data[3], 't');
205 called = true;
206
207 return kSuccess;
208 }));
209
210 StartEngine();
211 g_autoptr(GBytes) data = g_bytes_new_static("test", 4);
214
215 EXPECT_TRUE(called);
216}
@ kFlutterSemanticsActionTap
Definition embedder.h:125
void fl_engine_dispatch_semantics_action(FlEngine *self, FlutterViewId view_id, uint64_t node_id, FlutterSemanticsAction action, GBytes *data)
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
Definition switch_defs.h:36
FlutterEngineSendSemanticsActionFnPtr SendSemanticsAction
Definition embedder.h:3810
FlutterViewId view_id
The ID of the view that includes the node.
Definition embedder.h:2833
FlutterSemanticsAction action
The semantics action.
Definition embedder.h:2839
size_t data_length
The data length.
Definition embedder.h:2845
uint64_t node_id
The semantics node identifier.
Definition embedder.h:2836
const uint8_t * data
Data associated with the action.
Definition embedder.h:2842

References FlutterSendSemanticsActionInfo::action, FlutterSendSemanticsActionInfo::data, FlutterSendSemanticsActionInfo::data_length, engine, fl_engine_dispatch_semantics_action(), fl_engine_get_embedder_api(), g_autoptr(), kFlutterSemanticsActionTap, kSuccess, MOCK_ENGINE_PROC, FlutterSendSemanticsActionInfo::node_id, FlutterEngineProcTable::SendSemanticsAction, and FlutterSendSemanticsActionInfo::view_id.

◆ TEST_F() [9/31]

TEST_F ( FlEngineTest  ,
DuplicateLocale   
)

Definition at line 564 of file fl_engine_test.cc.

564 {
565 g_autofree gchar* initial_language = g_strdup(g_getenv("LANGUAGE"));
566 g_setenv("LANGUAGE", "en:en", TRUE);
567
568 bool called = false;
570 UpdateLocales, ([&called](auto engine, const FlutterLocale** locales,
571 size_t locales_count) {
572 called = true;
573
574 EXPECT_EQ(locales_count, static_cast<size_t>(2));
575
576 EXPECT_STREQ(locales[0]->language_code, "en");
577 EXPECT_STREQ(locales[0]->country_code, nullptr);
578 EXPECT_STREQ(locales[0]->script_code, nullptr);
579 EXPECT_STREQ(locales[0]->variant_code, nullptr);
580
581 EXPECT_STREQ(locales[1]->language_code, "C");
582 EXPECT_STREQ(locales[1]->country_code, nullptr);
583 EXPECT_STREQ(locales[1]->script_code, nullptr);
584 EXPECT_STREQ(locales[1]->variant_code, nullptr);
585
586 return kSuccess;
587 }));
588
589 StartEngine();
590
591 EXPECT_TRUE(called);
592
593 if (initial_language) {
594 g_setenv("LANGUAGE", initial_language, TRUE);
595 } else {
596 g_unsetenv("LANGUAGE");
597 }
598}

References engine, fl_engine_get_embedder_api(), kSuccess, MOCK_ENGINE_PROC, TRUE, and FlutterEngineProcTable::UpdateLocales.

◆ TEST_F() [10/31]

TEST_F ( FlEngineTest  ,
EmptyLocales   
)

Definition at line 600 of file fl_engine_test.cc.

600 {
601 g_autofree gchar* initial_language = g_strdup(g_getenv("LANGUAGE"));
602 g_setenv("LANGUAGE", "de:: :en_US", TRUE);
603
604 bool called = false;
606 UpdateLocales, ([&called](auto engine, const FlutterLocale** locales,
607 size_t locales_count) {
608 called = true;
609
610 EXPECT_EQ(locales_count, static_cast<size_t>(4));
611
612 EXPECT_STREQ(locales[0]->language_code, "de");
613 EXPECT_STREQ(locales[0]->country_code, nullptr);
614 EXPECT_STREQ(locales[0]->script_code, nullptr);
615 EXPECT_STREQ(locales[0]->variant_code, nullptr);
616
617 EXPECT_STREQ(locales[1]->language_code, "en");
618 EXPECT_STREQ(locales[1]->country_code, "US");
619 EXPECT_STREQ(locales[1]->script_code, nullptr);
620 EXPECT_STREQ(locales[1]->variant_code, nullptr);
621
622 EXPECT_STREQ(locales[2]->language_code, "en");
623 EXPECT_STREQ(locales[2]->country_code, nullptr);
624 EXPECT_STREQ(locales[2]->script_code, nullptr);
625 EXPECT_STREQ(locales[2]->variant_code, nullptr);
626
627 EXPECT_STREQ(locales[3]->language_code, "C");
628 EXPECT_STREQ(locales[3]->country_code, nullptr);
629 EXPECT_STREQ(locales[3]->script_code, nullptr);
630 EXPECT_STREQ(locales[3]->variant_code, nullptr);
631
632 return kSuccess;
633 }));
634
635 StartEngine();
636
637 EXPECT_TRUE(called);
638
639 if (initial_language) {
640 g_setenv("LANGUAGE", initial_language, TRUE);
641 } else {
642 g_unsetenv("LANGUAGE");
643 }
644}

References engine, fl_engine_get_embedder_api(), kSuccess, MOCK_ENGINE_PROC, TRUE, and FlutterEngineProcTable::UpdateLocales.

◆ TEST_F() [11/31]

TEST_F ( FlEngineTest  ,
EnableImpellerDefault   
)

Definition at line 959 of file fl_engine_test.cc.

959 {
960 bool called = false;
962 Initialize,
963 ([&called](size_t version, const FlutterRendererConfig* config,
964 const FlutterProjectArgs* args, void* user_data,
965 FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
966 called = true;
967 bool has_impeller_switch = false;
968 for (int i = 0; i < args->command_line_argc; i++) {
969 if (strcmp(args->command_line_argv[i], "--enable-impeller") == 0) {
970 has_impeller_switch = true;
971 }
972 }
973 EXPECT_TRUE(has_impeller_switch);
974 return kSuccess;
975 }));
977 MOCK_ENGINE_PROC(RunInitialized, ([](auto engine) { return kSuccess; }));
978
979 StartEngine();
980 EXPECT_TRUE(called);
981}

References args, engine, fl_engine_get_embedder_api(), FLUTTER_API_SYMBOL, i, FlutterEngineProcTable::Initialize, kSuccess, MOCK_ENGINE_PROC, FlutterEngineProcTable::RunInitialized, and user_data.

◆ TEST_F() [12/31]

TEST_F ( FlEngineTest  ,
EngineId   
)

Definition at line 404 of file fl_engine_test.cc.

404 {
405 int64_t engine_id;
407 Initialize,
408 ([&engine_id](size_t version, const FlutterRendererConfig* config,
409 const FlutterProjectArgs* args, void* user_data,
410 FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
411 engine_id = args->engine_id;
412 return kSuccess;
413 }));
415 MOCK_ENGINE_PROC(RunInitialized, ([](auto engine) { return kSuccess; }));
416
417 StartEngine();
418 EXPECT_TRUE(engine_id != 0);
419
420 EXPECT_EQ(fl_engine_for_id(engine_id), engine);
421}
FlEngine * fl_engine_for_id(int64_t id)
Definition fl_engine.cc:724

References args, engine, fl_engine_for_id(), fl_engine_get_embedder_api(), FLUTTER_API_SYMBOL, FlutterEngineProcTable::Initialize, kSuccess, MOCK_ENGINE_PROC, FlutterEngineProcTable::RunInitialized, and user_data.

◆ TEST_F() [13/31]

TEST_F ( FlEngineTest  ,
Locales   
)

Definition at line 487 of file fl_engine_test.cc.

487 {
488 g_autofree gchar* initial_language = g_strdup(g_getenv("LANGUAGE"));
489 g_setenv("LANGUAGE", "de:en_US", TRUE);
490
491 bool called = false;
493 UpdateLocales, ([&called](auto engine, const FlutterLocale** locales,
494 size_t locales_count) {
495 called = true;
496
497 EXPECT_EQ(locales_count, static_cast<size_t>(4));
498
499 EXPECT_STREQ(locales[0]->language_code, "de");
500 EXPECT_STREQ(locales[0]->country_code, nullptr);
501 EXPECT_STREQ(locales[0]->script_code, nullptr);
502 EXPECT_STREQ(locales[0]->variant_code, nullptr);
503
504 EXPECT_STREQ(locales[1]->language_code, "en");
505 EXPECT_STREQ(locales[1]->country_code, "US");
506 EXPECT_STREQ(locales[1]->script_code, nullptr);
507 EXPECT_STREQ(locales[1]->variant_code, nullptr);
508
509 EXPECT_STREQ(locales[2]->language_code, "en");
510 EXPECT_STREQ(locales[2]->country_code, nullptr);
511 EXPECT_STREQ(locales[2]->script_code, nullptr);
512 EXPECT_STREQ(locales[2]->variant_code, nullptr);
513
514 EXPECT_STREQ(locales[3]->language_code, "C");
515 EXPECT_STREQ(locales[3]->country_code, nullptr);
516 EXPECT_STREQ(locales[3]->script_code, nullptr);
517 EXPECT_STREQ(locales[3]->variant_code, nullptr);
518
519 return kSuccess;
520 }));
521
522 StartEngine();
523
524 EXPECT_TRUE(called);
525
526 if (initial_language) {
527 g_setenv("LANGUAGE", initial_language, TRUE);
528 } else {
529 g_unsetenv("LANGUAGE");
530 }
531}

References engine, fl_engine_get_embedder_api(), kSuccess, MOCK_ENGINE_PROC, TRUE, and FlutterEngineProcTable::UpdateLocales.

◆ TEST_F() [14/31]

TEST_F ( FlEngineTest  ,
MousePointer   
)

Definition at line 102 of file fl_engine_test.cc.

102 {
103 bool called = false;
105 SendPointerEvent,
106 ([&called](auto engine, const FlutterPointerEvent* events,
107 size_t events_count) {
108 called = true;
109 EXPECT_EQ(events_count, static_cast<size_t>(1));
110 EXPECT_EQ(events[0].view_id, 1);
111 EXPECT_EQ(events[0].phase, kDown);
112 EXPECT_EQ(events[0].timestamp, static_cast<size_t>(1234567890));
113 EXPECT_EQ(events[0].x, 800);
114 EXPECT_EQ(events[0].y, 600);
115 EXPECT_EQ(events[0].device, static_cast<int32_t>(0));
116 EXPECT_EQ(events[0].signal_kind, kFlutterPointerSignalKindScroll);
117 EXPECT_EQ(events[0].scroll_delta_x, 1.2);
118 EXPECT_EQ(events[0].scroll_delta_y, -3.4);
119 EXPECT_EQ(events[0].device_kind, kFlutterPointerDeviceKindMouse);
120 EXPECT_EQ(events[0].buttons, kFlutterPointerButtonMouseSecondary);
121
122 return kSuccess;
123 }));
124
125 StartEngine();
126 fl_engine_send_mouse_pointer_event(engine, 1, kDown, 1234567890, 800, 600,
129
130 EXPECT_TRUE(called);
131}
int32_t x
@ kDown
Definition embedder.h:1282
@ kFlutterPointerButtonMouseSecondary
Definition embedder.h:1321
@ kFlutterPointerSignalKindScroll
Definition embedder.h:1347
@ kFlutterPointerDeviceKindMouse
Definition embedder.h:1310
VkDevice device
Definition main.cc:69
void fl_engine_send_mouse_pointer_event(FlEngine *self, FlutterViewId view_id, FlutterPointerPhase phase, size_t timestamp, double x, double y, FlutterPointerDeviceKind device_kind, double scroll_delta_x, double scroll_delta_y, int64_t buttons, double rotation, double pressure)
double y
FlutterEngineSendPointerEventFnPtr SendPointerEvent
Definition embedder.h:3775

References device, engine, fl_engine_get_embedder_api(), fl_engine_send_mouse_pointer_event(), kDown, kFlutterPointerButtonMouseSecondary, kFlutterPointerDeviceKindMouse, kFlutterPointerSignalKindScroll, kSuccess, MOCK_ENGINE_PROC, FlutterEngineProcTable::SendPointerEvent, view_id, x, and y.

◆ TEST_F() [15/31]

TEST_F ( FlEngineTest  ,
MousePointerDeviceState   
)

Definition at line 134 of file fl_engine_test.cc.

134 {
135 bool device_state_sent = false;
137 SendPointerEvent,
138 ([&device_state_sent](auto engine, const FlutterPointerEvent* events,
139 size_t events_count) {
140 device_state_sent = true;
141 EXPECT_EQ(events_count, static_cast<size_t>(1));
142 EXPECT_DOUBLE_EQ(events[0].pressure, 0.5);
143 EXPECT_DOUBLE_EQ(events[0].pressure_min, 0.0);
144 EXPECT_DOUBLE_EQ(events[0].pressure_max, 1.0);
145 EXPECT_DOUBLE_EQ(events[0].rotation, G_PI / 2.0);
146
147 return kSuccess;
148 }));
149
150 StartEngine();
152 engine, 1, kDown, 1234567890, 800, 600, kFlutterPointerDeviceKindMouse,
153 1.2, -3.4, kFlutterPointerButtonMouseSecondary, 90.0, 0.5);
154
155 EXPECT_TRUE(device_state_sent);
156}

References engine, fl_engine_get_embedder_api(), fl_engine_send_mouse_pointer_event(), kDown, kFlutterPointerButtonMouseSecondary, kFlutterPointerDeviceKindMouse, kSuccess, MOCK_ENGINE_PROC, and FlutterEngineProcTable::SendPointerEvent.

◆ TEST_F() [16/31]

TEST_F ( FlEngineTest  ,
NotifyDisplayUpdate   
)

Definition at line 22 of file fl_engine_test.cc.

22 {
23 StartEngine();
24
25 bool called = false;
27 NotifyDisplayUpdate,
28 ([&called](auto engine, FlutterEngineDisplaysUpdateType update_type,
29 const FlutterEngineDisplay* displays, size_t displays_length) {
30 called = true;
31 EXPECT_EQ(update_type, kFlutterEngineDisplaysUpdateTypeStartup);
32 EXPECT_EQ(displays_length, 2u);
33
34 EXPECT_EQ(displays[0].display_id, 1u);
35 EXPECT_EQ(displays[0].refresh_rate, 60);
36 EXPECT_EQ(displays[0].width, 1024u);
37 EXPECT_EQ(displays[0].height, 768u);
38 EXPECT_EQ(displays[0].device_pixel_ratio, 1.0);
39
40 EXPECT_EQ(displays[1].display_id, 2u);
41 EXPECT_EQ(displays[1].refresh_rate, 120);
42 EXPECT_EQ(displays[1].width, 3840u);
43 EXPECT_EQ(displays[1].height, 2160u);
44 EXPECT_EQ(displays[1].device_pixel_ratio, 2.0);
45
46 return kSuccess;
47 }));
48
50 {
52 .display_id = 1,
53 .single_display = false,
54 .refresh_rate = 60.0,
55 .width = 1024,
56 .height = 768,
57 .device_pixel_ratio = 1.0,
58 },
59 {
60 .struct_size = sizeof(FlutterEngineDisplay),
61 .display_id = 2,
62 .single_display = false,
63 .refresh_rate = 120.0,
64 .width = 3840,
65 .height = 2160,
66 .device_pixel_ratio = 2.0,
67 }};
69
70 EXPECT_TRUE(called);
71}
FlutterEngineDisplaysUpdateType
Definition embedder.h:2373
@ kFlutterEngineDisplaysUpdateTypeStartup
Definition embedder.h:2379
void fl_engine_notify_display_update(FlEngine *self, const FlutterEngineDisplay *displays, size_t displays_length)
Definition fl_engine.cc:924
std::vector< FlutterEngineDisplay > * displays
int32_t height
int32_t width
size_t struct_size
The size of this struct. Must be sizeof(FlutterEngineDisplay).
Definition embedder.h:2346
FlutterEngineNotifyDisplayUpdateFnPtr NotifyDisplayUpdate
Definition embedder.h:3804

References displays, engine, fl_engine_get_embedder_api(), fl_engine_notify_display_update(), height, kFlutterEngineDisplaysUpdateTypeStartup, kSuccess, MOCK_ENGINE_PROC, FlutterEngineProcTable::NotifyDisplayUpdate, FlutterEngineDisplay::struct_size, and width.

◆ TEST_F() [17/31]

TEST_F ( FlEngineTest  ,
OnPreEngineRestart   
)

Definition at line 334 of file fl_engine_test.cc.

334 {
336 void* callback_user_data;
337
338 bool called = false;
340 Initialize, ([&callback, &callback_user_data, &called](
341 size_t version, const FlutterRendererConfig* config,
342 const FlutterProjectArgs* args, void* user_data,
343 FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
344 called = true;
345 callback = args->on_pre_engine_restart_callback;
346 callback_user_data = user_data;
347
348 return kSuccess;
349 }));
351 MOCK_ENGINE_PROC(RunInitialized, ([](auto engine) { return kSuccess; }));
352
353 StartEngine();
354
355 EXPECT_TRUE(called);
356 EXPECT_NE(callback, nullptr);
357
358 // The following call has no effect but should not crash.
359 callback(callback_user_data);
360
361 int count = 0;
362
363 // Set handler so that:
364 //
365 // * When the engine restarts, count += 1;
366 // * When the engine is freed, count += 10.
367 g_signal_connect(engine, "on-pre-engine-restart",
368 G_CALLBACK(on_pre_engine_restart_cb), &count);
369
370 callback(callback_user_data);
371 EXPECT_EQ(count, 1);
372}
void(* OnPreEngineRestartCallback)(void *)
Definition embedder.h:631
void on_pre_engine_restart_cb(FlEngine *engine, gpointer user_data)
FlutterDesktopBinaryReply callback

References args, callback, engine, fl_engine_get_embedder_api(), FLUTTER_API_SYMBOL, FlutterEngineProcTable::Initialize, kSuccess, MOCK_ENGINE_PROC, on_pre_engine_restart_cb(), FlutterEngineProcTable::RunInitialized, and user_data.

◆ TEST_F() [18/31]

TEST_F ( FlEngineTest  ,
PlatformMessage   
)

Definition at line 219 of file fl_engine_test.cc.

219 {
220 bool called = false;
224 SendPlatformMessage,
225 ([&called, old_handler](auto engine,
227 if (strcmp(message->channel, "test") != 0) {
228 return old_handler(engine, message);
229 }
230
231 called = true;
232
233 EXPECT_EQ(message->message_size, static_cast<size_t>(4));
234 EXPECT_EQ(message->message[0], 't');
235 EXPECT_EQ(message->message[1], 'e');
236 EXPECT_EQ(message->message[2], 's');
237 EXPECT_EQ(message->message[3], 't');
238
239 return kSuccess;
240 }));
241
242 StartEngine();
243 g_autoptr(GBytes) message = g_bytes_new_static("test", 4);
244 fl_engine_send_platform_message(engine, "test", message, nullptr, nullptr,
245 nullptr);
246
247 EXPECT_TRUE(called);
248}
FlutterEngineResult(* FlutterEngineSendPlatformMessageFnPtr)(FLUTTER_API_SYMBOL(FlutterEngine) engine, const FlutterPlatformMessage *message)
Definition embedder.h:3665
const char * message
void fl_engine_send_platform_message(FlEngine *self, const gchar *channel, GBytes *message, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
FlutterEngineSendPlatformMessageFnPtr SendPlatformMessage
Definition embedder.h:3777

References engine, fl_engine_get_embedder_api(), fl_engine_send_platform_message(), g_autoptr(), kSuccess, message, MOCK_ENGINE_PROC, and FlutterEngineProcTable::SendPlatformMessage.

◆ TEST_F() [19/31]

Definition at line 251 of file fl_engine_test.cc.

251 {
252 bool called = false;
255 SendPlatformMessageResponse,
256 ([&called](auto engine,
258 const uint8_t* data, size_t data_length) {
259 called = true;
260
261 EXPECT_EQ(
262 handle,
263 reinterpret_cast<const FlutterPlatformMessageResponseHandle*>(
264 42));
265 EXPECT_EQ(data_length, static_cast<size_t>(4));
266 EXPECT_EQ(data[0], 't');
267 EXPECT_EQ(data[1], 'e');
268 EXPECT_EQ(data[2], 's');
269 EXPECT_EQ(data[3], 't');
270
271 return kSuccess;
272 }));
273
274 g_autoptr(GError) error = nullptr;
275 StartEngine();
276 g_autoptr(GBytes) response = g_bytes_new_static("test", 4);
278 engine, reinterpret_cast<const FlutterPlatformMessageResponseHandle*>(42),
279 response, &error));
280 EXPECT_EQ(error, nullptr);
281
282 EXPECT_TRUE(called);
283}
gboolean fl_engine_send_platform_message_response(FlEngine *self, const FlutterPlatformMessageResponseHandle *handle, GBytes *response, GError **error)
FlutterEngineSendPlatformMessageResponseFnPtr SendPlatformMessageResponse
Definition embedder.h:3782

References engine, error, fl_engine_get_embedder_api(), fl_engine_send_platform_message_response(), g_autoptr(), kSuccess, MOCK_ENGINE_PROC, and FlutterEngineProcTable::SendPlatformMessageResponse.

◆ TEST_F() [20/31]

TEST_F ( FlEngineTest  ,
PointerPanZoom   
)

Definition at line 159 of file fl_engine_test.cc.

159 {
160 bool called = false;
162 SendPointerEvent,
163 ([&called](auto engine, const FlutterPointerEvent* events,
164 size_t events_count) {
165 called = true;
166 EXPECT_EQ(events_count, static_cast<size_t>(1));
167 EXPECT_EQ(events[0].view_id, 1);
168 EXPECT_EQ(events[0].phase, kPanZoomUpdate);
169 EXPECT_EQ(events[0].timestamp, static_cast<size_t>(1234567890));
170 EXPECT_EQ(events[0].x, 800);
171 EXPECT_EQ(events[0].y, 600);
172 EXPECT_EQ(events[0].device, static_cast<int32_t>(1));
173 EXPECT_EQ(events[0].signal_kind, kFlutterPointerSignalKindNone);
174 EXPECT_EQ(events[0].pan_x, 1.5);
175 EXPECT_EQ(events[0].pan_y, 2.5);
176 EXPECT_EQ(events[0].scale, 3.5);
177 EXPECT_EQ(events[0].rotation, 4.5);
178 EXPECT_EQ(events[0].device_kind, kFlutterPointerDeviceKindTrackpad);
179 EXPECT_EQ(events[0].buttons, 0);
180
181 return kSuccess;
182 }));
183
184 StartEngine();
185 fl_engine_send_pointer_pan_zoom_event(engine, 1, 1234567890, 800, 600,
186 kPanZoomUpdate, 1.5, 2.5, 3.5, 4.5);
187
188 EXPECT_TRUE(called);
189}
@ kPanZoomUpdate
The pan/zoom updated.
Definition embedder.h:1303
@ kFlutterPointerSignalKindNone
Definition embedder.h:1346
@ kFlutterPointerDeviceKindTrackpad
Definition embedder.h:1313
void fl_engine_send_pointer_pan_zoom_event(FlEngine *self, FlutterViewId view_id, size_t timestamp, double x, double y, FlutterPointerPhase phase, double pan_x, double pan_y, double scale, double rotation)

References device, engine, fl_engine_get_embedder_api(), fl_engine_send_pointer_pan_zoom_event(), kFlutterPointerDeviceKindTrackpad, kFlutterPointerSignalKindNone, kPanZoomUpdate, kSuccess, MOCK_ENGINE_PROC, FlutterEngineProcTable::SendPointerEvent, view_id, x, and y.

◆ TEST_F() [21/31]

TEST_F ( FlEngineTest  ,
RemoveView   
)

Definition at line 762 of file fl_engine_test.cc.

762 {
763 bool called = false;
765 RemoveView, ([&called](auto engine, const FlutterRemoveViewInfo* info) {
766 called = true;
767 EXPECT_EQ(info->view_id, 123);
768
770 result.struct_size = sizeof(FlutterRemoveViewResult);
771 result.removed = true;
772 result.user_data = info->user_data;
773 info->remove_view_callback(&result);
774
775 return kSuccess;
776 }));
777
778 fl_engine_remove_view(engine, 123, nullptr, remove_view_cb, loop);
779 EXPECT_TRUE(called);
780
781 // Blocks here until remove_view_cb is called.
782 g_main_loop_run(loop);
783}
void fl_engine_remove_view(FlEngine *self, FlutterViewId view_id, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
static void remove_view_cb(GObject *object, GAsyncResult *result, gpointer user_data)
FlutterEngineRemoveViewFnPtr RemoveView
Definition embedder.h:3808
FlutterRemoveViewCallback remove_view_callback
Definition embedder.h:1195
FlutterViewId view_id
Definition embedder.h:1178
void * user_data
The |FlutterRemoveViewInfo.user_data|.
Definition embedder.h:1159
bool removed
True if the remove view operation succeeded.
Definition embedder.h:1156

References engine, fl_engine_get_embedder_api(), fl_engine_remove_view(), kSuccess, MOCK_ENGINE_PROC, FlutterRemoveViewInfo::remove_view_callback, remove_view_cb(), FlutterRemoveViewResult::removed, FlutterEngineProcTable::RemoveView, FlutterRemoveViewResult::struct_size, FlutterRemoveViewResult::user_data, FlutterRemoveViewInfo::user_data, and FlutterRemoveViewInfo::view_id.

◆ TEST_F() [22/31]

TEST_F ( FlEngineTest  ,
RemoveViewEngineError   
)

Definition at line 825 of file fl_engine_test.cc.

825 {
827 RemoveView, ([](auto engine, const FlutterRemoveViewInfo* info) {
828 return kInvalidArguments;
829 }));
830
832 loop);
833
834 // Blocks here until remove_view_engine_error_cb is called.
835 g_main_loop_run(loop);
836}
static void remove_view_engine_error_cb(GObject *object, GAsyncResult *result, gpointer user_data)

References engine, fl_engine_get_embedder_api(), fl_engine_remove_view(), kInvalidArguments, MOCK_ENGINE_PROC, remove_view_engine_error_cb(), and FlutterEngineProcTable::RemoveView.

◆ TEST_F() [23/31]

TEST_F ( FlEngineTest  ,
RemoveViewError   
)

Definition at line 796 of file fl_engine_test.cc.

796 {
798 RemoveView, ([](auto engine, const FlutterRemoveViewInfo* info) {
800 result.struct_size = sizeof(FlutterRemoveViewResult);
801 result.removed = false;
802 result.user_data = info->user_data;
803 info->remove_view_callback(&result);
804
805 return kSuccess;
806 }));
807
809
810 // Blocks here until remove_view_error_cb is called.
811 g_main_loop_run(loop);
812}
static void remove_view_error_cb(GObject *object, GAsyncResult *result, gpointer user_data)

References engine, fl_engine_get_embedder_api(), fl_engine_remove_view(), kSuccess, MOCK_ENGINE_PROC, FlutterRemoveViewInfo::remove_view_callback, remove_view_error_cb(), FlutterRemoveViewResult::removed, FlutterEngineProcTable::RemoveView, FlutterRemoveViewResult::struct_size, FlutterRemoveViewResult::user_data, and FlutterRemoveViewInfo::user_data.

◆ TEST_F() [24/31]

TEST_F ( FlEngineTest  ,
SendKeyEvent   
)

Definition at line 838 of file fl_engine_test.cc.

838 {
839 StartEngine();
840
841 bool called;
843 SendKeyEvent,
844 ([&called](auto engine, const FlutterKeyEvent* event,
846 called = true;
847 EXPECT_EQ(event->timestamp, 1234);
848 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
849 EXPECT_EQ(event->physical, static_cast<uint64_t>(42));
850 EXPECT_EQ(event->logical, static_cast<uint64_t>(123));
851 EXPECT_TRUE(event->synthesized);
854 return kSuccess;
855 }));
856
857 FlutterKeyEvent event = {.struct_size = sizeof(FlutterKeyEvent),
858 .timestamp = 1234,
860 .physical = 42,
861 .logical = 123,
862 .character = nullptr,
863 .synthesized = true,
866 engine, &event, nullptr,
867 [](GObject* object, GAsyncResult* result, gpointer user_data) {
868 gboolean handled;
869 g_autoptr(GError) error = nullptr;
870 EXPECT_TRUE(fl_engine_send_key_event_finish(FL_ENGINE(object), result,
871 &handled, &error));
872 EXPECT_EQ(error, nullptr);
873 EXPECT_TRUE(handled);
874 g_main_loop_quit(static_cast<GMainLoop*>(user_data));
875 },
876 loop);
877
878 g_main_loop_run(loop);
879 EXPECT_TRUE(called);
880}
@ kFlutterKeyEventDeviceTypeKeyboard
Definition embedder.h:1408
void(* FlutterKeyEventCallback)(bool, void *)
Definition embedder.h:1482
@ kFlutterKeyEventTypeUp
Definition embedder.h:1402
gboolean fl_engine_send_key_event_finish(FlEngine *self, GAsyncResult *result, gboolean *handled, GError **error)
void fl_engine_send_key_event(FlEngine *self, const FlutterKeyEvent *event, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
impeller::ShaderType type
FlutterEngineSendKeyEventFnPtr SendKeyEvent
Definition embedder.h:3776
uint64_t logical
Definition embedder.h:1461
size_t struct_size
The size of this struct. Must be sizeof(FlutterKeyEvent).
Definition embedder.h:1439
uint64_t physical
Definition embedder.h:1453
FlutterKeyEventDeviceType device_type
The source device for the key event.
Definition embedder.h:1479
FlutterKeyEventType type
The event kind.
Definition embedder.h:1445

References callback, character, FlutterKeyEvent::device_type, engine, error, fl_engine_get_embedder_api(), fl_engine_send_key_event(), fl_engine_send_key_event_finish(), g_autoptr(), kFlutterKeyEventDeviceTypeKeyboard, kFlutterKeyEventTypeUp, kSuccess, FlutterKeyEvent::logical, MOCK_ENGINE_PROC, FlutterKeyEvent::physical, FlutterEngineProcTable::SendKeyEvent, FlutterKeyEvent::struct_size, FlutterKeyEvent::synthesized, FlutterKeyEvent::timestamp, TRUE, type, FlutterKeyEvent::type, and user_data.

◆ TEST_F() [25/31]

TEST_F ( FlEngineTest  ,
SendKeyEventError   
)

Definition at line 920 of file fl_engine_test.cc.

920 {
921 g_autoptr(GError) error = nullptr;
922 // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.Assign)
923 StartEngine();
924
925 bool called;
927 SendKeyEvent,
928 ([&called](auto engine, const FlutterKeyEvent* event,
930 called = true;
931 return kInvalidArguments;
932 }));
933
934 FlutterKeyEvent event = {.struct_size = sizeof(FlutterKeyEvent),
935 .timestamp = 1234,
937 .physical = 42,
938 .logical = 123,
939 .character = nullptr,
940 .synthesized = true,
943 engine, &event, nullptr,
944 [](GObject* object, GAsyncResult* result, gpointer user_data) {
945 gboolean handled;
946 g_autoptr(GError) error = nullptr;
947 EXPECT_FALSE(fl_engine_send_key_event_finish(FL_ENGINE(object), result,
948 &handled, &error));
949 EXPECT_NE(error, nullptr);
950 EXPECT_STREQ(error->message, "Failed to send key event");
951 g_main_loop_quit(static_cast<GMainLoop*>(user_data));
952 },
953 loop);
954
955 g_main_loop_run(loop);
956 EXPECT_TRUE(called);
957}

References callback, character, engine, error, fl_engine_get_embedder_api(), fl_engine_send_key_event(), fl_engine_send_key_event_finish(), g_autoptr(), kFlutterKeyEventDeviceTypeKeyboard, kFlutterKeyEventTypeUp, kInvalidArguments, MOCK_ENGINE_PROC, FlutterEngineProcTable::SendKeyEvent, FlutterKeyEvent::struct_size, type, and user_data.

◆ TEST_F() [26/31]

TEST_F ( FlEngineTest  ,
SendKeyEventNotHandled   
)

Definition at line 882 of file fl_engine_test.cc.

882 {
883 StartEngine();
884
885 bool called;
887 SendKeyEvent,
888 ([&called](auto engine, const FlutterKeyEvent* event,
890 called = true;
891 callback(FALSE, user_data);
892 return kSuccess;
893 }));
894
895 FlutterKeyEvent event = {.struct_size = sizeof(FlutterKeyEvent),
896 .timestamp = 1234,
898 .physical = 42,
899 .logical = 123,
900 .character = nullptr,
901 .synthesized = true,
904 engine, &event, nullptr,
905 [](GObject* object, GAsyncResult* result, gpointer user_data) {
906 gboolean handled;
907 g_autoptr(GError) error = nullptr;
908 EXPECT_TRUE(fl_engine_send_key_event_finish(FL_ENGINE(object), result,
909 &handled, &error));
910 EXPECT_EQ(error, nullptr);
911 EXPECT_FALSE(handled);
912 g_main_loop_quit(static_cast<GMainLoop*>(user_data));
913 },
914 loop);
915
916 g_main_loop_run(loop);
917 EXPECT_TRUE(called);
918}

References callback, character, engine, error, fl_engine_get_embedder_api(), fl_engine_send_key_event(), fl_engine_send_key_event_finish(), g_autoptr(), kFlutterKeyEventDeviceTypeKeyboard, kFlutterKeyEventTypeUp, kSuccess, MOCK_ENGINE_PROC, FlutterEngineProcTable::SendKeyEvent, FlutterKeyEvent::struct_size, type, and user_data.

◆ TEST_F() [27/31]

TEST_F ( FlEngineTest  ,
SettingsHandler   
)

Definition at line 286 of file fl_engine_test.cc.

286 {
287 bool called = false;
289 SendPlatformMessage,
290 ([&called](auto engine, const FlutterPlatformMessage* message) {
291 called = true;
292
293 EXPECT_STREQ(message->channel, "flutter/settings");
294
295 g_autoptr(FlJsonMessageCodec) codec = fl_json_message_codec_new();
296 g_autoptr(GBytes) data =
297 g_bytes_new(message->message, message->message_size);
298 g_autoptr(GError) error = nullptr;
300 FL_MESSAGE_CODEC(codec), data, &error);
301 EXPECT_NE(settings, nullptr);
302 EXPECT_EQ(error, nullptr);
303
304 FlValue* text_scale_factor =
305 fl_value_lookup_string(settings, "textScaleFactor");
306 EXPECT_NE(text_scale_factor, nullptr);
307 EXPECT_EQ(fl_value_get_type(text_scale_factor), FL_VALUE_TYPE_FLOAT);
308
309 FlValue* always_use_24hr_format =
310 fl_value_lookup_string(settings, "alwaysUse24HourFormat");
311 EXPECT_NE(always_use_24hr_format, nullptr);
312 EXPECT_EQ(fl_value_get_type(always_use_24hr_format),
314
315 FlValue* platform_brightness =
316 fl_value_lookup_string(settings, "platformBrightness");
317 EXPECT_NE(platform_brightness, nullptr);
318 EXPECT_EQ(fl_value_get_type(platform_brightness), FL_VALUE_TYPE_STRING);
319
320 return kSuccess;
321 }));
322
323 StartEngine();
324
325 EXPECT_TRUE(called);
326}
G_MODULE_EXPORT FlJsonMessageCodec * fl_json_message_codec_new()
G_MODULE_EXPORT FlValue * fl_message_codec_decode_message(FlMessageCodec *self, GBytes *message, GError **error)
G_MODULE_EXPORT FlValue * fl_value_lookup_string(FlValue *self, const gchar *key)
Definition fl_value.cc:811
G_MODULE_EXPORT FlValueType fl_value_get_type(FlValue *self)
Definition fl_value.cc:466
typedefG_BEGIN_DECLS struct _FlValue FlValue
Definition fl_value.h:42
@ FL_VALUE_TYPE_STRING
Definition fl_value.h:68
@ FL_VALUE_TYPE_BOOL
Definition fl_value.h:65
@ FL_VALUE_TYPE_FLOAT
Definition fl_value.h:67

References engine, error, fl_engine_get_embedder_api(), fl_json_message_codec_new(), fl_message_codec_decode_message(), fl_value_get_type(), fl_value_lookup_string(), FL_VALUE_TYPE_BOOL, FL_VALUE_TYPE_FLOAT, FL_VALUE_TYPE_STRING, g_autoptr(), kSuccess, message, MOCK_ENGINE_PROC, and FlutterEngineProcTable::SendPlatformMessage.

◆ TEST_F() [28/31]

TEST_F ( FlEngineTest  ,
UIIsolateDefaultThreadPolicy   
)

Definition at line 423 of file fl_engine_test.cc.

423 {
425
426 bool same_task_runner = false;
427
429 Initialize,
430 ([&same_task_runner](size_t version, const FlutterRendererConfig* config,
431 const FlutterProjectArgs* args, void* user_data,
432 FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
433 same_task_runner = args->custom_task_runners->platform_task_runner ==
434 args->custom_task_runners->ui_task_runner;
435 return kSuccess;
436 }));
438 MOCK_ENGINE_PROC(RunInitialized, ([](auto engine) { return kSuccess; }));
439
440 StartEngine();
441 EXPECT_TRUE(same_task_runner);
442}
G_MODULE_EXPORT void fl_dart_project_set_ui_thread_policy(FlDartProject *project, FlUIThreadPolicy policy)
@ FL_UI_THREAD_POLICY_DEFAULT

References args, engine, fl_dart_project_set_ui_thread_policy(), fl_engine_get_embedder_api(), FL_UI_THREAD_POLICY_DEFAULT, FLUTTER_API_SYMBOL, FlutterEngineProcTable::Initialize, kSuccess, MOCK_ENGINE_PROC, FlutterEngineProcTable::RunInitialized, and user_data.

◆ TEST_F() [29/31]

TEST_F ( FlEngineTest  ,
UIIsolateOnPlatformTaskRunner   
)

Definition at line 444 of file fl_engine_test.cc.

444 {
447
448 bool same_task_runner = false;
449
451 Initialize,
452 ([&same_task_runner](size_t version, const FlutterRendererConfig* config,
453 const FlutterProjectArgs* args, void* user_data,
454 FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
455 same_task_runner = args->custom_task_runners->platform_task_runner ==
456 args->custom_task_runners->ui_task_runner;
457 return kSuccess;
458 }));
460 MOCK_ENGINE_PROC(RunInitialized, ([](auto engine) { return kSuccess; }));
461
462 StartEngine();
463 EXPECT_TRUE(same_task_runner);
464}
@ FL_UI_THREAD_POLICY_RUN_ON_PLATFORM_THREAD

References args, engine, fl_dart_project_set_ui_thread_policy(), fl_engine_get_embedder_api(), FL_UI_THREAD_POLICY_RUN_ON_PLATFORM_THREAD, FLUTTER_API_SYMBOL, FlutterEngineProcTable::Initialize, kSuccess, MOCK_ENGINE_PROC, FlutterEngineProcTable::RunInitialized, and user_data.

◆ TEST_F() [30/31]

TEST_F ( FlEngineTest  ,
UIIsolateOnSeparateThread   
)

Definition at line 466 of file fl_engine_test.cc.

466 {
469
470 bool separate_thread = false;
471
473 Initialize,
474 ([&separate_thread](size_t version, const FlutterRendererConfig* config,
475 const FlutterProjectArgs* args, void* user_data,
476 FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
477 separate_thread = args->custom_task_runners->ui_task_runner == nullptr;
478 return kSuccess;
479 }));
481 MOCK_ENGINE_PROC(RunInitialized, ([](auto engine) { return kSuccess; }));
482
483 StartEngine();
484 EXPECT_TRUE(separate_thread);
485}
@ FL_UI_THREAD_POLICY_RUN_ON_SEPARATE_THREAD

References args, engine, fl_dart_project_set_ui_thread_policy(), fl_engine_get_embedder_api(), FL_UI_THREAD_POLICY_RUN_ON_SEPARATE_THREAD, FLUTTER_API_SYMBOL, FlutterEngineProcTable::Initialize, kSuccess, MOCK_ENGINE_PROC, FlutterEngineProcTable::RunInitialized, and user_data.

◆ TEST_F() [31/31]

TEST_F ( FlEngineTest  ,
WindowMetrics   
)

Definition at line 74 of file fl_engine_test.cc.

74 {
75 StartEngine();
76
77 bool called = false;
79 SendWindowMetricsEvent,
80 ([&called](auto engine, const FlutterWindowMetricsEvent* event) {
81 called = true;
82 EXPECT_EQ(event->display_id, 99u);
83 EXPECT_EQ(event->view_id, 1);
84 EXPECT_EQ(event->width, 800u);
85 EXPECT_EQ(event->height, 600u);
86 EXPECT_TRUE(event->has_constraints);
87 EXPECT_EQ(event->min_width_constraint, 800u);
88 EXPECT_EQ(event->min_height_constraint, 600u);
89 EXPECT_EQ(event->max_width_constraint, 3840u);
90 EXPECT_EQ(event->max_height_constraint, 2160u);
91 EXPECT_EQ(event->pixel_ratio, 2.0);
92
93 return kSuccess;
94 }));
95
96 fl_engine_send_window_metrics_event(engine, 99, 1, 800, 600, 3840, 2160, 2.0);
97
98 EXPECT_TRUE(called);
99}
void fl_engine_send_window_metrics_event(FlEngine *self, FlutterEngineDisplayId display_id, FlutterViewId view_id, size_t min_width, size_t min_height, size_t max_width, size_t max_height, double pixel_ratio)
FlutterEngineSendWindowMetricsEventFnPtr SendWindowMetricsEvent
Definition embedder.h:3774
FlutterEngineDisplayId display_id
The identifier of the display the view is rendering on.
Definition embedder.h:1074
int64_t view_id
The view that this event is describing.
Definition embedder.h:1076

References FlutterWindowMetricsEvent::display_id, engine, fl_engine_get_embedder_api(), fl_engine_send_window_metrics_event(), FlutterWindowMetricsEvent::has_constraints, FlutterWindowMetricsEvent::height, kSuccess, FlutterWindowMetricsEvent::max_height_constraint, FlutterWindowMetricsEvent::max_width_constraint, FlutterWindowMetricsEvent::min_height_constraint, FlutterWindowMetricsEvent::min_width_constraint, MOCK_ENGINE_PROC, FlutterWindowMetricsEvent::pixel_ratio, FlutterEngineProcTable::SendWindowMetricsEvent, FlutterWindowMetricsEvent::view_id, and FlutterWindowMetricsEvent::width.