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
13namespace flutter {
14
15namespace {
16
17class 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.
45TEST(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.
73TEST(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