Flutter Engine
 
Loading...
Searching...
No Matches
fl_event_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.
6#include "gtest/gtest.h"
7
12
13// Checks we detect a listen event.
14TEST(FlEventChannelTest, Listen) {
15 g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
16 g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
17 g_autoptr(FlEventChannel) channel = fl_event_channel_new(
18 FL_BINARY_MESSENGER(messenger), "test", FL_METHOD_CODEC(codec));
20 channel,
21 [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
23
24 return static_cast<FlMethodErrorResponse*>(nullptr);
25 },
26 nullptr, nullptr, nullptr);
27
28 gboolean called = FALSE;
30 messenger, "test", "listen", nullptr,
31 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
32 gpointer user_data) {
33 gboolean* called = static_cast<gboolean*>(user_data);
34 *called = TRUE;
35
36 EXPECT_TRUE(FL_IS_METHOD_SUCCESS_RESPONSE(response));
38 FL_METHOD_SUCCESS_RESPONSE(response));
39 EXPECT_EQ(fl_value_get_type(result), FL_VALUE_TYPE_NULL);
40 },
41 &called);
42 EXPECT_TRUE(called);
43}
44
45// Checks we can generate a listen exception.
46TEST(FlEventChannelTest, ListenException) {
47 g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
48 g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
49 g_autoptr(FlEventChannel) channel = fl_event_channel_new(
50 FL_BINARY_MESSENGER(messenger), "test", FL_METHOD_CODEC(codec));
52 channel,
53 [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
54 return fl_method_error_response_new("LISTEN-ERROR",
55 "LISTEN-ERROR-MESSAGE", nullptr);
56 },
57 nullptr, nullptr, nullptr);
58
59 gboolean called = FALSE;
61 messenger, "test", "listen", nullptr,
62 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
63 gpointer user_data) {
64 gboolean* called = static_cast<gboolean*>(user_data);
65 *called = TRUE;
66
67 EXPECT_TRUE(FL_IS_METHOD_ERROR_RESPONSE(response));
69 FL_METHOD_ERROR_RESPONSE(response)),
70 "LISTEN-ERROR");
72 FL_METHOD_ERROR_RESPONSE(response)),
73 "LISTEN-ERROR-MESSAGE");
74 },
75 &called);
76 EXPECT_TRUE(called);
77}
78
79// Checks we detect a cancel event.
80TEST(FlEventChannelTest, Cancel) {
81 g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
82 g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
83 g_autoptr(FlEventChannel) channel = fl_event_channel_new(
84 FL_BINARY_MESSENGER(messenger), "test", FL_METHOD_CODEC(codec));
86 channel, nullptr,
87 [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
89
90 return static_cast<FlMethodErrorResponse*>(nullptr);
91 },
92 nullptr, nullptr);
93
95 messenger, "test", "listen", nullptr,
96 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
97 gpointer user_data) {},
98 nullptr);
99 gboolean called = FALSE;
101 messenger, "test", "cancel", nullptr,
102 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
103 gpointer user_data) {
104 gboolean* called = static_cast<gboolean*>(user_data);
105 *called = TRUE;
106
107 EXPECT_TRUE(FL_IS_METHOD_SUCCESS_RESPONSE(response));
109 FL_METHOD_SUCCESS_RESPONSE(response));
110 EXPECT_EQ(fl_value_get_type(result), FL_VALUE_TYPE_NULL);
111 },
112 &called);
113 EXPECT_TRUE(called);
114}
115
116// Checks we can generate a cancel exception.
117TEST(FlEventChannelTest, CancelException) {
118 g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
119 g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
120 g_autoptr(FlEventChannel) channel = fl_event_channel_new(
121 FL_BINARY_MESSENGER(messenger), "test", FL_METHOD_CODEC(codec));
123 channel, nullptr,
124 [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
125 return fl_method_error_response_new("CANCEL-ERROR",
126 "CANCEL-ERROR-MESSAGE", nullptr);
127 },
128 nullptr, nullptr);
129
131 messenger, "test", "listen", nullptr,
132 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
133 gpointer user_data) {},
134 nullptr);
135 gboolean called = FALSE;
137 messenger, "test", "cancel", nullptr,
138 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
139 gpointer user_data) {
140 gboolean* called = static_cast<gboolean*>(user_data);
141 *called = TRUE;
142
143 EXPECT_TRUE(FL_IS_METHOD_ERROR_RESPONSE(response));
145 FL_METHOD_ERROR_RESPONSE(response)),
146 "CANCEL-ERROR");
148 FL_METHOD_ERROR_RESPONSE(response)),
149 "CANCEL-ERROR-MESSAGE");
150 },
151 &called);
152 EXPECT_TRUE(called);
153}
154
155// Checks args are passed to listen/cancel.
156TEST(FlEventChannelTest, Args) {
157 g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
158 g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
159 g_autoptr(FlEventChannel) channel = fl_event_channel_new(
160 FL_BINARY_MESSENGER(messenger), "test", FL_METHOD_CODEC(codec));
161 int call_count = 0;
163 channel,
164 [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
165 int* call_count = static_cast<int*>(user_data);
166 EXPECT_EQ(*call_count, 0);
167 (*call_count)++;
168
169 g_autoptr(FlValue) expected_args = fl_value_new_string("LISTEN-ARGS");
170 EXPECT_TRUE(fl_value_equal(args, expected_args));
171
172 return static_cast<FlMethodErrorResponse*>(nullptr);
173 },
174 [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
175 int* call_count = static_cast<int*>(user_data);
176 EXPECT_EQ(*call_count, 1);
177 (*call_count)++;
178
179 g_autoptr(FlValue) expected_args = fl_value_new_string("CANCEL-ARGS");
180 EXPECT_TRUE(fl_value_equal(args, expected_args));
181
182 return static_cast<FlMethodErrorResponse*>(nullptr);
183 },
184 &call_count, nullptr);
185
186 g_autoptr(FlValue) listen_args = fl_value_new_string("LISTEN-ARGS");
188 messenger, "test", "listen", listen_args,
189 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
190 gpointer user_data) {},
191 nullptr);
192 g_autoptr(FlValue) cancel_args = fl_value_new_string("CANCEL-ARGS");
194 messenger, "test", "cancel", cancel_args,
195 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
196 gpointer user_data) {},
197 nullptr);
198
199 EXPECT_EQ(call_count, 2);
200}
201
202// Checks can send events.
203TEST(FlEventChannelTest, SendEvents) {
204 g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
205 int event_count = 0;
207 messenger, "test",
208 [](FlMockBinaryMessenger* messenger, FlValue* event, gpointer user_data) {
209 int* event_count = static_cast<int*>(user_data);
210
211 EXPECT_EQ(fl_value_get_type(event), FL_VALUE_TYPE_INT);
212 EXPECT_EQ(fl_value_get_int(event), *event_count);
213
214 (*event_count)++;
215 },
216 [](FlMockBinaryMessenger* messenger, const gchar* code,
217 const gchar* message, FlValue* details, gpointer user_data) {},
218 &event_count);
219
220 g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
221 g_autoptr(FlEventChannel) channel = fl_event_channel_new(
222 FL_BINARY_MESSENGER(messenger), "test", FL_METHOD_CODEC(codec));
224 channel,
225 [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
226 // Send some events.
227 for (int i = 0; i < 5; i++) {
229 g_autoptr(GError) error = nullptr;
230 EXPECT_TRUE(fl_event_channel_send(channel, event, nullptr, &error));
231 EXPECT_EQ(error, nullptr);
232 }
233
234 return static_cast<FlMethodErrorResponse*>(nullptr);
235 },
236 nullptr, nullptr, nullptr);
237
239 messenger, "test", "listen", nullptr,
240 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
241 gpointer user_data) {},
242 nullptr);
244 messenger, "test", "cancel", nullptr,
245 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
246 gpointer user_data) {},
247 nullptr);
248
249 EXPECT_EQ(event_count, 5);
250}
251
252// Check can register an event channel with the same name as one previously
253// used.
254TEST(FlEventChannelTest, ReuseChannel) {
255 g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
256 int event_count = 0;
258 messenger, "test",
259 [](FlMockBinaryMessenger* messenger, FlValue* event, gpointer user_data) {
260 int* event_count = static_cast<int*>(user_data);
261
262 EXPECT_EQ(fl_value_get_type(event), FL_VALUE_TYPE_INT);
263 EXPECT_EQ(fl_value_get_int(event), *event_count);
264
265 (*event_count)++;
266 },
267 [](FlMockBinaryMessenger* messenger, const gchar* code,
268 const gchar* message, FlValue* details, gpointer user_data) {},
269 &event_count);
270
271 g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
272 FlEventChannel* channel1 = fl_event_channel_new(
273 FL_BINARY_MESSENGER(messenger), "test", FL_METHOD_CODEC(codec));
275 channel1,
276 [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
277 // Send some events.
278 for (int i = 0; i < 5; i++) {
279 g_autoptr(FlValue) event = fl_value_new_int(100 + i);
280 g_autoptr(GError) error = nullptr;
281 EXPECT_TRUE(fl_event_channel_send(channel, event, nullptr, &error));
282 EXPECT_EQ(error, nullptr);
283 }
284
285 return static_cast<FlMethodErrorResponse*>(nullptr);
286 },
287 nullptr, nullptr, nullptr);
288
289 // Remove this channel
290 g_object_unref(channel1);
291
292 // Register a second channel with the same name.
293 g_autoptr(FlEventChannel) channel2 = fl_event_channel_new(
294 FL_BINARY_MESSENGER(messenger), "test", FL_METHOD_CODEC(codec));
296 channel2,
297 [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
298 // Send some events.
299 for (int i = 0; i < 5; i++) {
301 g_autoptr(GError) error = nullptr;
302 EXPECT_TRUE(fl_event_channel_send(channel, event, nullptr, &error));
303 EXPECT_EQ(error, nullptr);
304 }
305
306 return static_cast<FlMethodErrorResponse*>(nullptr);
307 },
308 nullptr, nullptr, nullptr);
309
311 messenger, "test", "listen", nullptr,
312 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
313 gpointer user_data) {},
314 nullptr);
316 messenger, "test", "cancel", nullptr,
317 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
318 gpointer user_data) {},
319 nullptr);
320
321 EXPECT_EQ(event_count, 5);
322}
323
324// Check can register an event channel replacing an existing one.
325TEST(FlEventChannelTest, ReplaceChannel) {
326 g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
327 int event_count = 0;
329 messenger, "test",
330 [](FlMockBinaryMessenger* messenger, FlValue* event, gpointer user_data) {
331 int* event_count = static_cast<int*>(user_data);
332
333 EXPECT_EQ(fl_value_get_type(event), FL_VALUE_TYPE_INT);
334 EXPECT_EQ(fl_value_get_int(event), *event_count);
335
336 (*event_count)++;
337 },
338 [](FlMockBinaryMessenger* messenger, const gchar* code,
339 const gchar* message, FlValue* details, gpointer user_data) {},
340 &event_count);
341
342 g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
343 FlEventChannel* channel1 = fl_event_channel_new(
344 FL_BINARY_MESSENGER(messenger), "test", FL_METHOD_CODEC(codec));
346 channel1,
347 [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
348 // Send some events.
349 for (int i = 0; i < 5; i++) {
350 g_autoptr(FlValue) event = fl_value_new_int(100 + i);
351 g_autoptr(GError) error = nullptr;
352 EXPECT_TRUE(fl_event_channel_send(channel, event, nullptr, &error));
353 EXPECT_EQ(error, nullptr);
354 }
355
356 return static_cast<FlMethodErrorResponse*>(nullptr);
357 },
358 nullptr, nullptr, nullptr);
359
360 // Register a second channel with the same name.
361 g_autoptr(FlEventChannel) channel2 = fl_event_channel_new(
362 FL_BINARY_MESSENGER(messenger), "test", FL_METHOD_CODEC(codec));
364 channel2,
365 [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
366 // Send some events.
367 for (int i = 0; i < 5; i++) {
369 g_autoptr(GError) error = nullptr;
370 EXPECT_TRUE(fl_event_channel_send(channel, event, nullptr, &error));
371 EXPECT_EQ(error, nullptr);
372 }
373
374 return static_cast<FlMethodErrorResponse*>(nullptr);
375 },
376 nullptr, nullptr, nullptr);
377
379 messenger, "test", "listen", nullptr,
380 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
381 gpointer user_data) {},
382 nullptr);
384 messenger, "test", "cancel", nullptr,
385 [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
386 gpointer user_data) {},
387 nullptr);
388
389 EXPECT_EQ(event_count, 5);
390}
g_autoptr(GMutexLocker) locker
return TRUE
G_MODULE_EXPORT gboolean fl_event_channel_send(FlEventChannel *self, FlValue *event, GCancellable *cancellable, GError **error)
G_MODULE_EXPORT void fl_event_channel_set_stream_handlers(FlEventChannel *self, FlEventChannelHandler listen_handler, FlEventChannelHandler cancel_handler, gpointer user_data, GDestroyNotify destroy_notify)
G_MODULE_EXPORT FlEventChannel * fl_event_channel_new(FlBinaryMessenger *messenger, const gchar *name, FlMethodCodec *codec)
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
TEST(FlEventChannelTest, Listen)
G_MODULE_EXPORT FlValue * fl_method_success_response_get_result(FlMethodSuccessResponse *self)
G_MODULE_EXPORT FlMethodErrorResponse * fl_method_error_response_new(const gchar *code, const gchar *message, FlValue *details)
G_MODULE_EXPORT const gchar * fl_method_error_response_get_message(FlMethodErrorResponse *self)
G_MODULE_EXPORT const gchar * fl_method_error_response_get_code(FlMethodErrorResponse *self)
void fl_mock_binary_messenger_invoke_standard_method(FlMockBinaryMessenger *self, const gchar *channel, const char *name, FlValue *args, FlMockBinaryMessengerMethodCallback callback, gpointer user_data)
void fl_mock_binary_messenger_set_standard_event_channel(FlMockBinaryMessenger *self, const gchar *channel, FlMockBinaryMessengerEventChannelHandler handler, FlMockBinaryMessengerEventChannelErrorHandler error_handler, gpointer user_data)
const gchar * channel
FlMockBinaryMessenger * fl_mock_binary_messenger_new()
G_BEGIN_DECLS GBytes * message
const uint8_t uint32_t uint32_t GError ** error
G_MODULE_EXPORT FlStandardMethodCodec * fl_standard_method_codec_new()
G_MODULE_EXPORT int64_t fl_value_get_int(FlValue *self)
Definition fl_value.cc:668
G_MODULE_EXPORT FlValueType fl_value_get_type(FlValue *self)
Definition fl_value.cc:466
G_MODULE_EXPORT FlValue * fl_value_new_string(const gchar *value)
Definition fl_value.cc:276
G_MODULE_EXPORT FlValue * fl_value_new_int(int64_t value)
Definition fl_value.cc:262
G_MODULE_EXPORT bool fl_value_equal(FlValue *a, FlValue *b)
Definition fl_value.cc:471
typedefG_BEGIN_DECLS struct _FlValue FlValue
Definition fl_value.h:42
@ FL_VALUE_TYPE_NULL
Definition fl_value.h:64
@ FL_VALUE_TYPE_INT
Definition fl_value.h:66