Flutter Linux Embedder
fl_settings_handler_test.cc
Go to the documentation of this file.
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 
6 #include "flutter/shell/platform/embedder/embedder.h"
7 #include "flutter/shell/platform/embedder/test_utils/proc_table_replacement.h"
10 #include "flutter/shell/platform/linux/testing/fl_mock_binary_messenger.h"
11 #include "flutter/shell/platform/linux/testing/mock_settings.h"
12 #include "flutter/testing/testing.h"
13 
14 #include "flutter/shell/platform/linux/testing/linux_test.h"
15 #include "gmock/gmock.h"
16 #include "gtest/gtest.h"
17 
18 class FlSettingsHandlerTest : public flutter::testing::LinuxTest {
19  protected:
20  void SetUp() override {
21  messenger = fl_mock_binary_messenger_new();
22  g_clear_object(&engine);
23  engine =
24  fl_engine_new_with_binary_messenger(FL_BINARY_MESSENGER(messenger));
26  }
27 
29  fl_binary_messenger_shutdown(FL_BINARY_MESSENGER(messenger));
30  g_clear_object(&handler);
31  g_clear_object(&messenger);
32  }
33 
34  FlMockBinaryMessenger* messenger = nullptr;
35  FlSettingsHandler* handler = nullptr;
36  ::testing::NiceMock<flutter::testing::MockSettings> settings;
37 };
38 
39 TEST_F(FlSettingsHandlerTest, AlwaysUse24HourFormat) {
40  EXPECT_CALL(settings, fl_settings_get_clock_format(
41  ::testing::Eq<FlSettings*>(settings)))
42  .WillOnce(::testing::Return(FL_CLOCK_FORMAT_12H))
43  .WillOnce(::testing::Return(FL_CLOCK_FORMAT_24H));
44 
45  gboolean called = FALSE;
46  fl_mock_binary_messenger_set_json_message_channel(
47  messenger, "flutter/settings",
48  [](FlMockBinaryMessenger* messenger, GTask* task, FlValue* message,
49  gpointer user_data) {
50  gboolean* called = static_cast<gboolean*>(user_data);
51  *called = TRUE;
52 
54  FlValue* value =
55  fl_value_lookup_string(message, "alwaysUse24HourFormat");
56  EXPECT_NE(value, nullptr);
58  EXPECT_FALSE(fl_value_get_bool(value));
59 
60  return fl_value_new_null();
61  },
62  &called);
63  fl_settings_handler_start(handler, settings);
64  EXPECT_TRUE(called);
65 
66  called = FALSE;
67  fl_mock_binary_messenger_set_json_message_channel(
68  messenger, "flutter/settings",
69  [](FlMockBinaryMessenger* messenger, GTask* task, FlValue* message,
70  gpointer user_data) {
71  gboolean* called = static_cast<gboolean*>(user_data);
72  *called = TRUE;
73 
75  FlValue* value =
76  fl_value_lookup_string(message, "alwaysUse24HourFormat");
77  EXPECT_NE(value, nullptr);
79  EXPECT_TRUE(fl_value_get_bool(value));
80 
81  return fl_value_new_null();
82  },
83  &called);
84  fl_settings_emit_changed(settings);
85  EXPECT_TRUE(called);
86 }
87 
88 TEST_F(FlSettingsHandlerTest, PlatformBrightness) {
89  EXPECT_CALL(settings, fl_settings_get_color_scheme(
90  ::testing::Eq<FlSettings*>(settings)))
91  .WillOnce(::testing::Return(FL_COLOR_SCHEME_LIGHT))
92  .WillOnce(::testing::Return(FL_COLOR_SCHEME_DARK));
93 
94  gboolean called = FALSE;
95  fl_mock_binary_messenger_set_json_message_channel(
96  messenger, "flutter/settings",
97  [](FlMockBinaryMessenger* messenger, GTask* task, FlValue* message,
98  gpointer user_data) {
99  gboolean* called = static_cast<gboolean*>(user_data);
100  *called = TRUE;
101 
103  FlValue* value = fl_value_lookup_string(message, "platformBrightness");
104  EXPECT_NE(value, nullptr);
106  EXPECT_STREQ(fl_value_get_string(value), "light");
107 
108  return fl_value_new_null();
109  },
110  &called);
111  fl_settings_handler_start(handler, settings);
112  EXPECT_TRUE(called);
113 
114  called = FALSE;
115  fl_mock_binary_messenger_set_json_message_channel(
116  messenger, "flutter/settings",
117  [](FlMockBinaryMessenger* messenger, GTask* task, FlValue* message,
118  gpointer user_data) {
119  gboolean* called = static_cast<gboolean*>(user_data);
120  *called = TRUE;
121 
123  FlValue* value = fl_value_lookup_string(message, "platformBrightness");
124  EXPECT_NE(value, nullptr);
126  EXPECT_STREQ(fl_value_get_string(value), "dark");
127 
128  return fl_value_new_null();
129  },
130  &called);
131  fl_settings_emit_changed(settings);
132  EXPECT_TRUE(called);
133 }
134 
135 TEST_F(FlSettingsHandlerTest, TextScaleFactor) {
136  EXPECT_CALL(settings, fl_settings_get_text_scaling_factor(
137  ::testing::Eq<FlSettings*>(settings)))
138  .WillOnce(::testing::Return(1.0))
139  .WillOnce(::testing::Return(2.0));
140 
141  gboolean called = FALSE;
142  fl_mock_binary_messenger_set_json_message_channel(
143  messenger, "flutter/settings",
144  [](FlMockBinaryMessenger* messenger, GTask* task, FlValue* message,
145  gpointer user_data) {
146  gboolean* called = static_cast<gboolean*>(user_data);
147  *called = TRUE;
148 
150  FlValue* value = fl_value_lookup_string(message, "textScaleFactor");
151  EXPECT_NE(value, nullptr);
153  EXPECT_EQ(fl_value_get_float(value), 1.0);
154 
155  return fl_value_new_null();
156  },
157  &called);
158  fl_settings_handler_start(handler, settings);
159  EXPECT_TRUE(called);
160 
161  called = FALSE;
162  fl_mock_binary_messenger_set_json_message_channel(
163  messenger, "flutter/settings",
164  [](FlMockBinaryMessenger* messenger, GTask* task, FlValue* message,
165  gpointer user_data) {
166  gboolean* called = static_cast<gboolean*>(user_data);
167  *called = TRUE;
168 
170  FlValue* value = fl_value_lookup_string(message, "textScaleFactor");
171  EXPECT_NE(value, nullptr);
173  EXPECT_EQ(fl_value_get_float(value), 2.0);
174 
175  return fl_value_new_null();
176  },
177  &called);
178  fl_settings_emit_changed(settings);
179  EXPECT_TRUE(called);
180 }
181 
182 // MOCK_ENGINE_PROC is leaky by design
183 // NOLINTBEGIN(clang-analyzer-core.StackAddressEscape)
184 TEST_F(FlSettingsHandlerTest, AccessibilityFeatures) {
185  StartEngine();
186 
187  std::vector<FlutterAccessibilityFeature> calls;
188  fl_engine_get_embedder_api(engine)->UpdateAccessibilityFeatures =
189  MOCK_ENGINE_PROC(
190  UpdateAccessibilityFeatures,
191  ([&calls](auto engine, FlutterAccessibilityFeature features) {
192  calls.push_back(features);
193  return kSuccess;
194  }));
195 
196  EXPECT_CALL(settings, fl_settings_get_enable_animations(
197  ::testing::Eq<FlSettings*>(settings)))
198  .WillOnce(::testing::Return(false))
199  .WillOnce(::testing::Return(true))
200  .WillOnce(::testing::Return(false))
201  .WillOnce(::testing::Return(true));
202 
203  EXPECT_CALL(settings, fl_settings_get_high_contrast(
204  ::testing::Eq<FlSettings*>(settings)))
205  .WillOnce(::testing::Return(true))
206  .WillOnce(::testing::Return(false))
207  .WillOnce(::testing::Return(false))
208  .WillOnce(::testing::Return(true));
209 
210  fl_settings_handler_start(handler, settings);
211  EXPECT_THAT(calls, ::testing::SizeIs(1));
212  EXPECT_EQ(calls.back(), static_cast<FlutterAccessibilityFeature>(
213  kFlutterAccessibilityFeatureDisableAnimations |
214  kFlutterAccessibilityFeatureHighContrast));
215 
216  fl_settings_emit_changed(settings);
217  EXPECT_THAT(calls, ::testing::SizeIs(2));
218  EXPECT_EQ(calls.back(), static_cast<FlutterAccessibilityFeature>(0));
219 
220  fl_settings_emit_changed(settings);
221  EXPECT_THAT(calls, ::testing::SizeIs(3));
222  EXPECT_EQ(calls.back(), static_cast<FlutterAccessibilityFeature>(
223  kFlutterAccessibilityFeatureDisableAnimations));
224 
225  fl_settings_emit_changed(settings);
226  EXPECT_THAT(calls, ::testing::SizeIs(4));
227  EXPECT_EQ(calls.back(), static_cast<FlutterAccessibilityFeature>(
228  kFlutterAccessibilityFeatureHighContrast));
229 }
230 // NOLINTEND(clang-analyzer-core.StackAddressEscape)
::testing::NiceMock< flutter::testing::MockSettings > settings
FlMockBinaryMessenger * messenger
const char * message
const char FlTextDirection FlAssertiveness gpointer user_data
void fl_binary_messenger_shutdown(FlBinaryMessenger *self)
return TRUE
FlutterEngineProcTable * fl_engine_get_embedder_api(FlEngine *self)
Definition: fl_engine.cc:920
FlEngine * fl_engine_new_with_binary_messenger(FlBinaryMessenger *binary_messenger)
Definition: fl_engine.cc:734
gboolean fl_settings_get_high_contrast(FlSettings *self)
Definition: fl_settings.cc:42
gdouble fl_settings_get_text_scaling_factor(FlSettings *self)
Definition: fl_settings.cc:46
void fl_settings_emit_changed(FlSettings *self)
Definition: fl_settings.cc:50
gboolean fl_settings_get_enable_animations(FlSettings *self)
Definition: fl_settings.cc:38
FlColorScheme fl_settings_get_color_scheme(FlSettings *self)
Definition: fl_settings.cc:34
FlClockFormat fl_settings_get_clock_format(FlSettings *self)
Definition: fl_settings.cc:30
@ FL_COLOR_SCHEME_DARK
Definition: fl_settings.h:35
@ FL_COLOR_SCHEME_LIGHT
Definition: fl_settings.h:34
@ FL_CLOCK_FORMAT_12H
Definition: fl_settings.h:22
@ FL_CLOCK_FORMAT_24H
Definition: fl_settings.h:23
void fl_settings_handler_start(FlSettingsHandler *self, FlSettings *settings)
FlSettingsHandler * fl_settings_handler_new(FlEngine *engine)
TEST_F(FlSettingsHandlerTest, AlwaysUse24HourFormat)
uint8_t value
G_MODULE_EXPORT FlValue * fl_value_lookup_string(FlValue *self, const gchar *key)
Definition: fl_value.cc:811
G_MODULE_EXPORT FlValueType fl_value_get_type(FlValue *self)
Definition: fl_value.cc:466
G_MODULE_EXPORT bool fl_value_get_bool(FlValue *self)
Definition: fl_value.cc:661
G_MODULE_EXPORT FlValue * fl_value_new_null()
Definition: fl_value.cc:251
G_MODULE_EXPORT const gchar * fl_value_get_string(FlValue *self)
Definition: fl_value.cc:682
G_MODULE_EXPORT double fl_value_get_float(FlValue *self)
Definition: fl_value.cc:675
typedefG_BEGIN_DECLS struct _FlValue FlValue
Definition: fl_value.h:42
@ FL_VALUE_TYPE_STRING
Definition: fl_value.h:68
@ FL_VALUE_TYPE_BOOL
Definition: fl_value.h:65
@ FL_VALUE_TYPE_MAP
Definition: fl_value.h:74
@ FL_VALUE_TYPE_FLOAT
Definition: fl_value.h:67