Index: services/resource_coordinator/coordination_unit/coordination_unit_graph_observer_unittest.cc |
diff --git a/services/resource_coordinator/coordination_unit/coordination_unit_graph_observer_unittest.cc b/services/resource_coordinator/coordination_unit/coordination_unit_graph_observer_unittest.cc |
index 7ad44f721747b13865f1859b7ebffe7e038bc11c..ec182eadb70d1c847895f2f3d759e5a180f6e98e 100644 |
--- a/services/resource_coordinator/coordination_unit/coordination_unit_graph_observer_unittest.cc |
+++ b/services/resource_coordinator/coordination_unit/coordination_unit_graph_observer_unittest.cc |
@@ -25,278 +25,155 @@ namespace { |
class CoordinationUnitGraphObserverTest : public CoordinationUnitImplTestBase { |
}; |
-class TestBasicAPICoordinationUnitGraphObserver |
- : public CoordinationUnitGraphObserver { |
+class TestCoordinationUnitGraphObserver : public CoordinationUnitGraphObserver { |
public: |
- TestBasicAPICoordinationUnitGraphObserver() |
- : TestBasicAPICoordinationUnitGraphObserver( |
- CoordinationUnitType::kInvalidType) {} |
- |
- void OnCoordinationUnitCreatedEvent( |
- CoordinationUnitImpl* coordination_unit) override { |
- ++on_coordination_unit_created_invocations_; |
- |
- coordination_unit->ObserveOnChildAddedEvent(this); |
- coordination_unit->ObserveOnParentAddedEvent(this); |
- coordination_unit->ObserveOnPropertyChangedEvent(this); |
- coordination_unit->ObserveOnChildRemovedEvent(this); |
- coordination_unit->ObserveOnParentRemovedEvent(this); |
- coordination_unit->ObserveOnWillBeDestroyedEvent(this); |
- } |
- |
- size_t on_child_added_listener_invocations() { |
- return on_child_added_listener_invocations_; |
- } |
- size_t on_parent_added_listener_invocations() { |
- return on_parent_added_listener_invocations_; |
- } |
- size_t on_coordination_unit_created_invocations() { |
- return on_coordination_unit_created_invocations_; |
+ TestCoordinationUnitGraphObserver() |
+ : on_child_added_count_(0u), |
+ on_parent_added_count_(0u), |
+ on_coordination_unit_created_count_(0u), |
+ on_property_changed_count_(0u), |
+ on_child_removed_count_(0u), |
+ on_parent_removed_count_(0u), |
+ on_coordination_unit_will_be_destroyed_count_(0u) {} |
+ |
+ size_t on_child_added_count() { return on_child_added_count_; } |
+ size_t on_parent_added_count() { return on_parent_added_count_; } |
+ size_t on_coordination_unit_created_count() { |
+ return on_coordination_unit_created_count_; |
} |
- size_t on_property_changed_listener_invocations() { |
- return on_property_changed_listener_invocations_; |
+ size_t on_property_changed_count() { return on_property_changed_count_; } |
+ size_t on_child_removed_count() { return on_child_removed_count_; } |
+ size_t on_parent_removed_count() { return on_parent_removed_count_; } |
+ size_t on_coordination_unit_will_be_destroyed_count() { |
+ return on_coordination_unit_will_be_destroyed_count_; |
} |
- size_t on_child_removed_listener_invocations() { |
- return on_child_removed_listener_invocations_; |
- } |
- size_t on_parent_removed_listener_invocations() { |
- return on_parent_removed_listener_invocations_; |
+ |
+ // Overridden from CoordinationUnitGraphObserver. |
+ bool ShouldObserve(const CoordinationUnitImpl* coordination_unit) override { |
+ return coordination_unit->id().type == CoordinationUnitType::kFrame; |
} |
- size_t on_will_be_destroyed_listener_invocations() { |
- return on_will_be_destroyed_listener_invocations_; |
+ void OnCoordinationUnitCreated( |
+ const CoordinationUnitImpl* coordination_unit) override { |
+ ++on_coordination_unit_created_count_; |
} |
- |
- void OnChildAddedEvent( |
+ void OnChildAdded( |
const CoordinationUnitImpl* coordination_unit, |
const CoordinationUnitImpl* child_coordination_unit) override { |
- ++on_child_added_listener_invocations_; |
+ ++on_child_added_count_; |
} |
- void OnParentAddedEvent( |
+ void OnParentAdded( |
const CoordinationUnitImpl* coordination_unit, |
const CoordinationUnitImpl* parent_coordination_unit) override { |
- ++on_parent_added_listener_invocations_; |
+ ++on_parent_added_count_; |
} |
- void OnPropertyChangedEvent(const CoordinationUnitImpl* coordination_unit, |
- mojom::PropertyType property) override { |
- ++on_property_changed_listener_invocations_; |
+ void OnPropertyChanged(const CoordinationUnitImpl* coordination_unit, |
+ mojom::PropertyType property) override { |
+ ++on_property_changed_count_; |
} |
- void OnChildRemovedEvent( |
+ void OnChildRemoved( |
const CoordinationUnitImpl* coordination_unit, |
const CoordinationUnitImpl* former_child_coordination_unit) override { |
- ++on_child_removed_listener_invocations_; |
+ ++on_child_removed_count_; |
} |
- void OnParentRemovedEvent( |
+ void OnParentRemoved( |
const CoordinationUnitImpl* coordination_unit, |
const CoordinationUnitImpl* former_parent_coordination_unit) override { |
- ++on_parent_removed_listener_invocations_; |
+ ++on_parent_removed_count_; |
} |
- void OnWillBeDestroyedEvent( |
+ void OnCoordinationUnitWillBeDestroyed( |
const CoordinationUnitImpl* coordination_unit) override { |
- ++on_will_be_destroyed_listener_invocations_; |
+ ++on_coordination_unit_will_be_destroyed_count_; |
} |
- protected: |
- explicit TestBasicAPICoordinationUnitGraphObserver( |
- CoordinationUnitType filter) |
- : CoordinationUnitGraphObserver(filter), |
- on_child_added_listener_invocations_(0u), |
- on_parent_added_listener_invocations_(0u), |
- on_coordination_unit_created_invocations_(0u), |
- on_property_changed_listener_invocations_(0u), |
- on_child_removed_listener_invocations_(0u), |
- on_parent_removed_listener_invocations_(0u), |
- on_will_be_destroyed_listener_invocations_(0u) {} |
- |
- size_t on_child_added_listener_invocations_; |
- size_t on_parent_added_listener_invocations_; |
- size_t on_coordination_unit_created_invocations_; |
- size_t on_property_changed_listener_invocations_; |
- size_t on_child_removed_listener_invocations_; |
- size_t on_parent_removed_listener_invocations_; |
- size_t on_will_be_destroyed_listener_invocations_; |
-}; |
- |
-class TestFilterAPICoordinationUnitGraphObserver |
- : public TestBasicAPICoordinationUnitGraphObserver { |
- public: |
- explicit TestFilterAPICoordinationUnitGraphObserver( |
- CoordinationUnitType filter) |
- : TestBasicAPICoordinationUnitGraphObserver(filter) {} |
- |
- void OnCoordinationUnitCreatedEvent( |
- CoordinationUnitImpl* coordination_unit) override { |
- ++on_coordination_unit_created_invocations_; |
- |
- coordination_unit->ObserveOnChildAddedEvent(this, |
- CoordinationUnitType::kFrame); |
- coordination_unit->ObserveOnParentAddedEvent( |
- this, CoordinationUnitType::kProcess); |
- // TODO(matthalp) Use property mojom::PropertyType enum once it is created. |
- // Currently the only enum is mojom::PropertyType::kTest which is mean to |
- // be filtered out in the test this observer class is used in. |
- coordination_unit->ObserveOnPropertyChangedEvent( |
- this, static_cast<mojom::PropertyType>(1)); |
- coordination_unit->ObserveOnChildRemovedEvent( |
- this, CoordinationUnitType::kNavigation); |
- coordination_unit->ObserveOnParentRemovedEvent( |
- this, CoordinationUnitType::kWebContents); |
- coordination_unit->ObserveOnWillBeDestroyedEvent(this); |
- } |
+ private: |
+ size_t on_child_added_count_; |
+ size_t on_parent_added_count_; |
+ size_t on_coordination_unit_created_count_; |
+ size_t on_property_changed_count_; |
+ size_t on_child_removed_count_; |
+ size_t on_parent_removed_count_; |
+ size_t on_coordination_unit_will_be_destroyed_count_; |
}; |
} // namespace |
TEST_F(CoordinationUnitGraphObserverTest, CallbacksInvokedNoFilters) { |
- TestBasicAPICoordinationUnitGraphObserver* observer = |
- new TestBasicAPICoordinationUnitGraphObserver(); |
- |
- // The observer will be deleted after this test executes when the |
- // CoordinationUnitManager object goes out of scope and destructs. |
- coordination_unit_manager()->RegisterObserver( |
- std::unique_ptr<TestBasicAPICoordinationUnitGraphObserver>(observer)); |
- |
- // The CoordinationUnit types are intentionally different to make |
- // sure filtering, which is not disabled, does not occur. |
- CoordinationUnitID parent_cu_id(CoordinationUnitType::kWebContents, |
- std::string()); |
- CoordinationUnitID child_cu_id(CoordinationUnitType::kFrame, std::string()); |
+ EXPECT_TRUE(coordination_unit_manager().observers().empty()); |
+ coordination_unit_manager().RegisterObserver( |
+ base::MakeUnique<TestCoordinationUnitGraphObserver>()); |
- std::unique_ptr<CoordinationUnitImpl> parent_coordination_unit = |
- coordination_unit_factory::CreateCoordinationUnit( |
- parent_cu_id, service_context_ref_factory()->CreateRef()); |
- std::unique_ptr<CoordinationUnitImpl> child_coordination_unit = |
- coordination_unit_factory::CreateCoordinationUnit( |
- child_cu_id, service_context_ref_factory()->CreateRef()); |
+ EXPECT_EQ(1u, coordination_unit_manager().observers().size()); |
+ TestCoordinationUnitGraphObserver* observer = |
+ static_cast<TestCoordinationUnitGraphObserver*>( |
+ coordination_unit_manager().observers()[0].get()); |
- coordination_unit_manager()->NotifyObserversCoordinationUnitCreated( |
- parent_coordination_unit.get()); |
- coordination_unit_manager()->NotifyObserversCoordinationUnitCreated( |
- child_coordination_unit.get()); |
- |
- parent_coordination_unit->AddChild(child_coordination_unit->id()); |
- parent_coordination_unit->RemoveChild(child_coordination_unit->id()); |
- |
- parent_coordination_unit->SetProperty(mojom::PropertyType::kTest, |
- base::Value(42)); |
- |
- child_coordination_unit->WillBeDestroyed(); |
- parent_coordination_unit->WillBeDestroyed(); |
- |
- EXPECT_EQ(1u, observer->on_child_added_listener_invocations()); |
- EXPECT_EQ(1u, observer->on_child_removed_listener_invocations()); |
- EXPECT_EQ(2u, observer->on_coordination_unit_created_invocations()); |
- EXPECT_EQ(1u, observer->on_parent_added_listener_invocations()); |
- EXPECT_EQ(1u, observer->on_parent_removed_listener_invocations()); |
- EXPECT_EQ(1u, observer->on_property_changed_listener_invocations()); |
- EXPECT_EQ(2u, observer->on_will_be_destroyed_listener_invocations()); |
-} |
- |
-TEST_F(CoordinationUnitGraphObserverTest, CallbacksInvokedWithoutFilters) { |
- TestFilterAPICoordinationUnitGraphObserver* observer = |
- new TestFilterAPICoordinationUnitGraphObserver( |
- CoordinationUnitType::kFrame); |
- coordination_unit_manager()->RegisterObserver( |
- std::unique_ptr<TestFilterAPICoordinationUnitGraphObserver>(observer)); |
- |
- // The CoordinationUnit types are intentionally different to test |
- // that filtering is working correctly. |
CoordinationUnitID process_cu_id(CoordinationUnitType::kProcess, |
std::string()); |
- CoordinationUnitID tab_cu_id(CoordinationUnitType::kWebContents, |
- std::string()); |
CoordinationUnitID root_frame_cu_id(CoordinationUnitType::kFrame, |
std::string()); |
CoordinationUnitID frame_cu_id(CoordinationUnitType::kFrame, std::string()); |
- CoordinationUnitID navigation_cu_id(CoordinationUnitType::kNavigation, |
- std::string()); |
std::unique_ptr<CoordinationUnitImpl> process_coordination_unit = |
coordination_unit_factory::CreateCoordinationUnit( |
process_cu_id, service_context_ref_factory()->CreateRef()); |
- std::unique_ptr<CoordinationUnitImpl> tab_coordination_unit = |
- coordination_unit_factory::CreateCoordinationUnit( |
- tab_cu_id, service_context_ref_factory()->CreateRef()); |
std::unique_ptr<CoordinationUnitImpl> root_frame_coordination_unit = |
coordination_unit_factory::CreateCoordinationUnit( |
root_frame_cu_id, service_context_ref_factory()->CreateRef()); |
std::unique_ptr<CoordinationUnitImpl> frame_coordination_unit = |
coordination_unit_factory::CreateCoordinationUnit( |
frame_cu_id, service_context_ref_factory()->CreateRef()); |
- std::unique_ptr<CoordinationUnitImpl> navigation_coordination_unit = |
- coordination_unit_factory::CreateCoordinationUnit( |
- navigation_cu_id, service_context_ref_factory()->CreateRef()); |
- // Should only invoke the OnCoordinationUnitCreated listener for |
- // the root_frame and frame CoordinationUnits because the observer |
- // filter is set to CoordinationUnitType::kFrame. |
- coordination_unit_manager()->NotifyObserversCoordinationUnitCreated( |
+ coordination_unit_manager().OnCoordinationUnitCreated( |
process_coordination_unit.get()); |
- coordination_unit_manager()->NotifyObserversCoordinationUnitCreated( |
- tab_coordination_unit.get()); |
- coordination_unit_manager()->NotifyObserversCoordinationUnitCreated( |
+ coordination_unit_manager().OnCoordinationUnitCreated( |
root_frame_coordination_unit.get()); |
- coordination_unit_manager()->NotifyObserversCoordinationUnitCreated( |
+ coordination_unit_manager().OnCoordinationUnitCreated( |
frame_coordination_unit.get()); |
- coordination_unit_manager()->NotifyObserversCoordinationUnitCreated( |
- navigation_coordination_unit.get()); |
+ EXPECT_EQ(2u, observer->on_coordination_unit_created_count()); |
- // Test AddChild filtering. The AddChild filter for the frame |
- // CoordinationUnit has been set to only execute when the child |
- // is a CoordinationUnitType::kFrame so the callback will execute. |
- root_frame_coordination_unit->AddChild(frame_coordination_unit->id()); |
- // The child is CoordinationUnitType::kNavigation so the callback |
- // should not be executed. The navigation Coordination Unit is not |
- // actually a child of a frame in practice, but is being used here to |
- // check filtering on OnChildAdded. |
- root_frame_coordination_unit->AddChild(navigation_coordination_unit->id()); |
- |
- // Test AddParent filtering. The AddParent filter for the frame |
- // CoordinationUnit has been set to only execute when the parent |
- // is a CoordinationUnitType::kProcess so the callback will execute. |
- // Note that AddParent is called within Add child. |
+ // The registered observer will only observe the events that happen to |
+ // |root_frame_coordination_unit| and |frame_coordination_unit| because |
+ // they are CoordinationUnitType::kFrame. |
+ // OnAddParent will called for |root_frame_coordination_unit|. |
process_coordination_unit->AddChild(root_frame_coordination_unit->id()); |
- // The parent is CoordinationUnitType::kFrame so the callback |
- // should not be executed. |
- tab_coordination_unit->AddChild(root_frame_coordination_unit->id()); |
- |
- // Test RemoveChild filtering. The RemoveChild filter for the frame |
- // CoordinationUnit has been set to only execute when the child |
- // is a CoordinationUnitType::kFrame so the callback will execute. |
- root_frame_coordination_unit->RemoveChild(frame_coordination_unit->id()); |
- // The child is CoordinationUnitType::kNavigation so the callback |
- // should not be executed. The navigation Coordination Unit is not |
- // actually a child of a frame in practice, but is being used here to |
- // check filtering on OnRemoveChild. |
- root_frame_coordination_unit->RemoveChild(navigation_coordination_unit->id()); |
+ // OnAddParent will called for |frame_coordination_unit|. |
+ process_coordination_unit->AddChild(frame_coordination_unit->id()); |
+ // OnAddChild will called for |root_frame_coordination_unit| and |
+ // OnAddParent will called for |frame_coordination_unit|. |
+ root_frame_coordination_unit->AddChild(frame_coordination_unit->id()); |
+ EXPECT_EQ(1u, observer->on_child_added_count()); |
+ EXPECT_EQ(3u, observer->on_parent_added_count()); |
- // Test RemoveParent filtering. The RemoveParent filter for the frame |
- // CoordinationUnit has been set to only execute when the parent |
- // is a CoordinationUnitType::kProcess so the callback will execute. |
- // Note that RemoveParent is called within Remove child. |
+ // The registered observer will only observe the events that happen to |
+ // |root_frame_coordination_unit| and |frame_coordination_unit| because |
+ // they are CoordinationUnitType::kFrame. |
+ // OnRemoveParent will called for |root_frame_coordination_unit|. |
process_coordination_unit->RemoveChild(root_frame_coordination_unit->id()); |
- // The parent is CoordinationUnitType::kFrame so the callback |
- // should not be executed. |
- tab_coordination_unit->RemoveChild(root_frame_coordination_unit->id()); |
+ // OnRemoveParent will called for |frame_coordination_unit|. |
+ process_coordination_unit->RemoveChild(frame_coordination_unit->id()); |
+ // OnRemoveChild will called for |root_frame_coordination_unit| and |
+ // OnRemoveParent will called for |frame_coordination_unit|. |
+ root_frame_coordination_unit->RemoveChild(frame_coordination_unit->id()); |
+ EXPECT_EQ(1u, observer->on_child_removed_count()); |
+ EXPECT_EQ(3u, observer->on_parent_removed_count()); |
- // TODO(matthalp) Implement this another SetProperty once an additional |
- // mojom::PropertyType has been implemented so that the SetProperty |
- // filtering API can be tested. |
+ // The registered observer will only observe the events that happen to |
+ // |root_frame_coordination_unit| and |frame_coordination_unit| because |
+ // they are CoordinationUnitType::kFrame, so OnPropertyChanged |
+ // will only be called for |root_frame_coordination_unit|. |
root_frame_coordination_unit->SetProperty(mojom::PropertyType::kTest, |
base::Value(42)); |
+ process_coordination_unit->SetProperty(mojom::PropertyType::kTest, |
+ base::Value(42)); |
+ EXPECT_EQ(1u, observer->on_property_changed_count()); |
- frame_coordination_unit->WillBeDestroyed(); |
- navigation_coordination_unit->WillBeDestroyed(); |
- process_coordination_unit->WillBeDestroyed(); |
- root_frame_coordination_unit->WillBeDestroyed(); |
- tab_coordination_unit->WillBeDestroyed(); |
- |
- EXPECT_EQ(1u, observer->on_child_added_listener_invocations()); |
- EXPECT_EQ(1u, observer->on_child_removed_listener_invocations()); |
- EXPECT_EQ(2u, observer->on_coordination_unit_created_invocations()); |
- EXPECT_EQ(1u, observer->on_parent_added_listener_invocations()); |
- EXPECT_EQ(1u, observer->on_parent_removed_listener_invocations()); |
- EXPECT_EQ(0u, observer->on_property_changed_listener_invocations()); |
- EXPECT_EQ(2u, observer->on_will_be_destroyed_listener_invocations()); |
+ coordination_unit_manager().OnCoordinationUnitWillBeDestroyed( |
+ process_coordination_unit.get()); |
+ coordination_unit_manager().OnCoordinationUnitWillBeDestroyed( |
+ root_frame_coordination_unit.get()); |
+ coordination_unit_manager().OnCoordinationUnitWillBeDestroyed( |
+ frame_coordination_unit.get()); |
+ EXPECT_EQ(2u, observer->on_coordination_unit_will_be_destroyed_count()); |
} |
} // namespace resource_coordinator |