xref: /aosp_15_r20/external/libchrome/dbus/object_manager_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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