blob: 533d55b11e8be163f68075283b581afea57f58a7 [file] [log] [blame]
keybuk@chromium.org09715012013-03-26 03:20:08 +09001// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "dbus/object_manager.h"
6
avi0ad0ce02015-12-23 03:12:45 +09007#include <stddef.h>
8#include <stdint.h>
9
keybuk@chromium.org09715012013-03-26 03:20:08 +090010#include <string>
11#include <vector>
12
keybuk@chromium.org09715012013-03-26 03:20:08 +090013#include "base/bind.h"
avi@chromium.orga29af562013-07-18 08:00:30 +090014#include "base/message_loop/message_loop.h"
earthdok64401d72014-09-03 19:32:36 +090015#include "base/run_loop.h"
fdoray851719c2016-08-26 00:36:37 +090016#include "base/single_thread_task_runner.h"
keybuk@chromium.org09715012013-03-26 03:20:08 +090017#include "base/threading/thread.h"
18#include "base/threading/thread_restrictions.h"
19#include "dbus/bus.h"
20#include "dbus/object_path.h"
21#include "dbus/object_proxy.h"
22#include "dbus/property.h"
23#include "dbus/test_service.h"
24#include "testing/gtest/include/gtest/gtest.h"
25
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090026namespace dbus {
27
keybuk@chromium.org09715012013-03-26 03:20:08 +090028// The object manager test exercises the asynchronous APIs in ObjectManager,
29// and by extension PropertySet and Property<>.
30class ObjectManagerTest
31 : public testing::Test,
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090032 public ObjectManager::Interface {
keybuk@chromium.org09715012013-03-26 03:20:08 +090033 public:
armansitof4364642014-09-06 02:49:34 +090034 ObjectManagerTest() : timeout_expired_(false) {
keybuk@chromium.org09715012013-03-26 03:20:08 +090035 }
36
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090037 struct Properties : public PropertySet {
38 Property<std::string> name;
avi0ad0ce02015-12-23 03:12:45 +090039 Property<int16_t> version;
Ben Chandf19e682017-11-08 10:50:21 +090040 Property<std::vector<std::string>> methods;
41 Property<std::vector<ObjectPath>> objects;
keybuk@chromium.org09715012013-03-26 03:20:08 +090042
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090043 Properties(ObjectProxy* object_proxy,
keybuk@chromium.org09715012013-03-26 03:20:08 +090044 const std::string& interface_name,
45 PropertyChangedCallback property_changed_callback)
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090046 : PropertySet(object_proxy, interface_name, property_changed_callback) {
keybuk@chromium.org09715012013-03-26 03:20:08 +090047 RegisterProperty("Name", &name);
48 RegisterProperty("Version", &version);
49 RegisterProperty("Methods", &methods);
50 RegisterProperty("Objects", &objects);
51 }
52 };
53
dcheng7f5750d2014-12-30 03:30:17 +090054 PropertySet* CreateProperties(ObjectProxy* object_proxy,
55 const ObjectPath& object_path,
56 const std::string& interface_name) override {
keybuk@chromium.org09715012013-03-26 03:20:08 +090057 Properties* properties = new Properties(
58 object_proxy, interface_name,
59 base::Bind(&ObjectManagerTest::OnPropertyChanged,
60 base::Unretained(this), object_path));
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090061 return static_cast<PropertySet*>(properties);
keybuk@chromium.org09715012013-03-26 03:20:08 +090062 }
63
dcheng7f5750d2014-12-30 03:30:17 +090064 void SetUp() override {
keybuk@chromium.org09715012013-03-26 03:20:08 +090065 // Make the main thread not to allow IO.
66 base::ThreadRestrictions::SetIOAllowed(false);
67
68 // Start the D-Bus thread.
69 dbus_thread_.reset(new base::Thread("D-Bus Thread"));
70 base::Thread::Options thread_options;
xhwang@chromium.orgdff6b132013-05-02 01:10:30 +090071 thread_options.message_loop_type = base::MessageLoop::TYPE_IO;
keybuk@chromium.org09715012013-03-26 03:20:08 +090072 ASSERT_TRUE(dbus_thread_->StartWithOptions(thread_options));
73
74 // Start the test service, using the D-Bus thread.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090075 TestService::Options options;
skyostile5a8dc42015-06-18 00:46:04 +090076 options.dbus_task_runner = dbus_thread_->task_runner();
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090077 test_service_.reset(new TestService(options));
keybuk@chromium.org09715012013-03-26 03:20:08 +090078 ASSERT_TRUE(test_service_->StartService());
79 ASSERT_TRUE(test_service_->WaitUntilServiceIsStarted());
80 ASSERT_TRUE(test_service_->HasDBusThread());
81
82 // Create the client, using the D-Bus thread.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090083 Bus::Options bus_options;
84 bus_options.bus_type = Bus::SESSION;
85 bus_options.connection_type = Bus::PRIVATE;
skyostile5a8dc42015-06-18 00:46:04 +090086 bus_options.dbus_task_runner = dbus_thread_->task_runner();
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090087 bus_ = new Bus(bus_options);
keybuk@chromium.org09715012013-03-26 03:20:08 +090088 ASSERT_TRUE(bus_->HasDBusThread());
89
90 object_manager_ = bus_->GetObjectManager(
hashimotof4a4c0d2016-01-05 17:48:03 +090091 test_service_->service_name(),
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090092 ObjectPath("/org/chromium/TestService"));
keybuk@chromium.org09715012013-03-26 03:20:08 +090093 object_manager_->RegisterInterface("org.chromium.TestInterface", this);
94
keybuk@chromium.org09715012013-03-26 03:20:08 +090095 WaitForObject();
96 }
97
dcheng7f5750d2014-12-30 03:30:17 +090098 void TearDown() override {
keybuk@chromium.org09715012013-03-26 03:20:08 +090099 bus_->ShutdownOnDBusThreadAndBlock();
100
101 // Shut down the service.
102 test_service_->ShutdownAndBlock();
103
104 // Reset to the default.
105 base::ThreadRestrictions::SetIOAllowed(true);
106
107 // Stopping a thread is considered an IO operation, so do this after
108 // allowing IO.
109 test_service_->Stop();
earthdok64401d72014-09-03 19:32:36 +0900110
111 base::RunLoop().RunUntilIdle();
keybuk@chromium.org09715012013-03-26 03:20:08 +0900112 }
113
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900114 void MethodCallback(Response* response) {
keybuk@chromium.org09715012013-03-26 03:20:08 +0900115 method_callback_called_ = true;
earthdok64401d72014-09-03 19:32:36 +0900116 run_loop_->Quit();
keybuk@chromium.org09715012013-03-26 03:20:08 +0900117 }
118
armansitof4364642014-09-06 02:49:34 +0900119 // Called from the PropertiesChangedAsObjectsReceived test case. The test will
120 // not run the message loop if it receives the expected PropertiesChanged
121 // signal before the timeout. This method immediately fails the test.
122 void PropertiesChangedTestTimeout() {
123 timeout_expired_ = true;
124 run_loop_->Quit();
125
126 FAIL() << "Never received PropertiesChanged";
127 }
128
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900129 protected:
keybuk@chromium.org09715012013-03-26 03:20:08 +0900130 // Called when an object is added.
dcheng7f5750d2014-12-30 03:30:17 +0900131 void ObjectAdded(const ObjectPath& object_path,
132 const std::string& interface_name) override {
keybuk@chromium.org09715012013-03-26 03:20:08 +0900133 added_objects_.push_back(std::make_pair(object_path, interface_name));
earthdok64401d72014-09-03 19:32:36 +0900134 run_loop_->Quit();
keybuk@chromium.org09715012013-03-26 03:20:08 +0900135 }
136
137 // Called when an object is removed.
dcheng7f5750d2014-12-30 03:30:17 +0900138 void ObjectRemoved(const ObjectPath& object_path,
139 const std::string& interface_name) override {
keybuk@chromium.org09715012013-03-26 03:20:08 +0900140 removed_objects_.push_back(std::make_pair(object_path, interface_name));
earthdok64401d72014-09-03 19:32:36 +0900141 run_loop_->Quit();
keybuk@chromium.org09715012013-03-26 03:20:08 +0900142 }
143
144 // Called when a property value is updated.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900145 void OnPropertyChanged(const ObjectPath& object_path,
keybuk@chromium.org09715012013-03-26 03:20:08 +0900146 const std::string& name) {
armansitof4364642014-09-06 02:49:34 +0900147 // Store the value of the "Name" property if that's the one that
148 // changed.
149 Properties* properties = static_cast<Properties*>(
150 object_manager_->GetProperties(
151 object_path,
152 "org.chromium.TestInterface"));
153 if (name == properties->name.name())
154 last_name_value_ = properties->name.value();
155
156 // Store the updated property.
keybuk@chromium.org09715012013-03-26 03:20:08 +0900157 updated_properties_.push_back(name);
earthdok64401d72014-09-03 19:32:36 +0900158 run_loop_->Quit();
keybuk@chromium.org09715012013-03-26 03:20:08 +0900159 }
160
161 static const size_t kExpectedObjects = 1;
162 static const size_t kExpectedProperties = 4;
163
164 void WaitForObject() {
165 while (added_objects_.size() < kExpectedObjects ||
earthdok64401d72014-09-03 19:32:36 +0900166 updated_properties_.size() < kExpectedProperties) {
167 run_loop_.reset(new base::RunLoop);
168 run_loop_->Run();
169 }
keybuk@chromium.org09715012013-03-26 03:20:08 +0900170 for (size_t i = 0; i < kExpectedObjects; ++i)
171 added_objects_.erase(added_objects_.begin());
172 for (size_t i = 0; i < kExpectedProperties; ++i)
173 updated_properties_.erase(updated_properties_.begin());
174 }
175
176 void WaitForRemoveObject() {
earthdok64401d72014-09-03 19:32:36 +0900177 while (removed_objects_.size() < kExpectedObjects) {
178 run_loop_.reset(new base::RunLoop);
179 run_loop_->Run();
180 }
keybuk@chromium.org09715012013-03-26 03:20:08 +0900181 for (size_t i = 0; i < kExpectedObjects; ++i)
182 removed_objects_.erase(removed_objects_.begin());
183 }
184
185 void WaitForMethodCallback() {
earthdok64401d72014-09-03 19:32:36 +0900186 run_loop_.reset(new base::RunLoop);
187 run_loop_->Run();
keybuk@chromium.org09715012013-03-26 03:20:08 +0900188 method_callback_called_ = false;
189 }
190
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900191 void PerformAction(const std::string& action, const ObjectPath& object_path) {
192 ObjectProxy* object_proxy = bus_->GetObjectProxy(
hashimotof4a4c0d2016-01-05 17:48:03 +0900193 test_service_->service_name(),
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900194 ObjectPath("/org/chromium/TestObject"));
keybuk@chromium.org09715012013-03-26 03:20:08 +0900195
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900196 MethodCall method_call("org.chromium.TestInterface", "PerformAction");
197 MessageWriter writer(&method_call);
keybuk@chromium.org09715012013-03-26 03:20:08 +0900198 writer.AppendString(action);
199 writer.AppendObjectPath(object_path);
200
201 object_proxy->CallMethod(&method_call,
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900202 ObjectProxy::TIMEOUT_USE_DEFAULT,
keybuk@chromium.org09715012013-03-26 03:20:08 +0900203 base::Bind(&ObjectManagerTest::MethodCallback,
204 base::Unretained(this)));
205 WaitForMethodCallback();
206 }
207
xhwang@chromium.orgdff6b132013-05-02 01:10:30 +0900208 base::MessageLoop message_loop_;
dcheng30c5a172016-04-09 07:55:04 +0900209 std::unique_ptr<base::RunLoop> run_loop_;
210 std::unique_ptr<base::Thread> dbus_thread_;
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900211 scoped_refptr<Bus> bus_;
212 ObjectManager* object_manager_;
dcheng30c5a172016-04-09 07:55:04 +0900213 std::unique_ptr<TestService> test_service_;
keybuk@chromium.org09715012013-03-26 03:20:08 +0900214
armansitof4364642014-09-06 02:49:34 +0900215 std::string last_name_value_;
216 bool timeout_expired_;
217
Ben Chandf19e682017-11-08 10:50:21 +0900218 std::vector<std::pair<ObjectPath, std::string>> added_objects_;
219 std::vector<std::pair<ObjectPath, std::string>> removed_objects_;
keybuk@chromium.org09715012013-03-26 03:20:08 +0900220 std::vector<std::string> updated_properties_;
221
222 bool method_callback_called_;
223};
224
225
226TEST_F(ObjectManagerTest, InitialObject) {
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900227 ObjectProxy* object_proxy = object_manager_->GetObjectProxy(
228 ObjectPath("/org/chromium/TestObject"));
keybuk@chromium.org09715012013-03-26 03:20:08 +0900229 EXPECT_TRUE(object_proxy != NULL);
230
231 Properties* properties = static_cast<Properties*>(
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900232 object_manager_->GetProperties(ObjectPath("/org/chromium/TestObject"),
233 "org.chromium.TestInterface"));
keybuk@chromium.org09715012013-03-26 03:20:08 +0900234 EXPECT_TRUE(properties != NULL);
235
236 EXPECT_EQ("TestService", properties->name.value());
237 EXPECT_EQ(10, properties->version.value());
238
239 std::vector<std::string> methods = properties->methods.value();
240 ASSERT_EQ(4U, methods.size());
241 EXPECT_EQ("Echo", methods[0]);
242 EXPECT_EQ("SlowEcho", methods[1]);
243 EXPECT_EQ("AsyncEcho", methods[2]);
244 EXPECT_EQ("BrokenMethod", methods[3]);
245
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900246 std::vector<ObjectPath> objects = properties->objects.value();
keybuk@chromium.org09715012013-03-26 03:20:08 +0900247 ASSERT_EQ(1U, objects.size());
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900248 EXPECT_EQ(ObjectPath("/TestObjectPath"), objects[0]);
keybuk@chromium.org09715012013-03-26 03:20:08 +0900249}
250
251TEST_F(ObjectManagerTest, UnknownObjectProxy) {
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900252 ObjectProxy* object_proxy = object_manager_->GetObjectProxy(
253 ObjectPath("/org/chromium/UnknownObject"));
keybuk@chromium.org09715012013-03-26 03:20:08 +0900254 EXPECT_TRUE(object_proxy == NULL);
255}
256
257TEST_F(ObjectManagerTest, UnknownObjectProperties) {
258 Properties* properties = static_cast<Properties*>(
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900259 object_manager_->GetProperties(ObjectPath("/org/chromium/UnknownObject"),
260 "org.chromium.TestInterface"));
keybuk@chromium.org09715012013-03-26 03:20:08 +0900261 EXPECT_TRUE(properties == NULL);
262}
263
264TEST_F(ObjectManagerTest, UnknownInterfaceProperties) {
265 Properties* properties = static_cast<Properties*>(
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900266 object_manager_->GetProperties(ObjectPath("/org/chromium/TestObject"),
267 "org.chromium.UnknownService"));
keybuk@chromium.org09715012013-03-26 03:20:08 +0900268 EXPECT_TRUE(properties == NULL);
269}
270
271TEST_F(ObjectManagerTest, GetObjects) {
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900272 std::vector<ObjectPath> object_paths = object_manager_->GetObjects();
keybuk@chromium.org09715012013-03-26 03:20:08 +0900273 ASSERT_EQ(1U, object_paths.size());
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900274 EXPECT_EQ(ObjectPath("/org/chromium/TestObject"), object_paths[0]);
keybuk@chromium.org09715012013-03-26 03:20:08 +0900275}
276
277TEST_F(ObjectManagerTest, GetObjectsWithInterface) {
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900278 std::vector<ObjectPath> object_paths =
keybuk@chromium.org09715012013-03-26 03:20:08 +0900279 object_manager_->GetObjectsWithInterface("org.chromium.TestInterface");
280 ASSERT_EQ(1U, object_paths.size());
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900281 EXPECT_EQ(ObjectPath("/org/chromium/TestObject"), object_paths[0]);
keybuk@chromium.org09715012013-03-26 03:20:08 +0900282}
283
284TEST_F(ObjectManagerTest, GetObjectsWithUnknownInterface) {
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900285 std::vector<ObjectPath> object_paths =
keybuk@chromium.org09715012013-03-26 03:20:08 +0900286 object_manager_->GetObjectsWithInterface("org.chromium.UnknownService");
287 EXPECT_EQ(0U, object_paths.size());
288}
289
290TEST_F(ObjectManagerTest, SameObject) {
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900291 ObjectManager* object_manager = bus_->GetObjectManager(
hashimotof4a4c0d2016-01-05 17:48:03 +0900292 test_service_->service_name(),
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900293 ObjectPath("/org/chromium/TestService"));
keybuk@chromium.org09715012013-03-26 03:20:08 +0900294 EXPECT_EQ(object_manager_, object_manager);
295}
296
297TEST_F(ObjectManagerTest, DifferentObjectForService) {
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900298 ObjectManager* object_manager = bus_->GetObjectManager(
keybuk@chromium.org09715012013-03-26 03:20:08 +0900299 "org.chromium.DifferentService",
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900300 ObjectPath("/org/chromium/TestService"));
keybuk@chromium.org09715012013-03-26 03:20:08 +0900301 EXPECT_NE(object_manager_, object_manager);
302}
303
304TEST_F(ObjectManagerTest, DifferentObjectForPath) {
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900305 ObjectManager* object_manager = bus_->GetObjectManager(
hashimotof4a4c0d2016-01-05 17:48:03 +0900306 test_service_->service_name(),
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900307 ObjectPath("/org/chromium/DifferentService"));
keybuk@chromium.org09715012013-03-26 03:20:08 +0900308 EXPECT_NE(object_manager_, object_manager);
309}
310
311TEST_F(ObjectManagerTest, SecondObject) {
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900312 PerformAction("AddObject", ObjectPath("/org/chromium/SecondObject"));
keybuk@chromium.org09715012013-03-26 03:20:08 +0900313 WaitForObject();
314
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900315 ObjectProxy* object_proxy = object_manager_->GetObjectProxy(
316 ObjectPath("/org/chromium/SecondObject"));
keybuk@chromium.org09715012013-03-26 03:20:08 +0900317 EXPECT_TRUE(object_proxy != NULL);
318
319 Properties* properties = static_cast<Properties*>(
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900320 object_manager_->GetProperties(ObjectPath("/org/chromium/SecondObject"),
321 "org.chromium.TestInterface"));
keybuk@chromium.org09715012013-03-26 03:20:08 +0900322 EXPECT_TRUE(properties != NULL);
323
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900324 std::vector<ObjectPath> object_paths = object_manager_->GetObjects();
keybuk@chromium.org09715012013-03-26 03:20:08 +0900325 ASSERT_EQ(2U, object_paths.size());
326
327 std::sort(object_paths.begin(), object_paths.end());
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900328 EXPECT_EQ(ObjectPath("/org/chromium/SecondObject"), object_paths[0]);
329 EXPECT_EQ(ObjectPath("/org/chromium/TestObject"), object_paths[1]);
keybuk@chromium.org09715012013-03-26 03:20:08 +0900330
331 object_paths =
332 object_manager_->GetObjectsWithInterface("org.chromium.TestInterface");
333 ASSERT_EQ(2U, object_paths.size());
334
335 std::sort(object_paths.begin(), object_paths.end());
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900336 EXPECT_EQ(ObjectPath("/org/chromium/SecondObject"), object_paths[0]);
337 EXPECT_EQ(ObjectPath("/org/chromium/TestObject"), object_paths[1]);
keybuk@chromium.org09715012013-03-26 03:20:08 +0900338}
339
340TEST_F(ObjectManagerTest, RemoveSecondObject) {
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900341 PerformAction("AddObject", ObjectPath("/org/chromium/SecondObject"));
keybuk@chromium.org09715012013-03-26 03:20:08 +0900342 WaitForObject();
343
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900344 std::vector<ObjectPath> object_paths = object_manager_->GetObjects();
keybuk@chromium.org09715012013-03-26 03:20:08 +0900345 ASSERT_EQ(2U, object_paths.size());
346
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900347 PerformAction("RemoveObject", ObjectPath("/org/chromium/SecondObject"));
keybuk@chromium.org09715012013-03-26 03:20:08 +0900348 WaitForRemoveObject();
349
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900350 ObjectProxy* object_proxy = object_manager_->GetObjectProxy(
351 ObjectPath("/org/chromium/SecondObject"));
keybuk@chromium.org09715012013-03-26 03:20:08 +0900352 EXPECT_TRUE(object_proxy == NULL);
353
354 Properties* properties = static_cast<Properties*>(
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900355 object_manager_->GetProperties(ObjectPath("/org/chromium/SecondObject"),
356 "org.chromium.TestInterface"));
keybuk@chromium.org09715012013-03-26 03:20:08 +0900357 EXPECT_TRUE(properties == NULL);
358
359 object_paths = object_manager_->GetObjects();
360 ASSERT_EQ(1U, object_paths.size());
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900361 EXPECT_EQ(ObjectPath("/org/chromium/TestObject"), object_paths[0]);
keybuk@chromium.org09715012013-03-26 03:20:08 +0900362
363 object_paths =
364 object_manager_->GetObjectsWithInterface("org.chromium.TestInterface");
365 ASSERT_EQ(1U, object_paths.size());
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900366 EXPECT_EQ(ObjectPath("/org/chromium/TestObject"), object_paths[0]);
keybuk@chromium.org09715012013-03-26 03:20:08 +0900367}
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900368
keybuk@chromium.org40b05ba2014-03-07 11:24:33 +0900369TEST_F(ObjectManagerTest, OwnershipLost) {
370 PerformAction("ReleaseOwnership", ObjectPath("/org/chromium/TestService"));
371 WaitForRemoveObject();
372
373 std::vector<ObjectPath> object_paths = object_manager_->GetObjects();
374 ASSERT_EQ(0U, object_paths.size());
375}
376
377TEST_F(ObjectManagerTest, OwnershipLostAndRegained) {
378 PerformAction("Ownership", ObjectPath("/org/chromium/TestService"));
379 WaitForRemoveObject();
380 WaitForObject();
381
382 std::vector<ObjectPath> object_paths = object_manager_->GetObjects();
383 ASSERT_EQ(1U, object_paths.size());
384}
385
armansitof4364642014-09-06 02:49:34 +0900386TEST_F(ObjectManagerTest, PropertiesChangedAsObjectsReceived) {
387 // Remove the existing object manager.
388 object_manager_->UnregisterInterface("org.chromium.TestInterface");
389 run_loop_.reset(new base::RunLoop);
390 EXPECT_TRUE(bus_->RemoveObjectManager(
hashimotof4a4c0d2016-01-05 17:48:03 +0900391 test_service_->service_name(),
armansitof4364642014-09-06 02:49:34 +0900392 ObjectPath("/org/chromium/TestService"),
393 run_loop_->QuitClosure()));
394 run_loop_->Run();
395
396 PerformAction("SetSendImmediatePropertiesChanged",
397 ObjectPath("/org/chromium/TestService"));
398
399 object_manager_ = bus_->GetObjectManager(
hashimotof4a4c0d2016-01-05 17:48:03 +0900400 test_service_->service_name(),
armansitof4364642014-09-06 02:49:34 +0900401 ObjectPath("/org/chromium/TestService"));
402 object_manager_->RegisterInterface("org.chromium.TestInterface", this);
403
404 // The newly created object manager should call GetManagedObjects immediately
405 // after setting up the match rule for PropertiesChanged. We should process
406 // the PropertiesChanged event right after that. If we don't receive it within
407 // 2 seconds, then fail the test.
fdoray851719c2016-08-26 00:36:37 +0900408 message_loop_.task_runner()->PostDelayedTask(
409 FROM_HERE, base::Bind(&ObjectManagerTest::PropertiesChangedTestTimeout,
410 base::Unretained(this)),
armansitof4364642014-09-06 02:49:34 +0900411 base::TimeDelta::FromSeconds(2));
412
413 while (last_name_value_ != "ChangedTestServiceName" && !timeout_expired_) {
414 run_loop_.reset(new base::RunLoop);
415 run_loop_->Run();
416 }
417}
418
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900419} // namespace dbus