Flutter Linux Embedder
fl_engine_test.cc File Reference
#include "flutter/shell/platform/linux/testing/linux_test.h"
#include "gtest/gtest.h"
#include "flutter/shell/platform/embedder/test_utils/proc_table_replacement.h"
#include "flutter/shell/platform/linux/fl_engine_private.h"
#include "flutter/shell/platform/linux/public/flutter_linux/fl_engine.h"
#include "flutter/shell/platform/linux/public/flutter_linux/fl_json_message_codec.h"
#include "flutter/shell/platform/linux/public/flutter_linux/fl_string_codec.h"
#include "flutter/shell/platform/linux/testing/mock_renderable.h"

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
const char FlTextDirection FlAssertiveness gpointer user_data
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)
Definition: fl_engine.cc:1034

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;
659  fl_engine_get_embedder_api(engine)->AddView = MOCK_ENGINE_PROC(
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 
671  FlutterAddViewResult result;
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();
681  FlutterViewId view_id =
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 }
FlRenderable * renderable
FlutterEngineProcTable * fl_engine_get_embedder_api(FlEngine *self)
Definition: fl_engine.cc:920
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
static void add_view_cb(GObject *object, GAsyncResult *result, gpointer user_data)
G_BEGIN_DECLS FlutterViewId view_id

References add_view_cb(), fl_engine_add_view(), fl_engine_get_embedder_api(), g_autoptr(), renderable, and view_id.

◆ TEST_F() [2/31]

TEST_F ( FlEngineTest  ,
AddViewEngineError   
)

Definition at line 735 of file fl_engine_test.cc.

735  {
736  fl_engine_get_embedder_api(engine)->AddView = MOCK_ENGINE_PROC(
737  AddView, ([](auto engine, const FlutterAddViewInfo* info) {
738  return kInvalidArguments;
739  }));
740 
741  g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
742  FlutterViewId view_id =
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 }
static void add_view_engine_error_cb(GObject *object, GAsyncResult *result, gpointer user_data)

References add_view_engine_error_cb(), fl_engine_add_view(), fl_engine_get_embedder_api(), g_autoptr(), renderable, and view_id.

◆ TEST_F() [3/31]

TEST_F ( FlEngineTest  ,
AddViewError   
)

Definition at line 702 of file fl_engine_test.cc.

702  {
703  fl_engine_get_embedder_api(engine)->AddView = MOCK_ENGINE_PROC(
704  AddView, ([](auto engine, const FlutterAddViewInfo* info) {
705  FlutterAddViewResult result;
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();
715  FlutterViewId view_id =
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 add_view_error_cb(), fl_engine_add_view(), fl_engine_get_embedder_api(), g_autoptr(), renderable, 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 }
FlMouseCursorHandler * fl_engine_get_mouse_cursor_handler(FlEngine *self)
Definition: fl_engine.cc:1575
FlTaskRunner * fl_engine_get_task_runner(FlEngine *self)
Definition: fl_engine.cc:1528
FlKeyboardManager * fl_engine_get_keyboard_manager(FlEngine *self)
Definition: fl_engine.cc:1565
FlDisplayMonitor * fl_engine_get_display_monitor(FlEngine *self)
Definition: fl_engine.cc:754
G_MODULE_EXPORT FlBinaryMessenger * fl_engine_get_binary_messenger(FlEngine *self)
Definition: fl_engine.cc:1522

References 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;
538  fl_engine_get_embedder_api(engine)->UpdateLocales = MOCK_ENGINE_PROC(
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

References fl_engine_get_embedder_api(), and TRUE.

◆ 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;
385  fl_engine_get_embedder_api(engine)->Initialize = MOCK_ENGINE_PROC(
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  }));
396  fl_engine_get_embedder_api(engine)->RunInitialized =
397  MOCK_ENGINE_PROC(RunInitialized, ([](auto engine) { return kSuccess; }));
398 
399  StartEngine();
400 
401  EXPECT_TRUE(called);
402 }
G_MODULE_EXPORT void fl_dart_project_set_dart_entrypoint_arguments(FlDartProject *self, char **argv)
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args

References args, fl_dart_project_set_dart_entrypoint_arguments(), fl_engine_get_embedder_api(), and user_data.

◆ TEST_F() [7/31]

TEST_F ( FlEngineTest  ,
DisableImpeller   
)

Definition at line 983 of file fl_engine_test.cc.

983  {
984  fl_dart_project_set_enable_impeller(project, FALSE);
985 
986  bool called = false;
987  fl_engine_get_embedder_api(engine)->Initialize = MOCK_ENGINE_PROC(
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  }));
1002  fl_engine_get_embedder_api(engine)->RunInitialized =
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, error, fl_dart_project_set_enable_impeller(), fl_engine_get_embedder_api(), fl_engine_start(), g_autoptr(), i, 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;
194  fl_engine_get_embedder_api(engine)->SendSemanticsAction = MOCK_ENGINE_PROC(
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);
212  fl_engine_dispatch_semantics_action(engine, 456, 42,
213  kFlutterSemanticsActionTap, data);
214 
215  EXPECT_TRUE(called);
216 }
void fl_engine_dispatch_semantics_action(FlEngine *self, FlutterViewId view_id, uint64_t node_id, FlutterSemanticsAction action, GBytes *data)
Definition: fl_engine.cc:1471

References fl_engine_dispatch_semantics_action(), fl_engine_get_embedder_api(), and g_autoptr().

◆ 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;
569  fl_engine_get_embedder_api(engine)->UpdateLocales = MOCK_ENGINE_PROC(
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 fl_engine_get_embedder_api(), and TRUE.

◆ 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;
605  fl_engine_get_embedder_api(engine)->UpdateLocales = MOCK_ENGINE_PROC(
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 fl_engine_get_embedder_api(), and TRUE.

◆ TEST_F() [11/31]

TEST_F ( FlEngineTest  ,
EnableImpellerDefault   
)

Definition at line 959 of file fl_engine_test.cc.

959  {
960  bool called = false;
961  fl_engine_get_embedder_api(engine)->Initialize = MOCK_ENGINE_PROC(
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  }));
976  fl_engine_get_embedder_api(engine)->RunInitialized =
977  MOCK_ENGINE_PROC(RunInitialized, ([](auto engine) { return kSuccess; }));
978 
979  StartEngine();
980  EXPECT_TRUE(called);
981 }

References args, fl_engine_get_embedder_api(), i, 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;
406  fl_engine_get_embedder_api(engine)->Initialize = MOCK_ENGINE_PROC(
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  }));
414  fl_engine_get_embedder_api(engine)->RunInitialized =
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, fl_engine_for_id(), fl_engine_get_embedder_api(), 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;
492  fl_engine_get_embedder_api(engine)->UpdateLocales = MOCK_ENGINE_PROC(
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 fl_engine_get_embedder_api(), and TRUE.

◆ TEST_F() [14/31]

TEST_F ( FlEngineTest  ,
MousePointer   
)

Definition at line 102 of file fl_engine_test.cc.

102  {
103  bool called = false;
104  fl_engine_get_embedder_api(engine)->SendPointerEvent = MOCK_ENGINE_PROC(
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,
127  kFlutterPointerDeviceKindMouse, 1.2, -3.4,
128  kFlutterPointerButtonMouseSecondary, 0, 0);
129 
130  EXPECT_TRUE(called);
131 }
FlFramebuffer double x
FlFramebuffer double double y
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)
Definition: fl_engine.cc:1195

References fl_engine_get_embedder_api(), fl_engine_send_mouse_pointer_event(), 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;
136  fl_engine_get_embedder_api(engine)->SendPointerEvent = MOCK_ENGINE_PROC(
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 fl_engine_get_embedder_api(), and fl_engine_send_mouse_pointer_event().

◆ 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;
26  fl_engine_get_embedder_api(engine)->NotifyDisplayUpdate = MOCK_ENGINE_PROC(
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 
49  FlutterEngineDisplay displays[2] = {
50  {
51  .struct_size = sizeof(FlutterEngineDisplay),
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  }};
68  fl_engine_notify_display_update(engine, displays, 2);
69 
70  EXPECT_TRUE(called);
71 }
FlFramebuffer double double int int height
FlFramebuffer double double int width
void fl_engine_notify_display_update(FlEngine *self, const FlutterEngineDisplay *displays, size_t displays_length)
Definition: fl_engine.cc:924

References fl_engine_get_embedder_api(), fl_engine_notify_display_update(), height, and width.

◆ TEST_F() [17/31]

TEST_F ( FlEngineTest  ,
OnPreEngineRestart   
)

Definition at line 334 of file fl_engine_test.cc.

334  {
335  OnPreEngineRestartCallback callback;
336  void* callback_user_data;
337 
338  bool called = false;
339  fl_engine_get_embedder_api(engine)->Initialize = MOCK_ENGINE_PROC(
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  }));
350  fl_engine_get_embedder_api(engine)->RunInitialized =
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 on_pre_engine_restart_cb(FlEngine *engine, gpointer user_data)

References args, fl_engine_get_embedder_api(), on_pre_engine_restart_cb(), 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;
221  FlutterEngineSendPlatformMessageFnPtr old_handler =
222  fl_engine_get_embedder_api(engine)->SendPlatformMessage;
223  fl_engine_get_embedder_api(engine)->SendPlatformMessage = MOCK_ENGINE_PROC(
224  SendPlatformMessage,
225  ([&called, old_handler](auto engine,
226  const FlutterPlatformMessage* message) {
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 }
const char * message
void fl_engine_send_platform_message(FlEngine *self, const gchar *channel, GBytes *message, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
Definition: fl_engine.cc:1092

References fl_engine_get_embedder_api(), fl_engine_send_platform_message(), g_autoptr(), and message.

◆ TEST_F() [19/31]

TEST_F ( FlEngineTest  ,
PlatformMessageResponse   
)

Definition at line 251 of file fl_engine_test.cc.

251  {
252  bool called = false;
253  fl_engine_get_embedder_api(engine)->SendPlatformMessageResponse =
254  MOCK_ENGINE_PROC(
255  SendPlatformMessageResponse,
256  ([&called](auto engine,
257  const FlutterPlatformMessageResponseHandle* handle,
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)
Definition: fl_engine.cc:1060

References error, fl_engine_get_embedder_api(), fl_engine_send_platform_message_response(), and g_autoptr().

◆ TEST_F() [20/31]

TEST_F ( FlEngineTest  ,
PointerPanZoom   
)

Definition at line 159 of file fl_engine_test.cc.

159  {
160  bool called = false;
161  fl_engine_get_embedder_api(engine)->SendPointerEvent = MOCK_ENGINE_PROC(
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 }
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)
Definition: fl_engine.cc:1389

References fl_engine_get_embedder_api(), fl_engine_send_pointer_pan_zoom_event(), 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;
764  fl_engine_get_embedder_api(engine)->RemoveView = MOCK_ENGINE_PROC(
765  RemoveView, ([&called](auto engine, const FlutterRemoveViewInfo* info) {
766  called = true;
767  EXPECT_EQ(info->view_id, 123);
768 
769  FlutterRemoveViewResult result;
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)
Definition: fl_engine.cc:1007
static void remove_view_cb(GObject *object, GAsyncResult *result, gpointer user_data)

References fl_engine_get_embedder_api(), fl_engine_remove_view(), and remove_view_cb().

◆ TEST_F() [22/31]

TEST_F ( FlEngineTest  ,
RemoveViewEngineError   
)

Definition at line 825 of file fl_engine_test.cc.

825  {
826  fl_engine_get_embedder_api(engine)->RemoveView = MOCK_ENGINE_PROC(
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 fl_engine_get_embedder_api(), fl_engine_remove_view(), and remove_view_engine_error_cb().

◆ TEST_F() [23/31]

TEST_F ( FlEngineTest  ,
RemoveViewError   
)

Definition at line 796 of file fl_engine_test.cc.

796  {
797  fl_engine_get_embedder_api(engine)->RemoveView = MOCK_ENGINE_PROC(
798  RemoveView, ([](auto engine, const FlutterRemoveViewInfo* info) {
799  FlutterRemoveViewResult result;
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 
808  fl_engine_remove_view(engine, 123, nullptr, remove_view_error_cb, loop);
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 fl_engine_get_embedder_api(), fl_engine_remove_view(), and remove_view_error_cb().

◆ 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;
842  fl_engine_get_embedder_api(engine)->SendKeyEvent = MOCK_ENGINE_PROC(
843  SendKeyEvent,
844  ([&called](auto engine, const FlutterKeyEvent* event,
845  FlutterKeyEventCallback callback, void* user_data) {
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);
852  EXPECT_EQ(event->device_type, kFlutterKeyEventDeviceTypeKeyboard);
853  callback(TRUE, user_data);
854  return kSuccess;
855  }));
856 
857  FlutterKeyEvent event = {.struct_size = sizeof(FlutterKeyEvent),
858  .timestamp = 1234,
859  .type = kFlutterKeyEventTypeUp,
860  .physical = 42,
861  .logical = 123,
862  .character = nullptr,
863  .synthesized = true,
864  .device_type = kFlutterKeyEventDeviceTypeKeyboard};
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 }
gboolean fl_engine_send_key_event_finish(FlEngine *self, GAsyncResult *result, gboolean *handled, GError **error)
Definition: fl_engine.cc:1454
void fl_engine_send_key_event(FlEngine *self, const FlutterKeyEvent *event, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
Definition: fl_engine.cc:1431

References error, fl_engine_get_embedder_api(), fl_engine_send_key_event(), fl_engine_send_key_event_finish(), g_autoptr(), TRUE, 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;
926  fl_engine_get_embedder_api(engine)->SendKeyEvent = MOCK_ENGINE_PROC(
927  SendKeyEvent,
928  ([&called](auto engine, const FlutterKeyEvent* event,
929  FlutterKeyEventCallback callback, void* user_data) {
930  called = true;
931  return kInvalidArguments;
932  }));
933 
934  FlutterKeyEvent event = {.struct_size = sizeof(FlutterKeyEvent),
935  .timestamp = 1234,
936  .type = kFlutterKeyEventTypeUp,
937  .physical = 42,
938  .logical = 123,
939  .character = nullptr,
940  .synthesized = true,
941  .device_type = kFlutterKeyEventDeviceTypeKeyboard};
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 error, fl_engine_get_embedder_api(), fl_engine_send_key_event(), fl_engine_send_key_event_finish(), g_autoptr(), 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;
886  fl_engine_get_embedder_api(engine)->SendKeyEvent = MOCK_ENGINE_PROC(
887  SendKeyEvent,
888  ([&called](auto engine, const FlutterKeyEvent* event,
889  FlutterKeyEventCallback callback, void* user_data) {
890  called = true;
891  callback(FALSE, user_data);
892  return kSuccess;
893  }));
894 
895  FlutterKeyEvent event = {.struct_size = sizeof(FlutterKeyEvent),
896  .timestamp = 1234,
897  .type = kFlutterKeyEventTypeUp,
898  .physical = 42,
899  .logical = 123,
900  .character = nullptr,
901  .synthesized = true,
902  .device_type = kFlutterKeyEventDeviceTypeKeyboard};
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 error, fl_engine_get_embedder_api(), fl_engine_send_key_event(), fl_engine_send_key_event_finish(), g_autoptr(), 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;
288  fl_engine_get_embedder_api(engine)->SendPlatformMessage = MOCK_ENGINE_PROC(
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 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(), and message.

◆ 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 
428  fl_engine_get_embedder_api(engine)->Initialize = MOCK_ENGINE_PROC(
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  }));
437  fl_engine_get_embedder_api(engine)->RunInitialized =
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, fl_dart_project_set_ui_thread_policy(), fl_engine_get_embedder_api(), FL_UI_THREAD_POLICY_DEFAULT, 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 
450  fl_engine_get_embedder_api(engine)->Initialize = MOCK_ENGINE_PROC(
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  }));
459  fl_engine_get_embedder_api(engine)->RunInitialized =
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, fl_dart_project_set_ui_thread_policy(), fl_engine_get_embedder_api(), FL_UI_THREAD_POLICY_RUN_ON_PLATFORM_THREAD, 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 
472  fl_engine_get_embedder_api(engine)->Initialize = MOCK_ENGINE_PROC(
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  }));
480  fl_engine_get_embedder_api(engine)->RunInitialized =
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, fl_dart_project_set_ui_thread_policy(), fl_engine_get_embedder_api(), FL_UI_THREAD_POLICY_RUN_ON_SEPARATE_THREAD, 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;
78  fl_engine_get_embedder_api(engine)->SendWindowMetricsEvent = MOCK_ENGINE_PROC(
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)
Definition: fl_engine.cc:1163

References fl_engine_get_embedder_api(), and fl_engine_send_window_metrics_event().