OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2017 The Chromium 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 <string> | |
6 #include <utility> | |
7 | |
8 #include "base/memory/ptr_util.h" | |
9 #include "base/process/process_handle.h" | |
10 #include "base/run_loop.h" | |
11 #include "services/resource_coordinator/coordination_unit/coordination_unit_fact ory.h" | |
12 #include "services/resource_coordinator/coordination_unit/coordination_unit_grap h_observer.h" | |
13 #include "services/resource_coordinator/coordination_unit/coordination_unit_impl .h" | |
14 #include "services/resource_coordinator/coordination_unit/coordination_unit_impl _unittest_util.h" | |
15 #include "services/resource_coordinator/coordination_unit/coordination_unit_mana ger.h" | |
16 #include "services/resource_coordinator/public/cpp/coordination_unit_id.h" | |
17 #include "services/resource_coordinator/public/cpp/coordination_unit_types.h" | |
18 #include "services/resource_coordinator/public/interfaces/coordination_unit.mojo m.h" | |
19 #include "testing/gtest/include/gtest/gtest.h" | |
20 | |
21 namespace resource_coordinator { | |
22 | |
23 namespace { | |
24 | |
25 class CoordinationUnitGraphObserverTest : public CoordinationUnitImplTestBase { | |
26 }; | |
27 | |
28 class TestCoordinationUnitGraphObserver : public CoordinationUnitGraphObserver { | |
29 public: | |
30 TestCoordinationUnitGraphObserver() | |
31 : on_child_added_count_(0u), | |
32 on_parent_added_count_(0u), | |
33 on_coordination_unit_created_count_(0u), | |
34 on_property_changed_count_(0u), | |
35 on_child_removed_count_(0u), | |
36 on_parent_removed_count_(0u), | |
37 on_coordination_unit_will_be_destroyed_count_(0u) {} | |
38 | |
39 size_t on_child_added_count() { return on_child_added_count_; } | |
40 size_t on_parent_added_count() { return on_parent_added_count_; } | |
41 size_t on_coordination_unit_created_count() { | |
42 return on_coordination_unit_created_count_; | |
43 } | |
44 size_t on_property_changed_count() { return on_property_changed_count_; } | |
45 size_t on_child_removed_count() { return on_child_removed_count_; } | |
46 size_t on_parent_removed_count() { return on_parent_removed_count_; } | |
47 size_t on_coordination_unit_will_be_destroyed_count() { | |
48 return on_coordination_unit_will_be_destroyed_count_; | |
49 } | |
50 | |
51 // Overridden from CoordinationUnitGraphObserver. | |
52 bool ShouldObserve(const CoordinationUnitImpl* coordination_unit) override { | |
53 return coordination_unit->id().type == CoordinationUnitType::kFrame; | |
54 } | |
55 void OnCoordinationUnitCreated( | |
56 const CoordinationUnitImpl* coordination_unit) override { | |
57 ++on_coordination_unit_created_count_; | |
58 } | |
59 void OnChildAdded( | |
60 const CoordinationUnitImpl* coordination_unit, | |
61 const CoordinationUnitImpl* child_coordination_unit) override { | |
62 ++on_child_added_count_; | |
63 } | |
64 void OnParentAdded( | |
65 const CoordinationUnitImpl* coordination_unit, | |
66 const CoordinationUnitImpl* parent_coordination_unit) override { | |
67 ++on_parent_added_count_; | |
68 } | |
69 void OnPropertyChanged(const CoordinationUnitImpl* coordination_unit, | |
70 mojom::PropertyType property) override { | |
71 ++on_property_changed_count_; | |
72 } | |
73 void OnChildRemoved( | |
74 const CoordinationUnitImpl* coordination_unit, | |
75 const CoordinationUnitImpl* former_child_coordination_unit) override { | |
76 ++on_child_removed_count_; | |
77 } | |
78 void OnParentRemoved( | |
79 const CoordinationUnitImpl* coordination_unit, | |
80 const CoordinationUnitImpl* former_parent_coordination_unit) override { | |
81 ++on_parent_removed_count_; | |
82 } | |
83 void OnCoordinationUnitWillBeDestroyed( | |
84 const CoordinationUnitImpl* coordination_unit) override { | |
85 ++on_coordination_unit_will_be_destroyed_count_; | |
86 } | |
87 | |
88 private: | |
89 size_t on_child_added_count_; | |
90 size_t on_parent_added_count_; | |
91 size_t on_coordination_unit_created_count_; | |
92 size_t on_property_changed_count_; | |
93 size_t on_child_removed_count_; | |
94 size_t on_parent_removed_count_; | |
95 size_t on_coordination_unit_will_be_destroyed_count_; | |
96 }; | |
97 | |
98 } // namespace | |
99 | |
100 TEST_F(CoordinationUnitGraphObserverTest, CallbacksInvokedNoFilters) { | |
Zhen Wang
2017/06/21 03:48:36
nit: CallbacksInvokedNoFilters/CallbacksInvoked
T
| |
101 EXPECT_TRUE(coordination_unit_manager().observers_for_testing().empty()); | |
102 coordination_unit_manager().RegisterObserver( | |
103 base::MakeUnique<TestCoordinationUnitGraphObserver>()); | |
104 EXPECT_EQ(1u, coordination_unit_manager().observers_for_testing().size()); | |
105 | |
106 TestCoordinationUnitGraphObserver* observer = | |
107 static_cast<TestCoordinationUnitGraphObserver*>( | |
108 coordination_unit_manager().observers_for_testing()[0].get()); | |
109 | |
110 CoordinationUnitID process_cu_id(CoordinationUnitType::kProcess, | |
111 std::string()); | |
112 CoordinationUnitID root_frame_cu_id(CoordinationUnitType::kFrame, | |
113 std::string()); | |
114 CoordinationUnitID frame_cu_id(CoordinationUnitType::kFrame, std::string()); | |
115 | |
116 std::unique_ptr<CoordinationUnitImpl> process_coordination_unit = | |
117 coordination_unit_factory::CreateCoordinationUnit( | |
118 process_cu_id, service_context_ref_factory()->CreateRef()); | |
119 std::unique_ptr<CoordinationUnitImpl> root_frame_coordination_unit = | |
120 coordination_unit_factory::CreateCoordinationUnit( | |
121 root_frame_cu_id, service_context_ref_factory()->CreateRef()); | |
122 std::unique_ptr<CoordinationUnitImpl> frame_coordination_unit = | |
123 coordination_unit_factory::CreateCoordinationUnit( | |
124 frame_cu_id, service_context_ref_factory()->CreateRef()); | |
125 | |
126 coordination_unit_manager().OnCoordinationUnitCreated( | |
127 process_coordination_unit.get()); | |
128 coordination_unit_manager().OnCoordinationUnitCreated( | |
129 root_frame_coordination_unit.get()); | |
130 coordination_unit_manager().OnCoordinationUnitCreated( | |
131 frame_coordination_unit.get()); | |
132 EXPECT_EQ(2u, observer->on_coordination_unit_created_count()); | |
133 | |
134 // The registered observer will only observe the events that happen to | |
135 // |root_frame_coordination_unit| and |frame_coordination_unit| because | |
136 // they are CoordinationUnitType::kFrame. | |
137 // OnAddParent will called for |root_frame_coordination_unit|. | |
138 process_coordination_unit->AddChild(root_frame_coordination_unit->id()); | |
139 // OnAddParent will called for |frame_coordination_unit|. | |
140 process_coordination_unit->AddChild(frame_coordination_unit->id()); | |
141 // OnAddChild will called for |root_frame_coordination_unit| and | |
142 // OnAddParent will called for |frame_coordination_unit|. | |
143 root_frame_coordination_unit->AddChild(frame_coordination_unit->id()); | |
144 EXPECT_EQ(1u, observer->on_child_added_count()); | |
145 EXPECT_EQ(3u, observer->on_parent_added_count()); | |
146 | |
147 // The registered observer will only observe the events that happen to | |
148 // |root_frame_coordination_unit| and |frame_coordination_unit| because | |
149 // they are CoordinationUnitType::kFrame. | |
150 // OnRemoveParent will called for |root_frame_coordination_unit|. | |
151 process_coordination_unit->RemoveChild(root_frame_coordination_unit->id()); | |
152 // OnRemoveParent will called for |frame_coordination_unit|. | |
153 process_coordination_unit->RemoveChild(frame_coordination_unit->id()); | |
154 // OnRemoveChild will called for |root_frame_coordination_unit| and | |
155 // OnRemoveParent will called for |frame_coordination_unit|. | |
156 root_frame_coordination_unit->RemoveChild(frame_coordination_unit->id()); | |
157 EXPECT_EQ(1u, observer->on_child_removed_count()); | |
158 EXPECT_EQ(3u, observer->on_parent_removed_count()); | |
159 | |
160 // The registered observer will only observe the events that happen to | |
161 // |root_frame_coordination_unit| and |frame_coordination_unit| because | |
162 // they are CoordinationUnitType::kFrame, so OnPropertyChanged | |
163 // will only be called for |root_frame_coordination_unit|. | |
164 root_frame_coordination_unit->SetProperty(mojom::PropertyType::kTest, | |
165 base::Value(42)); | |
166 process_coordination_unit->SetProperty(mojom::PropertyType::kTest, | |
167 base::Value(42)); | |
168 EXPECT_EQ(1u, observer->on_property_changed_count()); | |
169 | |
170 coordination_unit_manager().OnCoordinationUnitWillBeDestroyed( | |
171 process_coordination_unit.get()); | |
172 coordination_unit_manager().OnCoordinationUnitWillBeDestroyed( | |
173 root_frame_coordination_unit.get()); | |
174 coordination_unit_manager().OnCoordinationUnitWillBeDestroyed( | |
175 frame_coordination_unit.get()); | |
176 EXPECT_EQ(2u, observer->on_coordination_unit_will_be_destroyed_count()); | |
177 } | |
178 | |
179 } // namespace resource_coordinator | |
OLD | NEW |