7#include "gtest/gtest.h"
26 void* response_callback_user_data;
29 PlatformMessageCreateResponseHandle,
30 ([&response_callback, &response_callback_user_data](
33 response_callback = data_callback;
39 ([&response_callback, &response_callback_user_data](
41 EXPECT_STREQ(
message->channel,
"test");
42 g_autofree gchar*
text =
43 g_strndup(
reinterpret_cast<const gchar*
>(
message->message),
45 EXPECT_STREQ(
text,
"Marco!");
47 const gchar* response =
"Polo!";
48 response_callback(
reinterpret_cast<const uint8_t*
>(response),
49 strlen(response), response_callback_user_data);
55 const char*
text =
"Marco!";
58 messenger,
"test",
message,
nullptr,
59 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
62 FL_BINARY_MESSENGER(
object), result, &
error);
64 EXPECT_EQ(
error,
nullptr);
66 g_autofree gchar*
text = g_strndup(
67 static_cast<const gchar*
>(g_bytes_get_data(
message,
nullptr)),
69 EXPECT_STREQ(
text,
"Polo!");
71 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
75 g_main_loop_run(loop);
88 EXPECT_STREQ(
message->channel,
"test");
91 EXPECT_EQ(
message->message_size,
static_cast<size_t>(0));
112 EXPECT_STREQ(
message->channel,
"test");
113 EXPECT_EQ(
message->message_size,
static_cast<size_t>(0));
129 void* response_callback_user_data;
132 PlatformMessageCreateResponseHandle,
133 ([&response_callback, &response_callback_user_data](
136 response_callback = data_callback;
142 ([&response_callback, &response_callback_user_data](
144 EXPECT_STREQ(
message->channel,
"test");
145 g_autofree gchar*
text =
146 g_strndup(
reinterpret_cast<const gchar*
>(
message->message),
148 EXPECT_STREQ(
text,
"Hello World!");
150 response_callback(
nullptr, 0, response_callback_user_data);
156 const char*
text =
"Hello World!";
159 messenger,
"test",
message,
nullptr,
160 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
163 FL_BINARY_MESSENGER(
object), result, &
error);
165 EXPECT_EQ(
error,
nullptr);
167 EXPECT_EQ(g_bytes_get_size(
message),
static_cast<gsize
>(0));
169 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
173 g_main_loop_run(loop);
183 EXPECT_STREQ(
message->channel,
"test");
189 messenger,
"test",
nullptr,
nullptr,
190 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
193 FL_BINARY_MESSENGER(
object), result, &
error);
195 EXPECT_NE(
error,
nullptr);
196 EXPECT_STREQ(
error->message,
"Failed to send platform messages");
198 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
202 g_main_loop_run(loop);
212 SendPlatformMessageResponse,
215 const uint8_t* data,
size_t data_length) {
218 int fake_handle = *
reinterpret_cast<const int*
>(handle);
219 EXPECT_EQ(fake_handle, 42);
221 g_autofree gchar*
text =
222 g_strndup(
reinterpret_cast<const gchar*
>(data), data_length);
223 EXPECT_STREQ(
text,
"Polo!");
233 [](FlBinaryMessenger* messenger,
const gchar*
channel, GBytes*
message,
234 FlBinaryMessengerResponseHandle* response_handle, gpointer
user_data) {
235 g_autofree gchar*
text = g_strndup(
236 static_cast<const gchar*
>(g_bytes_get_data(
message,
nullptr)),
238 EXPECT_STREQ(
text,
"Marco!");
240 const char* response_text =
"Polo!";
242 g_bytes_new(response_text, strlen(response_text));
245 messenger, response_handle, response, &
error));
246 EXPECT_EQ(
error,
nullptr);
251 const char* message_text =
"Marco!";
252 g_autoptr(GBytes)
message = g_bytes_new(message_text, strlen(message_text));
253 int fake_handle = 42;
268 SendPlatformMessageResponse,
271 const uint8_t* data,
size_t data_length) {
272 int fake_handle = *
reinterpret_cast<const int*
>(handle);
273 EXPECT_EQ(fake_handle, 42);
275 g_autofree gchar*
text =
276 g_strndup(
reinterpret_cast<const gchar*
>(data), data_length);
277 EXPECT_STREQ(
text,
"Polo!");
279 g_main_loop_quit(loop);
289 [](FlBinaryMessenger* messenger,
const gchar*
channel, GBytes*
message,
290 FlBinaryMessengerResponseHandle* response_handle, gpointer
user_data) {
291 g_autofree gchar*
text = g_strndup(
292 static_cast<const gchar*
>(g_bytes_get_data(
message,
nullptr)),
294 EXPECT_STREQ(
text,
"Marco!");
298 FlBinaryMessenger* messenger;
299 FlBinaryMessengerResponseHandle* response_handle;
301 ThreadData* data = g_new0(ThreadData, 1);
303 static_cast<FlBinaryMessenger*
>(g_object_ref(messenger));
304 data->response_handle =
static_cast<FlBinaryMessengerResponseHandle*
>(
305 g_object_ref(response_handle));
306 g_autoptr(GThread) thread = g_thread_new(
309 g_autofree ThreadData* data =
static_cast<ThreadData*
>(
user_data);
310 g_autoptr(FlBinaryMessenger) messenger = data->messenger;
311 g_autoptr(FlBinaryMessengerResponseHandle) response_handle =
312 data->response_handle;
314 const char* response_text =
"Polo!";
316 g_bytes_new(response_text, strlen(response_text));
319 data->messenger, data->response_handle, response, &
error));
320 EXPECT_EQ(
error,
nullptr);
322 return static_cast<gpointer
>(
nullptr);
329 const char* message_text =
"Marco!";
330 g_autoptr(GBytes)
message = g_bytes_new(message_text, strlen(message_text));
331 int fake_handle = 42;
337 g_main_loop_run(loop);
351 ([&called, old_handler](
auto engine,
354 if (strcmp(
message->channel,
"dev.flutter/channel-buffers") != 0) {
355 return old_handler(engine, message);
363 const int expected_message_size = 29;
364 EXPECT_EQ(
message->message_size,
365 static_cast<size_t>(expected_message_size));
366 int expected[expected_message_size] = {
367 7, 6, 114, 101, 115, 105, 122, 101, 12, 2,
368 7, 12, 102, 108, 117, 116, 116, 101, 114, 47,
369 116, 101, 115, 116, 3, 3, 0, 0, 0};
370 for (
size_t i = 0;
i < expected_message_size;
i++) {
371 EXPECT_EQ(
message->message[
i], expected[
i]);
393 ([&called, old_handler](
auto engine,
396 if (strcmp(
message->channel,
"dev.flutter/channel-buffers") != 0) {
397 return old_handler(engine, message);
405 const int expected_message_size = 27;
406 EXPECT_EQ(
message->message_size,
407 static_cast<size_t>(expected_message_size));
408 int expected[expected_message_size] = {
409 7, 8, 111, 118, 101, 114, 102, 108, 111, 119, 12, 2, 7, 12,
410 102, 108, 117, 116, 116, 101, 114, 47, 116, 101, 115, 116, 1};
411 for (
size_t i = 0;
i < expected_message_size;
i++) {
412 EXPECT_EQ(
message->message[
i], expected[
i]);
438 ([&called, old_handler,
this](
auto engine,
441 if (strcmp(
message->channel,
"dev.flutter/channel-buffers") != 0) {
442 return old_handler(engine, message);
451 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
452 return G_SOURCE_REMOVE;
465 g_main_loop_run(loop);
476 gboolean destroy_notify_called = FALSE;
479 [](FlBinaryMessenger* messenger,
const gchar*
channel, GBytes*
message,
480 FlBinaryMessengerResponseHandle* response_handle,
482 &destroy_notify_called,
487 ASSERT_TRUE(destroy_notify_called);
void(* FlutterDataCallback)(const uint8_t *, size_t, void *)
FlutterEngineResult(* FlutterEngineSendPlatformMessageFnPtr)(FLUTTER_API_SYMBOL(FlutterEngine) engine, const FlutterPlatformMessage *message)
g_autoptr(FlEngine) engine
G_MODULE_EXPORT GBytes * fl_binary_messenger_send_on_channel_finish(FlBinaryMessenger *self, GAsyncResult *result, GError **error)
G_MODULE_EXPORT void fl_binary_messenger_resize_channel(FlBinaryMessenger *self, const gchar *channel, int64_t new_size)
G_MODULE_EXPORT void fl_binary_messenger_set_message_handler_on_channel(FlBinaryMessenger *self, const gchar *channel, FlBinaryMessengerMessageHandler handler, gpointer user_data, GDestroyNotify destroy_notify)
G_MODULE_EXPORT void fl_binary_messenger_send_on_channel(FlBinaryMessenger *self, const gchar *channel, GBytes *message, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
FlBinaryMessenger * fl_binary_messenger_new(FlEngine *engine)
G_MODULE_EXPORT gboolean fl_binary_messenger_send_response(FlBinaryMessenger *self, FlBinaryMessengerResponseHandle *response_handle, GBytes *response, GError **error)
G_MODULE_EXPORT void fl_binary_messenger_set_warns_on_channel_overflow(FlBinaryMessenger *self, const gchar *channel, bool warns)
gboolean fl_binary_messenger_handle_message(FlBinaryMessenger *messenger, const gchar *channel, GBytes *message, const FlutterPlatformMessageResponseHandle *response_handle)
TEST_F(FlBinaryMessengerTest, Send)
FlutterEngineProcTable * fl_engine_get_embedder_api(FlEngine *self)
G_MODULE_EXPORT FlBinaryMessenger * fl_engine_get_binary_messenger(FlEngine *self)
const uint8_t uint32_t uint32_t GError ** error
#define MOCK_ENGINE_PROC(proc, mock_impl)
FlutterEngineSendPlatformMessageFnPtr SendPlatformMessage
FlutterEnginePlatformMessageCreateResponseHandleFnPtr PlatformMessageCreateResponseHandle
FlutterEngineSendPlatformMessageResponseFnPtr SendPlatformMessageResponse