| Index: dbus/object_manager_unittest.cc
|
| diff --git a/dbus/object_manager_unittest.cc b/dbus/object_manager_unittest.cc
|
| index 10730e18ffbd367ba4829c0465ce061c2363bd9e..54ddeacebd4fd0cc1cdf2d15face1c45b4eb9e62 100644
|
| --- a/dbus/object_manager_unittest.cc
|
| +++ b/dbus/object_manager_unittest.cc
|
| @@ -28,7 +28,7 @@ class ObjectManagerTest
|
| : public testing::Test,
|
| public ObjectManager::Interface {
|
| public:
|
| - ObjectManagerTest() {
|
| + ObjectManagerTest() : timeout_expired_(false) {
|
| }
|
|
|
| struct Properties : public PropertySet {
|
| @@ -90,7 +90,6 @@ class ObjectManagerTest
|
| ObjectPath("/org/chromium/TestService"));
|
| object_manager_->RegisterInterface("org.chromium.TestInterface", this);
|
|
|
| - object_manager_->GetManagedObjects();
|
| WaitForObject();
|
| }
|
|
|
| @@ -115,6 +114,16 @@ class ObjectManagerTest
|
| run_loop_->Quit();
|
| }
|
|
|
| + // Called from the PropertiesChangedAsObjectsReceived test case. The test will
|
| + // not run the message loop if it receives the expected PropertiesChanged
|
| + // signal before the timeout. This method immediately fails the test.
|
| + void PropertiesChangedTestTimeout() {
|
| + timeout_expired_ = true;
|
| + run_loop_->Quit();
|
| +
|
| + FAIL() << "Never received PropertiesChanged";
|
| + }
|
| +
|
| protected:
|
| // Called when an object is added.
|
| virtual void ObjectAdded(const ObjectPath& object_path,
|
| @@ -133,6 +142,16 @@ class ObjectManagerTest
|
| // Called when a property value is updated.
|
| void OnPropertyChanged(const ObjectPath& object_path,
|
| const std::string& name) {
|
| + // Store the value of the "Name" property if that's the one that
|
| + // changed.
|
| + Properties* properties = static_cast<Properties*>(
|
| + object_manager_->GetProperties(
|
| + object_path,
|
| + "org.chromium.TestInterface"));
|
| + if (name == properties->name.name())
|
| + last_name_value_ = properties->name.value();
|
| +
|
| + // Store the updated property.
|
| updated_properties_.push_back(name);
|
| run_loop_->Quit();
|
| }
|
| @@ -191,6 +210,9 @@ class ObjectManagerTest
|
| ObjectManager* object_manager_;
|
| scoped_ptr<TestService> test_service_;
|
|
|
| + std::string last_name_value_;
|
| + bool timeout_expired_;
|
| +
|
| std::vector<std::pair<ObjectPath, std::string> > added_objects_;
|
| std::vector<std::pair<ObjectPath, std::string> > removed_objects_;
|
| std::vector<std::string> updated_properties_;
|
| @@ -359,4 +381,38 @@ TEST_F(ObjectManagerTest, OwnershipLostAndRegained) {
|
| ASSERT_EQ(1U, object_paths.size());
|
| }
|
|
|
| +TEST_F(ObjectManagerTest, PropertiesChangedAsObjectsReceived) {
|
| + // Remove the existing object manager.
|
| + object_manager_->UnregisterInterface("org.chromium.TestInterface");
|
| + run_loop_.reset(new base::RunLoop);
|
| + EXPECT_TRUE(bus_->RemoveObjectManager(
|
| + "org.chromium.TestService",
|
| + ObjectPath("/org/chromium/TestService"),
|
| + run_loop_->QuitClosure()));
|
| + run_loop_->Run();
|
| +
|
| + PerformAction("SetSendImmediatePropertiesChanged",
|
| + ObjectPath("/org/chromium/TestService"));
|
| +
|
| + object_manager_ = bus_->GetObjectManager(
|
| + "org.chromium.TestService",
|
| + ObjectPath("/org/chromium/TestService"));
|
| + object_manager_->RegisterInterface("org.chromium.TestInterface", this);
|
| +
|
| + // The newly created object manager should call GetManagedObjects immediately
|
| + // after setting up the match rule for PropertiesChanged. We should process
|
| + // the PropertiesChanged event right after that. If we don't receive it within
|
| + // 2 seconds, then fail the test.
|
| + message_loop_.PostDelayedTask(
|
| + FROM_HERE,
|
| + base::Bind(&ObjectManagerTest::PropertiesChangedTestTimeout,
|
| + base::Unretained(this)),
|
| + base::TimeDelta::FromSeconds(2));
|
| +
|
| + while (last_name_value_ != "ChangedTestServiceName" && !timeout_expired_) {
|
| + run_loop_.reset(new base::RunLoop);
|
| + run_loop_->Run();
|
| + }
|
| +}
|
| +
|
| } // namespace dbus
|
|
|