@@ -33,7 +33,9 @@ class TestBinaryMessenger : public BinaryMessenger {
3333 return last_message_handler_channel_;
3434 }
3535
36- BinaryMessageHandler last_message_handler () { return last_message_handler_; }
36+ const BinaryMessageHandler& last_message_handler () {
37+ return last_message_handler_;
38+ }
3739
3840 private:
3941 std::string last_message_handler_channel_;
@@ -64,7 +66,7 @@ TEST(EventChannelTest, Registration) {
6466 EXPECT_EQ (messenger.last_message_handler_channel (), channel_name);
6567 EXPECT_NE (messenger.last_message_handler (), nullptr );
6668
67- // Send dummy listen message.
69+ // Send test listen message.
6870 MethodCall<> call (" listen" , nullptr );
6971 auto message = codec.EncodeMethodCall (call);
7072 messenger.last_message_handler ()(
@@ -121,15 +123,15 @@ TEST(EventChannelTest, Cancel) {
121123 EXPECT_EQ (messenger.last_message_handler_channel (), channel_name);
122124 EXPECT_NE (messenger.last_message_handler (), nullptr );
123125
124- // Send dummy listen message.
126+ // Send test listen message.
125127 MethodCall<> call_listen (" listen" , nullptr );
126128 auto message = codec.EncodeMethodCall (call_listen);
127129 messenger.last_message_handler ()(
128130 message->data (), message->size (),
129131 [](const uint8_t * reply, const size_t reply_size) {});
130132 EXPECT_EQ (on_listen_called, true );
131133
132- // Send dummy cancel message.
134+ // Send test cancel message.
133135 MethodCall<> call_cancel (" cancel" , nullptr );
134136 message = codec.EncodeMethodCall (call_cancel);
135137 messenger.last_message_handler ()(
@@ -165,7 +167,7 @@ TEST(EventChannelTest, ListenNotCancel) {
165167 EXPECT_EQ (messenger.last_message_handler_channel (), channel_name);
166168 EXPECT_NE (messenger.last_message_handler (), nullptr );
167169
168- // Send dummy listen message.
170+ // Send test listen message.
169171 MethodCall<> call_listen (" listen" , nullptr );
170172 auto message = codec.EncodeMethodCall (call_listen);
171173 messenger.last_message_handler ()(
@@ -205,15 +207,15 @@ TEST(EventChannelTest, ReRegistration) {
205207 EXPECT_EQ (messenger.last_message_handler_channel (), channel_name);
206208 EXPECT_NE (messenger.last_message_handler (), nullptr );
207209
208- // Send dummy listen message.
210+ // Send test listen message.
209211 MethodCall<> call (" listen" , nullptr );
210212 auto message = codec.EncodeMethodCall (call);
211213 messenger.last_message_handler ()(
212214 message->data (), message->size (),
213215 [](const uint8_t * reply, const size_t reply_size) {});
214216 EXPECT_EQ (on_listen_called, true );
215217
216- // Send second dummy message to test StreamHandler's OnCancel
218+ // Send second test message to test StreamHandler's OnCancel
217219 // method is called before OnListen method is called.
218220 on_listen_called = false ;
219221 message = codec.EncodeMethodCall (call);
@@ -226,4 +228,50 @@ TEST(EventChannelTest, ReRegistration) {
226228 EXPECT_EQ (on_listen_called, true );
227229}
228230
231+ // Test that the handler is called even if the event channel is destroyed.
232+ TEST (EventChannelTest, HandlerOutlivesEventChannel) {
233+ TestBinaryMessenger messenger;
234+ const std::string channel_name (" some_channel" );
235+ const StandardMethodCodec& codec = StandardMethodCodec::GetInstance ();
236+
237+ bool on_listen_called = false ;
238+ bool on_cancel_called = false ;
239+ {
240+ EventChannel channel (&messenger, channel_name, &codec);
241+ auto handler = std::make_unique<StreamHandlerFunctions<>>(
242+ [&on_listen_called](const EncodableValue* arguments,
243+ std::unique_ptr<EventSink<>>&& events)
244+ -> std::unique_ptr<StreamHandlerError<>> {
245+ on_listen_called = true ;
246+ return nullptr ;
247+ },
248+ [&on_cancel_called](const EncodableValue* arguments)
249+ -> std::unique_ptr<StreamHandlerError<>> {
250+ on_cancel_called = true ;
251+ return nullptr ;
252+ });
253+ channel.SetStreamHandler (std::move (handler));
254+ }
255+
256+ // The event channel was destroyed but the handler should still be alive.
257+ EXPECT_EQ (messenger.last_message_handler_channel (), channel_name);
258+ EXPECT_NE (messenger.last_message_handler (), nullptr );
259+
260+ // Send test listen message.
261+ MethodCall<> call_listen (" listen" , nullptr );
262+ auto message = codec.EncodeMethodCall (call_listen);
263+ messenger.last_message_handler ()(
264+ message->data (), message->size (),
265+ [](const uint8_t * reply, const size_t reply_size) {});
266+ EXPECT_EQ (on_listen_called, true );
267+
268+ // Send test cancel message.
269+ MethodCall<> call_cancel (" cancel" , nullptr );
270+ message = codec.EncodeMethodCall (call_cancel);
271+ messenger.last_message_handler ()(
272+ message->data (), message->size (),
273+ [](const uint8_t * reply, const size_t reply_size) {});
274+ EXPECT_EQ (on_cancel_called, true );
275+ }
276+
229277} // namespace flutter
0 commit comments