Skip to content

Commit bf50fb0

Browse files
committed
[Linux][Testing] reduce the boilerplate for MockBinaryMessenger
Let MockBinaryMessenger internally manage the FlBinaryMessenger wrapper instance and provide it via operator FlBinaryMessenger*() to avoid having to create two objects in every test. The same technique was used for MockSettings in flutter#32618.
1 parent ea2ee93 commit bf50fb0

File tree

4 files changed

+54
-48
lines changed

4 files changed

+54
-48
lines changed

shell/platform/linux/fl_settings_plugin_test.cc

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,18 @@ MATCHER_P2(HasSetting, key, value, "") {
2525
return false;
2626
}
2727

28-
#define EXPECT_SETTING(mock, messenger, key, value) \
29-
EXPECT_CALL(mock, fl_binary_messenger_send_on_channel( \
30-
messenger, ::testing::StrEq("flutter/settings"), \
31-
HasSetting(key, value), ::testing::A<GCancellable*>(), \
32-
::testing::A<GAsyncReadyCallback>(), \
33-
::testing::A<gpointer>()))
28+
#define EXPECT_SETTING(messenger, key, value) \
29+
EXPECT_CALL( \
30+
messenger, \
31+
fl_binary_messenger_send_on_channel( \
32+
::testing::Eq<FlBinaryMessenger*>(messenger), \
33+
::testing::StrEq("flutter/settings"), HasSetting(key, value), \
34+
::testing::A<GCancellable*>(), ::testing::A<GAsyncReadyCallback>(), \
35+
::testing::A<gpointer>()))
3436

3537
TEST(FlSettingsPluginTest, AlwaysUse24HourFormat) {
3638
::testing::NiceMock<flutter::testing::MockSettings> settings;
37-
38-
::testing::NiceMock<flutter::testing::MockBinaryMessenger> mock_messenger;
39-
g_autoptr(FlBinaryMessenger) messenger =
40-
fl_binary_messenger_new_mock(&mock_messenger);
39+
::testing::NiceMock<flutter::testing::MockBinaryMessenger> messenger;
4140

4241
g_autoptr(FlSettingsPlugin) plugin = fl_settings_plugin_new(messenger);
4342

@@ -49,21 +48,18 @@ TEST(FlSettingsPluginTest, AlwaysUse24HourFormat) {
4948
.WillOnce(::testing::Return(FL_CLOCK_FORMAT_12H))
5049
.WillOnce(::testing::Return(FL_CLOCK_FORMAT_24H));
5150

52-
EXPECT_SETTING(mock_messenger, messenger, "alwaysUse24HourFormat", use_12h);
51+
EXPECT_SETTING(messenger, "alwaysUse24HourFormat", use_12h);
5352

5453
fl_settings_plugin_start(plugin, settings);
5554

56-
EXPECT_SETTING(mock_messenger, messenger, "alwaysUse24HourFormat", use_24h);
55+
EXPECT_SETTING(messenger, "alwaysUse24HourFormat", use_24h);
5756

5857
fl_settings_emit_changed(settings);
5958
}
6059

6160
TEST(FlSettingsPluginTest, PlatformBrightness) {
6261
::testing::NiceMock<flutter::testing::MockSettings> settings;
63-
64-
::testing::NiceMock<flutter::testing::MockBinaryMessenger> mock_messenger;
65-
g_autoptr(FlBinaryMessenger) messenger =
66-
fl_binary_messenger_new_mock(&mock_messenger);
62+
::testing::NiceMock<flutter::testing::MockBinaryMessenger> messenger;
6763

6864
g_autoptr(FlSettingsPlugin) plugin = fl_settings_plugin_new(messenger);
6965

@@ -75,21 +71,18 @@ TEST(FlSettingsPluginTest, PlatformBrightness) {
7571
.WillOnce(::testing::Return(FL_COLOR_SCHEME_LIGHT))
7672
.WillOnce(::testing::Return(FL_COLOR_SCHEME_DARK));
7773

78-
EXPECT_SETTING(mock_messenger, messenger, "platformBrightness", light);
74+
EXPECT_SETTING(messenger, "platformBrightness", light);
7975

8076
fl_settings_plugin_start(plugin, settings);
8177

82-
EXPECT_SETTING(mock_messenger, messenger, "platformBrightness", dark);
78+
EXPECT_SETTING(messenger, "platformBrightness", dark);
8379

8480
fl_settings_emit_changed(settings);
8581
}
8682

8783
TEST(FlSettingsPluginTest, TextScaleFactor) {
8884
::testing::NiceMock<flutter::testing::MockSettings> settings;
89-
90-
::testing::NiceMock<flutter::testing::MockBinaryMessenger> mock_messenger;
91-
g_autoptr(FlBinaryMessenger) messenger =
92-
fl_binary_messenger_new_mock(&mock_messenger);
85+
::testing::NiceMock<flutter::testing::MockBinaryMessenger> messenger;
9386

9487
g_autoptr(FlSettingsPlugin) plugin = fl_settings_plugin_new(messenger);
9588

@@ -101,11 +94,11 @@ TEST(FlSettingsPluginTest, TextScaleFactor) {
10194
.WillOnce(::testing::Return(1.0))
10295
.WillOnce(::testing::Return(2.0));
10396

104-
EXPECT_SETTING(mock_messenger, messenger, "textScaleFactor", one);
97+
EXPECT_SETTING(messenger, "textScaleFactor", one);
10598

10699
fl_settings_plugin_start(plugin, settings);
107100

108-
EXPECT_SETTING(mock_messenger, messenger, "textScaleFactor", two);
101+
EXPECT_SETTING(messenger, "textScaleFactor", two);
109102

110103
fl_settings_emit_changed(settings);
111104
}

shell/platform/linux/fl_text_input_plugin_test.cc

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,14 @@ static FlValue* build_list(std::vector<FlValue*> args) {
4949
}
5050

5151
TEST(FlTextInputPluginTest, SetClient) {
52-
::testing::NiceMock<flutter::testing::MockBinaryMessenger> mock;
53-
g_autoptr(FlBinaryMessenger) messenger = fl_binary_messenger_new_mock(&mock);
52+
::testing::NiceMock<flutter::testing::MockBinaryMessenger> messenger;
5453
auto filter =
5554
+[](GtkIMContext* im_context, gpointer gdk_event) { return false; };
5655

5756
fl_text_input_plugin_new(messenger, nullptr,
5857
FlTextInputPluginImFilter(filter));
5958

60-
EXPECT_TRUE(mock.HasMessageHandler("flutter/textinput"));
59+
EXPECT_TRUE(messenger.HasMessageHandler("flutter/textinput"));
6160

6261
g_autoptr(FlValue) args = build_list({
6362
fl_value_new_int(1), // client id
@@ -75,11 +74,11 @@ TEST(FlTextInputPluginTest, SetClient) {
7574
FL_METHOD_CODEC(codec), "TextInput.setClient", args, nullptr);
7675

7776
g_autoptr(FlValue) null = fl_value_new_null();
78-
EXPECT_CALL(mock, fl_binary_messenger_send_response(
79-
::testing::Eq(messenger),
80-
::testing::A<FlBinaryMessengerResponseHandle*>(),
81-
SuccessResponse(null), ::testing::A<GError**>()))
77+
EXPECT_CALL(messenger, fl_binary_messenger_send_response(
78+
::testing::Eq<FlBinaryMessenger*>(messenger),
79+
::testing::A<FlBinaryMessengerResponseHandle*>(),
80+
SuccessResponse(null), ::testing::A<GError**>()))
8281
.WillOnce(::testing::Return(true));
8382

84-
mock.ReceiveMessage(messenger, "flutter/textinput", message);
83+
messenger.ReceiveMessage("flutter/textinput", message);
8584
}

shell/platform/linux/testing/mock_binary_messenger.cc

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,27 @@ struct _FlMockBinaryMessenger {
1818
MockBinaryMessenger* mock;
1919
};
2020

21+
static FlBinaryMessenger* fl_mock_binary_messenger_new(
22+
MockBinaryMessenger* mock) {
23+
FlMockBinaryMessenger* self = FL_MOCK_BINARY_MESSENGER(
24+
g_object_new(fl_mock_binary_messenger_get_type(), nullptr));
25+
self->mock = mock;
26+
return FL_BINARY_MESSENGER(self);
27+
}
28+
29+
MockBinaryMessenger::MockBinaryMessenger()
30+
: instance_(fl_mock_binary_messenger_new(this)) {}
31+
32+
MockBinaryMessenger::~MockBinaryMessenger() {
33+
if (FL_IS_BINARY_MESSENGER(instance_)) {
34+
g_clear_object(&instance_);
35+
}
36+
}
37+
38+
MockBinaryMessenger::operator FlBinaryMessenger*() {
39+
return instance_;
40+
}
41+
2142
bool MockBinaryMessenger::HasMessageHandler(const gchar* channel) const {
2243
return message_handlers.at(channel) != nullptr;
2344
}
@@ -30,15 +51,14 @@ void MockBinaryMessenger::SetMessageHandler(
3051
user_datas[channel] = user_data;
3152
}
3253

33-
void MockBinaryMessenger::ReceiveMessage(FlBinaryMessenger* messenger,
34-
const gchar* channel,
54+
void MockBinaryMessenger::ReceiveMessage(const gchar* channel,
3555
GBytes* message) {
3656
FlBinaryMessengerMessageHandler handler = message_handlers[channel];
3757
if (response_handles[channel] == nullptr) {
3858
response_handles[channel] = FL_BINARY_MESSENGER_RESPONSE_HANDLE(
3959
fl_mock_binary_messenger_response_handle_new());
4060
}
41-
handler(messenger, channel, message, response_handles[channel],
61+
handler(instance_, channel, message, response_handles[channel],
4262
user_datas[channel]);
4363
}
4464

@@ -113,10 +133,3 @@ static void fl_mock_binary_messenger_iface_init(
113133
}
114134

115135
static void fl_mock_binary_messenger_init(FlMockBinaryMessenger* self) {}
116-
117-
FlBinaryMessenger* fl_binary_messenger_new_mock(MockBinaryMessenger* mock) {
118-
FlMockBinaryMessenger* self = FL_MOCK_BINARY_MESSENGER(
119-
g_object_new(fl_mock_binary_messenger_get_type(), NULL));
120-
self->mock = mock;
121-
return FL_BINARY_MESSENGER(self);
122-
}

shell/platform/linux/testing/mock_binary_messenger.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ namespace testing {
1717
// Mock for FlBinaryMessenger.
1818
class MockBinaryMessenger {
1919
public:
20+
MockBinaryMessenger();
21+
~MockBinaryMessenger();
22+
23+
operator FlBinaryMessenger*();
24+
2025
MOCK_METHOD5(fl_binary_messenger_set_message_handler_on_channel,
2126
void(FlBinaryMessenger* messenger,
2227
const gchar* channel,
@@ -49,11 +54,10 @@ class MockBinaryMessenger {
4954
FlBinaryMessengerMessageHandler handler,
5055
gpointer user_data);
5156

52-
void ReceiveMessage(FlBinaryMessenger* messenger,
53-
const gchar* channel,
54-
GBytes* message);
57+
void ReceiveMessage(const gchar* channel, GBytes* message);
5558

5659
private:
60+
FlBinaryMessenger* instance_ = nullptr;
5761
std::unordered_map<std::string, FlBinaryMessengerMessageHandler>
5862
message_handlers;
5963
std::unordered_map<std::string, FlBinaryMessengerResponseHandle*>
@@ -64,7 +68,4 @@ class MockBinaryMessenger {
6468
} // namespace testing
6569
} // namespace flutter
6670

67-
FlBinaryMessenger* fl_binary_messenger_new_mock(
68-
flutter::testing::MockBinaryMessenger* mock);
69-
7071
#endif // FLUTTER_SHELL_PLATFORM_LINUX_TESTING_MOCK_BINARY_MESSENGER_H_

0 commit comments

Comments
 (0)