6#include "gtest/gtest.h"
19TEST(FlBinaryMessengerTest, Send) {
20 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
27 EXPECT_EQ(
error,
nullptr);
30 void* response_callback_user_data;
33 PlatformMessageCreateResponseHandle,
34 ([&response_callback, &response_callback_user_data](
37 response_callback = data_callback;
43 ([&response_callback, &response_callback_user_data](
45 EXPECT_STREQ(
message->channel,
"test");
46 g_autofree gchar*
text =
47 g_strndup(
reinterpret_cast<const gchar*
>(
message->message),
49 EXPECT_STREQ(
text,
"Marco!");
51 const gchar* response =
"Polo!";
52 response_callback(
reinterpret_cast<const uint8_t*
>(response),
53 strlen(response), response_callback_user_data);
59 const char*
text =
"Marco!";
62 messenger,
"test",
message,
nullptr,
63 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
66 FL_BINARY_MESSENGER(
object), result, &
error);
68 EXPECT_EQ(
error,
nullptr);
70 g_autofree gchar*
text = g_strndup(
71 static_cast<const gchar*
>(g_bytes_get_data(
message,
nullptr)),
73 EXPECT_STREQ(
text,
"Polo!");
75 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
79 g_main_loop_run(loop);
83TEST(FlBinaryMessengerTest, SendNullptr) {
89 EXPECT_EQ(
error,
nullptr);
97 EXPECT_STREQ(
message->channel,
"test");
100 EXPECT_EQ(
message->message_size,
static_cast<size_t>(0));
112TEST(FlBinaryMessengerTest, SendEmpty) {
118 EXPECT_EQ(
error,
nullptr);
126 EXPECT_STREQ(
message->channel,
"test");
127 EXPECT_EQ(
message->message_size,
static_cast<size_t>(0));
139TEST(FlBinaryMessengerTest, NullptrResponse) {
140 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
147 EXPECT_EQ(
error,
nullptr);
150 void* response_callback_user_data;
153 PlatformMessageCreateResponseHandle,
154 ([&response_callback, &response_callback_user_data](
157 response_callback = data_callback;
163 ([&response_callback, &response_callback_user_data](
165 EXPECT_STREQ(
message->channel,
"test");
166 g_autofree gchar*
text =
167 g_strndup(
reinterpret_cast<const gchar*
>(
message->message),
169 EXPECT_STREQ(
text,
"Hello World!");
171 response_callback(
nullptr, 0, response_callback_user_data);
177 const char*
text =
"Hello World!";
180 messenger,
"test",
message,
nullptr,
181 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
184 FL_BINARY_MESSENGER(
object), result, &
error);
186 EXPECT_EQ(
error,
nullptr);
188 EXPECT_EQ(g_bytes_get_size(
message),
static_cast<gsize
>(0));
190 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
194 g_main_loop_run(loop);
198TEST(FlBinaryMessengerTest, SendFailure) {
199 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
206 EXPECT_EQ(
error,
nullptr);
211 EXPECT_STREQ(
message->channel,
"test");
217 messenger,
"test",
nullptr,
nullptr,
218 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
221 FL_BINARY_MESSENGER(
object), result, &
error);
223 EXPECT_NE(
error,
nullptr);
224 EXPECT_STREQ(
error->message,
"Failed to send platform messages");
226 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
230 g_main_loop_run(loop);
234TEST(FlBinaryMessengerTest, Receive) {
240 EXPECT_EQ(
error,
nullptr);
245 SendPlatformMessageResponse,
248 const uint8_t*
data,
size_t data_length) {
251 int fake_handle = *
reinterpret_cast<const int*
>(handle);
252 EXPECT_EQ(fake_handle, 42);
254 g_autofree gchar*
text =
255 g_strndup(
reinterpret_cast<const gchar*
>(
data), data_length);
256 EXPECT_STREQ(
text,
"Polo!");
266 [](FlBinaryMessenger* messenger,
const gchar*
channel, GBytes*
message,
267 FlBinaryMessengerResponseHandle* response_handle, gpointer
user_data) {
268 g_autofree gchar*
text = g_strndup(
269 static_cast<const gchar*
>(g_bytes_get_data(
message,
nullptr)),
271 EXPECT_STREQ(
text,
"Marco!");
273 const char* response_text =
"Polo!";
275 g_bytes_new(response_text, strlen(response_text));
278 messenger, response_handle, response, &
error));
279 EXPECT_EQ(
error,
nullptr);
284 const char* message_text =
"Marco!";
285 g_autoptr(GBytes)
message = g_bytes_new(message_text, strlen(message_text));
286 int fake_handle = 42;
296TEST(FlBinaryMessengerTest, ReceiveRespondThread) {
297 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
304 EXPECT_EQ(
error,
nullptr);
308 SendPlatformMessageResponse,
311 const uint8_t*
data,
size_t data_length) {
312 int fake_handle = *
reinterpret_cast<const int*
>(handle);
313 EXPECT_EQ(fake_handle, 42);
315 g_autofree gchar*
text =
316 g_strndup(
reinterpret_cast<const gchar*
>(
data), data_length);
317 EXPECT_STREQ(
text,
"Polo!");
319 g_main_loop_quit(loop);
329 [](FlBinaryMessenger* messenger,
const gchar*
channel, GBytes*
message,
330 FlBinaryMessengerResponseHandle* response_handle, gpointer
user_data) {
331 g_autofree gchar*
text = g_strndup(
332 static_cast<const gchar*
>(g_bytes_get_data(
message,
nullptr)),
334 EXPECT_STREQ(
text,
"Marco!");
338 FlBinaryMessenger* messenger;
339 FlBinaryMessengerResponseHandle* response_handle;
341 ThreadData*
data = g_new0(ThreadData, 1);
343 static_cast<FlBinaryMessenger*
>(g_object_ref(messenger));
344 data->response_handle =
static_cast<FlBinaryMessengerResponseHandle*
>(
345 g_object_ref(response_handle));
346 g_autoptr(GThread) thread = g_thread_new(
349 g_autofree ThreadData*
data =
static_cast<ThreadData*
>(
user_data);
351 g_autoptr(FlBinaryMessengerResponseHandle) response_handle =
352 data->response_handle;
354 const char* response_text =
"Polo!";
356 g_bytes_new(response_text, strlen(response_text));
360 EXPECT_EQ(
error,
nullptr);
362 return static_cast<gpointer
>(
nullptr);
369 const char* message_text =
"Marco!";
370 g_autoptr(GBytes)
message = g_bytes_new(message_text, strlen(message_text));
371 int fake_handle = 42;
377 g_main_loop_run(loop);
384TEST(FlBinaryMessengerTest, ResizeChannel) {
394 ([&called, old_handler](
auto engine,
397 if (strcmp(
message->channel,
"dev.flutter/channel-buffers") != 0) {
398 return old_handler(engine, message);
406 const int expected_message_size = 29;
407 EXPECT_EQ(
message->message_size,
408 static_cast<size_t>(expected_message_size));
409 int expected[expected_message_size] = {
410 7, 6, 114, 101, 115, 105, 122, 101, 12, 2,
411 7, 12, 102, 108, 117, 116, 116, 101, 114, 47,
412 116, 101, 115, 116, 3, 3, 0, 0, 0};
413 for (
size_t i = 0;
i < expected_message_size;
i++) {
414 EXPECT_EQ(
message->message[
i], expected[
i]);
422 EXPECT_EQ(
error,
nullptr);
431TEST(FlBinaryMessengerTest, WarnsOnOverflowChannel) {
441 ([&called, old_handler](
auto engine,
444 if (strcmp(
message->channel,
"dev.flutter/channel-buffers") != 0) {
445 return old_handler(engine, message);
453 const int expected_message_size = 27;
454 EXPECT_EQ(
message->message_size,
455 static_cast<size_t>(expected_message_size));
456 int expected[expected_message_size] = {
457 7, 8, 111, 118, 101, 114, 102, 108, 111, 119, 12, 2, 7, 12,
458 102, 108, 117, 116, 116, 101, 114, 47, 116, 101, 115, 116, 1};
459 for (
size_t i = 0;
i < expected_message_size;
i++) {
460 EXPECT_EQ(
message->message[
i], expected[
i]);
468 EXPECT_EQ(
error,
nullptr);
479TEST(FlBinaryMessengerTest, ControlChannelErrorResponse) {
480 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
487 EXPECT_EQ(
error,
nullptr);
495 ([&called, old_handler, loop](
auto engine,
498 if (strcmp(
message->channel,
"dev.flutter/channel-buffers") != 0) {
499 return old_handler(engine, message);
508 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
522 g_main_loop_run(loop);
527TEST(FlBinaryMessengerTest, DeletingEngineClearsHandlers) {
533 EXPECT_EQ(
error,
nullptr);
538 gboolean destroy_notify_called = FALSE;
541 [](FlBinaryMessenger* messenger,
const gchar*
channel, GBytes*
message,
542 FlBinaryMessengerResponseHandle* response_handle,
544 &destroy_notify_called,
549 ASSERT_TRUE(destroy_notify_called);
void(* FlutterDataCallback)(const uint8_t *, size_t, void *)
FlutterEngineResult(* FlutterEngineSendPlatformMessageFnPtr)(FLUTTER_API_SYMBOL(FlutterEngine) engine, const FlutterPlatformMessage *message)
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(FlBinaryMessengerTest, Send)
g_autoptr(GMutexLocker) locker
G_MODULE_EXPORT FlDartProject * fl_dart_project_new()
G_MODULE_EXPORT FlEngine * fl_engine_new(FlDartProject *project)
FlutterEngineProcTable * fl_engine_get_embedder_api(FlEngine *self)
G_MODULE_EXPORT FlBinaryMessenger * fl_engine_get_binary_messenger(FlEngine *self)
gboolean fl_engine_start(FlEngine *self, GError **error)
G_BEGIN_DECLS GBytes * message
const uint8_t uint32_t uint32_t GError ** error
#define MOCK_ENGINE_PROC(proc, mock_impl)
FlutterEngineSendPlatformMessageFnPtr SendPlatformMessage
FlutterEnginePlatformMessageCreateResponseHandleFnPtr PlatformMessageCreateResponseHandle
FlutterEngineSendPlatformMessageResponseFnPtr SendPlatformMessageResponse
std::shared_ptr< const fml::Mapping > data