1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker #include "dbus/object_manager.h"
6*635a8641SAndroid Build Coastguard Worker
7*635a8641SAndroid Build Coastguard Worker #include <stddef.h>
8*635a8641SAndroid Build Coastguard Worker #include <stdint.h>
9*635a8641SAndroid Build Coastguard Worker
10*635a8641SAndroid Build Coastguard Worker #include <string>
11*635a8641SAndroid Build Coastguard Worker #include <vector>
12*635a8641SAndroid Build Coastguard Worker
13*635a8641SAndroid Build Coastguard Worker #include "base/bind.h"
14*635a8641SAndroid Build Coastguard Worker #include "base/message_loop/message_loop.h"
15*635a8641SAndroid Build Coastguard Worker #include "base/run_loop.h"
16*635a8641SAndroid Build Coastguard Worker #include "base/single_thread_task_runner.h"
17*635a8641SAndroid Build Coastguard Worker #include "base/threading/thread.h"
18*635a8641SAndroid Build Coastguard Worker #include "base/threading/thread_restrictions.h"
19*635a8641SAndroid Build Coastguard Worker #include "dbus/bus.h"
20*635a8641SAndroid Build Coastguard Worker #include "dbus/object_path.h"
21*635a8641SAndroid Build Coastguard Worker #include "dbus/object_proxy.h"
22*635a8641SAndroid Build Coastguard Worker #include "dbus/property.h"
23*635a8641SAndroid Build Coastguard Worker #include "dbus/test_service.h"
24*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
25*635a8641SAndroid Build Coastguard Worker
26*635a8641SAndroid Build Coastguard Worker namespace dbus {
27*635a8641SAndroid Build Coastguard Worker
28*635a8641SAndroid Build Coastguard Worker // The object manager test exercises the asynchronous APIs in ObjectManager,
29*635a8641SAndroid Build Coastguard Worker // and by extension PropertySet and Property<>.
30*635a8641SAndroid Build Coastguard Worker class ObjectManagerTest
31*635a8641SAndroid Build Coastguard Worker : public testing::Test,
32*635a8641SAndroid Build Coastguard Worker public ObjectManager::Interface {
33*635a8641SAndroid Build Coastguard Worker public:
ObjectManagerTest()34*635a8641SAndroid Build Coastguard Worker ObjectManagerTest() : timeout_expired_(false) {
35*635a8641SAndroid Build Coastguard Worker }
36*635a8641SAndroid Build Coastguard Worker
37*635a8641SAndroid Build Coastguard Worker struct Properties : public PropertySet {
38*635a8641SAndroid Build Coastguard Worker Property<std::string> name;
39*635a8641SAndroid Build Coastguard Worker Property<int16_t> version;
40*635a8641SAndroid Build Coastguard Worker Property<std::vector<std::string>> methods;
41*635a8641SAndroid Build Coastguard Worker Property<std::vector<ObjectPath>> objects;
42*635a8641SAndroid Build Coastguard Worker
Propertiesdbus::ObjectManagerTest::Properties43*635a8641SAndroid Build Coastguard Worker Properties(ObjectProxy* object_proxy,
44*635a8641SAndroid Build Coastguard Worker const std::string& interface_name,
45*635a8641SAndroid Build Coastguard Worker PropertyChangedCallback property_changed_callback)
46*635a8641SAndroid Build Coastguard Worker : PropertySet(object_proxy, interface_name, property_changed_callback) {
47*635a8641SAndroid Build Coastguard Worker RegisterProperty("Name", &name);
48*635a8641SAndroid Build Coastguard Worker RegisterProperty("Version", &version);
49*635a8641SAndroid Build Coastguard Worker RegisterProperty("Methods", &methods);
50*635a8641SAndroid Build Coastguard Worker RegisterProperty("Objects", &objects);
51*635a8641SAndroid Build Coastguard Worker }
52*635a8641SAndroid Build Coastguard Worker };
53*635a8641SAndroid Build Coastguard Worker
CreateProperties(ObjectProxy * object_proxy,const ObjectPath & object_path,const std::string & interface_name)54*635a8641SAndroid Build Coastguard Worker PropertySet* CreateProperties(ObjectProxy* object_proxy,
55*635a8641SAndroid Build Coastguard Worker const ObjectPath& object_path,
56*635a8641SAndroid Build Coastguard Worker const std::string& interface_name) override {
57*635a8641SAndroid Build Coastguard Worker Properties* properties = new Properties(
58*635a8641SAndroid Build Coastguard Worker object_proxy, interface_name,
59*635a8641SAndroid Build Coastguard Worker base::Bind(&ObjectManagerTest::OnPropertyChanged,
60*635a8641SAndroid Build Coastguard Worker base::Unretained(this), object_path));
61*635a8641SAndroid Build Coastguard Worker return static_cast<PropertySet*>(properties);
62*635a8641SAndroid Build Coastguard Worker }
63*635a8641SAndroid Build Coastguard Worker
SetUp()64*635a8641SAndroid Build Coastguard Worker void SetUp() override {
65*635a8641SAndroid Build Coastguard Worker // Make the main thread not to allow IO.
66*635a8641SAndroid Build Coastguard Worker base::ThreadRestrictions::SetIOAllowed(false);
67*635a8641SAndroid Build Coastguard Worker
68*635a8641SAndroid Build Coastguard Worker // Start the D-Bus thread.
69*635a8641SAndroid Build Coastguard Worker dbus_thread_.reset(new base::Thread("D-Bus Thread"));
70*635a8641SAndroid Build Coastguard Worker base::Thread::Options thread_options;
71*635a8641SAndroid Build Coastguard Worker thread_options.message_loop_type = base::MessageLoop::TYPE_IO;
72*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(dbus_thread_->StartWithOptions(thread_options));
73*635a8641SAndroid Build Coastguard Worker
74*635a8641SAndroid Build Coastguard Worker // Start the test service, using the D-Bus thread.
75*635a8641SAndroid Build Coastguard Worker TestService::Options options;
76*635a8641SAndroid Build Coastguard Worker options.dbus_task_runner = dbus_thread_->task_runner();
77*635a8641SAndroid Build Coastguard Worker test_service_.reset(new TestService(options));
78*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(test_service_->StartService());
79*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(test_service_->WaitUntilServiceIsStarted());
80*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(test_service_->HasDBusThread());
81*635a8641SAndroid Build Coastguard Worker
82*635a8641SAndroid Build Coastguard Worker // Create the client, using the D-Bus thread.
83*635a8641SAndroid Build Coastguard Worker Bus::Options bus_options;
84*635a8641SAndroid Build Coastguard Worker bus_options.bus_type = Bus::SESSION;
85*635a8641SAndroid Build Coastguard Worker bus_options.connection_type = Bus::PRIVATE;
86*635a8641SAndroid Build Coastguard Worker bus_options.dbus_task_runner = dbus_thread_->task_runner();
87*635a8641SAndroid Build Coastguard Worker bus_ = new Bus(bus_options);
88*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(bus_->HasDBusThread());
89*635a8641SAndroid Build Coastguard Worker
90*635a8641SAndroid Build Coastguard Worker object_manager_ = bus_->GetObjectManager(
91*635a8641SAndroid Build Coastguard Worker test_service_->service_name(),
92*635a8641SAndroid Build Coastguard Worker ObjectPath("/org/chromium/TestService"));
93*635a8641SAndroid Build Coastguard Worker object_manager_->RegisterInterface("org.chromium.TestInterface", this);
94*635a8641SAndroid Build Coastguard Worker
95*635a8641SAndroid Build Coastguard Worker WaitForObject();
96*635a8641SAndroid Build Coastguard Worker }
97*635a8641SAndroid Build Coastguard Worker
TearDown()98*635a8641SAndroid Build Coastguard Worker void TearDown() override {
99*635a8641SAndroid Build Coastguard Worker bus_->ShutdownOnDBusThreadAndBlock();
100*635a8641SAndroid Build Coastguard Worker
101*635a8641SAndroid Build Coastguard Worker // Shut down the service.
102*635a8641SAndroid Build Coastguard Worker test_service_->ShutdownAndBlock();
103*635a8641SAndroid Build Coastguard Worker
104*635a8641SAndroid Build Coastguard Worker // Reset to the default.
105*635a8641SAndroid Build Coastguard Worker base::ThreadRestrictions::SetIOAllowed(true);
106*635a8641SAndroid Build Coastguard Worker
107*635a8641SAndroid Build Coastguard Worker // Stopping a thread is considered an IO operation, so do this after
108*635a8641SAndroid Build Coastguard Worker // allowing IO.
109*635a8641SAndroid Build Coastguard Worker test_service_->Stop();
110*635a8641SAndroid Build Coastguard Worker
111*635a8641SAndroid Build Coastguard Worker base::RunLoop().RunUntilIdle();
112*635a8641SAndroid Build Coastguard Worker }
113*635a8641SAndroid Build Coastguard Worker
MethodCallback(Response * response)114*635a8641SAndroid Build Coastguard Worker void MethodCallback(Response* response) {
115*635a8641SAndroid Build Coastguard Worker method_callback_called_ = true;
116*635a8641SAndroid Build Coastguard Worker run_loop_->Quit();
117*635a8641SAndroid Build Coastguard Worker }
118*635a8641SAndroid Build Coastguard Worker
119*635a8641SAndroid Build Coastguard Worker // Called from the PropertiesChangedAsObjectsReceived test case. The test will
120*635a8641SAndroid Build Coastguard Worker // not run the message loop if it receives the expected PropertiesChanged
121*635a8641SAndroid Build Coastguard Worker // signal before the timeout. This method immediately fails the test.
PropertiesChangedTestTimeout()122*635a8641SAndroid Build Coastguard Worker void PropertiesChangedTestTimeout() {
123*635a8641SAndroid Build Coastguard Worker timeout_expired_ = true;
124*635a8641SAndroid Build Coastguard Worker run_loop_->Quit();
125*635a8641SAndroid Build Coastguard Worker
126*635a8641SAndroid Build Coastguard Worker FAIL() << "Never received PropertiesChanged";
127*635a8641SAndroid Build Coastguard Worker }
128*635a8641SAndroid Build Coastguard Worker
129*635a8641SAndroid Build Coastguard Worker protected:
130*635a8641SAndroid Build Coastguard Worker // Called when an object is added.
ObjectAdded(const ObjectPath & object_path,const std::string & interface_name)131*635a8641SAndroid Build Coastguard Worker void ObjectAdded(const ObjectPath& object_path,
132*635a8641SAndroid Build Coastguard Worker const std::string& interface_name) override {
133*635a8641SAndroid Build Coastguard Worker added_objects_.push_back(std::make_pair(object_path, interface_name));
134*635a8641SAndroid Build Coastguard Worker run_loop_->Quit();
135*635a8641SAndroid Build Coastguard Worker }
136*635a8641SAndroid Build Coastguard Worker
137*635a8641SAndroid Build Coastguard Worker // Called when an object is removed.
ObjectRemoved(const ObjectPath & object_path,const std::string & interface_name)138*635a8641SAndroid Build Coastguard Worker void ObjectRemoved(const ObjectPath& object_path,
139*635a8641SAndroid Build Coastguard Worker const std::string& interface_name) override {
140*635a8641SAndroid Build Coastguard Worker removed_objects_.push_back(std::make_pair(object_path, interface_name));
141*635a8641SAndroid Build Coastguard Worker run_loop_->Quit();
142*635a8641SAndroid Build Coastguard Worker }
143*635a8641SAndroid Build Coastguard Worker
144*635a8641SAndroid Build Coastguard Worker // Called when a property value is updated.
OnPropertyChanged(const ObjectPath & object_path,const std::string & name)145*635a8641SAndroid Build Coastguard Worker void OnPropertyChanged(const ObjectPath& object_path,
146*635a8641SAndroid Build Coastguard Worker const std::string& name) {
147*635a8641SAndroid Build Coastguard Worker // Store the value of the "Name" property if that's the one that
148*635a8641SAndroid Build Coastguard Worker // changed.
149*635a8641SAndroid Build Coastguard Worker Properties* properties = static_cast<Properties*>(
150*635a8641SAndroid Build Coastguard Worker object_manager_->GetProperties(
151*635a8641SAndroid Build Coastguard Worker object_path,
152*635a8641SAndroid Build Coastguard Worker "org.chromium.TestInterface"));
153*635a8641SAndroid Build Coastguard Worker if (name == properties->name.name())
154*635a8641SAndroid Build Coastguard Worker last_name_value_ = properties->name.value();
155*635a8641SAndroid Build Coastguard Worker
156*635a8641SAndroid Build Coastguard Worker // Store the updated property.
157*635a8641SAndroid Build Coastguard Worker updated_properties_.push_back(name);
158*635a8641SAndroid Build Coastguard Worker run_loop_->Quit();
159*635a8641SAndroid Build Coastguard Worker }
160*635a8641SAndroid Build Coastguard Worker
161*635a8641SAndroid Build Coastguard Worker static const size_t kExpectedObjects = 1;
162*635a8641SAndroid Build Coastguard Worker static const size_t kExpectedProperties = 4;
163*635a8641SAndroid Build Coastguard Worker
WaitForObject()164*635a8641SAndroid Build Coastguard Worker void WaitForObject() {
165*635a8641SAndroid Build Coastguard Worker while (added_objects_.size() < kExpectedObjects ||
166*635a8641SAndroid Build Coastguard Worker updated_properties_.size() < kExpectedProperties) {
167*635a8641SAndroid Build Coastguard Worker run_loop_.reset(new base::RunLoop);
168*635a8641SAndroid Build Coastguard Worker run_loop_->Run();
169*635a8641SAndroid Build Coastguard Worker }
170*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < kExpectedObjects; ++i)
171*635a8641SAndroid Build Coastguard Worker added_objects_.erase(added_objects_.begin());
172*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < kExpectedProperties; ++i)
173*635a8641SAndroid Build Coastguard Worker updated_properties_.erase(updated_properties_.begin());
174*635a8641SAndroid Build Coastguard Worker }
175*635a8641SAndroid Build Coastguard Worker
WaitForRemoveObject()176*635a8641SAndroid Build Coastguard Worker void WaitForRemoveObject() {
177*635a8641SAndroid Build Coastguard Worker while (removed_objects_.size() < kExpectedObjects) {
178*635a8641SAndroid Build Coastguard Worker run_loop_.reset(new base::RunLoop);
179*635a8641SAndroid Build Coastguard Worker run_loop_->Run();
180*635a8641SAndroid Build Coastguard Worker }
181*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < kExpectedObjects; ++i)
182*635a8641SAndroid Build Coastguard Worker removed_objects_.erase(removed_objects_.begin());
183*635a8641SAndroid Build Coastguard Worker }
184*635a8641SAndroid Build Coastguard Worker
WaitForMethodCallback()185*635a8641SAndroid Build Coastguard Worker void WaitForMethodCallback() {
186*635a8641SAndroid Build Coastguard Worker run_loop_.reset(new base::RunLoop);
187*635a8641SAndroid Build Coastguard Worker run_loop_->Run();
188*635a8641SAndroid Build Coastguard Worker method_callback_called_ = false;
189*635a8641SAndroid Build Coastguard Worker }
190*635a8641SAndroid Build Coastguard Worker
PerformAction(const std::string & action,const ObjectPath & object_path)191*635a8641SAndroid Build Coastguard Worker void PerformAction(const std::string& action, const ObjectPath& object_path) {
192*635a8641SAndroid Build Coastguard Worker ObjectProxy* object_proxy = bus_->GetObjectProxy(
193*635a8641SAndroid Build Coastguard Worker test_service_->service_name(),
194*635a8641SAndroid Build Coastguard Worker ObjectPath("/org/chromium/TestObject"));
195*635a8641SAndroid Build Coastguard Worker
196*635a8641SAndroid Build Coastguard Worker MethodCall method_call("org.chromium.TestInterface", "PerformAction");
197*635a8641SAndroid Build Coastguard Worker MessageWriter writer(&method_call);
198*635a8641SAndroid Build Coastguard Worker writer.AppendString(action);
199*635a8641SAndroid Build Coastguard Worker writer.AppendObjectPath(object_path);
200*635a8641SAndroid Build Coastguard Worker
201*635a8641SAndroid Build Coastguard Worker object_proxy->CallMethod(&method_call,
202*635a8641SAndroid Build Coastguard Worker ObjectProxy::TIMEOUT_USE_DEFAULT,
203*635a8641SAndroid Build Coastguard Worker base::Bind(&ObjectManagerTest::MethodCallback,
204*635a8641SAndroid Build Coastguard Worker base::Unretained(this)));
205*635a8641SAndroid Build Coastguard Worker WaitForMethodCallback();
206*635a8641SAndroid Build Coastguard Worker }
207*635a8641SAndroid Build Coastguard Worker
208*635a8641SAndroid Build Coastguard Worker base::MessageLoop message_loop_;
209*635a8641SAndroid Build Coastguard Worker std::unique_ptr<base::RunLoop> run_loop_;
210*635a8641SAndroid Build Coastguard Worker std::unique_ptr<base::Thread> dbus_thread_;
211*635a8641SAndroid Build Coastguard Worker scoped_refptr<Bus> bus_;
212*635a8641SAndroid Build Coastguard Worker ObjectManager* object_manager_;
213*635a8641SAndroid Build Coastguard Worker std::unique_ptr<TestService> test_service_;
214*635a8641SAndroid Build Coastguard Worker
215*635a8641SAndroid Build Coastguard Worker std::string last_name_value_;
216*635a8641SAndroid Build Coastguard Worker bool timeout_expired_;
217*635a8641SAndroid Build Coastguard Worker
218*635a8641SAndroid Build Coastguard Worker std::vector<std::pair<ObjectPath, std::string>> added_objects_;
219*635a8641SAndroid Build Coastguard Worker std::vector<std::pair<ObjectPath, std::string>> removed_objects_;
220*635a8641SAndroid Build Coastguard Worker std::vector<std::string> updated_properties_;
221*635a8641SAndroid Build Coastguard Worker
222*635a8641SAndroid Build Coastguard Worker bool method_callback_called_;
223*635a8641SAndroid Build Coastguard Worker };
224*635a8641SAndroid Build Coastguard Worker
225*635a8641SAndroid Build Coastguard Worker
TEST_F(ObjectManagerTest,InitialObject)226*635a8641SAndroid Build Coastguard Worker TEST_F(ObjectManagerTest, InitialObject) {
227*635a8641SAndroid Build Coastguard Worker ObjectProxy* object_proxy = object_manager_->GetObjectProxy(
228*635a8641SAndroid Build Coastguard Worker ObjectPath("/org/chromium/TestObject"));
229*635a8641SAndroid Build Coastguard Worker EXPECT_NE(nullptr, object_proxy);
230*635a8641SAndroid Build Coastguard Worker
231*635a8641SAndroid Build Coastguard Worker Properties* properties = static_cast<Properties*>(
232*635a8641SAndroid Build Coastguard Worker object_manager_->GetProperties(ObjectPath("/org/chromium/TestObject"),
233*635a8641SAndroid Build Coastguard Worker "org.chromium.TestInterface"));
234*635a8641SAndroid Build Coastguard Worker EXPECT_NE(nullptr, properties);
235*635a8641SAndroid Build Coastguard Worker
236*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("TestService", properties->name.value());
237*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(10, properties->version.value());
238*635a8641SAndroid Build Coastguard Worker
239*635a8641SAndroid Build Coastguard Worker std::vector<std::string> methods = properties->methods.value();
240*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(4U, methods.size());
241*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("Echo", methods[0]);
242*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("SlowEcho", methods[1]);
243*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("AsyncEcho", methods[2]);
244*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("BrokenMethod", methods[3]);
245*635a8641SAndroid Build Coastguard Worker
246*635a8641SAndroid Build Coastguard Worker std::vector<ObjectPath> objects = properties->objects.value();
247*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(1U, objects.size());
248*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ObjectPath("/TestObjectPath"), objects[0]);
249*635a8641SAndroid Build Coastguard Worker }
250*635a8641SAndroid Build Coastguard Worker
TEST_F(ObjectManagerTest,UnknownObjectProxy)251*635a8641SAndroid Build Coastguard Worker TEST_F(ObjectManagerTest, UnknownObjectProxy) {
252*635a8641SAndroid Build Coastguard Worker ObjectProxy* object_proxy = object_manager_->GetObjectProxy(
253*635a8641SAndroid Build Coastguard Worker ObjectPath("/org/chromium/UnknownObject"));
254*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, object_proxy);
255*635a8641SAndroid Build Coastguard Worker }
256*635a8641SAndroid Build Coastguard Worker
TEST_F(ObjectManagerTest,UnknownObjectProperties)257*635a8641SAndroid Build Coastguard Worker TEST_F(ObjectManagerTest, UnknownObjectProperties) {
258*635a8641SAndroid Build Coastguard Worker Properties* properties = static_cast<Properties*>(
259*635a8641SAndroid Build Coastguard Worker object_manager_->GetProperties(ObjectPath("/org/chromium/UnknownObject"),
260*635a8641SAndroid Build Coastguard Worker "org.chromium.TestInterface"));
261*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, properties);
262*635a8641SAndroid Build Coastguard Worker }
263*635a8641SAndroid Build Coastguard Worker
TEST_F(ObjectManagerTest,UnknownInterfaceProperties)264*635a8641SAndroid Build Coastguard Worker TEST_F(ObjectManagerTest, UnknownInterfaceProperties) {
265*635a8641SAndroid Build Coastguard Worker Properties* properties = static_cast<Properties*>(
266*635a8641SAndroid Build Coastguard Worker object_manager_->GetProperties(ObjectPath("/org/chromium/TestObject"),
267*635a8641SAndroid Build Coastguard Worker "org.chromium.UnknownService"));
268*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, properties);
269*635a8641SAndroid Build Coastguard Worker }
270*635a8641SAndroid Build Coastguard Worker
TEST_F(ObjectManagerTest,GetObjects)271*635a8641SAndroid Build Coastguard Worker TEST_F(ObjectManagerTest, GetObjects) {
272*635a8641SAndroid Build Coastguard Worker std::vector<ObjectPath> object_paths = object_manager_->GetObjects();
273*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(1U, object_paths.size());
274*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ObjectPath("/org/chromium/TestObject"), object_paths[0]);
275*635a8641SAndroid Build Coastguard Worker }
276*635a8641SAndroid Build Coastguard Worker
TEST_F(ObjectManagerTest,GetObjectsWithInterface)277*635a8641SAndroid Build Coastguard Worker TEST_F(ObjectManagerTest, GetObjectsWithInterface) {
278*635a8641SAndroid Build Coastguard Worker std::vector<ObjectPath> object_paths =
279*635a8641SAndroid Build Coastguard Worker object_manager_->GetObjectsWithInterface("org.chromium.TestInterface");
280*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(1U, object_paths.size());
281*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ObjectPath("/org/chromium/TestObject"), object_paths[0]);
282*635a8641SAndroid Build Coastguard Worker }
283*635a8641SAndroid Build Coastguard Worker
TEST_F(ObjectManagerTest,GetObjectsWithUnknownInterface)284*635a8641SAndroid Build Coastguard Worker TEST_F(ObjectManagerTest, GetObjectsWithUnknownInterface) {
285*635a8641SAndroid Build Coastguard Worker std::vector<ObjectPath> object_paths =
286*635a8641SAndroid Build Coastguard Worker object_manager_->GetObjectsWithInterface("org.chromium.UnknownService");
287*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0U, object_paths.size());
288*635a8641SAndroid Build Coastguard Worker }
289*635a8641SAndroid Build Coastguard Worker
TEST_F(ObjectManagerTest,SameObject)290*635a8641SAndroid Build Coastguard Worker TEST_F(ObjectManagerTest, SameObject) {
291*635a8641SAndroid Build Coastguard Worker ObjectManager* object_manager = bus_->GetObjectManager(
292*635a8641SAndroid Build Coastguard Worker test_service_->service_name(),
293*635a8641SAndroid Build Coastguard Worker ObjectPath("/org/chromium/TestService"));
294*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(object_manager_, object_manager);
295*635a8641SAndroid Build Coastguard Worker }
296*635a8641SAndroid Build Coastguard Worker
TEST_F(ObjectManagerTest,DifferentObjectForService)297*635a8641SAndroid Build Coastguard Worker TEST_F(ObjectManagerTest, DifferentObjectForService) {
298*635a8641SAndroid Build Coastguard Worker ObjectManager* object_manager = bus_->GetObjectManager(
299*635a8641SAndroid Build Coastguard Worker "org.chromium.DifferentService",
300*635a8641SAndroid Build Coastguard Worker ObjectPath("/org/chromium/TestService"));
301*635a8641SAndroid Build Coastguard Worker EXPECT_NE(object_manager_, object_manager);
302*635a8641SAndroid Build Coastguard Worker }
303*635a8641SAndroid Build Coastguard Worker
TEST_F(ObjectManagerTest,DifferentObjectForPath)304*635a8641SAndroid Build Coastguard Worker TEST_F(ObjectManagerTest, DifferentObjectForPath) {
305*635a8641SAndroid Build Coastguard Worker ObjectManager* object_manager = bus_->GetObjectManager(
306*635a8641SAndroid Build Coastguard Worker test_service_->service_name(),
307*635a8641SAndroid Build Coastguard Worker ObjectPath("/org/chromium/DifferentService"));
308*635a8641SAndroid Build Coastguard Worker EXPECT_NE(object_manager_, object_manager);
309*635a8641SAndroid Build Coastguard Worker }
310*635a8641SAndroid Build Coastguard Worker
TEST_F(ObjectManagerTest,SecondObject)311*635a8641SAndroid Build Coastguard Worker TEST_F(ObjectManagerTest, SecondObject) {
312*635a8641SAndroid Build Coastguard Worker PerformAction("AddObject", ObjectPath("/org/chromium/SecondObject"));
313*635a8641SAndroid Build Coastguard Worker WaitForObject();
314*635a8641SAndroid Build Coastguard Worker
315*635a8641SAndroid Build Coastguard Worker ObjectProxy* object_proxy = object_manager_->GetObjectProxy(
316*635a8641SAndroid Build Coastguard Worker ObjectPath("/org/chromium/SecondObject"));
317*635a8641SAndroid Build Coastguard Worker EXPECT_NE(nullptr, object_proxy);
318*635a8641SAndroid Build Coastguard Worker
319*635a8641SAndroid Build Coastguard Worker Properties* properties = static_cast<Properties*>(
320*635a8641SAndroid Build Coastguard Worker object_manager_->GetProperties(ObjectPath("/org/chromium/SecondObject"),
321*635a8641SAndroid Build Coastguard Worker "org.chromium.TestInterface"));
322*635a8641SAndroid Build Coastguard Worker EXPECT_NE(nullptr, properties);
323*635a8641SAndroid Build Coastguard Worker
324*635a8641SAndroid Build Coastguard Worker std::vector<ObjectPath> object_paths = object_manager_->GetObjects();
325*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(2U, object_paths.size());
326*635a8641SAndroid Build Coastguard Worker
327*635a8641SAndroid Build Coastguard Worker std::sort(object_paths.begin(), object_paths.end());
328*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ObjectPath("/org/chromium/SecondObject"), object_paths[0]);
329*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ObjectPath("/org/chromium/TestObject"), object_paths[1]);
330*635a8641SAndroid Build Coastguard Worker
331*635a8641SAndroid Build Coastguard Worker object_paths =
332*635a8641SAndroid Build Coastguard Worker object_manager_->GetObjectsWithInterface("org.chromium.TestInterface");
333*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(2U, object_paths.size());
334*635a8641SAndroid Build Coastguard Worker
335*635a8641SAndroid Build Coastguard Worker std::sort(object_paths.begin(), object_paths.end());
336*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ObjectPath("/org/chromium/SecondObject"), object_paths[0]);
337*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ObjectPath("/org/chromium/TestObject"), object_paths[1]);
338*635a8641SAndroid Build Coastguard Worker }
339*635a8641SAndroid Build Coastguard Worker
TEST_F(ObjectManagerTest,RemoveSecondObject)340*635a8641SAndroid Build Coastguard Worker TEST_F(ObjectManagerTest, RemoveSecondObject) {
341*635a8641SAndroid Build Coastguard Worker PerformAction("AddObject", ObjectPath("/org/chromium/SecondObject"));
342*635a8641SAndroid Build Coastguard Worker WaitForObject();
343*635a8641SAndroid Build Coastguard Worker
344*635a8641SAndroid Build Coastguard Worker std::vector<ObjectPath> object_paths = object_manager_->GetObjects();
345*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(2U, object_paths.size());
346*635a8641SAndroid Build Coastguard Worker
347*635a8641SAndroid Build Coastguard Worker PerformAction("RemoveObject", ObjectPath("/org/chromium/SecondObject"));
348*635a8641SAndroid Build Coastguard Worker WaitForRemoveObject();
349*635a8641SAndroid Build Coastguard Worker
350*635a8641SAndroid Build Coastguard Worker ObjectProxy* object_proxy = object_manager_->GetObjectProxy(
351*635a8641SAndroid Build Coastguard Worker ObjectPath("/org/chromium/SecondObject"));
352*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, object_proxy);
353*635a8641SAndroid Build Coastguard Worker
354*635a8641SAndroid Build Coastguard Worker Properties* properties = static_cast<Properties*>(
355*635a8641SAndroid Build Coastguard Worker object_manager_->GetProperties(ObjectPath("/org/chromium/SecondObject"),
356*635a8641SAndroid Build Coastguard Worker "org.chromium.TestInterface"));
357*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, properties);
358*635a8641SAndroid Build Coastguard Worker
359*635a8641SAndroid Build Coastguard Worker object_paths = object_manager_->GetObjects();
360*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(1U, object_paths.size());
361*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ObjectPath("/org/chromium/TestObject"), object_paths[0]);
362*635a8641SAndroid Build Coastguard Worker
363*635a8641SAndroid Build Coastguard Worker object_paths =
364*635a8641SAndroid Build Coastguard Worker object_manager_->GetObjectsWithInterface("org.chromium.TestInterface");
365*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(1U, object_paths.size());
366*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ObjectPath("/org/chromium/TestObject"), object_paths[0]);
367*635a8641SAndroid Build Coastguard Worker }
368*635a8641SAndroid Build Coastguard Worker
TEST_F(ObjectManagerTest,OwnershipLost)369*635a8641SAndroid Build Coastguard Worker TEST_F(ObjectManagerTest, OwnershipLost) {
370*635a8641SAndroid Build Coastguard Worker PerformAction("ReleaseOwnership", ObjectPath("/org/chromium/TestService"));
371*635a8641SAndroid Build Coastguard Worker WaitForRemoveObject();
372*635a8641SAndroid Build Coastguard Worker
373*635a8641SAndroid Build Coastguard Worker std::vector<ObjectPath> object_paths = object_manager_->GetObjects();
374*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(0U, object_paths.size());
375*635a8641SAndroid Build Coastguard Worker }
376*635a8641SAndroid Build Coastguard Worker
TEST_F(ObjectManagerTest,OwnershipLostAndRegained)377*635a8641SAndroid Build Coastguard Worker TEST_F(ObjectManagerTest, OwnershipLostAndRegained) {
378*635a8641SAndroid Build Coastguard Worker PerformAction("Ownership", ObjectPath("/org/chromium/TestService"));
379*635a8641SAndroid Build Coastguard Worker WaitForRemoveObject();
380*635a8641SAndroid Build Coastguard Worker WaitForObject();
381*635a8641SAndroid Build Coastguard Worker
382*635a8641SAndroid Build Coastguard Worker std::vector<ObjectPath> object_paths = object_manager_->GetObjects();
383*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(1U, object_paths.size());
384*635a8641SAndroid Build Coastguard Worker }
385*635a8641SAndroid Build Coastguard Worker
TEST_F(ObjectManagerTest,PropertiesChangedAsObjectsReceived)386*635a8641SAndroid Build Coastguard Worker TEST_F(ObjectManagerTest, PropertiesChangedAsObjectsReceived) {
387*635a8641SAndroid Build Coastguard Worker // Remove the existing object manager.
388*635a8641SAndroid Build Coastguard Worker object_manager_->UnregisterInterface("org.chromium.TestInterface");
389*635a8641SAndroid Build Coastguard Worker run_loop_.reset(new base::RunLoop);
390*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(bus_->RemoveObjectManager(
391*635a8641SAndroid Build Coastguard Worker test_service_->service_name(),
392*635a8641SAndroid Build Coastguard Worker ObjectPath("/org/chromium/TestService"),
393*635a8641SAndroid Build Coastguard Worker run_loop_->QuitClosure()));
394*635a8641SAndroid Build Coastguard Worker run_loop_->Run();
395*635a8641SAndroid Build Coastguard Worker
396*635a8641SAndroid Build Coastguard Worker PerformAction("SetSendImmediatePropertiesChanged",
397*635a8641SAndroid Build Coastguard Worker ObjectPath("/org/chromium/TestService"));
398*635a8641SAndroid Build Coastguard Worker
399*635a8641SAndroid Build Coastguard Worker object_manager_ = bus_->GetObjectManager(
400*635a8641SAndroid Build Coastguard Worker test_service_->service_name(),
401*635a8641SAndroid Build Coastguard Worker ObjectPath("/org/chromium/TestService"));
402*635a8641SAndroid Build Coastguard Worker object_manager_->RegisterInterface("org.chromium.TestInterface", this);
403*635a8641SAndroid Build Coastguard Worker
404*635a8641SAndroid Build Coastguard Worker // The newly created object manager should call GetManagedObjects immediately
405*635a8641SAndroid Build Coastguard Worker // after setting up the match rule for PropertiesChanged. We should process
406*635a8641SAndroid Build Coastguard Worker // the PropertiesChanged event right after that. If we don't receive it within
407*635a8641SAndroid Build Coastguard Worker // 2 seconds, then fail the test.
408*635a8641SAndroid Build Coastguard Worker message_loop_.task_runner()->PostDelayedTask(
409*635a8641SAndroid Build Coastguard Worker FROM_HERE, base::Bind(&ObjectManagerTest::PropertiesChangedTestTimeout,
410*635a8641SAndroid Build Coastguard Worker base::Unretained(this)),
411*635a8641SAndroid Build Coastguard Worker base::TimeDelta::FromSeconds(2));
412*635a8641SAndroid Build Coastguard Worker
413*635a8641SAndroid Build Coastguard Worker while (last_name_value_ != "ChangedTestServiceName" && !timeout_expired_) {
414*635a8641SAndroid Build Coastguard Worker run_loop_.reset(new base::RunLoop);
415*635a8641SAndroid Build Coastguard Worker run_loop_->Run();
416*635a8641SAndroid Build Coastguard Worker }
417*635a8641SAndroid Build Coastguard Worker }
418*635a8641SAndroid Build Coastguard Worker
419*635a8641SAndroid Build Coastguard Worker } // namespace dbus
420