object_manager_unittest.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "dbus/object_manager.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/message_loop.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/thread.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/thread_restrictions.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "dbus/bus.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "dbus/object_path.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "dbus/object_proxy.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "dbus/property.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "dbus/test_service.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The object manager test exercises the asynchronous APIs in ObjectManager, 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and by extension PropertySet and Property<>. 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ObjectManagerTest 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public testing::Test, 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public dbus::ObjectManager::Interface { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ObjectManagerTest() { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct Properties : public dbus::PropertySet { 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::Property<std::string> name; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::Property<int16> version; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::Property<std::vector<std::string> > methods; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::Property<std::vector<dbus::ObjectPath> > objects; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Properties(dbus::ObjectProxy* object_proxy, 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& interface_name, 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PropertyChangedCallback property_changed_callback) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : dbus::PropertySet(object_proxy, interface_name, 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) property_changed_callback) { 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RegisterProperty("Name", &name); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RegisterProperty("Version", &version); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RegisterProperty("Methods", &methods); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RegisterProperty("Objects", &objects); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual dbus::PropertySet* CreateProperties( 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectProxy* object_proxy, 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const dbus::ObjectPath& object_path, 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& interface_name) OVERRIDE { 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Properties* properties = new Properties( 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object_proxy, interface_name, 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&ObjectManagerTest::OnPropertyChanged, 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this), object_path)); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return static_cast<dbus::PropertySet*>(properties); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUp() { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make the main thread not to allow IO. 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ThreadRestrictions::SetIOAllowed(false); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start the D-Bus thread. 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus_thread_.reset(new base::Thread("D-Bus Thread")); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Thread::Options thread_options; 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) thread_options.message_loop_type = base::MessageLoop::TYPE_IO; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(dbus_thread_->StartWithOptions(thread_options)); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start the test service, using the D-Bus thread. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::TestService::Options options; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options.dbus_task_runner = dbus_thread_->message_loop_proxy(); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_service_.reset(new dbus::TestService(options)); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_service_->StartService()); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_service_->WaitUntilServiceIsStarted()); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_service_->HasDBusThread()); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create the client, using the D-Bus thread. 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::Bus::Options bus_options; 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bus_options.bus_type = dbus::Bus::SESSION; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bus_options.connection_type = dbus::Bus::PRIVATE; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bus_options.dbus_task_runner = dbus_thread_->message_loop_proxy(); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bus_ = new dbus::Bus(bus_options); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(bus_->HasDBusThread()); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object_manager_ = bus_->GetObjectManager( 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "org.chromium.TestService", 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectPath("/org/chromium/TestService")); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object_manager_->RegisterInterface("org.chromium.TestInterface", this); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object_manager_->GetManagedObjects(); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WaitForObject(); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TearDown() { 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bus_->ShutdownOnDBusThreadAndBlock(); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Shut down the service. 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_service_->ShutdownAndBlock(); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Reset to the default. 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ThreadRestrictions::SetIOAllowed(true); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Stopping a thread is considered an IO operation, so do this after 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // allowing IO. 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_service_->Stop(); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MethodCallback(dbus::Response* response) { 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) method_callback_called_ = true; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.Quit(); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)protected: 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when an object is added. 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ObjectAdded(const dbus::ObjectPath& object_path, 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& interface_name) OVERRIDE { 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) added_objects_.push_back(std::make_pair(object_path, interface_name)); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.Quit(); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when an object is removed. 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ObjectRemoved(const dbus::ObjectPath& object_path, 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& interface_name) OVERRIDE { 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) removed_objects_.push_back(std::make_pair(object_path, interface_name)); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.Quit(); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when a property value is updated. 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnPropertyChanged(const dbus::ObjectPath& object_path, 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& name) { 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) updated_properties_.push_back(name); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.Quit(); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const size_t kExpectedObjects = 1; 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const size_t kExpectedProperties = 4; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void WaitForObject() { 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (added_objects_.size() < kExpectedObjects || 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) updated_properties_.size() < kExpectedProperties) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.Run(); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < kExpectedObjects; ++i) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) added_objects_.erase(added_objects_.begin()); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < kExpectedProperties; ++i) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) updated_properties_.erase(updated_properties_.begin()); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void WaitForRemoveObject() { 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (removed_objects_.size() < kExpectedObjects) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.Run(); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < kExpectedObjects; ++i) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) removed_objects_.erase(removed_objects_.begin()); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void WaitForMethodCallback() { 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.Run(); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) method_callback_called_ = false; 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void PerformAction(const std::string& action, 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const dbus::ObjectPath& object_path) { 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectProxy* object_proxy = bus_->GetObjectProxy( 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "org.chromium.TestService", 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectPath("/org/chromium/TestObject")); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::MethodCall method_call("org.chromium.TestInterface", "PerformAction"); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::MessageWriter writer(&method_call); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) writer.AppendString(action); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) writer.AppendObjectPath(object_path); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object_proxy->CallMethod(&method_call, 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&ObjectManagerTest::MethodCallback, 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WaitForMethodCallback(); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop message_loop_; 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Thread> dbus_thread_; 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<dbus::Bus> bus_; 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectManager* object_manager_; 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<dbus::TestService> test_service_; 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::pair<dbus::ObjectPath, std::string> > added_objects_; 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::pair<dbus::ObjectPath, std::string> > removed_objects_; 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> updated_properties_; 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool method_callback_called_; 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ObjectManagerTest, InitialObject) { 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectProxy* object_proxy = object_manager_->GetObjectProxy( 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectPath("/org/chromium/TestObject")); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(object_proxy != NULL); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Properties* properties = static_cast<Properties*>( 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object_manager_->GetProperties( 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectPath("/org/chromium/TestObject"), 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "org.chromium.TestInterface")); 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(properties != NULL); 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("TestService", properties->name.value()); 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(10, properties->version.value()); 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> methods = properties->methods.value(); 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(4U, methods.size()); 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("Echo", methods[0]); 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("SlowEcho", methods[1]); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("AsyncEcho", methods[2]); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("BrokenMethod", methods[3]); 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<dbus::ObjectPath> objects = properties->objects.value(); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1U, objects.size()); 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(dbus::ObjectPath("/TestObjectPath"), objects[0]); 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ObjectManagerTest, UnknownObjectProxy) { 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectProxy* object_proxy = object_manager_->GetObjectProxy( 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectPath("/org/chromium/UnknownObject")); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(object_proxy == NULL); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ObjectManagerTest, UnknownObjectProperties) { 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Properties* properties = static_cast<Properties*>( 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object_manager_->GetProperties( 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectPath("/org/chromium/UnknownObject"), 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "org.chromium.TestInterface")); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(properties == NULL); 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ObjectManagerTest, UnknownInterfaceProperties) { 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Properties* properties = static_cast<Properties*>( 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object_manager_->GetProperties( 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectPath("/org/chromium/TestObject"), 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "org.chromium.UnknownService")); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(properties == NULL); 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ObjectManagerTest, GetObjects) { 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<dbus::ObjectPath> object_paths = object_manager_->GetObjects(); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1U, object_paths.size()); 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(dbus::ObjectPath("/org/chromium/TestObject"), object_paths[0]); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ObjectManagerTest, GetObjectsWithInterface) { 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<dbus::ObjectPath> object_paths = 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object_manager_->GetObjectsWithInterface("org.chromium.TestInterface"); 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1U, object_paths.size()); 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(dbus::ObjectPath("/org/chromium/TestObject"), object_paths[0]); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ObjectManagerTest, GetObjectsWithUnknownInterface) { 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<dbus::ObjectPath> object_paths = 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object_manager_->GetObjectsWithInterface("org.chromium.UnknownService"); 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0U, object_paths.size()); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ObjectManagerTest, SameObject) { 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectManager* object_manager = bus_->GetObjectManager( 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "org.chromium.TestService", 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectPath("/org/chromium/TestService")); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(object_manager_, object_manager); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ObjectManagerTest, DifferentObjectForService) { 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectManager* object_manager = bus_->GetObjectManager( 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "org.chromium.DifferentService", 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectPath("/org/chromium/TestService")); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(object_manager_, object_manager); 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ObjectManagerTest, DifferentObjectForPath) { 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectManager* object_manager = bus_->GetObjectManager( 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "org.chromium.TestService", 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectPath("/org/chromium/DifferentService")); 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(object_manager_, object_manager); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ObjectManagerTest, SecondObject) { 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PerformAction("AddObject", dbus::ObjectPath("/org/chromium/SecondObject")); 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WaitForObject(); 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectProxy* object_proxy = object_manager_->GetObjectProxy( 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectPath("/org/chromium/SecondObject")); 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(object_proxy != NULL); 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Properties* properties = static_cast<Properties*>( 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object_manager_->GetProperties( 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectPath("/org/chromium/SecondObject"), 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "org.chromium.TestInterface")); 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(properties != NULL); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<dbus::ObjectPath> object_paths = object_manager_->GetObjects(); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2U, object_paths.size()); 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::sort(object_paths.begin(), object_paths.end()); 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(dbus::ObjectPath("/org/chromium/SecondObject"), object_paths[0]); 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(dbus::ObjectPath("/org/chromium/TestObject"), object_paths[1]); 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object_paths = 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object_manager_->GetObjectsWithInterface("org.chromium.TestInterface"); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2U, object_paths.size()); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::sort(object_paths.begin(), object_paths.end()); 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(dbus::ObjectPath("/org/chromium/SecondObject"), object_paths[0]); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(dbus::ObjectPath("/org/chromium/TestObject"), object_paths[1]); 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ObjectManagerTest, RemoveSecondObject) { 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PerformAction("AddObject", dbus::ObjectPath("/org/chromium/SecondObject")); 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WaitForObject(); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<dbus::ObjectPath> object_paths = object_manager_->GetObjects(); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2U, object_paths.size()); 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PerformAction("RemoveObject", dbus::ObjectPath("/org/chromium/SecondObject")); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WaitForRemoveObject(); 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectProxy* object_proxy = object_manager_->GetObjectProxy( 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectPath("/org/chromium/SecondObject")); 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(object_proxy == NULL); 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Properties* properties = static_cast<Properties*>( 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object_manager_->GetProperties( 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectPath("/org/chromium/SecondObject"), 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "org.chromium.TestInterface")); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(properties == NULL); 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object_paths = object_manager_->GetObjects(); 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1U, object_paths.size()); 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(dbus::ObjectPath("/org/chromium/TestObject"), object_paths[0]); 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object_paths = 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object_manager_->GetObjectsWithInterface("org.chromium.TestInterface"); 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1U, object_paths.size()); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(dbus::ObjectPath("/org/chromium/TestObject"), object_paths[0]); 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 340