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 | #include <memory> |
6 | #include <string> |
7 | |
8 | #include "flutter/shell/platform/common/cpp/client_wrapper/include/flutter/basic_message_channel.h" |
9 | #include "flutter/shell/platform/common/cpp/client_wrapper/include/flutter/binary_messenger.h" |
10 | #include "flutter/shell/platform/common/cpp/client_wrapper/include/flutter/standard_message_codec.h" |
11 | #include "gtest/gtest.h" |
12 | |
13 | namespace flutter { |
14 | |
15 | namespace { |
16 | |
17 | class TestBinaryMessenger : public BinaryMessenger { |
18 | public: |
19 | void Send(const std::string& channel, |
20 | const uint8_t* message, |
21 | const size_t message_size, |
22 | BinaryReply reply) const override {} |
23 | |
24 | void SetMessageHandler(const std::string& channel, |
25 | BinaryMessageHandler handler) override { |
26 | last_message_handler_channel_ = channel; |
27 | last_message_handler_ = handler; |
28 | } |
29 | |
30 | std::string last_message_handler_channel() { |
31 | return last_message_handler_channel_; |
32 | } |
33 | |
34 | BinaryMessageHandler last_message_handler() { return last_message_handler_; } |
35 | |
36 | private: |
37 | std::string last_message_handler_channel_; |
38 | BinaryMessageHandler last_message_handler_; |
39 | }; |
40 | |
41 | } // namespace |
42 | |
43 | // Tests that SetMessageHandler sets a handler that correctly interacts with |
44 | // the binary messenger. |
45 | TEST(BasicMessageChannelTest, Registration) { |
46 | TestBinaryMessenger messenger; |
47 | const std::string channel_name("some_channel" ); |
48 | const StandardMessageCodec& codec = StandardMessageCodec::GetInstance(); |
49 | BasicMessageChannel channel(&messenger, channel_name, &codec); |
50 | |
51 | bool callback_called = false; |
52 | const std::string message_value("hello" ); |
53 | channel.SetMessageHandler( |
54 | [&callback_called, message_value](const auto& message, auto reply) { |
55 | callback_called = true; |
56 | // Ensure that the wrapper recieved a correctly decoded message and a |
57 | // reply. |
58 | EXPECT_EQ(std::get<std::string>(message), message_value); |
59 | EXPECT_NE(reply, nullptr); |
60 | }); |
61 | EXPECT_EQ(messenger.last_message_handler_channel(), channel_name); |
62 | EXPECT_NE(messenger.last_message_handler(), nullptr); |
63 | // Send a test message to trigger the handler test assertions. |
64 | auto message = codec.EncodeMessage(EncodableValue(message_value)); |
65 | |
66 | messenger.last_message_handler()( |
67 | message->data(), message->size(), |
68 | [](const uint8_t* reply, const size_t reply_size) {}); |
69 | EXPECT_EQ(callback_called, true); |
70 | } |
71 | |
72 | // Tests that SetMessageHandler with a null handler unregisters the handler. |
73 | TEST(BasicMessageChannelTest, Unregistration) { |
74 | TestBinaryMessenger messenger; |
75 | const std::string channel_name("some_channel" ); |
76 | BasicMessageChannel channel(&messenger, channel_name, |
77 | &flutter::StandardMessageCodec::GetInstance()); |
78 | |
79 | channel.SetMessageHandler([](const auto& message, auto reply) {}); |
80 | EXPECT_EQ(messenger.last_message_handler_channel(), channel_name); |
81 | EXPECT_NE(messenger.last_message_handler(), nullptr); |
82 | |
83 | channel.SetMessageHandler(nullptr); |
84 | EXPECT_EQ(messenger.last_message_handler_channel(), channel_name); |
85 | EXPECT_EQ(messenger.last_message_handler(), nullptr); |
86 | } |
87 | |
88 | } // namespace flutter |
89 | |