Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
fl_basic_message_channel_test.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Included first as it collides with the X11 headers.
7#include "gtest/gtest.h"
8
10
14
16 protected:
18
19 ~FlBasicMessageChannelTest() { g_clear_object(&messenger); }
20
21 FlMockBinaryMessenger* messenger = nullptr;
22};
23
24// Checks sending a message without a response works.
25// MOCK_ENGINE_PROC is leaky by design
26// NOLINTBEGIN(clang-analyzer-core.StackAddressEscape)
27TEST_F(FlBasicMessageChannelTest, SendMessageWithoutResponse) {
28 gboolean called = FALSE;
30 messenger, "test",
31 [](FlMockBinaryMessenger* messenger, GTask* task, FlValue* message,
32 gpointer user_data) {
33 gboolean* called = static_cast<gboolean*>(user_data);
34 *called = TRUE;
35
36 EXPECT_NE(message, nullptr);
38 EXPECT_STREQ(fl_value_get_string(message), "Marco!");
39
40 // No response.
41 return static_cast<FlValue*>(nullptr);
42 },
43 &called);
44
45 g_autoptr(FlStandardMessageCodec) codec = fl_standard_message_codec_new();
46 g_autoptr(FlBasicMessageChannel) channel = fl_basic_message_channel_new(
47 FL_BINARY_MESSENGER(messenger), "test", FL_MESSAGE_CODEC(codec));
49 fl_basic_message_channel_send(channel, message, nullptr, nullptr, nullptr);
50
51 EXPECT_TRUE(called);
52}
53// NOLINTEND(clang-analyzer-core.StackAddressEscape)
54
55// Checks sending a message with a response works.
56TEST_F(FlBasicMessageChannelTest, SendMessageWithResponse) {
58 messenger, "test",
59 [](FlMockBinaryMessenger* messenger, GTask* task, FlValue* message,
60 gpointer user_data) {
61 EXPECT_NE(message, nullptr);
63 EXPECT_STREQ(fl_value_get_string(message), "Marco!");
64
65 return fl_value_new_string("Polo!");
66 },
67 nullptr);
68
69 g_autoptr(FlStandardMessageCodec) codec = fl_standard_message_codec_new();
70 g_autoptr(FlBasicMessageChannel) channel = fl_basic_message_channel_new(
71 FL_BINARY_MESSENGER(messenger), "test", FL_MESSAGE_CODEC(codec));
74 channel, message, nullptr,
75 [](GObject* object, GAsyncResult* result, gpointer user_data) {
76 g_autoptr(GError) error = nullptr;
78 FL_BASIC_MESSAGE_CHANNEL(object), result, &error);
79 EXPECT_NE(message, nullptr);
80 EXPECT_EQ(error, nullptr);
81
83 EXPECT_STREQ(fl_value_get_string(message), "Polo!");
84
85 g_main_loop_quit(static_cast<GMainLoop*>(user_data));
86 },
87 loop);
88
89 g_main_loop_run(loop);
90}
91
92// Checks the engine reporting a send failure is handled.
94 fl_mock_binary_messenger_set_error_channel(messenger, "test", 42, "Error");
95
96 g_autoptr(FlStandardMessageCodec) codec = fl_standard_message_codec_new();
97 g_autoptr(FlBasicMessageChannel) channel = fl_basic_message_channel_new(
98 FL_BINARY_MESSENGER(messenger), "test", FL_MESSAGE_CODEC(codec));
101 channel, message, nullptr,
102 [](GObject* object, GAsyncResult* result, gpointer user_data) {
103 g_autoptr(GError) error = nullptr;
105 FL_BASIC_MESSAGE_CHANNEL(object), result, &error);
106 EXPECT_EQ(message, nullptr);
107 EXPECT_NE(error, nullptr);
108 EXPECT_EQ(error->code, 42);
109 EXPECT_STREQ(error->message, "Error");
110
111 g_main_loop_quit(static_cast<GMainLoop*>(user_data));
112 },
113 loop);
114
115 g_main_loop_run(loop);
116}
117
118// Checks the shell able to receive and respond to messages from the engine.
120 // Listen for messages from the engine.
121 g_autoptr(FlStandardMessageCodec) codec = fl_standard_message_codec_new();
122 g_autoptr(FlBasicMessageChannel) messages_channel =
123 fl_basic_message_channel_new(FL_BINARY_MESSENGER(messenger), "test",
124 FL_MESSAGE_CODEC(codec));
126 messages_channel,
127 [](FlBasicMessageChannel* channel, FlValue* message,
128 FlBasicMessageChannelResponseHandle* response_handle,
129 gpointer user_data) {
130 EXPECT_NE(message, nullptr);
132 EXPECT_STREQ(fl_value_get_string(message), "Marco!");
133
134 g_autoptr(GError) error = nullptr;
135 g_autoptr(FlValue) response = fl_value_new_string("Polo!");
136 EXPECT_TRUE(fl_basic_message_channel_respond(channel, response_handle,
137 response, &error));
138 EXPECT_EQ(error, nullptr);
139 },
140 nullptr, nullptr);
141
142 // Trigger the engine to send a message.
144 gboolean called = FALSE;
146 messenger, "test", message,
147 [](FlMockBinaryMessenger* messenger, FlValue* response,
148 gpointer user_data) {
149 gboolean* called = static_cast<gboolean*>(user_data);
150 *called = TRUE;
151
152 EXPECT_NE(response, nullptr);
153 EXPECT_EQ(fl_value_get_type(response), FL_VALUE_TYPE_STRING);
154 EXPECT_STREQ(fl_value_get_string(response), "Polo!");
155 },
156 &called);
157
158 EXPECT_TRUE(called);
159}
160
161// Checks sending a null message with a response works.
162TEST_F(FlBasicMessageChannelTest, SendNullMessageWithResponse) {
164 messenger, "test",
165 [](FlMockBinaryMessenger* messenger, GTask* task, FlValue* message,
166 gpointer user_data) { return fl_value_new_null(); },
167 nullptr);
168
169 g_autoptr(FlStandardMessageCodec) codec = fl_standard_message_codec_new();
170 g_autoptr(FlBasicMessageChannel) channel = fl_basic_message_channel_new(
171 FL_BINARY_MESSENGER(messenger), "test", FL_MESSAGE_CODEC(codec));
173 channel, nullptr, nullptr,
174 [](GObject* object, GAsyncResult* result, gpointer user_data) {
175 g_autoptr(GError) error = nullptr;
177 FL_BASIC_MESSAGE_CHANNEL(object), result, &error);
178 EXPECT_NE(message, nullptr);
179 EXPECT_EQ(error, nullptr);
180
182
183 g_main_loop_quit(static_cast<GMainLoop*>(user_data));
184 },
185 loop);
186
187 g_main_loop_run(loop);
188}
189
190// Checks sending a message with a custom type generates an error.
193 messenger, "test",
194 [](FlMockBinaryMessenger* messenger, GTask* task, FlValue* message,
195 gpointer user_data) { return fl_value_new_null(); },
196 nullptr);
197
198 g_autoptr(FlStandardMessageCodec) codec = fl_standard_message_codec_new();
199 g_autoptr(FlBasicMessageChannel) channel = fl_basic_message_channel_new(
200 FL_BINARY_MESSENGER(messenger), "test", FL_MESSAGE_CODEC(codec));
201 g_autoptr(FlValue) message = fl_value_new_custom(42, nullptr, nullptr);
203 channel, message, nullptr,
204 [](GObject* object, GAsyncResult* result, gpointer user_data) {
205 g_autoptr(GError) error = nullptr;
207 FL_BASIC_MESSAGE_CHANNEL(object), result, &error);
208 EXPECT_EQ(message, nullptr);
209 EXPECT_NE(error, nullptr);
210 EXPECT_STREQ(error->message, "Custom value not implemented");
211
212 g_main_loop_quit(static_cast<GMainLoop*>(user_data));
213 },
214 loop);
215
216 g_main_loop_run(loop);
217}
const char * message
g_autoptr(FlEngine) engine
G_MODULE_EXPORT FlBasicMessageChannel * fl_basic_message_channel_new(FlBinaryMessenger *messenger, const gchar *name, FlMessageCodec *codec)
G_MODULE_EXPORT void fl_basic_message_channel_set_message_handler(FlBasicMessageChannel *self, FlBasicMessageChannelMessageHandler handler, gpointer user_data, GDestroyNotify destroy_notify)
G_MODULE_EXPORT gboolean fl_basic_message_channel_respond(FlBasicMessageChannel *self, FlBasicMessageChannelResponseHandle *response_handle, FlValue *message, GError **error)
G_MODULE_EXPORT FlValue * fl_basic_message_channel_send_finish(FlBasicMessageChannel *self, GAsyncResult *result, GError **error)
G_MODULE_EXPORT void fl_basic_message_channel_send(FlBasicMessageChannel *self, FlValue *message, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
TEST_F(FlBasicMessageChannelTest, SendMessageWithoutResponse)
return TRUE
void fl_mock_binary_messenger_set_error_channel(FlMockBinaryMessenger *self, const gchar *channel, gint code, const gchar *message)
const gchar * channel
void fl_mock_binary_messenger_send_standard_message(FlMockBinaryMessenger *self, const gchar *channel, FlValue *message, FlMockBinaryMessengerMessageCallback callback, gpointer user_data)
FlMockBinaryMessenger * fl_mock_binary_messenger_new()
void fl_mock_binary_messenger_set_standard_message_channel(FlMockBinaryMessenger *self, const gchar *channel, FlMockBinaryMessengerMessageChannelHandler handler, gpointer user_data)
const uint8_t uint32_t uint32_t GError ** error
G_MODULE_EXPORT FlStandardMessageCodec * fl_standard_message_codec_new()
G_MODULE_EXPORT FlValue * fl_value_new_custom(int type, gconstpointer value, GDestroyNotify destroy_notify)
Definition fl_value.cc:374
G_MODULE_EXPORT FlValueType fl_value_get_type(FlValue *self)
Definition fl_value.cc:466
G_MODULE_EXPORT FlValue * fl_value_new_null()
Definition fl_value.cc:251
G_MODULE_EXPORT FlValue * fl_value_new_string(const gchar *value)
Definition fl_value.cc:276
G_MODULE_EXPORT const gchar * fl_value_get_string(FlValue *self)
Definition fl_value.cc:682
typedefG_BEGIN_DECLS struct _FlValue FlValue
Definition fl_value.h:42
@ FL_VALUE_TYPE_STRING
Definition fl_value.h:68
@ FL_VALUE_TYPE_NULL
Definition fl_value.h:64