Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
44a638b
Initial commit
Kurun-pan Mar 7, 2020
395df1e
remove std::optional (C++17)
Kurun-pan Mar 8, 2020
c556c7a
Fix unit test code, bugfix.
Kurun-pan Mar 8, 2020
1000496
Fixed bug that the error of EventChannel register stream handler when…
Kurun-pan Mar 8, 2020
ae81b9d
Fix coding format.
Kurun-pan Mar 9, 2020
9069e4c
Fix unit test fail.
Kurun-pan Mar 9, 2020
8e96c4f
Fix coding format
Kurun-pan Mar 9, 2020
b8fe504
Fix build break.
Kurun-pan Mar 9, 2020
251829e
Fix code format
Kurun-pan Mar 9, 2020
4f5e051
Modified unit test scenario.
Kurun-pan Mar 9, 2020
b821d51
Fix code format
Kurun-pan Mar 9, 2020
7c5e963
Fix code format
Kurun-pan Mar 9, 2020
0b9446e
Fix code format
Kurun-pan Mar 9, 2020
6168c67
Fix build error.
Kurun-pan Mar 9, 2020
6917341
Fix code format
Kurun-pan Mar 9, 2020
f870a60
Fix BUILD.gn format
Kurun-pan Mar 9, 2020
f4f8634
Fix licenses_flutter, core_wrapper_files.gni format
Kurun-pan Mar 9, 2020
02b3a3e
Fix licenses_flutter, core_wrapper_files.gni format
Kurun-pan Mar 9, 2020
59c7146
Modify comments
Kurun-pan Mar 22, 2020
5222fc0
Fix unit test code
Kurun-pan Mar 29, 2020
50576c6
Modify comment and change from class to structure
Kurun-pan Mar 29, 2020
28cc16e
Fix for code review result
Kurun-pan Mar 31, 2020
0835785
Fix code format
Kurun-pan Mar 31, 2020
cc3f913
Fix code format
Kurun-pan Mar 31, 2020
2210369
Fix build error
Kurun-pan Mar 31, 2020
6c942dc
Fix code format
Kurun-pan Mar 31, 2020
fbaaee8
Fix code format
Kurun-pan Mar 31, 2020
6c3fb5f
Fixed the points that were pointed out.
Kurun-pan Apr 11, 2020
7f0e247
Fixed the points that were pointed out.
Kurun-pan Apr 11, 2020
a4e0caf
Fix code format
Kurun-pan Apr 11, 2020
05ce3b5
- Add error handling of StreamHandler and fix unit test code.
Kurun-pan Apr 11, 2020
c830c9b
Fix code formatting
Kurun-pan Apr 11, 2020
53077da
Merge commit 'f779f09058c695f33eaee1f4b7dcd8908ac5f195' into topic-ev…
Kurun-pan Apr 11, 2020
21d9f99
Merge commit 'fb208b486ec354dc7324e4228d9c311208174b18' into topic-ev…
Kurun-pan Apr 17, 2020
3768021
Fix build error, modify the comment and test case.
Kurun-pan Apr 17, 2020
825ca23
Add StreamHandlerError to communicate errors, and fix the points that…
Kurun-pan Apr 18, 2020
3befe52
Fix code formatting.
Kurun-pan Apr 18, 2020
8a76fba
Fix code formatting.
Kurun-pan Apr 18, 2020
5f09561
Recreated StreamHandler class with reference to MethodResult.
Kurun-pan Apr 18, 2020
4896184
Fix build error.
Kurun-pan Apr 18, 2020
41eb32f
Fix code formatting.
Kurun-pan Apr 18, 2020
dc68fbd
Fix code formatting.
Kurun-pan Apr 18, 2020
0416d5b
Fix code formatting.
Kurun-pan Apr 18, 2020
b36ae30
Fix code formatting.
Kurun-pan Apr 18, 2020
dfb1451
Fix code formatting.
Kurun-pan Apr 18, 2020
61df9ba
Modified method name and other.
Kurun-pan Apr 18, 2020
090f6bf
Modify comments.
Kurun-pan Apr 18, 2020
7905db1
Fixed some comments and unit test scenario name. Furthermore, don't u…
Kurun-pan Apr 30, 2020
f71c8a0
Merge commit '590381a00a56fdab914eeddcbcf4430b0f763ec1' into topic-ev…
Kurun-pan Apr 30, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions ci/licenses_golden/licenses_flutter
Original file line number Diff line number Diff line change
Expand Up @@ -782,10 +782,15 @@ FILE: ../../../flutter/shell/platform/common/cpp/client_wrapper/basic_message_ch
FILE: ../../../flutter/shell/platform/common/cpp/client_wrapper/byte_stream_wrappers.h
FILE: ../../../flutter/shell/platform/common/cpp/client_wrapper/encodable_value_unittests.cc
FILE: ../../../flutter/shell/platform/common/cpp/client_wrapper/engine_method_result.cc
FILE: ../../../flutter/shell/platform/common/cpp/client_wrapper/event_channel_unittests.cc
FILE: ../../../flutter/shell/platform/common/cpp/client_wrapper/include/flutter/basic_message_channel.h
FILE: ../../../flutter/shell/platform/common/cpp/client_wrapper/include/flutter/binary_messenger.h
FILE: ../../../flutter/shell/platform/common/cpp/client_wrapper/include/flutter/encodable_value.h
FILE: ../../../flutter/shell/platform/common/cpp/client_wrapper/include/flutter/engine_method_result.h
FILE: ../../../flutter/shell/platform/common/cpp/client_wrapper/include/flutter/event_channel.h
FILE: ../../../flutter/shell/platform/common/cpp/client_wrapper/include/flutter/event_sink.h
FILE: ../../../flutter/shell/platform/common/cpp/client_wrapper/include/flutter/event_stream_handler.h
FILE: ../../../flutter/shell/platform/common/cpp/client_wrapper/include/flutter/event_stream_handler_functions.h
FILE: ../../../flutter/shell/platform/common/cpp/client_wrapper/include/flutter/message_codec.h
FILE: ../../../flutter/shell/platform/common/cpp/client_wrapper/include/flutter/method_call.h
FILE: ../../../flutter/shell/platform/common/cpp/client_wrapper/include/flutter/method_channel.h
Expand Down
1 change: 1 addition & 0 deletions shell/platform/common/cpp/client_wrapper/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ executable("client_wrapper_unittests") {
sources = [
"basic_message_channel_unittests.cc",
"encodable_value_unittests.cc",
"event_channel_unittests.cc",
"method_call_unittests.cc",
"method_channel_unittests.cc",
"method_result_functions_unittests.cc",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ core_cpp_client_wrapper_includes =
"include/flutter/binary_messenger.h",
"include/flutter/encodable_value.h",
"include/flutter/engine_method_result.h",
"include/flutter/event_channel.h",
"include/flutter/event_sink.h",
"include/flutter/event_stream_handler_functions.h",
"include/flutter/event_stream_handler.h",
"include/flutter/message_codec.h",
"include/flutter/method_call.h",
"include/flutter/method_channel.h",
Expand Down
206 changes: 206 additions & 0 deletions shell/platform/common/cpp/client_wrapper/event_channel_unittests.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,206 @@
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "flutter/shell/platform/common/cpp/client_wrapper/include/flutter/event_channel.h"

#include <memory>
#include <string>

#include "flutter/shell/platform/common/cpp/client_wrapper/include/flutter/binary_messenger.h"
#include "flutter/shell/platform/common/cpp/client_wrapper/include/flutter/event_stream_handler_functions.h"
#include "flutter/shell/platform/common/cpp/client_wrapper/include/flutter/standard_method_codec.h"
#include "gtest/gtest.h"

namespace flutter {

namespace {

class TestBinaryMessenger : public BinaryMessenger {
public:
void Send(const std::string& channel,
const uint8_t* message,
const size_t message_size,
BinaryReply reply) const override {}

void SetMessageHandler(const std::string& channel,
BinaryMessageHandler handler) override {
last_message_handler_channel_ = channel;
last_message_handler_ = handler;
}

std::string last_message_handler_channel() {
return last_message_handler_channel_;
}

BinaryMessageHandler last_message_handler() { return last_message_handler_; }

private:
std::string last_message_handler_channel_;
BinaryMessageHandler last_message_handler_;
};

} // namespace

// Tests that SetStreamHandler sets a handler that correctly interacts with
// the binary messenger.
TEST(EventChannelTest, Registration) {
TestBinaryMessenger messenger;
const std::string channel_name("some_channel");
const StandardMethodCodec& codec = StandardMethodCodec::GetInstance();
EventChannel channel(&messenger, channel_name, &codec);

bool on_listen_called = false;
auto handler = std::make_unique<
flutter::StreamHandlerFunctions<flutter::EncodableValue>>(
[&on_listen_called](
const flutter::EncodableValue* arguments,
std::unique_ptr<flutter::EventSink<flutter::EncodableValue>>&& events)
-> std::unique_ptr<StreamHandlerError<flutter::EncodableValue>> {
on_listen_called = true;
return nullptr;
},
[](const flutter::EncodableValue* arguments)
-> std::unique_ptr<StreamHandlerError<flutter::EncodableValue>> {
return nullptr;
});
channel.SetStreamHandler(std::move(handler));
EXPECT_EQ(messenger.last_message_handler_channel(), channel_name);
EXPECT_NE(messenger.last_message_handler(), nullptr);

// Send dummy listen message.
MethodCall<flutter::EncodableValue> call("listen", nullptr);
auto message = codec.EncodeMethodCall(call);
messenger.last_message_handler()(
message->data(), message->size(),
[](const uint8_t* reply, const size_t reply_size) {});

// Check results.
EXPECT_EQ(on_listen_called, true);
}

// Tests that SetStreamHandler with a null handler unregisters the handler.
TEST(EventChannelTest, Unregistration) {
TestBinaryMessenger messenger;
const std::string channel_name("some_channel");
const StandardMethodCodec& codec = StandardMethodCodec::GetInstance();
EventChannel channel(&messenger, channel_name, &codec);

auto handler = std::make_unique<
flutter::StreamHandlerFunctions<flutter::EncodableValue>>(
[](const flutter::EncodableValue* arguments,
std::unique_ptr<flutter::EventSink<flutter::EncodableValue>>&& events)
-> std::unique_ptr<StreamHandlerError<flutter::EncodableValue>> {
return nullptr;
},
[](const flutter::EncodableValue* arguments)
-> std::unique_ptr<StreamHandlerError<flutter::EncodableValue>> {
return nullptr;
});
channel.SetStreamHandler(std::move(handler));
EXPECT_EQ(messenger.last_message_handler_channel(), channel_name);
EXPECT_NE(messenger.last_message_handler(), nullptr);

channel.SetStreamHandler(nullptr);
EXPECT_EQ(messenger.last_message_handler_channel(), channel_name);
EXPECT_EQ(messenger.last_message_handler(), nullptr);
}

// Test that OnCancel callback sequence.
TEST(EventChannelTest, Cancel) {
TestBinaryMessenger messenger;
const std::string channel_name("some_channel");
const StandardMethodCodec& codec = StandardMethodCodec::GetInstance();
EventChannel channel(&messenger, channel_name, &codec);

bool on_listen_called = false;
bool on_cancel_called = false;
auto handler = std::make_unique<
flutter::StreamHandlerFunctions<flutter::EncodableValue>>(
[&on_listen_called](
const flutter::EncodableValue* arguments,
std::unique_ptr<flutter::EventSink<flutter::EncodableValue>>&& events)
-> std::unique_ptr<StreamHandlerError<flutter::EncodableValue>> {
on_listen_called = true;
return nullptr;
},
[&on_cancel_called](const flutter::EncodableValue* arguments)
-> std::unique_ptr<StreamHandlerError<flutter::EncodableValue>> {
on_cancel_called = true;
return nullptr;
});
channel.SetStreamHandler(std::move(handler));
EXPECT_EQ(messenger.last_message_handler_channel(), channel_name);
EXPECT_NE(messenger.last_message_handler(), nullptr);

// Send dummy listen message.
MethodCall<flutter::EncodableValue> call_listen("listen", nullptr);
auto message = codec.EncodeMethodCall(call_listen);
messenger.last_message_handler()(
message->data(), message->size(),
[](const uint8_t* reply, const size_t reply_size) {});
EXPECT_EQ(on_listen_called, true);

// Send dummy cancel message.
MethodCall<flutter::EncodableValue> call_cancel("cancel", nullptr);
message = codec.EncodeMethodCall(call_cancel);
messenger.last_message_handler()(
message->data(), message->size(),
[](const uint8_t* reply, const size_t reply_size) {});

// Check results.
EXPECT_EQ(on_cancel_called, true);
}

// Pseudo test when user re-registers or call OnListen to the same channel.
// Confirm that OnCancel is called and OnListen is called again
// when user re-registers the same channel that has already started
// communication.
TEST(EventChannelTest, ReRegistration) {
TestBinaryMessenger messenger;
const std::string channel_name("some_channel");
const StandardMethodCodec& codec = StandardMethodCodec::GetInstance();
EventChannel channel(&messenger, channel_name, &codec);

bool on_listen_called = false;
bool on_cancel_called = false;
auto handler = std::make_unique<
flutter::StreamHandlerFunctions<flutter::EncodableValue>>(
[&on_listen_called](
const flutter::EncodableValue* arguments,
std::unique_ptr<flutter::EventSink<flutter::EncodableValue>>&& events)
-> std::unique_ptr<StreamHandlerError<flutter::EncodableValue>> {
on_listen_called = true;
return nullptr;
},
[&on_cancel_called](const flutter::EncodableValue* arguments)
-> std::unique_ptr<StreamHandlerError<flutter::EncodableValue>> {
on_cancel_called = true;
return nullptr;
});
channel.SetStreamHandler(std::move(handler));
EXPECT_EQ(messenger.last_message_handler_channel(), channel_name);
EXPECT_NE(messenger.last_message_handler(), nullptr);

// Send dummy listen message.
MethodCall<flutter::EncodableValue> call("listen", nullptr);
auto message = codec.EncodeMethodCall(call);
messenger.last_message_handler()(
message->data(), message->size(),
[](const uint8_t* reply, const size_t reply_size) {});
EXPECT_EQ(on_listen_called, true);

// Send second dummy message to test StreamHandler's OnCancel
// method is called before OnListen method is called.
on_listen_called = false;
message = codec.EncodeMethodCall(call);
messenger.last_message_handler()(
message->data(), message->size(),
[](const uint8_t* reply, const size_t reply_size) {});

// Check results.
EXPECT_EQ(on_cancel_called, true);
EXPECT_EQ(on_listen_called, true);
}

} // namespace flutter
Loading