6 #include "gtest/gtest.h"
11 #include "flutter/shell/platform/linux/testing/fl_mock_binary_messenger.h"
14 TEST(FlMethodChannelTest, InvokeMethod) {
15 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
17 g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
18 fl_mock_binary_messenger_set_standard_method_channel(
20 [](FlMockBinaryMessenger* messenger, GTask* task,
const gchar* name,
22 EXPECT_STREQ(name,
"Test");
32 FL_BINARY_MESSENGER(messenger),
"test", FL_METHOD_CODEC(codec));
36 channel,
"Test",
args,
nullptr,
37 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
38 g_autoptr(GError)
error =
nullptr;
39 g_autoptr(FlMethodResponse) response =
42 EXPECT_NE(response,
nullptr);
43 EXPECT_EQ(
error,
nullptr);
46 EXPECT_NE(r,
nullptr);
47 EXPECT_EQ(
error,
nullptr);
52 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
56 g_main_loop_run(loop);
60 TEST(FlMethodChannelTest, InvokeMethodNullptrArgsMessage) {
61 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
63 g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
64 fl_mock_binary_messenger_set_standard_method_channel(
66 [](FlMockBinaryMessenger* messenger, GTask* task,
const gchar* name,
68 EXPECT_STREQ(name,
"Test");
76 FL_BINARY_MESSENGER(messenger),
"test", FL_METHOD_CODEC(codec));
79 channel,
"Test",
nullptr,
nullptr,
80 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
81 g_autoptr(GError)
error =
nullptr;
82 g_autoptr(FlMethodResponse) response =
85 EXPECT_NE(response,
nullptr);
86 EXPECT_EQ(
error,
nullptr);
89 EXPECT_NE(r,
nullptr);
90 EXPECT_EQ(
error,
nullptr);
93 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
97 g_main_loop_run(loop);
101 TEST(FlMethodChannelTest, InvokeMethodError) {
102 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
104 g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
105 fl_mock_binary_messenger_set_standard_method_channel(
107 [](FlMockBinaryMessenger* messenger, GTask* task,
const gchar* name,
109 EXPECT_STREQ(name,
"Test");
111 return FL_METHOD_RESPONSE(
118 FL_BINARY_MESSENGER(messenger),
"test", FL_METHOD_CODEC(codec));
121 channel,
"Test",
nullptr,
nullptr,
122 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
123 g_autoptr(GError)
error =
nullptr;
124 g_autoptr(FlMethodResponse) response =
127 EXPECT_NE(response,
nullptr);
128 EXPECT_EQ(
error,
nullptr);
130 EXPECT_TRUE(FL_IS_METHOD_ERROR_RESPONSE(response));
132 FL_METHOD_ERROR_RESPONSE(response)),
135 FL_METHOD_ERROR_RESPONSE(response)),
138 FL_METHOD_ERROR_RESPONSE(response));
139 EXPECT_NE(details,
nullptr);
143 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
147 g_main_loop_run(loop);
151 TEST(FlMethodChannelTest, InvokeMethodNotImplemented) {
152 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
154 g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
155 fl_mock_binary_messenger_set_standard_method_channel(
157 [](FlMockBinaryMessenger* messenger, GTask* task,
const gchar* name,
159 EXPECT_STREQ(name,
"Test");
166 FL_BINARY_MESSENGER(messenger),
"test", FL_METHOD_CODEC(codec));
169 channel,
"Test",
nullptr,
nullptr,
170 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
171 g_autoptr(GError)
error =
nullptr;
172 g_autoptr(FlMethodResponse) response =
175 EXPECT_NE(response,
nullptr);
176 EXPECT_EQ(
error,
nullptr);
178 EXPECT_TRUE(FL_IS_METHOD_NOT_IMPLEMENTED_RESPONSE(response));
180 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
184 g_main_loop_run(loop);
188 TEST(FlMethodChannelTest, InvokeMethodFailure) {
189 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
191 g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
192 fl_mock_binary_messenger_set_error_channel(messenger,
"test", 42,
"ERROR");
196 FL_BINARY_MESSENGER(messenger),
"test", FL_METHOD_CODEC(codec));
199 channel,
"Test",
nullptr,
nullptr,
200 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
201 g_autoptr(GError)
error =
nullptr;
202 g_autoptr(FlMethodResponse) response =
205 EXPECT_EQ(response,
nullptr);
206 EXPECT_NE(
error,
nullptr);
208 EXPECT_EQ(
error->code, 42);
209 EXPECT_STREQ(
error->message,
"ERROR");
211 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
215 g_main_loop_run(loop);
219 TEST(FlMethodChannelTest, ReceiveMethodCallRespondSuccess) {
220 g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
224 FL_BINARY_MESSENGER(messenger),
"test", FL_METHOD_CODEC(codec));
227 [](FlMethodChannel* channel, FlMethodCall*
method_call,
236 g_autoptr(GError)
error =
nullptr;
239 EXPECT_EQ(
error,
nullptr);
245 gboolean called = FALSE;
246 fl_mock_binary_messenger_invoke_standard_method(
247 messenger,
"test",
"Test",
args,
248 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
250 gboolean* called =
static_cast<gboolean*
>(
user_data);
253 EXPECT_TRUE(FL_IS_METHOD_SUCCESS_RESPONSE(response));
255 FL_METHOD_SUCCESS_RESPONSE(response));
264 TEST(FlMethodChannelTest, ReceiveMethodCallRespondError) {
265 g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
269 FL_BINARY_MESSENGER(messenger),
"test", FL_METHOD_CODEC(codec));
272 [](FlMethodChannel* channel, FlMethodCall*
method_call,
281 g_autoptr(GError)
error =
nullptr;
284 EXPECT_EQ(
error,
nullptr);
290 gboolean called = FALSE;
291 fl_mock_binary_messenger_invoke_standard_method(
292 messenger,
"test",
"Test",
args,
293 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
295 gboolean* called =
static_cast<gboolean*
>(
user_data);
298 EXPECT_TRUE(FL_IS_METHOD_ERROR_RESPONSE(response));
300 FL_METHOD_ERROR_RESPONSE(response)),
303 FL_METHOD_ERROR_RESPONSE(response)),
306 FL_METHOD_ERROR_RESPONSE(response));
315 TEST(FlMethodChannelTest, ReceiveMethodCallRespondNotImplemented) {
316 g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
320 FL_BINARY_MESSENGER(messenger),
"test", FL_METHOD_CODEC(codec));
323 [](FlMethodChannel* channel, FlMethodCall*
method_call,
331 g_autoptr(GError)
error =
nullptr;
334 EXPECT_EQ(
error,
nullptr);
340 gboolean called = FALSE;
341 fl_mock_binary_messenger_invoke_standard_method(
342 messenger,
"test",
"Test",
args,
343 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
345 gboolean* called =
static_cast<gboolean*
>(
user_data);
348 EXPECT_TRUE(FL_IS_METHOD_NOT_IMPLEMENTED_RESPONSE(response));
361 struct _TestMethodCodec {
362 FlMethodCodec parent_instance;
364 FlStandardMethodCodec* wrapped_codec;
367 G_DEFINE_TYPE(TestMethodCodec, test_method_codec, fl_method_codec_get_type())
370 TestMethodCodec*
self = TEST_METHOD_CODEC(
object);
372 g_clear_object(&self->wrapped_codec);
374 G_OBJECT_CLASS(test_method_codec_parent_class)->dispose(
object);
382 EXPECT_TRUE(TEST_IS_METHOD_CODEC(codec));
383 TestMethodCodec*
self = TEST_METHOD_CODEC(codec);
385 FL_METHOD_CODEC(self->wrapped_codec), name,
args,
error);
394 EXPECT_TRUE(TEST_IS_METHOD_CODEC(codec));
395 TestMethodCodec*
self = TEST_METHOD_CODEC(codec);
397 FL_METHOD_CODEC(self->wrapped_codec), message, name,
args,
error);
412 const gchar* message,
424 EXPECT_TRUE(TEST_IS_METHOD_CODEC(codec));
425 TestMethodCodec*
self = TEST_METHOD_CODEC(codec);
432 FL_METHOD_CODEC_CLASS(klass)->encode_method_call =
434 FL_METHOD_CODEC_CLASS(klass)->decode_method_call =
436 FL_METHOD_CODEC_CLASS(klass)->encode_success_envelope =
438 FL_METHOD_CODEC_CLASS(klass)->encode_error_envelope =
440 FL_METHOD_CODEC_CLASS(klass)->decode_response =
449 return TEST_METHOD_CODEC(g_object_new(test_method_codec_get_type(),
nullptr));
454 TEST(FlMethodChannelTest, ReceiveMethodCallRespondSuccessError) {
455 g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
459 FL_BINARY_MESSENGER(messenger),
"test", FL_METHOD_CODEC(codec));
460 gboolean called = FALSE;
463 [](FlMethodChannel* channel, FlMethodCall*
method_call,
465 gboolean* called =
static_cast<gboolean*
>(
user_data);
469 g_autoptr(GError) response_error =
nullptr;
472 EXPECT_NE(response_error,
nullptr);
473 EXPECT_STREQ(response_error->message,
"Unsupported type");
481 fl_mock_binary_messenger_invoke_standard_method(
482 messenger,
"test",
"Test",
nullptr,
483 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
492 TEST(FlMethodChannelTest, ReceiveMethodCallRespondErrorError) {
493 g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
497 FL_BINARY_MESSENGER(messenger),
"test", FL_METHOD_CODEC(codec));
498 gboolean called = FALSE;
501 [](FlMethodChannel* channel, FlMethodCall*
method_call,
503 gboolean* called =
static_cast<gboolean*
>(
user_data);
507 g_autoptr(GError) response_error =
nullptr;
509 details, &response_error));
510 EXPECT_NE(response_error,
nullptr);
511 EXPECT_STREQ(response_error->message,
"Unsupported type");
516 fl_mock_binary_messenger_invoke_standard_method(messenger,
"test",
"Test",
517 nullptr,
nullptr,
nullptr);
529 TEST(FlMethodChannelTest, ReplaceADisposedMethodChannel) {
530 g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
536 FL_BINARY_MESSENGER(messenger),
"test", FL_METHOD_CODEC(codec));
540 [](FlMethodChannel* channel, FlMethodCall*
method_call,
542 int* first_count =
static_cast<int*
>(
user_data);
548 &first_count,
nullptr);
550 fl_mock_binary_messenger_invoke_standard_method(
551 messenger,
"test",
"Test",
nullptr,
552 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
555 EXPECT_EQ(first_count, 1);
558 g_object_unref(channel1);
562 FL_BINARY_MESSENGER(messenger),
"test", FL_METHOD_CODEC(codec));
563 int second_count = 0;
566 [](FlMethodChannel* channel, FlMethodCall*
method_call,
568 int* second_count =
static_cast<int*
>(
user_data);
574 &second_count,
nullptr);
576 fl_mock_binary_messenger_invoke_standard_method(
577 messenger,
"test",
"Test",
nullptr,
578 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
581 EXPECT_EQ(first_count, 1);
582 EXPECT_EQ(second_count, 1);
592 TEST(FlMethodChannelTest, DisposeAReplacedMethodChannel) {
593 g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
599 FL_BINARY_MESSENGER(messenger),
"test", FL_METHOD_CODEC(codec));
603 [](FlMethodChannel* channel, FlMethodCall*
method_call,
605 int* first_count =
static_cast<int*
>(
user_data);
611 &first_count,
nullptr);
613 fl_mock_binary_messenger_invoke_standard_method(
614 messenger,
"test",
"Test",
nullptr,
615 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
618 EXPECT_EQ(first_count, 1);
622 FL_BINARY_MESSENGER(messenger),
"test", FL_METHOD_CODEC(codec));
623 int second_count = 0;
626 [](FlMethodChannel* channel, FlMethodCall*
method_call,
628 int* second_count =
static_cast<int*
>(
user_data);
634 &second_count,
nullptr);
636 fl_mock_binary_messenger_invoke_standard_method(
637 messenger,
"test",
"Test",
nullptr,
638 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
641 EXPECT_EQ(first_count, 1);
642 EXPECT_EQ(second_count, 1);
645 g_object_unref(channel1);
647 fl_mock_binary_messenger_invoke_standard_method(
648 messenger,
"test",
"Test",
nullptr,
649 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
652 EXPECT_EQ(first_count, 1);
653 EXPECT_EQ(second_count, 2);
657 TEST(FlMethodChannelTest, CustomType) {
658 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
660 g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
661 fl_mock_binary_messenger_set_standard_method_channel(
663 [](FlMockBinaryMessenger* messenger, GTask* task,
const gchar* name,
671 FL_BINARY_MESSENGER(messenger),
"test", FL_METHOD_CODEC(codec));
675 channel,
"Test",
args,
nullptr,
676 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
677 g_autoptr(GError)
error =
nullptr;
678 g_autoptr(FlMethodResponse) response =
681 EXPECT_EQ(response,
nullptr);
682 EXPECT_NE(
error,
nullptr);
683 EXPECT_STREQ(
error->message,
"Custom value not implemented");
685 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
689 g_main_loop_run(loop);