7
7
#include < gtest/gtest.h>
8
8
#include < lib/async-loop/cpp/loop.h>
9
9
#include < lib/async-loop/default.h>
10
+ #include < lib/async/cpp/executor.h>
10
11
#include < lib/fidl/cpp/binding_set.h>
11
12
#include < lib/fidl/cpp/interface_request.h>
13
+ #include < lib/inspect/cpp/hierarchy.h>
14
+ #include < lib/inspect/cpp/inspector.h>
15
+ #include < lib/inspect/cpp/reader.h>
12
16
#include < lib/sys/cpp/testing/service_directory_provider.h>
13
17
#include < zircon/types.h>
14
18
@@ -33,12 +37,11 @@ void ExpectNodeHasRole(
33
37
34
38
} // namespace
35
39
36
- class AccessibilityBridgeTestDelegate
37
- : public flutter_runner::AccessibilityBridge::Delegate {
40
+ class AccessibilityBridgeTestDelegate {
38
41
public:
39
- void SetSemanticsEnabled (bool enabled) override { enabled_ = enabled; }
42
+ void SetSemanticsEnabled (bool enabled) { enabled_ = enabled; }
40
43
void DispatchSemanticsAction (int32_t node_id,
41
- flutter::SemanticsAction action) override {
44
+ flutter::SemanticsAction action) {
42
45
actions.push_back (std::make_pair (node_id, action));
43
46
}
44
47
@@ -53,7 +56,8 @@ class AccessibilityBridgeTest : public testing::Test {
53
56
public:
54
57
AccessibilityBridgeTest ()
55
58
: loop_(&kAsyncLoopConfigAttachToCurrentThread ),
56
- services_provider_ (loop_.dispatcher()) {
59
+ services_provider_ (loop_.dispatcher()),
60
+ executor_(loop_.dispatcher()) {
57
61
services_provider_.AddService (
58
62
semantics_manager_.GetHandler (loop_.dispatcher ()),
59
63
SemanticsManager::Name_);
@@ -64,16 +68,44 @@ class AccessibilityBridgeTest : public testing::Test {
64
68
loop_.ResetQuit ();
65
69
}
66
70
71
+ void RunPromiseToCompletion (fit::promise<> promise) {
72
+ bool done = false ;
73
+ executor_.schedule_task (
74
+ std::move (promise).and_then ([&done]() { done = true ; }));
75
+ while (loop_.GetState () == ASYNC_LOOP_RUNNABLE) {
76
+ if (done) {
77
+ loop_.ResetQuit ();
78
+ return ;
79
+ }
80
+
81
+ loop_.Run (zx::deadline_after (zx::duration::infinite ()), true );
82
+ }
83
+ loop_.ResetQuit ();
84
+ }
85
+
67
86
protected:
68
87
void SetUp () override {
69
88
zx_status_t status = zx::eventpair::create (
70
89
/* flags*/ 0u , &view_ref_control_.reference , &view_ref_.reference );
71
90
EXPECT_EQ (status, ZX_OK);
72
91
73
92
accessibility_delegate_.actions .clear ();
93
+ inspector_ = std::make_unique<inspect::Inspector>();
94
+ flutter_runner::AccessibilityBridge::SetSemanticsEnabledCallback
95
+ set_semantics_enabled_callback = [this ](bool enabled) {
96
+ accessibility_delegate_.SetSemanticsEnabled (enabled);
97
+ };
98
+ flutter_runner::AccessibilityBridge::DispatchSemanticsActionCallback
99
+ dispatch_semantics_action_callback =
100
+ [this ](int32_t node_id, flutter::SemanticsAction action) {
101
+ accessibility_delegate_.DispatchSemanticsAction (node_id, action);
102
+ };
74
103
accessibility_bridge_ =
75
104
std::make_unique<flutter_runner::AccessibilityBridge>(
76
- accessibility_delegate_, services_provider_.service_directory (),
105
+ std::move (set_semantics_enabled_callback),
106
+ std::move (dispatch_semantics_action_callback),
107
+ services_provider_.service_directory (),
108
+ inspector_->GetRoot ().CreateChild (" test_node" ),
77
109
std::move (view_ref_));
78
110
RunLoopUntilIdle ();
79
111
}
@@ -85,10 +117,14 @@ class AccessibilityBridgeTest : public testing::Test {
85
117
MockSemanticsManager semantics_manager_;
86
118
AccessibilityBridgeTestDelegate accessibility_delegate_;
87
119
std::unique_ptr<flutter_runner::AccessibilityBridge> accessibility_bridge_;
120
+ // Required to verify inspect metrics.
121
+ std::unique_ptr<inspect::Inspector> inspector_;
88
122
89
123
private:
90
124
async::Loop loop_;
91
125
sys::testing::ServiceDirectoryProvider services_provider_;
126
+ // Required to retrieve inspect metrics.
127
+ async::Executor executor_;
92
128
};
93
129
94
130
TEST_F (AccessibilityBridgeTest, RegistersViewRef) {
@@ -952,4 +988,54 @@ TEST_F(AccessibilityBridgeTest, Actions) {
952
988
EXPECT_EQ (accessibility_delegate_.actions .back (),
953
989
std::make_pair (0 , flutter::SemanticsAction::kDecrease ));
954
990
}
991
+
992
+ #if !FLUTTER_RELEASE
993
+ TEST_F (AccessibilityBridgeTest, InspectData) {
994
+ flutter::SemanticsNodeUpdates updates;
995
+ flutter::SemanticsNode node0;
996
+ node0.id = 0 ;
997
+ node0.label = " node0" ;
998
+ node0.hint = " node0_hint" ;
999
+ node0.value = " value" ;
1000
+ node0.flags |= static_cast <int >(flutter::SemanticsFlags::kIsButton );
1001
+ node0.childrenInTraversalOrder = {1 };
1002
+ node0.childrenInHitTestOrder = {1 };
1003
+ node0.rect .setLTRB (0 , 0 , 100 , 100 );
1004
+ updates.emplace (0 , node0);
1005
+
1006
+ flutter::SemanticsNode node1;
1007
+ node1.id = 1 ;
1008
+ node1.flags |= static_cast <int >(flutter::SemanticsFlags::kIsHeader );
1009
+ node1.childrenInTraversalOrder = {};
1010
+ node1.childrenInHitTestOrder = {};
1011
+ updates.emplace (1 , node1);
1012
+
1013
+ accessibility_bridge_->AddSemanticsNodeUpdate (std::move (updates), 1 .f );
1014
+ RunLoopUntilIdle ();
1015
+
1016
+ fit::result<inspect::Hierarchy> hierarchy;
1017
+ ASSERT_FALSE (hierarchy.is_ok ());
1018
+ RunPromiseToCompletion (
1019
+ inspect::ReadFromInspector (*inspector_)
1020
+ .then ([&hierarchy](fit::result<inspect::Hierarchy>& result) {
1021
+ hierarchy = std::move (result);
1022
+ }));
1023
+ ASSERT_TRUE (hierarchy.is_ok ());
1024
+
1025
+ auto tree_inspect_hierarchy = hierarchy.value ().GetByPath ({" test_node" });
1026
+ ASSERT_NE (tree_inspect_hierarchy, nullptr );
1027
+ // TODO(http://fxbug.dev/75841): Rewrite flutter engine accessibility bridge
1028
+ // tests using inspect matchers. The checks bellow verify that the tree was
1029
+ // built, and that it matches the format of the input tree. This will be
1030
+ // updated in the future when test matchers are available to verify individual
1031
+ // property values.
1032
+ const auto & root = tree_inspect_hierarchy->children ();
1033
+ ASSERT_EQ (root.size (), 1u );
1034
+ EXPECT_EQ (root[0 ].name (), " semantic_tree_root" );
1035
+ const auto & child = root[0 ].children ();
1036
+ ASSERT_EQ (child.size (), 1u );
1037
+ EXPECT_EQ (child[0 ].name (), " node_1" );
1038
+ }
1039
+ #endif // !FLUTTER_RELEASE
1040
+
955
1041
} // namespace flutter_runner_test
0 commit comments