Flutter Linux Embedder
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 "flutter/shell/platform/linux/testing/linux_test.h"
7 #include "gtest/gtest.h"
8 
12 #include "flutter/shell/platform/linux/testing/fl_mock_binary_messenger.h"
13 
14 class FlEventChannelTest : public flutter::testing::LinuxTest {
15  protected:
16  void SetUp() override { messenger = fl_mock_binary_messenger_new(); }
17 
18  ~FlEventChannelTest() { g_clear_object(&messenger); }
19 
20  FlMockBinaryMessenger* messenger = nullptr;
21 };
22 
23 // Checks we detect a listen event.
25  g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
26  g_autoptr(FlEventChannel) channel = fl_event_channel_new(
27  FL_BINARY_MESSENGER(messenger), "test", FL_METHOD_CODEC(codec));
29  channel,
30  [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
32 
33  return static_cast<FlMethodErrorResponse*>(nullptr);
34  },
35  nullptr, nullptr, nullptr);
36 
37  gboolean called = FALSE;
38  fl_mock_binary_messenger_invoke_standard_method(
39  messenger, "test", "listen", nullptr,
40  [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
41  gpointer user_data) {
42  gboolean* called = static_cast<gboolean*>(user_data);
43  *called = TRUE;
44 
45  EXPECT_TRUE(FL_IS_METHOD_SUCCESS_RESPONSE(response));
47  FL_METHOD_SUCCESS_RESPONSE(response));
48  EXPECT_EQ(fl_value_get_type(result), FL_VALUE_TYPE_NULL);
49  },
50  &called);
51  EXPECT_TRUE(called);
52 }
53 
54 // Checks we can generate a listen exception.
55 TEST_F(FlEventChannelTest, ListenException) {
56  g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
57  g_autoptr(FlEventChannel) channel = fl_event_channel_new(
58  FL_BINARY_MESSENGER(messenger), "test", FL_METHOD_CODEC(codec));
60  channel,
61  [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
62  return fl_method_error_response_new("LISTEN-ERROR",
63  "LISTEN-ERROR-MESSAGE", nullptr);
64  },
65  nullptr, nullptr, nullptr);
66 
67  gboolean called = FALSE;
68  fl_mock_binary_messenger_invoke_standard_method(
69  messenger, "test", "listen", nullptr,
70  [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
71  gpointer user_data) {
72  gboolean* called = static_cast<gboolean*>(user_data);
73  *called = TRUE;
74 
75  EXPECT_TRUE(FL_IS_METHOD_ERROR_RESPONSE(response));
77  FL_METHOD_ERROR_RESPONSE(response)),
78  "LISTEN-ERROR");
80  FL_METHOD_ERROR_RESPONSE(response)),
81  "LISTEN-ERROR-MESSAGE");
82  },
83  &called);
84  EXPECT_TRUE(called);
85 }
86 
87 // Checks we detect a cancel event.
89  g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
90  g_autoptr(FlEventChannel) channel = fl_event_channel_new(
91  FL_BINARY_MESSENGER(messenger), "test", FL_METHOD_CODEC(codec));
93  channel, nullptr,
94  [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
96 
97  return static_cast<FlMethodErrorResponse*>(nullptr);
98  },
99  nullptr, nullptr);
100 
101  fl_mock_binary_messenger_invoke_standard_method(
102  messenger, "test", "listen", nullptr,
103  [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
104  gpointer user_data) {},
105  nullptr);
106  gboolean called = FALSE;
107  fl_mock_binary_messenger_invoke_standard_method(
108  messenger, "test", "cancel", nullptr,
109  [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
110  gpointer user_data) {
111  gboolean* called = static_cast<gboolean*>(user_data);
112  *called = TRUE;
113 
114  EXPECT_TRUE(FL_IS_METHOD_SUCCESS_RESPONSE(response));
116  FL_METHOD_SUCCESS_RESPONSE(response));
117  EXPECT_EQ(fl_value_get_type(result), FL_VALUE_TYPE_NULL);
118  },
119  &called);
120  EXPECT_TRUE(called);
121 }
122 
123 // Checks we can generate a cancel exception.
124 TEST_F(FlEventChannelTest, CancelException) {
125  g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
126  g_autoptr(FlEventChannel) channel = fl_event_channel_new(
127  FL_BINARY_MESSENGER(messenger), "test", FL_METHOD_CODEC(codec));
129  channel, nullptr,
130  [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
131  return fl_method_error_response_new("CANCEL-ERROR",
132  "CANCEL-ERROR-MESSAGE", nullptr);
133  },
134  nullptr, nullptr);
135 
136  fl_mock_binary_messenger_invoke_standard_method(
137  messenger, "test", "listen", nullptr,
138  [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
139  gpointer user_data) {},
140  nullptr);
141  gboolean called = FALSE;
142  fl_mock_binary_messenger_invoke_standard_method(
143  messenger, "test", "cancel", nullptr,
144  [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
145  gpointer user_data) {
146  gboolean* called = static_cast<gboolean*>(user_data);
147  *called = TRUE;
148 
149  EXPECT_TRUE(FL_IS_METHOD_ERROR_RESPONSE(response));
151  FL_METHOD_ERROR_RESPONSE(response)),
152  "CANCEL-ERROR");
154  FL_METHOD_ERROR_RESPONSE(response)),
155  "CANCEL-ERROR-MESSAGE");
156  },
157  &called);
158  EXPECT_TRUE(called);
159 }
160 
161 // Checks args are passed to listen/cancel.
163  g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
164  g_autoptr(FlEventChannel) channel = fl_event_channel_new(
165  FL_BINARY_MESSENGER(messenger), "test", FL_METHOD_CODEC(codec));
166  int call_count = 0;
168  channel,
169  [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
170  int* call_count = static_cast<int*>(user_data);
171  EXPECT_EQ(*call_count, 0);
172  (*call_count)++;
173 
174  g_autoptr(FlValue) expected_args = fl_value_new_string("LISTEN-ARGS");
175  EXPECT_TRUE(fl_value_equal(args, expected_args));
176 
177  return static_cast<FlMethodErrorResponse*>(nullptr);
178  },
179  [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
180  int* call_count = static_cast<int*>(user_data);
181  EXPECT_EQ(*call_count, 1);
182  (*call_count)++;
183 
184  g_autoptr(FlValue) expected_args = fl_value_new_string("CANCEL-ARGS");
185  EXPECT_TRUE(fl_value_equal(args, expected_args));
186 
187  return static_cast<FlMethodErrorResponse*>(nullptr);
188  },
189  &call_count, nullptr);
190 
191  g_autoptr(FlValue) listen_args = fl_value_new_string("LISTEN-ARGS");
192  fl_mock_binary_messenger_invoke_standard_method(
193  messenger, "test", "listen", listen_args,
194  [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
195  gpointer user_data) {},
196  nullptr);
197  g_autoptr(FlValue) cancel_args = fl_value_new_string("CANCEL-ARGS");
198  fl_mock_binary_messenger_invoke_standard_method(
199  messenger, "test", "cancel", cancel_args,
200  [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
201  gpointer user_data) {},
202  nullptr);
203 
204  EXPECT_EQ(call_count, 2);
205 }
206 
207 // Checks can send events.
209  int event_count = 0;
210  fl_mock_binary_messenger_set_standard_event_channel(
211  messenger, "test",
212  [](FlMockBinaryMessenger* messenger, FlValue* event, gpointer user_data) {
213  int* event_count = static_cast<int*>(user_data);
214 
215  EXPECT_EQ(fl_value_get_type(event), FL_VALUE_TYPE_INT);
216  EXPECT_EQ(fl_value_get_int(event), *event_count);
217 
218  (*event_count)++;
219  },
220  [](FlMockBinaryMessenger* messenger, const gchar* code,
221  const gchar* message, FlValue* details, gpointer user_data) {},
222  &event_count);
223 
224  g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
225  g_autoptr(FlEventChannel) channel = fl_event_channel_new(
226  FL_BINARY_MESSENGER(messenger), "test", FL_METHOD_CODEC(codec));
228  channel,
229  [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
230  // Send some events.
231  for (int i = 0; i < 5; i++) {
233  g_autoptr(GError) error = nullptr;
234  EXPECT_TRUE(fl_event_channel_send(channel, event, nullptr, &error));
235  EXPECT_EQ(error, nullptr);
236  }
237 
238  return static_cast<FlMethodErrorResponse*>(nullptr);
239  },
240  nullptr, nullptr, nullptr);
241 
242  fl_mock_binary_messenger_invoke_standard_method(
243  messenger, "test", "listen", nullptr,
244  [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
245  gpointer user_data) {},
246  nullptr);
247  fl_mock_binary_messenger_invoke_standard_method(
248  messenger, "test", "cancel", nullptr,
249  [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
250  gpointer user_data) {},
251  nullptr);
252 
253  EXPECT_EQ(event_count, 5);
254 }
255 
256 // Check can register an event channel with the same name as one previously
257 // used.
258 TEST_F(FlEventChannelTest, ReuseChannel) {
259  int event_count = 0;
260  fl_mock_binary_messenger_set_standard_event_channel(
261  messenger, "test",
262  [](FlMockBinaryMessenger* messenger, FlValue* event, gpointer user_data) {
263  int* event_count = static_cast<int*>(user_data);
264 
265  EXPECT_EQ(fl_value_get_type(event), FL_VALUE_TYPE_INT);
266  EXPECT_EQ(fl_value_get_int(event), *event_count);
267 
268  (*event_count)++;
269  },
270  [](FlMockBinaryMessenger* messenger, const gchar* code,
271  const gchar* message, FlValue* details, gpointer user_data) {},
272  &event_count);
273 
274  g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
275  FlEventChannel* channel1 = fl_event_channel_new(
276  FL_BINARY_MESSENGER(messenger), "test", FL_METHOD_CODEC(codec));
278  channel1,
279  [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
280  // Send some events.
281  for (int i = 0; i < 5; i++) {
282  g_autoptr(FlValue) event = fl_value_new_int(100 + i);
283  g_autoptr(GError) error = nullptr;
284  EXPECT_TRUE(fl_event_channel_send(channel, event, nullptr, &error));
285  EXPECT_EQ(error, nullptr);
286  }
287 
288  return static_cast<FlMethodErrorResponse*>(nullptr);
289  },
290  nullptr, nullptr, nullptr);
291 
292  // Remove this channel
293  g_object_unref(channel1);
294 
295  // Register a second channel with the same name.
296  g_autoptr(FlEventChannel) channel2 = fl_event_channel_new(
297  FL_BINARY_MESSENGER(messenger), "test", FL_METHOD_CODEC(codec));
299  channel2,
300  [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
301  // Send some events.
302  for (int i = 0; i < 5; i++) {
304  g_autoptr(GError) error = nullptr;
305  EXPECT_TRUE(fl_event_channel_send(channel, event, nullptr, &error));
306  EXPECT_EQ(error, nullptr);
307  }
308 
309  return static_cast<FlMethodErrorResponse*>(nullptr);
310  },
311  nullptr, nullptr, nullptr);
312 
313  fl_mock_binary_messenger_invoke_standard_method(
314  messenger, "test", "listen", nullptr,
315  [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
316  gpointer user_data) {},
317  nullptr);
318  fl_mock_binary_messenger_invoke_standard_method(
319  messenger, "test", "cancel", nullptr,
320  [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
321  gpointer user_data) {},
322  nullptr);
323 
324  EXPECT_EQ(event_count, 5);
325 }
326 
327 // Check can register an event channel replacing an existing one.
328 TEST_F(FlEventChannelTest, ReplaceChannel) {
329  int event_count = 0;
330  fl_mock_binary_messenger_set_standard_event_channel(
331  messenger, "test",
332  [](FlMockBinaryMessenger* messenger, FlValue* event, gpointer user_data) {
333  int* event_count = static_cast<int*>(user_data);
334 
335  EXPECT_EQ(fl_value_get_type(event), FL_VALUE_TYPE_INT);
336  EXPECT_EQ(fl_value_get_int(event), *event_count);
337 
338  (*event_count)++;
339  },
340  [](FlMockBinaryMessenger* messenger, const gchar* code,
341  const gchar* message, FlValue* details, gpointer user_data) {},
342  &event_count);
343 
344  g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
345  FlEventChannel* channel1 = fl_event_channel_new(
346  FL_BINARY_MESSENGER(messenger), "test", FL_METHOD_CODEC(codec));
348  channel1,
349  [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
350  // Send some events.
351  for (int i = 0; i < 5; i++) {
352  g_autoptr(FlValue) event = fl_value_new_int(100 + i);
353  g_autoptr(GError) error = nullptr;
354  EXPECT_TRUE(fl_event_channel_send(channel, event, nullptr, &error));
355  EXPECT_EQ(error, nullptr);
356  }
357 
358  return static_cast<FlMethodErrorResponse*>(nullptr);
359  },
360  nullptr, nullptr, nullptr);
361 
362  // Register a second channel with the same name.
363  g_autoptr(FlEventChannel) channel2 = fl_event_channel_new(
364  FL_BINARY_MESSENGER(messenger), "test", FL_METHOD_CODEC(codec));
366  channel2,
367  [](FlEventChannel* channel, FlValue* args, gpointer user_data) {
368  // Send some events.
369  for (int i = 0; i < 5; i++) {
371  g_autoptr(GError) error = nullptr;
372  EXPECT_TRUE(fl_event_channel_send(channel, event, nullptr, &error));
373  EXPECT_EQ(error, nullptr);
374  }
375 
376  return static_cast<FlMethodErrorResponse*>(nullptr);
377  },
378  nullptr, nullptr, nullptr);
379 
380  fl_mock_binary_messenger_invoke_standard_method(
381  messenger, "test", "listen", nullptr,
382  [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
383  gpointer user_data) {},
384  nullptr);
385  fl_mock_binary_messenger_invoke_standard_method(
386  messenger, "test", "cancel", nullptr,
387  [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
388  gpointer user_data) {},
389  nullptr);
390 
391  EXPECT_EQ(event_count, 5);
392 }
FlMockBinaryMessenger * messenger
const char * message
g_autoptr(FlEngine) engine
const char FlTextDirection FlAssertiveness gpointer user_data
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_F(FlEventChannelTest, Listen)
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_code(FlMethodErrorResponse *self)
G_MODULE_EXPORT const gchar * fl_method_error_response_get_message(FlMethodErrorResponse *self)
G_MODULE_EXPORT FlValue * fl_method_success_response_get_result(FlMethodSuccessResponse *self)
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 FlValue * fl_value_new_string(const gchar *value)
Definition: fl_value.cc:276
G_MODULE_EXPORT FlValueType fl_value_get_type(FlValue *self)
Definition: fl_value.cc:466
G_MODULE_EXPORT bool fl_value_equal(FlValue *a, FlValue *b)
Definition: fl_value.cc:471
G_MODULE_EXPORT FlValue * fl_value_new_int(int64_t value)
Definition: fl_value.cc:262
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