Migrate FlBinaryMessenger using embedder API instead of mock engine. (#57214)
This allows us to remove most of the remaining mock engine code.
diff --git a/shell/platform/linux/fl_binary_messenger.cc b/shell/platform/linux/fl_binary_messenger.cc
index 4453456..c0d6773 100644
--- a/shell/platform/linux/fl_binary_messenger.cc
+++ b/shell/platform/linux/fl_binary_messenger.cc
@@ -155,21 +155,9 @@
GBytes* message,
const FlutterPlatformMessageResponseHandle* response_handle,
void* user_data) {
- FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(user_data);
-
- PlatformMessageHandler* handler = static_cast<PlatformMessageHandler*>(
- g_hash_table_lookup(self->platform_message_handlers, channel));
- if (handler == nullptr) {
- return FALSE;
- }
-
- g_autoptr(FlBinaryMessengerResponseHandleImpl) handle =
- fl_binary_messenger_response_handle_impl_new(self, response_handle);
- handler->message_handler(FL_BINARY_MESSENGER(self), channel, message,
- FL_BINARY_MESSENGER_RESPONSE_HANDLE(handle),
- handler->message_handler_data);
-
- return TRUE;
+ FlBinaryMessenger* self = FL_BINARY_MESSENGER(user_data);
+ return fl_binary_messenger_handle_message(self, channel, message,
+ response_handle);
}
static void fl_binary_messenger_impl_dispose(GObject* object) {
@@ -487,6 +475,28 @@
self, channel, warns);
}
+gboolean fl_binary_messenger_handle_message(
+ FlBinaryMessenger* messenger,
+ const gchar* channel,
+ GBytes* message,
+ const FlutterPlatformMessageResponseHandle* response_handle) {
+ FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(messenger);
+
+ PlatformMessageHandler* handler = static_cast<PlatformMessageHandler*>(
+ g_hash_table_lookup(self->platform_message_handlers, channel));
+ if (handler == nullptr) {
+ return FALSE;
+ }
+
+ g_autoptr(FlBinaryMessengerResponseHandleImpl) handle =
+ fl_binary_messenger_response_handle_impl_new(self, response_handle);
+ handler->message_handler(FL_BINARY_MESSENGER(self), channel, message,
+ FL_BINARY_MESSENGER_RESPONSE_HANDLE(handle),
+ handler->message_handler_data);
+
+ return TRUE;
+}
+
void fl_binary_messenger_shutdown(FlBinaryMessenger* self) {
g_return_if_fail(FL_IS_BINARY_MESSENGER(self));
diff --git a/shell/platform/linux/fl_binary_messenger_private.h b/shell/platform/linux/fl_binary_messenger_private.h
index e444e8f..0925759 100644
--- a/shell/platform/linux/fl_binary_messenger_private.h
+++ b/shell/platform/linux/fl_binary_messenger_private.h
@@ -7,6 +7,7 @@
#include <glib-object.h>
+#include "flutter/shell/platform/embedder/embedder.h"
#include "flutter/shell/platform/linux/public/flutter_linux/fl_engine.h"
G_BEGIN_DECLS
@@ -23,6 +24,24 @@
FlBinaryMessenger* fl_binary_messenger_new(FlEngine* engine);
/**
+ * fl_binary_messenger_handle_message:
+ * @messenger: an #FlBinaryMessenger.
+ * @channel: channel message received on.
+ * @message: message data.
+ * @response_handle: handle to provide to
+ * fl_engine_send_platform_message_response().
+ *
+ * Handles a message received from the engine. Available for testing purposes.
+ *
+ * Returns: %TRUE if the message is handled.
+ */
+gboolean fl_binary_messenger_handle_message(
+ FlBinaryMessenger* messenger,
+ const gchar* channel,
+ GBytes* message,
+ const FlutterPlatformMessageResponseHandle* response_handle);
+
+/**
* fl_binary_messenger_shutdown:
* @messenger: an #FlBinaryMessenger.
*
diff --git a/shell/platform/linux/fl_binary_messenger_test.cc b/shell/platform/linux/fl_binary_messenger_test.cc
index 8f03eb5..3ea11fb 100644
--- a/shell/platform/linux/fl_binary_messenger_test.cc
+++ b/shell/platform/linux/fl_binary_messenger_test.cc
@@ -13,419 +13,369 @@
#include "flutter/shell/platform/linux/fl_binary_messenger_private.h"
#include "flutter/shell/platform/linux/fl_engine_private.h"
#include "flutter/shell/platform/linux/public/flutter_linux/fl_binary_messenger.h"
-#include "flutter/shell/platform/linux/public/flutter_linux/fl_method_channel.h"
#include "flutter/shell/platform/linux/public/flutter_linux/fl_standard_method_codec.h"
-#include "flutter/shell/platform/linux/testing/fl_test.h"
-#include "flutter/shell/platform/linux/testing/mock_renderer.h"
-G_DECLARE_FINAL_TYPE(FlFakeBinaryMessengerResponseHandle,
- fl_fake_binary_messenger_response_handle,
- FL,
- FAKE_BINARY_MESSENGER_RESPONSE_HANDLE,
- FlBinaryMessengerResponseHandle)
-
-struct _FlFakeBinaryMessengerResponseHandle {
- FlBinaryMessengerResponseHandle parent_instance;
-};
-
-G_DEFINE_TYPE(FlFakeBinaryMessengerResponseHandle,
- fl_fake_binary_messenger_response_handle,
- fl_binary_messenger_response_handle_get_type());
-
-static void fl_fake_binary_messenger_response_handle_class_init(
- FlFakeBinaryMessengerResponseHandleClass* klass) {}
-
-static void fl_fake_binary_messenger_response_handle_init(
- FlFakeBinaryMessengerResponseHandle* self) {}
-
-FlFakeBinaryMessengerResponseHandle*
-fl_fake_binary_messenger_response_handle_new() {
- return FL_FAKE_BINARY_MESSENGER_RESPONSE_HANDLE(
- g_object_new(fl_fake_binary_messenger_response_handle_get_type(), NULL));
-}
-
-G_DECLARE_FINAL_TYPE(FlFakeBinaryMessenger,
- fl_fake_binary_messenger,
- FL,
- FAKE_BINARY_MESSENGER,
- GObject)
-
-struct _FlFakeBinaryMessenger {
- GObject parent_instance;
-
- GMainLoop* loop;
- GAsyncReadyCallback send_callback;
- gpointer send_callback_user_data;
- FlBinaryMessengerMessageHandler message_handler;
- gpointer message_handler_user_data;
-};
-
-static void fl_fake_binary_messenger_iface_init(
- FlBinaryMessengerInterface* iface);
-
-G_DEFINE_TYPE_WITH_CODE(
- FlFakeBinaryMessenger,
- fl_fake_binary_messenger,
- G_TYPE_OBJECT,
- G_IMPLEMENT_INTERFACE(fl_binary_messenger_get_type(),
- fl_fake_binary_messenger_iface_init))
-
-static void fl_fake_binary_messenger_class_init(
- FlFakeBinaryMessengerClass* klass) {}
-
-static gboolean send_message_cb(gpointer user_data) {
- FlFakeBinaryMessenger* self = FL_FAKE_BINARY_MESSENGER(user_data);
-
- const char* text = "Marco!";
- g_autoptr(GBytes) message = g_bytes_new(text, strlen(text));
- self->message_handler(FL_BINARY_MESSENGER(self), "CHANNEL", message,
- FL_BINARY_MESSENGER_RESPONSE_HANDLE(
- fl_fake_binary_messenger_response_handle_new()),
- self->message_handler_user_data);
-
- return FALSE;
-}
-
-static void set_message_handler_on_channel(
- FlBinaryMessenger* messenger,
- const gchar* channel,
- FlBinaryMessengerMessageHandler handler,
- gpointer user_data,
- GDestroyNotify destroy_notify) {
- FlFakeBinaryMessenger* self = FL_FAKE_BINARY_MESSENGER(messenger);
-
- EXPECT_STREQ(channel, "CHANNEL");
-
- // Send message.
- self->message_handler = handler;
- self->message_handler_user_data = user_data;
- g_idle_add(send_message_cb, messenger);
-}
-
-static gboolean send_response(FlBinaryMessenger* messenger,
- FlBinaryMessengerResponseHandle* response_handle,
- GBytes* response,
- GError** error) {
- FlFakeBinaryMessenger* self = FL_FAKE_BINARY_MESSENGER(messenger);
-
- EXPECT_TRUE(FL_IS_FAKE_BINARY_MESSENGER_RESPONSE_HANDLE(response_handle));
-
- g_autofree gchar* text =
- g_strndup(static_cast<const gchar*>(g_bytes_get_data(response, nullptr)),
- g_bytes_get_size(response));
- EXPECT_STREQ(text, "Polo!");
-
- g_main_loop_quit(self->loop);
-
- return TRUE;
-}
-
-static gboolean send_ready_cb(gpointer user_data) {
- FlFakeBinaryMessenger* self = FL_FAKE_BINARY_MESSENGER(user_data);
-
- self->send_callback(G_OBJECT(self), NULL, self->send_callback_user_data);
-
- return FALSE;
-}
-
-static void send_on_channel(FlBinaryMessenger* messenger,
- const gchar* channel,
- GBytes* message,
- GCancellable* cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data) {
- FlFakeBinaryMessenger* self = FL_FAKE_BINARY_MESSENGER(messenger);
-
- EXPECT_STREQ(channel, "CHANNEL");
- g_autofree gchar* text =
- g_strndup(static_cast<const gchar*>(g_bytes_get_data(message, nullptr)),
- g_bytes_get_size(message));
- EXPECT_STREQ(text, "Marco!");
-
- // Send response.
- self->send_callback = callback;
- self->send_callback_user_data = user_data;
- g_idle_add(send_ready_cb, messenger);
-}
-
-static GBytes* send_on_channel_finish(FlBinaryMessenger* messenger,
- GAsyncResult* result,
- GError** error) {
- const char* text = "Polo!";
- return g_bytes_new(text, strlen(text));
-}
-
-static void resize_channel(FlBinaryMessenger* messenger,
- const gchar* channel,
- int64_t new_size) {
- // Fake implementation. Do nothing.
-}
-
-static void set_warns_on_channel_overflow(FlBinaryMessenger* messenger,
- const gchar* channel,
- bool warns) {
- // Fake implementation. Do nothing.
-}
-
-static void fl_fake_binary_messenger_iface_init(
- FlBinaryMessengerInterface* iface) {
- iface->set_message_handler_on_channel = set_message_handler_on_channel;
- iface->send_response = send_response;
- iface->send_on_channel = send_on_channel;
- iface->send_on_channel_finish = send_on_channel_finish;
- iface->resize_channel = resize_channel;
- iface->set_warns_on_channel_overflow = set_warns_on_channel_overflow;
-}
-
-static void fl_fake_binary_messenger_init(FlFakeBinaryMessenger* self) {}
-
-static FlBinaryMessenger* fl_fake_binary_messenger_new(GMainLoop* loop) {
- FlFakeBinaryMessenger* self = FL_FAKE_BINARY_MESSENGER(
- g_object_new(fl_fake_binary_messenger_get_type(), NULL));
- self->loop = loop;
- return FL_BINARY_MESSENGER(self);
-}
-
-// Called when the message response is received in the FakeMessengerSend test.
-static void fake_response_cb(GObject* object,
- GAsyncResult* result,
- gpointer user_data) {
- g_autoptr(GError) error = nullptr;
- g_autoptr(GBytes) message = fl_binary_messenger_send_on_channel_finish(
- FL_BINARY_MESSENGER(object), result, &error);
- EXPECT_NE(message, nullptr);
- EXPECT_EQ(error, nullptr);
-
- g_autofree gchar* text =
- g_strndup(static_cast<const gchar*>(g_bytes_get_data(message, nullptr)),
- g_bytes_get_size(message));
- EXPECT_STREQ(text, "Polo!");
-
- g_main_loop_quit(static_cast<GMainLoop*>(user_data));
-}
-
-// Checks can make a fake messenger and send a message.
-TEST(FlBinaryMessengerTest, FakeMessengerSend) {
+// Checks can send a message.
+TEST(FlBinaryMessengerTest, Send) {
g_autoptr(GMainLoop) loop = g_main_loop_new(nullptr, 0);
- g_autoptr(FlBinaryMessenger) messenger = fl_fake_binary_messenger_new(loop);
- EXPECT_TRUE(FL_IS_FAKE_BINARY_MESSENGER(messenger));
+ g_autoptr(FlDartProject) project = fl_dart_project_new();
+ g_autoptr(FlEngine) engine = fl_engine_new(project);
+ FlutterEngineProcTable* embedder_api = fl_engine_get_embedder_api(engine);
+ g_autoptr(GError) error = nullptr;
+ EXPECT_TRUE(fl_engine_start(engine, &error));
+ EXPECT_EQ(error, nullptr);
+
+ FlutterDataCallback response_callback;
+ void* response_callback_user_data;
+ embedder_api->PlatformMessageCreateResponseHandle = MOCK_ENGINE_PROC(
+ PlatformMessageCreateResponseHandle,
+ ([&response_callback, &response_callback_user_data](
+ auto engine, FlutterDataCallback data_callback, void* user_data,
+ FlutterPlatformMessageResponseHandle** response_out) {
+ response_callback = data_callback;
+ response_callback_user_data = user_data;
+ return kSuccess;
+ }));
+ embedder_api->SendPlatformMessage = MOCK_ENGINE_PROC(
+ SendPlatformMessage,
+ ([&response_callback, &response_callback_user_data](
+ auto engine, const FlutterPlatformMessage* message) {
+ EXPECT_STREQ(message->channel, "test");
+ g_autofree gchar* text =
+ g_strndup(reinterpret_cast<const gchar*>(message->message),
+ message->message_size);
+ EXPECT_STREQ(text, "Marco!");
+
+ const gchar* response = "Polo!";
+ response_callback(reinterpret_cast<const uint8_t*>(response),
+ strlen(response), response_callback_user_data);
+
+ return kSuccess;
+ }));
+
+ g_autoptr(FlBinaryMessenger) messenger = fl_binary_messenger_new(engine);
const char* text = "Marco!";
g_autoptr(GBytes) message = g_bytes_new(text, strlen(text));
- fl_binary_messenger_send_on_channel(messenger, "CHANNEL", message, nullptr,
- fake_response_cb, loop);
+ fl_binary_messenger_send_on_channel(
+ messenger, "test", message, nullptr,
+ [](GObject* object, GAsyncResult* result, gpointer user_data) {
+ g_autoptr(GError) error = nullptr;
+ g_autoptr(GBytes) message = fl_binary_messenger_send_on_channel_finish(
+ FL_BINARY_MESSENGER(object), result, &error);
+ EXPECT_NE(message, nullptr);
+ EXPECT_EQ(error, nullptr);
- // Blocks here until fake_response_cb is called.
- g_main_loop_run(loop);
-}
+ g_autofree gchar* text = g_strndup(
+ static_cast<const gchar*>(g_bytes_get_data(message, nullptr)),
+ g_bytes_get_size(message));
+ EXPECT_STREQ(text, "Polo!");
-// Called when a message is received in the FakeMessengerReceive test.
-static void fake_message_cb(FlBinaryMessenger* messenger,
- const gchar* channel,
- GBytes* message,
- FlBinaryMessengerResponseHandle* response_handle,
- gpointer user_data) {
- EXPECT_STREQ(channel, "CHANNEL");
+ g_main_loop_quit(static_cast<GMainLoop*>(user_data));
+ },
+ loop);
- EXPECT_NE(message, nullptr);
- g_autofree gchar* text =
- g_strndup(static_cast<const gchar*>(g_bytes_get_data(message, nullptr)),
- g_bytes_get_size(message));
- EXPECT_STREQ(text, "Marco!");
-
- const char* response_text = "Polo!";
- g_autoptr(GBytes) response =
- g_bytes_new(response_text, strlen(response_text));
- g_autoptr(GError) error = nullptr;
- EXPECT_TRUE(fl_binary_messenger_send_response(messenger, response_handle,
- response, &error));
- EXPECT_EQ(error, nullptr);
-}
-
-// Checks can make a fake messenger and receive a message.
-TEST(FlBinaryMessengerTest, FakeMessengerReceive) {
- g_autoptr(GMainLoop) loop = g_main_loop_new(nullptr, 0);
-
- g_autoptr(FlBinaryMessenger) messenger = fl_fake_binary_messenger_new(loop);
- EXPECT_TRUE(FL_IS_FAKE_BINARY_MESSENGER(messenger));
-
- fl_binary_messenger_set_message_handler_on_channel(
- messenger, "CHANNEL", fake_message_cb, nullptr, nullptr);
-
- // Blocks here until response is received in fake messenger.
g_main_loop_run(loop);
}
// Checks sending nullptr for a message works.
-TEST(FlBinaryMessengerTest, SendNullptrMessage) {
- g_autoptr(FlEngine) engine = make_mock_engine();
+TEST(FlBinaryMessengerTest, SendNullptr) {
+ g_autoptr(FlDartProject) project = fl_dart_project_new();
+ g_autoptr(FlEngine) engine = fl_engine_new(project);
+ FlutterEngineProcTable* embedder_api = fl_engine_get_embedder_api(engine);
+
+ g_autoptr(GError) error = nullptr;
+ EXPECT_TRUE(fl_engine_start(engine, &error));
+ EXPECT_EQ(error, nullptr);
+
+ bool called = false;
+ embedder_api->SendPlatformMessage = MOCK_ENGINE_PROC(
+ SendPlatformMessage,
+ ([&called](auto engine, const FlutterPlatformMessage* message) {
+ called = true;
+
+ EXPECT_STREQ(message->channel, "test");
+ // Note we don't check message->message as it could be nullptr or a
+ // pointer to an buffer - either way it wouldn't be accessed.
+ EXPECT_EQ(message->message_size, static_cast<size_t>(0));
+
+ return kSuccess;
+ }));
+
g_autoptr(FlBinaryMessenger) messenger = fl_binary_messenger_new(engine);
- fl_binary_messenger_send_on_channel(messenger, "test/echo", nullptr, nullptr,
+ fl_binary_messenger_send_on_channel(messenger, "test", nullptr, nullptr,
nullptr, nullptr);
+ EXPECT_TRUE(called);
}
// Checks sending a zero length message works.
-TEST(FlBinaryMessengerTest, SendEmptyMessage) {
- g_autoptr(FlEngine) engine = make_mock_engine();
+TEST(FlBinaryMessengerTest, SendEmpty) {
+ g_autoptr(FlDartProject) project = fl_dart_project_new();
+ g_autoptr(FlEngine) engine = fl_engine_new(project);
+ FlutterEngineProcTable* embedder_api = fl_engine_get_embedder_api(engine);
+
+ g_autoptr(GError) error = nullptr;
+ EXPECT_TRUE(fl_engine_start(engine, &error));
+ EXPECT_EQ(error, nullptr);
+
+ bool called = false;
+ embedder_api->SendPlatformMessage = MOCK_ENGINE_PROC(
+ SendPlatformMessage,
+ ([&called](auto engine, const FlutterPlatformMessage* message) {
+ called = true;
+
+ EXPECT_STREQ(message->channel, "test");
+ EXPECT_EQ(message->message_size, static_cast<size_t>(0));
+
+ return kSuccess;
+ }));
g_autoptr(FlBinaryMessenger) messenger = fl_binary_messenger_new(engine);
g_autoptr(GBytes) message = g_bytes_new(nullptr, 0);
- fl_binary_messenger_send_on_channel(messenger, "test/echo", message, nullptr,
+ fl_binary_messenger_send_on_channel(messenger, "test", message, nullptr,
nullptr, nullptr);
-}
-
-// Called when the message response is received in the SendMessage test.
-static void echo_response_cb(GObject* object,
- GAsyncResult* result,
- gpointer user_data) {
- g_autoptr(GError) error = nullptr;
- g_autoptr(GBytes) message = fl_binary_messenger_send_on_channel_finish(
- FL_BINARY_MESSENGER(object), result, &error);
- EXPECT_NE(message, nullptr);
- EXPECT_EQ(error, nullptr);
-
- g_autofree gchar* text =
- g_strndup(static_cast<const gchar*>(g_bytes_get_data(message, nullptr)),
- g_bytes_get_size(message));
- EXPECT_STREQ(text, "Hello World!");
-
- g_main_loop_quit(static_cast<GMainLoop*>(user_data));
-}
-
-// Checks sending a message works.
-TEST(FlBinaryMessengerTest, SendMessage) {
- g_autoptr(GMainLoop) loop = g_main_loop_new(nullptr, 0);
-
- g_autoptr(FlEngine) engine = make_mock_engine();
- g_autoptr(FlBinaryMessenger) messenger = fl_binary_messenger_new(engine);
- const char* text = "Hello World!";
- g_autoptr(GBytes) message = g_bytes_new(text, strlen(text));
- fl_binary_messenger_send_on_channel(messenger, "test/echo", message, nullptr,
- echo_response_cb, loop);
-
- // Blocks here until echo_response_cb is called.
- g_main_loop_run(loop);
-}
-
-// Called when the message response is received in the NullptrResponse test.
-static void nullptr_response_cb(GObject* object,
- GAsyncResult* result,
- gpointer user_data) {
- g_autoptr(GError) error = nullptr;
- g_autoptr(GBytes) message = fl_binary_messenger_send_on_channel_finish(
- FL_BINARY_MESSENGER(object), result, &error);
- EXPECT_NE(message, nullptr);
- EXPECT_EQ(error, nullptr);
-
- EXPECT_EQ(g_bytes_get_size(message), static_cast<gsize>(0));
-
- g_main_loop_quit(static_cast<GMainLoop*>(user_data));
+ EXPECT_TRUE(called);
}
// Checks the engine returning a nullptr message work.
TEST(FlBinaryMessengerTest, NullptrResponse) {
g_autoptr(GMainLoop) loop = g_main_loop_new(nullptr, 0);
- g_autoptr(FlEngine) engine = make_mock_engine();
+ g_autoptr(FlDartProject) project = fl_dart_project_new();
+ g_autoptr(FlEngine) engine = fl_engine_new(project);
+ FlutterEngineProcTable* embedder_api = fl_engine_get_embedder_api(engine);
+
+ g_autoptr(GError) error = nullptr;
+ EXPECT_TRUE(fl_engine_start(engine, &error));
+ EXPECT_EQ(error, nullptr);
+
+ FlutterDataCallback response_callback;
+ void* response_callback_user_data;
+ embedder_api->PlatformMessageCreateResponseHandle = MOCK_ENGINE_PROC(
+ PlatformMessageCreateResponseHandle,
+ ([&response_callback, &response_callback_user_data](
+ auto engine, FlutterDataCallback data_callback, void* user_data,
+ FlutterPlatformMessageResponseHandle** response_out) {
+ response_callback = data_callback;
+ response_callback_user_data = user_data;
+ return kSuccess;
+ }));
+ embedder_api->SendPlatformMessage = MOCK_ENGINE_PROC(
+ SendPlatformMessage,
+ ([&response_callback, &response_callback_user_data](
+ auto engine, const FlutterPlatformMessage* message) {
+ EXPECT_STREQ(message->channel, "test");
+ g_autofree gchar* text =
+ g_strndup(reinterpret_cast<const gchar*>(message->message),
+ message->message_size);
+ EXPECT_STREQ(text, "Hello World!");
+
+ response_callback(nullptr, 0, response_callback_user_data);
+
+ return kSuccess;
+ }));
+
g_autoptr(FlBinaryMessenger) messenger = fl_binary_messenger_new(engine);
const char* text = "Hello World!";
g_autoptr(GBytes) message = g_bytes_new(text, strlen(text));
- fl_binary_messenger_send_on_channel(messenger, "test/nullptr-response",
- message, nullptr, nullptr_response_cb,
- loop);
+ fl_binary_messenger_send_on_channel(
+ messenger, "test", message, nullptr,
+ [](GObject* object, GAsyncResult* result, gpointer user_data) {
+ g_autoptr(GError) error = nullptr;
+ g_autoptr(GBytes) message = fl_binary_messenger_send_on_channel_finish(
+ FL_BINARY_MESSENGER(object), result, &error);
+ EXPECT_NE(message, nullptr);
+ EXPECT_EQ(error, nullptr);
- // Blocks here until nullptr_response_cb is called.
+ EXPECT_EQ(g_bytes_get_size(message), static_cast<gsize>(0));
+
+ g_main_loop_quit(static_cast<GMainLoop*>(user_data));
+ },
+ loop);
+
g_main_loop_run(loop);
}
-// Called when the message response is received in the SendFailure test.
-static void failure_response_cb(GObject* object,
- GAsyncResult* result,
- gpointer user_data) {
- g_autoptr(GError) error = nullptr;
- g_autoptr(GBytes) message = fl_binary_messenger_send_on_channel_finish(
- FL_BINARY_MESSENGER(object), result, &error);
- EXPECT_EQ(message, nullptr);
- EXPECT_NE(error, nullptr);
-
- g_main_loop_quit(static_cast<GMainLoop*>(user_data));
-}
-
// Checks the engine reporting a send failure is handled.
TEST(FlBinaryMessengerTest, SendFailure) {
g_autoptr(GMainLoop) loop = g_main_loop_new(nullptr, 0);
- g_autoptr(FlEngine) engine = make_mock_engine();
- g_autoptr(FlBinaryMessenger) messenger = fl_binary_messenger_new(engine);
- fl_binary_messenger_send_on_channel(messenger, "test/failure", nullptr,
- nullptr, failure_response_cb, loop);
+ g_autoptr(FlDartProject) project = fl_dart_project_new();
+ g_autoptr(FlEngine) engine = fl_engine_new(project);
+ FlutterEngineProcTable* embedder_api = fl_engine_get_embedder_api(engine);
- // Blocks here until failure_response_cb is called.
+ g_autoptr(GError) error = nullptr;
+ EXPECT_TRUE(fl_engine_start(engine, &error));
+ EXPECT_EQ(error, nullptr);
+
+ embedder_api->SendPlatformMessage =
+ MOCK_ENGINE_PROC(SendPlatformMessage,
+ ([](auto engine, const FlutterPlatformMessage* message) {
+ EXPECT_STREQ(message->channel, "test");
+ return kInternalInconsistency;
+ }));
+
+ g_autoptr(FlBinaryMessenger) messenger = fl_binary_messenger_new(engine);
+ fl_binary_messenger_send_on_channel(
+ messenger, "test", nullptr, nullptr,
+ [](GObject* object, GAsyncResult* result, gpointer user_data) {
+ g_autoptr(GError) error = nullptr;
+ g_autoptr(GBytes) message = fl_binary_messenger_send_on_channel_finish(
+ FL_BINARY_MESSENGER(object), result, &error);
+ EXPECT_EQ(message, nullptr);
+ EXPECT_NE(error, nullptr);
+ EXPECT_STREQ(error->message, "Failed to send platform messages");
+
+ g_main_loop_quit(static_cast<GMainLoop*>(user_data));
+ },
+ loop);
+
g_main_loop_run(loop);
}
-// Called when a message is received from the engine in the ReceiveMessage test.
-static void message_cb(FlBinaryMessenger* messenger,
- const gchar* channel,
- GBytes* message,
- FlBinaryMessengerResponseHandle* response_handle,
- gpointer user_data) {
- EXPECT_NE(message, nullptr);
- g_autofree gchar* text =
- g_strndup(static_cast<const gchar*>(g_bytes_get_data(message, nullptr)),
- g_bytes_get_size(message));
- EXPECT_STREQ(text, "Marco!");
+// Checks can receive a message.
+TEST(FlBinaryMessengerTest, Receive) {
+ g_autoptr(FlDartProject) project = fl_dart_project_new();
+ g_autoptr(FlEngine) engine = fl_engine_new(project);
+ FlutterEngineProcTable* embedder_api = fl_engine_get_embedder_api(engine);
- const char* response_text = "Polo!";
- g_autoptr(GBytes) response =
- g_bytes_new(response_text, strlen(response_text));
g_autoptr(GError) error = nullptr;
- EXPECT_TRUE(fl_binary_messenger_send_response(messenger, response_handle,
- response, &error));
+ EXPECT_TRUE(fl_engine_start(engine, &error));
EXPECT_EQ(error, nullptr);
+
+ bool called = false;
+ embedder_api->SendPlatformMessageResponse = MOCK_ENGINE_PROC(
+ SendPlatformMessageResponse,
+ ([&called](auto engine,
+ const FlutterPlatformMessageResponseHandle* handle,
+ const uint8_t* data, size_t data_length) {
+ called = true;
+
+ int fake_handle = *reinterpret_cast<const int*>(handle);
+ EXPECT_EQ(fake_handle, 42);
+
+ g_autofree gchar* text =
+ g_strndup(reinterpret_cast<const gchar*>(data), data_length);
+ EXPECT_STREQ(text, "Polo!");
+
+ return kSuccess;
+ }));
+
+ FlBinaryMessenger* messenger = fl_engine_get_binary_messenger(engine);
+
+ // Listen for message.
+ fl_binary_messenger_set_message_handler_on_channel(
+ messenger, "test",
+ [](FlBinaryMessenger* messenger, const gchar* channel, GBytes* message,
+ FlBinaryMessengerResponseHandle* response_handle, gpointer user_data) {
+ g_autofree gchar* text = g_strndup(
+ static_cast<const gchar*>(g_bytes_get_data(message, nullptr)),
+ g_bytes_get_size(message));
+ EXPECT_STREQ(text, "Marco!");
+
+ const char* response_text = "Polo!";
+ g_autoptr(GBytes) response =
+ g_bytes_new(response_text, strlen(response_text));
+ g_autoptr(GError) error = nullptr;
+ EXPECT_TRUE(fl_binary_messenger_send_response(
+ messenger, response_handle, response, &error));
+ EXPECT_EQ(error, nullptr);
+ },
+ nullptr, nullptr);
+
+ // Send message from engine.
+ const char* message_text = "Marco!";
+ g_autoptr(GBytes) message = g_bytes_new(message_text, strlen(message_text));
+ int fake_handle = 42;
+ fl_binary_messenger_handle_message(
+ messenger, "test", message,
+ reinterpret_cast<const FlutterPlatformMessageResponseHandle*>(
+ &fake_handle));
+
+ EXPECT_TRUE(called);
}
-// Called when a the test engine notifies us what response we sent in the
-// ReceiveMessage test.
-static void response_cb(FlBinaryMessenger* messenger,
- const gchar* channel,
- GBytes* message,
- FlBinaryMessengerResponseHandle* response_handle,
- gpointer user_data) {
- EXPECT_NE(message, nullptr);
- g_autofree gchar* text =
- g_strndup(static_cast<const gchar*>(g_bytes_get_data(message, nullptr)),
- g_bytes_get_size(message));
- EXPECT_STREQ(text, "Polo!");
-
- fl_binary_messenger_send_response(messenger, response_handle, nullptr,
- nullptr);
-
- g_main_loop_quit(static_cast<GMainLoop*>(user_data));
-}
-
-// Checks the shell able to receive and respond to messages from the engine.
-TEST(FlBinaryMessengerTest, ReceiveMessage) {
+// Checks receieved messages can be responded to on a thread.
+TEST(FlBinaryMessengerTest, ReceiveRespondThread) {
g_autoptr(GMainLoop) loop = g_main_loop_new(nullptr, 0);
- g_autoptr(FlEngine) engine = make_mock_engine();
- g_autoptr(FlBinaryMessenger) messenger = fl_binary_messenger_new(engine);
+ g_autoptr(FlDartProject) project = fl_dart_project_new();
+ g_autoptr(FlEngine) engine = fl_engine_new(project);
+ FlutterEngineProcTable* embedder_api = fl_engine_get_embedder_api(engine);
- // Listen for messages from the engine.
+ g_autoptr(GError) error = nullptr;
+ EXPECT_TRUE(fl_engine_start(engine, &error));
+ EXPECT_EQ(error, nullptr);
+
+ embedder_api->SendPlatformMessageResponse = MOCK_ENGINE_PROC(
+ SendPlatformMessageResponse,
+ ([&loop](auto engine, const FlutterPlatformMessageResponseHandle* handle,
+ const uint8_t* data, size_t data_length) {
+ int fake_handle = *reinterpret_cast<const int*>(handle);
+ EXPECT_EQ(fake_handle, 42);
+
+ g_autofree gchar* text =
+ g_strndup(reinterpret_cast<const gchar*>(data), data_length);
+ EXPECT_STREQ(text, "Polo!");
+
+ g_main_loop_quit(loop);
+
+ return kSuccess;
+ }));
+
+ FlBinaryMessenger* messenger = fl_engine_get_binary_messenger(engine);
+
+ // Listen for message.
fl_binary_messenger_set_message_handler_on_channel(
- messenger, "test/messages", message_cb, nullptr, nullptr);
+ messenger, "test",
+ [](FlBinaryMessenger* messenger, const gchar* channel, GBytes* message,
+ FlBinaryMessengerResponseHandle* response_handle, gpointer user_data) {
+ g_autofree gchar* text = g_strndup(
+ static_cast<const gchar*>(g_bytes_get_data(message, nullptr)),
+ g_bytes_get_size(message));
+ EXPECT_STREQ(text, "Marco!");
- // Listen for response from the engine.
- fl_binary_messenger_set_message_handler_on_channel(
- messenger, "test/responses", response_cb, loop, nullptr);
+ // Respond on a thread.
+ typedef struct {
+ FlBinaryMessenger* messenger;
+ FlBinaryMessengerResponseHandle* response_handle;
+ } ThreadData;
+ ThreadData* data = g_new0(ThreadData, 1);
+ data->messenger =
+ static_cast<FlBinaryMessenger*>(g_object_ref(messenger));
+ data->response_handle = static_cast<FlBinaryMessengerResponseHandle*>(
+ g_object_ref(response_handle));
+ g_autoptr(GThread) thread = g_thread_new(
+ nullptr,
+ [](gpointer user_data) {
+ g_autofree ThreadData* data = static_cast<ThreadData*>(user_data);
+ g_autoptr(FlBinaryMessenger) messenger = data->messenger;
+ g_autoptr(FlBinaryMessengerResponseHandle) response_handle =
+ data->response_handle;
- // Trigger the engine to send a message.
- const char* text = "Marco!";
- g_autoptr(GBytes) message = g_bytes_new(text, strlen(text));
- fl_binary_messenger_send_on_channel(messenger, "test/send-message", message,
- nullptr, nullptr, nullptr);
+ const char* response_text = "Polo!";
+ g_autoptr(GBytes) response =
+ g_bytes_new(response_text, strlen(response_text));
+ g_autoptr(GError) error = nullptr;
+ EXPECT_TRUE(fl_binary_messenger_send_response(
+ data->messenger, data->response_handle, response, &error));
+ EXPECT_EQ(error, nullptr);
- // Blocks here until response_cb is called.
+ return static_cast<gpointer>(nullptr);
+ },
+ data);
+ },
+ nullptr, nullptr);
+
+ // Send message from engine.
+ const char* message_text = "Marco!";
+ g_autoptr(GBytes) message = g_bytes_new(message_text, strlen(message_text));
+ int fake_handle = 42;
+ fl_binary_messenger_handle_message(
+ messenger, "test", message,
+ reinterpret_cast<const FlutterPlatformMessageResponseHandle*>(
+ &fake_handle));
+
g_main_loop_run(loop);
}
@@ -434,7 +384,8 @@
// Checks if the 'resize' command is sent and is well-formed.
TEST(FlBinaryMessengerTest, ResizeChannel) {
- g_autoptr(FlEngine) engine = make_mock_engine();
+ g_autoptr(FlDartProject) project = fl_dart_project_new();
+ g_autoptr(FlEngine) engine = fl_engine_new(project);
FlutterEngineProcTable* embedder_api = fl_engine_get_embedder_api(engine);
bool called = false;
@@ -481,7 +432,8 @@
// Checks if the 'overflow' command is sent and is well-formed.
TEST(FlBinaryMessengerTest, WarnsOnOverflowChannel) {
- g_autoptr(FlEngine) engine = make_mock_engine();
+ g_autoptr(FlDartProject) project = fl_dart_project_new();
+ g_autoptr(FlEngine) engine = fl_engine_new(project);
FlutterEngineProcTable* embedder_api = fl_engine_get_embedder_api(engine);
bool called = false;
@@ -526,26 +478,21 @@
EXPECT_TRUE(called);
}
-static gboolean quit_main_loop_cb(gpointer user_data) {
- g_main_loop_quit(static_cast<GMainLoop*>(user_data));
- return FALSE;
-}
-
// Checks if error returned when invoking a command on the control channel
// are handled.
TEST(FlBinaryMessengerTest, ControlChannelErrorResponse) {
g_autoptr(GMainLoop) loop = g_main_loop_new(nullptr, 0);
- g_autoptr(FlEngine) engine = make_mock_engine();
- g_autoptr(FlBinaryMessenger) messenger = fl_binary_messenger_new(engine);
+
+ g_autoptr(FlDartProject) project = fl_dart_project_new();
+ g_autoptr(FlEngine) engine = fl_engine_new(project);
+ FlutterEngineProcTable* embedder_api = fl_engine_get_embedder_api(engine);
g_autoptr(GError) error = nullptr;
EXPECT_TRUE(fl_engine_start(engine, &error));
EXPECT_EQ(error, nullptr);
- FlutterEngineProcTable* embedder_api = fl_engine_get_embedder_api(engine);
-
+ g_autoptr(FlBinaryMessenger) messenger = fl_binary_messenger_new(engine);
bool called = false;
-
FlutterEngineSendPlatformMessageFnPtr old_handler =
embedder_api->SendPlatformMessage;
embedder_api->SendPlatformMessage = MOCK_ENGINE_PROC(
@@ -561,7 +508,12 @@
// Register a callback to quit the main loop when binary messenger work
// ends.
- g_idle_add(quit_main_loop_cb, loop);
+ g_idle_add(
+ [](gpointer user_data) {
+ g_main_loop_quit(static_cast<GMainLoop*>(user_data));
+ return FALSE;
+ },
+ loop);
// Simulates an internal error.
return kInvalidArguments;
@@ -572,102 +524,32 @@
EXPECT_TRUE(called);
- // Blocks here until quit_main_loop_cb is called.
g_main_loop_run(loop);
}
// NOLINTEND(clang-analyzer-core.StackAddressEscape)
-struct RespondsOnBackgroundThreadInfo {
- FlBinaryMessenger* messenger;
- FlBinaryMessengerResponseHandle* response_handle;
- GMainLoop* loop;
-};
-
-static gboolean cleanup_responds_on_background_thread_info(gpointer user_data) {
- RespondsOnBackgroundThreadInfo* info =
- static_cast<RespondsOnBackgroundThreadInfo*>(user_data);
- GMainLoop* loop = info->loop;
-
- g_object_unref(info->messenger);
- g_object_unref(info->response_handle);
- free(info);
-
- g_main_loop_quit(static_cast<GMainLoop*>(loop));
-
- return G_SOURCE_REMOVE;
-}
-
-static void* response_from_thread_main(void* user_data) {
- RespondsOnBackgroundThreadInfo* info =
- static_cast<RespondsOnBackgroundThreadInfo*>(user_data);
-
- fl_binary_messenger_send_response(info->messenger, info->response_handle,
- nullptr, nullptr);
-
- g_idle_add(cleanup_responds_on_background_thread_info, info);
-
- return nullptr;
-}
-
-static void response_from_thread_cb(
- FlBinaryMessenger* messenger,
- const gchar* channel,
- GBytes* message,
- FlBinaryMessengerResponseHandle* response_handle,
- gpointer user_data) {
- EXPECT_NE(message, nullptr);
- pthread_t thread;
- RespondsOnBackgroundThreadInfo* info =
- static_cast<RespondsOnBackgroundThreadInfo*>(
- malloc(sizeof(RespondsOnBackgroundThreadInfo)));
- info->messenger = FL_BINARY_MESSENGER(g_object_ref(messenger));
- info->response_handle =
- FL_BINARY_MESSENGER_RESPONSE_HANDLE(g_object_ref(response_handle));
- info->loop = static_cast<GMainLoop*>(user_data);
- EXPECT_EQ(0,
- pthread_create(&thread, nullptr, &response_from_thread_main, info));
-}
-
-TEST(FlBinaryMessengerTest, RespondOnBackgroundThread) {
- g_autoptr(GMainLoop) loop = g_main_loop_new(nullptr, 0);
-
- g_autoptr(FlEngine) engine = make_mock_engine();
- g_autoptr(FlBinaryMessenger) messenger = fl_binary_messenger_new(engine);
-
- // Listen for messages from the engine.
- fl_binary_messenger_set_message_handler_on_channel(
- messenger, "test/messages", message_cb, nullptr, nullptr);
-
- // Listen for response from the engine.
- fl_binary_messenger_set_message_handler_on_channel(
- messenger, "test/responses", response_from_thread_cb, loop, nullptr);
-
- // Trigger the engine to send a message.
- const char* text = "Marco!";
- g_autoptr(GBytes) message = g_bytes_new(text, strlen(text));
- fl_binary_messenger_send_on_channel(messenger, "test/send-message", message,
- nullptr, nullptr, nullptr);
-
- // Blocks here until response_cb is called.
- g_main_loop_run(loop);
-}
-
-static void kill_handler_notify_cb(gpointer was_called) {
- *static_cast<gboolean*>(was_called) = TRUE;
-}
-
TEST(FlBinaryMessengerTest, DeletingEngineClearsHandlers) {
- FlEngine* engine = make_mock_engine();
- FlBinaryMessenger* messenger = fl_engine_get_binary_messenger(engine);
- gboolean was_killed = FALSE;
+ g_autoptr(FlDartProject) project = fl_dart_project_new();
+ g_autoptr(FlEngine) engine = fl_engine_new(project);
- // Listen for messages from the engine.
- fl_binary_messenger_set_message_handler_on_channel(messenger, "test/messages",
- message_cb, &was_killed,
- kill_handler_notify_cb);
+ g_autoptr(GError) error = nullptr;
+ EXPECT_TRUE(fl_engine_start(engine, &error));
+ EXPECT_EQ(error, nullptr);
+
+ FlBinaryMessenger* messenger = fl_engine_get_binary_messenger(engine);
+
+ // Add handler to check the destroy_notify is called.
+ gboolean destroy_notify_called = FALSE;
+ fl_binary_messenger_set_message_handler_on_channel(
+ messenger, "test",
+ [](FlBinaryMessenger* messenger, const gchar* channel, GBytes* message,
+ FlBinaryMessengerResponseHandle* response_handle,
+ gpointer user_data) {},
+ &destroy_notify_called,
+ [](gpointer user_data) { *static_cast<gboolean*>(user_data) = TRUE; });
g_clear_object(&engine);
- ASSERT_TRUE(was_killed);
+ ASSERT_TRUE(destroy_notify_called);
}
diff --git a/shell/platform/linux/testing/mock_engine.cc b/shell/platform/linux/testing/mock_engine.cc
index 5db5d37..b1806e8 100644
--- a/shell/platform/linux/testing/mock_engine.cc
+++ b/shell/platform/linux/testing/mock_engine.cc
@@ -96,56 +96,6 @@
namespace {
-// Send a response from the engine.
-static void send_response(
- FLUTTER_API_SYMBOL(FlutterEngine) engine,
- const std::string& channel,
- const FlutterPlatformMessageResponseHandle* response_handle,
- const uint8_t* message,
- size_t message_size) {
- if (response_handle == nullptr) {
- return;
- }
-
- FlutterTask task;
- task.runner = new _FlutterTaskRunner(1234, channel, response_handle, message,
- message_size);
- task.task = task.runner->task;
- engine->platform_post_task_callback(task, 0, engine->user_data);
-}
-
-// Send a message from the engine.
-static void send_message(FLUTTER_API_SYMBOL(FlutterEngine) engine,
- const std::string& channel,
- const uint8_t* message,
- size_t message_size) {
- FlutterTask task;
- task.runner =
- new _FlutterTaskRunner(1234, channel, nullptr, message, message_size);
- task.task = task.runner->task;
- engine->platform_post_task_callback(task, 0, engine->user_data);
-}
-
-static void invoke_method(FLUTTER_API_SYMBOL(FlutterEngine) engine,
- const std::string& channel,
- const gchar* name,
- FlValue* args) {
- g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
- g_autoptr(GError) error = nullptr;
- g_autoptr(GBytes) message = fl_method_codec_encode_method_call(
- FL_METHOD_CODEC(codec), name, args, &error);
- EXPECT_NE(message, nullptr);
- EXPECT_EQ(error, nullptr);
-
- FlutterTask task;
- task.runner = new _FlutterTaskRunner(
- 1234, channel, nullptr,
- static_cast<const uint8_t*>(g_bytes_get_data(message, nullptr)),
- g_bytes_get_size(message));
- task.task = task.runner->task;
- engine->platform_post_task_callback(task, 0, engine->user_data);
-}
-
FlutterEngineResult FlutterEngineCreateAOTData(
const FlutterEngineAOTDataSource* source,
FlutterEngineAOTData* data_out) {
@@ -247,117 +197,6 @@
const FlutterPlatformMessage* message) {
EXPECT_TRUE(engine->running);
- if (strcmp(message->channel, "test/echo") == 0) {
- // Responds with the same message received.
- send_response(engine, message->channel, message->response_handle,
- message->message, message->message_size);
- } else if (strcmp(message->channel, "test/send-message") == 0) {
- // Triggers the engine to send a message.
- send_response(engine, message->channel, message->response_handle, nullptr,
- 0);
- send_message(engine, "test/messages", message->message,
- message->message_size);
- } else if (strcmp(message->channel, "test/standard-method") == 0) {
- g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
- g_autoptr(GBytes) m = g_bytes_new(message->message, message->message_size);
- g_autofree gchar* name = nullptr;
- g_autoptr(FlValue) args = nullptr;
- g_autoptr(GError) error = nullptr;
- EXPECT_TRUE(fl_method_codec_decode_method_call(FL_METHOD_CODEC(codec), m,
- &name, &args, &error));
- EXPECT_EQ(error, nullptr);
-
- g_autoptr(GBytes) response = nullptr;
- if (strcmp(name, "Echo") == 0) {
- // Returns args as a success result.
- response = fl_method_codec_encode_success_envelope(FL_METHOD_CODEC(codec),
- args, &error);
- EXPECT_EQ(error, nullptr);
- } else if (strcmp(name, "Error") == 0) {
- // Returns an error result.
- const gchar* code = nullptr;
- const gchar* message = nullptr;
- FlValue* details = nullptr;
- if (fl_value_get_length(args) >= 2) {
- FlValue* code_value = fl_value_get_list_value(args, 0);
- EXPECT_EQ(fl_value_get_type(code_value), FL_VALUE_TYPE_STRING);
- code = fl_value_get_string(code_value);
- FlValue* message_value = fl_value_get_list_value(args, 1);
- message = fl_value_get_type(message_value) == FL_VALUE_TYPE_STRING
- ? fl_value_get_string(message_value)
- : nullptr;
- }
- if (fl_value_get_length(args) >= 3) {
- details = fl_value_get_list_value(args, 2);
- }
- response = fl_method_codec_encode_error_envelope(
- FL_METHOD_CODEC(codec), code, message, details, &error);
- EXPECT_EQ(error, nullptr);
- } else if (strcmp(name, "InvokeMethod") == 0) {
- // Gets the engine to call the shell.
- if (fl_value_get_length(args) == 3) {
- FlValue* channel_value = fl_value_get_list_value(args, 0);
- EXPECT_EQ(fl_value_get_type(channel_value), FL_VALUE_TYPE_STRING);
- const gchar* channel = fl_value_get_string(channel_value);
- FlValue* name_value = fl_value_get_list_value(args, 1);
- EXPECT_EQ(fl_value_get_type(name_value), FL_VALUE_TYPE_STRING);
- const gchar* name = fl_value_get_string(name_value);
- FlValue* method_args = fl_value_get_list_value(args, 2);
- invoke_method(engine, channel, name, method_args);
- }
- response = fl_method_codec_encode_success_envelope(FL_METHOD_CODEC(codec),
- nullptr, &error);
- EXPECT_EQ(error, nullptr);
- } else {
- // Returns "not implemented".
- response = g_bytes_new(nullptr, 0);
- }
-
- send_response(
- engine, message->channel, message->response_handle,
- static_cast<const uint8_t*>(g_bytes_get_data(response, nullptr)),
- g_bytes_get_size(response));
- } else if (strcmp(message->channel, "test/nullptr-response") == 0) {
- // Sends a null response.
- send_response(engine, message->channel, message->response_handle, nullptr,
- 0);
- } else if (strcmp(message->channel, "test/failure") == 0) {
- // Generates an internal error.
- return kInternalInconsistency;
- } else if (strcmp(message->channel, "test/key-event-handled") == 0 ||
- strcmp(message->channel, "test/key-event-not-handled") == 0) {
- bool value = strcmp(message->channel, "test/key-event-handled") == 0;
- g_autoptr(FlJsonMessageCodec) codec = fl_json_message_codec_new();
- g_autoptr(FlValue) handledValue = fl_value_new_map();
- fl_value_set_string_take(handledValue, "handled", fl_value_new_bool(value));
- g_autoptr(GBytes) response = fl_message_codec_encode_message(
- FL_MESSAGE_CODEC(codec), handledValue, nullptr);
- send_response(
- engine, message->channel, message->response_handle,
- static_cast<const uint8_t*>(g_bytes_get_data(response, nullptr)),
- g_bytes_get_size(response));
- } else if (strcmp(message->channel, "test/key-event-delayed") == 0) {
- static std::unique_ptr<const FlutterPlatformMessageResponseHandle>
- delayed_response_handle = nullptr;
- g_autoptr(FlJsonMessageCodec) codec = fl_json_message_codec_new();
- g_autoptr(FlValue) handledValue = fl_value_new_map();
- fl_value_set_string_take(handledValue, "handled", fl_value_new_bool(true));
- g_autoptr(GBytes) response = fl_message_codec_encode_message(
- FL_MESSAGE_CODEC(codec), handledValue, nullptr);
- if (delayed_response_handle == nullptr) {
- delayed_response_handle.reset(message->response_handle);
- } else {
- send_response(
- engine, message->channel, message->response_handle,
- static_cast<const uint8_t*>(g_bytes_get_data(response, nullptr)),
- g_bytes_get_size(response));
- send_response(
- engine, message->channel, delayed_response_handle.release(),
- static_cast<const uint8_t*>(g_bytes_get_data(response, nullptr)),
- g_bytes_get_size(response));
- }
- }
-
return kSuccess;
}
@@ -401,11 +240,6 @@
EXPECT_TRUE(engine->running);
- // Send a message so the shell can check the responses received.
- if (handle->channel != "test/responses") {
- send_message(engine, "test/responses", data, data_length);
- }
-
EXPECT_FALSE(handle->released);
delete handle;