xref: /aosp_15_r20/external/libchrome/dbus/property_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 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/property.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 <memory>
11*635a8641SAndroid Build Coastguard Worker #include <string>
12*635a8641SAndroid Build Coastguard Worker #include <vector>
13*635a8641SAndroid Build Coastguard Worker 
14*635a8641SAndroid Build Coastguard Worker #include "base/bind.h"
15*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
16*635a8641SAndroid Build Coastguard Worker #include "base/macros.h"
17*635a8641SAndroid Build Coastguard Worker #include "base/message_loop/message_loop.h"
18*635a8641SAndroid Build Coastguard Worker #include "base/run_loop.h"
19*635a8641SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
20*635a8641SAndroid Build Coastguard Worker #include "base/threading/thread.h"
21*635a8641SAndroid Build Coastguard Worker #include "base/threading/thread_restrictions.h"
22*635a8641SAndroid Build Coastguard Worker #include "dbus/bus.h"
23*635a8641SAndroid Build Coastguard Worker #include "dbus/object_path.h"
24*635a8641SAndroid Build Coastguard Worker #include "dbus/object_proxy.h"
25*635a8641SAndroid Build Coastguard Worker #include "dbus/test_service.h"
26*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
27*635a8641SAndroid Build Coastguard Worker 
28*635a8641SAndroid Build Coastguard Worker namespace dbus {
29*635a8641SAndroid Build Coastguard Worker 
30*635a8641SAndroid Build Coastguard Worker // The property test exerises the asynchronous APIs in PropertySet and
31*635a8641SAndroid Build Coastguard Worker // Property<>.
32*635a8641SAndroid Build Coastguard Worker class PropertyTest : public testing::Test {
33*635a8641SAndroid Build Coastguard Worker  public:
34*635a8641SAndroid Build Coastguard Worker   PropertyTest() = default;
35*635a8641SAndroid Build Coastguard Worker 
36*635a8641SAndroid Build Coastguard Worker   struct Properties : public PropertySet {
37*635a8641SAndroid Build Coastguard Worker     Property<std::string> name;
38*635a8641SAndroid Build Coastguard Worker     Property<int16_t> version;
39*635a8641SAndroid Build Coastguard Worker     Property<std::vector<std::string>> methods;
40*635a8641SAndroid Build Coastguard Worker     Property<std::vector<ObjectPath>> objects;
41*635a8641SAndroid Build Coastguard Worker     Property<std::vector<uint8_t>> bytes;
42*635a8641SAndroid Build Coastguard Worker 
Propertiesdbus::PropertyTest::Properties43*635a8641SAndroid Build Coastguard Worker     Properties(ObjectProxy* object_proxy,
44*635a8641SAndroid Build Coastguard Worker                PropertyChangedCallback property_changed_callback)
45*635a8641SAndroid Build Coastguard Worker         : PropertySet(object_proxy,
46*635a8641SAndroid Build Coastguard Worker                       "org.chromium.TestInterface",
47*635a8641SAndroid Build Coastguard Worker                       property_changed_callback) {
48*635a8641SAndroid Build Coastguard Worker       RegisterProperty("Name", &name);
49*635a8641SAndroid Build Coastguard Worker       RegisterProperty("Version", &version);
50*635a8641SAndroid Build Coastguard Worker       RegisterProperty("Methods", &methods);
51*635a8641SAndroid Build Coastguard Worker       RegisterProperty("Objects", &objects);
52*635a8641SAndroid Build Coastguard Worker       RegisterProperty("Bytes", &bytes);
53*635a8641SAndroid Build Coastguard Worker     }
54*635a8641SAndroid Build Coastguard Worker   };
55*635a8641SAndroid Build Coastguard Worker 
SetUp()56*635a8641SAndroid Build Coastguard Worker   void SetUp() override {
57*635a8641SAndroid Build Coastguard Worker     // Make the main thread not to allow IO.
58*635a8641SAndroid Build Coastguard Worker     base::ThreadRestrictions::SetIOAllowed(false);
59*635a8641SAndroid Build Coastguard Worker 
60*635a8641SAndroid Build Coastguard Worker     // Start the D-Bus thread.
61*635a8641SAndroid Build Coastguard Worker     dbus_thread_.reset(new base::Thread("D-Bus Thread"));
62*635a8641SAndroid Build Coastguard Worker     base::Thread::Options thread_options;
63*635a8641SAndroid Build Coastguard Worker     thread_options.message_loop_type = base::MessageLoop::TYPE_IO;
64*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(dbus_thread_->StartWithOptions(thread_options));
65*635a8641SAndroid Build Coastguard Worker 
66*635a8641SAndroid Build Coastguard Worker     // Start the test service, using the D-Bus thread.
67*635a8641SAndroid Build Coastguard Worker     TestService::Options options;
68*635a8641SAndroid Build Coastguard Worker     options.dbus_task_runner = dbus_thread_->task_runner();
69*635a8641SAndroid Build Coastguard Worker     test_service_.reset(new TestService(options));
70*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(test_service_->StartService());
71*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(test_service_->WaitUntilServiceIsStarted());
72*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(test_service_->HasDBusThread());
73*635a8641SAndroid Build Coastguard Worker 
74*635a8641SAndroid Build Coastguard Worker     // Create the client, using the D-Bus thread.
75*635a8641SAndroid Build Coastguard Worker     Bus::Options bus_options;
76*635a8641SAndroid Build Coastguard Worker     bus_options.bus_type = Bus::SESSION;
77*635a8641SAndroid Build Coastguard Worker     bus_options.connection_type = Bus::PRIVATE;
78*635a8641SAndroid Build Coastguard Worker     bus_options.dbus_task_runner = dbus_thread_->task_runner();
79*635a8641SAndroid Build Coastguard Worker     bus_ = new Bus(bus_options);
80*635a8641SAndroid Build Coastguard Worker     object_proxy_ = bus_->GetObjectProxy(
81*635a8641SAndroid Build Coastguard Worker         test_service_->service_name(),
82*635a8641SAndroid Build Coastguard Worker         ObjectPath("/org/chromium/TestObject"));
83*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(bus_->HasDBusThread());
84*635a8641SAndroid Build Coastguard Worker 
85*635a8641SAndroid Build Coastguard Worker     // Create the properties structure
86*635a8641SAndroid Build Coastguard Worker     properties_.reset(new Properties(
87*635a8641SAndroid Build Coastguard Worker         object_proxy_,
88*635a8641SAndroid Build Coastguard Worker         base::Bind(&PropertyTest::OnPropertyChanged,
89*635a8641SAndroid Build Coastguard Worker                    base::Unretained(this))));
90*635a8641SAndroid Build Coastguard Worker     properties_->ConnectSignals();
91*635a8641SAndroid Build Coastguard Worker     properties_->GetAll();
92*635a8641SAndroid Build Coastguard Worker   }
93*635a8641SAndroid Build Coastguard Worker 
TearDown()94*635a8641SAndroid Build Coastguard Worker   void TearDown() override {
95*635a8641SAndroid Build Coastguard Worker     bus_->ShutdownOnDBusThreadAndBlock();
96*635a8641SAndroid Build Coastguard Worker 
97*635a8641SAndroid Build Coastguard Worker     // Shut down the service.
98*635a8641SAndroid Build Coastguard Worker     test_service_->ShutdownAndBlock();
99*635a8641SAndroid Build Coastguard Worker 
100*635a8641SAndroid Build Coastguard Worker     // Reset to the default.
101*635a8641SAndroid Build Coastguard Worker     base::ThreadRestrictions::SetIOAllowed(true);
102*635a8641SAndroid Build Coastguard Worker 
103*635a8641SAndroid Build Coastguard Worker     // Stopping a thread is considered an IO operation, so do this after
104*635a8641SAndroid Build Coastguard Worker     // allowing IO.
105*635a8641SAndroid Build Coastguard Worker     test_service_->Stop();
106*635a8641SAndroid Build Coastguard Worker   }
107*635a8641SAndroid Build Coastguard Worker 
108*635a8641SAndroid Build Coastguard Worker   // Generic callback, bind with a string |id| for passing to
109*635a8641SAndroid Build Coastguard Worker   // WaitForCallback() to ensure the callback for the right method is
110*635a8641SAndroid Build Coastguard Worker   // waited for.
PropertyCallback(const std::string & id,bool success)111*635a8641SAndroid Build Coastguard Worker   void PropertyCallback(const std::string& id, bool success) {
112*635a8641SAndroid Build Coastguard Worker     last_callback_ = id;
113*635a8641SAndroid Build Coastguard Worker     run_loop_->Quit();
114*635a8641SAndroid Build Coastguard Worker   }
115*635a8641SAndroid Build Coastguard Worker 
116*635a8641SAndroid Build Coastguard Worker   // Generic method callback, that might be used together with
117*635a8641SAndroid Build Coastguard Worker   // WaitForMethodCallback to test wether method was succesfully called.
MethodCallback(Response * response)118*635a8641SAndroid Build Coastguard Worker   void MethodCallback(Response* response) { run_loop_->Quit(); }
119*635a8641SAndroid Build Coastguard Worker 
120*635a8641SAndroid Build Coastguard Worker  protected:
121*635a8641SAndroid Build Coastguard Worker   // Called when a property value is updated.
OnPropertyChanged(const std::string & name)122*635a8641SAndroid Build Coastguard Worker   void OnPropertyChanged(const std::string& name) {
123*635a8641SAndroid Build Coastguard Worker     updated_properties_.push_back(name);
124*635a8641SAndroid Build Coastguard Worker     run_loop_->Quit();
125*635a8641SAndroid Build Coastguard Worker   }
126*635a8641SAndroid Build Coastguard Worker 
127*635a8641SAndroid Build Coastguard Worker   // Waits for the given number of updates.
WaitForUpdates(size_t num_updates)128*635a8641SAndroid Build Coastguard Worker   void WaitForUpdates(size_t num_updates) {
129*635a8641SAndroid Build Coastguard Worker     while (updated_properties_.size() < num_updates) {
130*635a8641SAndroid Build Coastguard Worker       run_loop_.reset(new base::RunLoop);
131*635a8641SAndroid Build Coastguard Worker       run_loop_->Run();
132*635a8641SAndroid Build Coastguard Worker     }
133*635a8641SAndroid Build Coastguard Worker     for (size_t i = 0; i < num_updates; ++i)
134*635a8641SAndroid Build Coastguard Worker       updated_properties_.erase(updated_properties_.begin());
135*635a8641SAndroid Build Coastguard Worker   }
136*635a8641SAndroid Build Coastguard Worker 
137*635a8641SAndroid Build Coastguard Worker   // Name, Version, Methods, Objects
138*635a8641SAndroid Build Coastguard Worker   static const int kExpectedSignalUpdates = 5;
139*635a8641SAndroid Build Coastguard Worker 
140*635a8641SAndroid Build Coastguard Worker   // Waits for initial values to be set.
WaitForGetAll()141*635a8641SAndroid Build Coastguard Worker   void WaitForGetAll() {
142*635a8641SAndroid Build Coastguard Worker     WaitForUpdates(kExpectedSignalUpdates);
143*635a8641SAndroid Build Coastguard Worker   }
144*635a8641SAndroid Build Coastguard Worker 
145*635a8641SAndroid Build Coastguard Worker   // Waits until MethodCallback is called.
WaitForMethodCallback()146*635a8641SAndroid Build Coastguard Worker   void WaitForMethodCallback() {
147*635a8641SAndroid Build Coastguard Worker     run_loop_.reset(new base::RunLoop);
148*635a8641SAndroid Build Coastguard Worker     run_loop_->Run();
149*635a8641SAndroid Build Coastguard Worker   }
150*635a8641SAndroid Build Coastguard Worker 
151*635a8641SAndroid Build Coastguard Worker   // Waits for the callback. |id| is the string bound to the callback when
152*635a8641SAndroid Build Coastguard Worker   // the method call is made that identifies it and distinguishes from any
153*635a8641SAndroid Build Coastguard Worker   // other; you can set this to whatever you wish.
WaitForCallback(const std::string & id)154*635a8641SAndroid Build Coastguard Worker   void WaitForCallback(const std::string& id) {
155*635a8641SAndroid Build Coastguard Worker     while (last_callback_ != id) {
156*635a8641SAndroid Build Coastguard Worker       run_loop_.reset(new base::RunLoop);
157*635a8641SAndroid Build Coastguard Worker       run_loop_->Run();
158*635a8641SAndroid Build Coastguard Worker     }
159*635a8641SAndroid Build Coastguard Worker   }
160*635a8641SAndroid Build Coastguard Worker 
161*635a8641SAndroid Build Coastguard Worker   base::MessageLoop message_loop_;
162*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<base::RunLoop> run_loop_;
163*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<base::Thread> dbus_thread_;
164*635a8641SAndroid Build Coastguard Worker   scoped_refptr<Bus> bus_;
165*635a8641SAndroid Build Coastguard Worker   ObjectProxy* object_proxy_;
166*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<Properties> properties_;
167*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<TestService> test_service_;
168*635a8641SAndroid Build Coastguard Worker   // Properties updated.
169*635a8641SAndroid Build Coastguard Worker   std::vector<std::string> updated_properties_;
170*635a8641SAndroid Build Coastguard Worker   // Last callback received.
171*635a8641SAndroid Build Coastguard Worker   std::string last_callback_;
172*635a8641SAndroid Build Coastguard Worker };
173*635a8641SAndroid Build Coastguard Worker 
TEST_F(PropertyTest,InitialValues)174*635a8641SAndroid Build Coastguard Worker TEST_F(PropertyTest, InitialValues) {
175*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(properties_->name.is_valid());
176*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(properties_->version.is_valid());
177*635a8641SAndroid Build Coastguard Worker 
178*635a8641SAndroid Build Coastguard Worker   WaitForGetAll();
179*635a8641SAndroid Build Coastguard Worker 
180*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(properties_->name.is_valid());
181*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("TestService", properties_->name.value());
182*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(properties_->version.is_valid());
183*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(10, properties_->version.value());
184*635a8641SAndroid Build Coastguard Worker 
185*635a8641SAndroid Build Coastguard Worker   std::vector<std::string> methods = properties_->methods.value();
186*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(4U, methods.size());
187*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("Echo", methods[0]);
188*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("SlowEcho", methods[1]);
189*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("AsyncEcho", methods[2]);
190*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("BrokenMethod", methods[3]);
191*635a8641SAndroid Build Coastguard Worker 
192*635a8641SAndroid Build Coastguard Worker   std::vector<ObjectPath> objects = properties_->objects.value();
193*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(1U, objects.size());
194*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(ObjectPath("/TestObjectPath"), objects[0]);
195*635a8641SAndroid Build Coastguard Worker 
196*635a8641SAndroid Build Coastguard Worker   std::vector<uint8_t> bytes = properties_->bytes.value();
197*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(4U, bytes.size());
198*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ('T', bytes[0]);
199*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ('e', bytes[1]);
200*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ('s', bytes[2]);
201*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ('t', bytes[3]);
202*635a8641SAndroid Build Coastguard Worker }
203*635a8641SAndroid Build Coastguard Worker 
TEST_F(PropertyTest,UpdatedValues)204*635a8641SAndroid Build Coastguard Worker TEST_F(PropertyTest, UpdatedValues) {
205*635a8641SAndroid Build Coastguard Worker   WaitForGetAll();
206*635a8641SAndroid Build Coastguard Worker 
207*635a8641SAndroid Build Coastguard Worker   // Update the value of the "Name" property, this value should not change.
208*635a8641SAndroid Build Coastguard Worker   properties_->name.Get(base::Bind(&PropertyTest::PropertyCallback,
209*635a8641SAndroid Build Coastguard Worker                                    base::Unretained(this),
210*635a8641SAndroid Build Coastguard Worker                                    "Name"));
211*635a8641SAndroid Build Coastguard Worker   WaitForCallback("Name");
212*635a8641SAndroid Build Coastguard Worker   WaitForUpdates(1);
213*635a8641SAndroid Build Coastguard Worker 
214*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("TestService", properties_->name.value());
215*635a8641SAndroid Build Coastguard Worker 
216*635a8641SAndroid Build Coastguard Worker   // Update the value of the "Version" property, this value should be changed.
217*635a8641SAndroid Build Coastguard Worker   properties_->version.Get(base::Bind(&PropertyTest::PropertyCallback,
218*635a8641SAndroid Build Coastguard Worker                                       base::Unretained(this),
219*635a8641SAndroid Build Coastguard Worker                                       "Version"));
220*635a8641SAndroid Build Coastguard Worker   WaitForCallback("Version");
221*635a8641SAndroid Build Coastguard Worker   WaitForUpdates(1);
222*635a8641SAndroid Build Coastguard Worker 
223*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(20, properties_->version.value());
224*635a8641SAndroid Build Coastguard Worker 
225*635a8641SAndroid Build Coastguard Worker   // Update the value of the "Methods" property, this value should not change
226*635a8641SAndroid Build Coastguard Worker   // and should not grow to contain duplicate entries.
227*635a8641SAndroid Build Coastguard Worker   properties_->methods.Get(base::Bind(&PropertyTest::PropertyCallback,
228*635a8641SAndroid Build Coastguard Worker                                       base::Unretained(this),
229*635a8641SAndroid Build Coastguard Worker                                       "Methods"));
230*635a8641SAndroid Build Coastguard Worker   WaitForCallback("Methods");
231*635a8641SAndroid Build Coastguard Worker   WaitForUpdates(1);
232*635a8641SAndroid Build Coastguard Worker 
233*635a8641SAndroid Build Coastguard Worker   std::vector<std::string> methods = properties_->methods.value();
234*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(4U, methods.size());
235*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("Echo", methods[0]);
236*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("SlowEcho", methods[1]);
237*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("AsyncEcho", methods[2]);
238*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("BrokenMethod", methods[3]);
239*635a8641SAndroid Build Coastguard Worker 
240*635a8641SAndroid Build Coastguard Worker   // Update the value of the "Objects" property, this value should not change
241*635a8641SAndroid Build Coastguard Worker   // and should not grow to contain duplicate entries.
242*635a8641SAndroid Build Coastguard Worker   properties_->objects.Get(base::Bind(&PropertyTest::PropertyCallback,
243*635a8641SAndroid Build Coastguard Worker                                       base::Unretained(this),
244*635a8641SAndroid Build Coastguard Worker                                       "Objects"));
245*635a8641SAndroid Build Coastguard Worker   WaitForCallback("Objects");
246*635a8641SAndroid Build Coastguard Worker   WaitForUpdates(1);
247*635a8641SAndroid Build Coastguard Worker 
248*635a8641SAndroid Build Coastguard Worker   std::vector<ObjectPath> objects = properties_->objects.value();
249*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(1U, objects.size());
250*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(ObjectPath("/TestObjectPath"), objects[0]);
251*635a8641SAndroid Build Coastguard Worker 
252*635a8641SAndroid Build Coastguard Worker   // Update the value of the "Bytes" property, this value should not change
253*635a8641SAndroid Build Coastguard Worker   // and should not grow to contain duplicate entries.
254*635a8641SAndroid Build Coastguard Worker   properties_->bytes.Get(base::Bind(&PropertyTest::PropertyCallback,
255*635a8641SAndroid Build Coastguard Worker                                     base::Unretained(this),
256*635a8641SAndroid Build Coastguard Worker                                    "Bytes"));
257*635a8641SAndroid Build Coastguard Worker   WaitForCallback("Bytes");
258*635a8641SAndroid Build Coastguard Worker   WaitForUpdates(1);
259*635a8641SAndroid Build Coastguard Worker 
260*635a8641SAndroid Build Coastguard Worker   std::vector<uint8_t> bytes = properties_->bytes.value();
261*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(4U, bytes.size());
262*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ('T', bytes[0]);
263*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ('e', bytes[1]);
264*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ('s', bytes[2]);
265*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ('t', bytes[3]);
266*635a8641SAndroid Build Coastguard Worker }
267*635a8641SAndroid Build Coastguard Worker 
TEST_F(PropertyTest,Get)268*635a8641SAndroid Build Coastguard Worker TEST_F(PropertyTest, Get) {
269*635a8641SAndroid Build Coastguard Worker   WaitForGetAll();
270*635a8641SAndroid Build Coastguard Worker 
271*635a8641SAndroid Build Coastguard Worker   // Ask for the new Version property.
272*635a8641SAndroid Build Coastguard Worker   properties_->version.Get(base::Bind(&PropertyTest::PropertyCallback,
273*635a8641SAndroid Build Coastguard Worker                                       base::Unretained(this),
274*635a8641SAndroid Build Coastguard Worker                                       "Get"));
275*635a8641SAndroid Build Coastguard Worker   WaitForCallback("Get");
276*635a8641SAndroid Build Coastguard Worker 
277*635a8641SAndroid Build Coastguard Worker   // Make sure we got a property update too.
278*635a8641SAndroid Build Coastguard Worker   WaitForUpdates(1);
279*635a8641SAndroid Build Coastguard Worker 
280*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(20, properties_->version.value());
281*635a8641SAndroid Build Coastguard Worker }
282*635a8641SAndroid Build Coastguard Worker 
TEST_F(PropertyTest,Set)283*635a8641SAndroid Build Coastguard Worker TEST_F(PropertyTest, Set) {
284*635a8641SAndroid Build Coastguard Worker   WaitForGetAll();
285*635a8641SAndroid Build Coastguard Worker 
286*635a8641SAndroid Build Coastguard Worker   // Set a new name.
287*635a8641SAndroid Build Coastguard Worker   properties_->name.Set("NewService",
288*635a8641SAndroid Build Coastguard Worker                         base::Bind(&PropertyTest::PropertyCallback,
289*635a8641SAndroid Build Coastguard Worker                                    base::Unretained(this),
290*635a8641SAndroid Build Coastguard Worker                                    "Set"));
291*635a8641SAndroid Build Coastguard Worker   WaitForCallback("Set");
292*635a8641SAndroid Build Coastguard Worker 
293*635a8641SAndroid Build Coastguard Worker   // TestService sends a property update.
294*635a8641SAndroid Build Coastguard Worker   WaitForUpdates(1);
295*635a8641SAndroid Build Coastguard Worker 
296*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("NewService", properties_->name.value());
297*635a8641SAndroid Build Coastguard Worker }
298*635a8641SAndroid Build Coastguard Worker 
TEST_F(PropertyTest,Invalidate)299*635a8641SAndroid Build Coastguard Worker TEST_F(PropertyTest, Invalidate) {
300*635a8641SAndroid Build Coastguard Worker   WaitForGetAll();
301*635a8641SAndroid Build Coastguard Worker 
302*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(properties_->name.is_valid());
303*635a8641SAndroid Build Coastguard Worker 
304*635a8641SAndroid Build Coastguard Worker   // Invalidate name.
305*635a8641SAndroid Build Coastguard Worker   MethodCall method_call("org.chromium.TestInterface", "PerformAction");
306*635a8641SAndroid Build Coastguard Worker   MessageWriter writer(&method_call);
307*635a8641SAndroid Build Coastguard Worker   writer.AppendString("InvalidateProperty");
308*635a8641SAndroid Build Coastguard Worker   writer.AppendObjectPath(ObjectPath("/org/chromium/TestService"));
309*635a8641SAndroid Build Coastguard Worker   object_proxy_->CallMethod(
310*635a8641SAndroid Build Coastguard Worker       &method_call, ObjectProxy::TIMEOUT_USE_DEFAULT,
311*635a8641SAndroid Build Coastguard Worker       base::Bind(&PropertyTest::MethodCallback, base::Unretained(this)));
312*635a8641SAndroid Build Coastguard Worker   WaitForMethodCallback();
313*635a8641SAndroid Build Coastguard Worker 
314*635a8641SAndroid Build Coastguard Worker   // TestService sends a property update.
315*635a8641SAndroid Build Coastguard Worker   WaitForUpdates(1);
316*635a8641SAndroid Build Coastguard Worker 
317*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(properties_->name.is_valid());
318*635a8641SAndroid Build Coastguard Worker 
319*635a8641SAndroid Build Coastguard Worker   // Set name to something valid.
320*635a8641SAndroid Build Coastguard Worker   properties_->name.Set("NewService",
321*635a8641SAndroid Build Coastguard Worker                         base::Bind(&PropertyTest::PropertyCallback,
322*635a8641SAndroid Build Coastguard Worker                                    base::Unretained(this), "Set"));
323*635a8641SAndroid Build Coastguard Worker   WaitForCallback("Set");
324*635a8641SAndroid Build Coastguard Worker 
325*635a8641SAndroid Build Coastguard Worker   // TestService sends a property update.
326*635a8641SAndroid Build Coastguard Worker   WaitForUpdates(1);
327*635a8641SAndroid Build Coastguard Worker 
328*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(properties_->name.is_valid());
329*635a8641SAndroid Build Coastguard Worker }
330*635a8641SAndroid Build Coastguard Worker 
TEST(PropertyTestStatic,ReadWriteStringMap)331*635a8641SAndroid Build Coastguard Worker TEST(PropertyTestStatic, ReadWriteStringMap) {
332*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<Response> message(Response::CreateEmpty());
333*635a8641SAndroid Build Coastguard Worker   MessageWriter writer(message.get());
334*635a8641SAndroid Build Coastguard Worker   MessageWriter variant_writer(nullptr);
335*635a8641SAndroid Build Coastguard Worker   MessageWriter variant_array_writer(nullptr);
336*635a8641SAndroid Build Coastguard Worker   MessageWriter struct_entry_writer(nullptr);
337*635a8641SAndroid Build Coastguard Worker 
338*635a8641SAndroid Build Coastguard Worker   writer.OpenVariant("a{ss}", &variant_writer);
339*635a8641SAndroid Build Coastguard Worker   variant_writer.OpenArray("{ss}", &variant_array_writer);
340*635a8641SAndroid Build Coastguard Worker   const char* items[] = {"One", "Two", "Three", "Four"};
341*635a8641SAndroid Build Coastguard Worker   for (unsigned i = 0; i < arraysize(items); ++i) {
342*635a8641SAndroid Build Coastguard Worker     variant_array_writer.OpenDictEntry(&struct_entry_writer);
343*635a8641SAndroid Build Coastguard Worker     struct_entry_writer.AppendString(items[i]);
344*635a8641SAndroid Build Coastguard Worker     struct_entry_writer.AppendString(base::UintToString(i + 1));
345*635a8641SAndroid Build Coastguard Worker     variant_array_writer.CloseContainer(&struct_entry_writer);
346*635a8641SAndroid Build Coastguard Worker   }
347*635a8641SAndroid Build Coastguard Worker   variant_writer.CloseContainer(&variant_array_writer);
348*635a8641SAndroid Build Coastguard Worker   writer.CloseContainer(&variant_writer);
349*635a8641SAndroid Build Coastguard Worker 
350*635a8641SAndroid Build Coastguard Worker   MessageReader reader(message.get());
351*635a8641SAndroid Build Coastguard Worker   Property<std::map<std::string, std::string>> string_map;
352*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(string_map.PopValueFromReader(&reader));
353*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(4U, string_map.value().size());
354*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("1", string_map.value().at("One"));
355*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("2", string_map.value().at("Two"));
356*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("3", string_map.value().at("Three"));
357*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("4", string_map.value().at("Four"));
358*635a8641SAndroid Build Coastguard Worker }
359*635a8641SAndroid Build Coastguard Worker 
TEST(PropertyTestStatic,SerializeStringMap)360*635a8641SAndroid Build Coastguard Worker TEST(PropertyTestStatic, SerializeStringMap) {
361*635a8641SAndroid Build Coastguard Worker   std::map<std::string, std::string> test_map;
362*635a8641SAndroid Build Coastguard Worker   test_map["Hi"] = "There";
363*635a8641SAndroid Build Coastguard Worker   test_map["Map"] = "Test";
364*635a8641SAndroid Build Coastguard Worker   test_map["Random"] = "Text";
365*635a8641SAndroid Build Coastguard Worker 
366*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<Response> message(Response::CreateEmpty());
367*635a8641SAndroid Build Coastguard Worker   MessageWriter writer(message.get());
368*635a8641SAndroid Build Coastguard Worker 
369*635a8641SAndroid Build Coastguard Worker   Property<std::map<std::string, std::string>> string_map;
370*635a8641SAndroid Build Coastguard Worker   string_map.ReplaceSetValueForTesting(test_map);
371*635a8641SAndroid Build Coastguard Worker   string_map.AppendSetValueToWriter(&writer);
372*635a8641SAndroid Build Coastguard Worker 
373*635a8641SAndroid Build Coastguard Worker   MessageReader reader(message.get());
374*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(string_map.PopValueFromReader(&reader));
375*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(test_map, string_map.value());
376*635a8641SAndroid Build Coastguard Worker }
377*635a8641SAndroid Build Coastguard Worker 
TEST(PropertyTestStatic,ReadWriteNetAddressArray)378*635a8641SAndroid Build Coastguard Worker TEST(PropertyTestStatic, ReadWriteNetAddressArray) {
379*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<Response> message(Response::CreateEmpty());
380*635a8641SAndroid Build Coastguard Worker   MessageWriter writer(message.get());
381*635a8641SAndroid Build Coastguard Worker   MessageWriter variant_writer(nullptr);
382*635a8641SAndroid Build Coastguard Worker   MessageWriter variant_array_writer(nullptr);
383*635a8641SAndroid Build Coastguard Worker   MessageWriter struct_entry_writer(nullptr);
384*635a8641SAndroid Build Coastguard Worker 
385*635a8641SAndroid Build Coastguard Worker   writer.OpenVariant("a(ayq)", &variant_writer);
386*635a8641SAndroid Build Coastguard Worker   variant_writer.OpenArray("(ayq)", &variant_array_writer);
387*635a8641SAndroid Build Coastguard Worker   uint8_t ip_bytes[] = {0x54, 0x65, 0x73, 0x74, 0x30};
388*635a8641SAndroid Build Coastguard Worker   for (uint16_t i = 0; i < 5; ++i) {
389*635a8641SAndroid Build Coastguard Worker     variant_array_writer.OpenStruct(&struct_entry_writer);
390*635a8641SAndroid Build Coastguard Worker     ip_bytes[4] = 0x30 + i;
391*635a8641SAndroid Build Coastguard Worker     struct_entry_writer.AppendArrayOfBytes(ip_bytes, arraysize(ip_bytes));
392*635a8641SAndroid Build Coastguard Worker     struct_entry_writer.AppendUint16(i);
393*635a8641SAndroid Build Coastguard Worker     variant_array_writer.CloseContainer(&struct_entry_writer);
394*635a8641SAndroid Build Coastguard Worker   }
395*635a8641SAndroid Build Coastguard Worker   variant_writer.CloseContainer(&variant_array_writer);
396*635a8641SAndroid Build Coastguard Worker   writer.CloseContainer(&variant_writer);
397*635a8641SAndroid Build Coastguard Worker 
398*635a8641SAndroid Build Coastguard Worker   MessageReader reader(message.get());
399*635a8641SAndroid Build Coastguard Worker   Property<std::vector<std::pair<std::vector<uint8_t>, uint16_t>>> ip_list;
400*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(ip_list.PopValueFromReader(&reader));
401*635a8641SAndroid Build Coastguard Worker 
402*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(5U, ip_list.value().size());
403*635a8641SAndroid Build Coastguard Worker   size_t item_index = 0;
404*635a8641SAndroid Build Coastguard Worker   for (auto& item : ip_list.value()) {
405*635a8641SAndroid Build Coastguard Worker     ASSERT_EQ(5U, item.first.size());
406*635a8641SAndroid Build Coastguard Worker     ip_bytes[4] = 0x30 + item_index;
407*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(0, memcmp(ip_bytes, item.first.data(), 5U));
408*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(item_index, item.second);
409*635a8641SAndroid Build Coastguard Worker     ++item_index;
410*635a8641SAndroid Build Coastguard Worker   }
411*635a8641SAndroid Build Coastguard Worker }
412*635a8641SAndroid Build Coastguard Worker 
TEST(PropertyTestStatic,SerializeNetAddressArray)413*635a8641SAndroid Build Coastguard Worker TEST(PropertyTestStatic, SerializeNetAddressArray) {
414*635a8641SAndroid Build Coastguard Worker   std::vector<std::pair<std::vector<uint8_t>, uint16_t>> test_list;
415*635a8641SAndroid Build Coastguard Worker 
416*635a8641SAndroid Build Coastguard Worker   uint8_t ip_bytes[] = {0x54, 0x65, 0x73, 0x74, 0x30};
417*635a8641SAndroid Build Coastguard Worker   for (uint16_t i = 0; i < 5; ++i) {
418*635a8641SAndroid Build Coastguard Worker     ip_bytes[4] = 0x30 + i;
419*635a8641SAndroid Build Coastguard Worker     std::vector<uint8_t> bytes(ip_bytes, ip_bytes + arraysize(ip_bytes));
420*635a8641SAndroid Build Coastguard Worker     test_list.push_back(make_pair(bytes, 16));
421*635a8641SAndroid Build Coastguard Worker   }
422*635a8641SAndroid Build Coastguard Worker 
423*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<Response> message(Response::CreateEmpty());
424*635a8641SAndroid Build Coastguard Worker   MessageWriter writer(message.get());
425*635a8641SAndroid Build Coastguard Worker 
426*635a8641SAndroid Build Coastguard Worker   Property<std::vector<std::pair<std::vector<uint8_t>, uint16_t>>> ip_list;
427*635a8641SAndroid Build Coastguard Worker   ip_list.ReplaceSetValueForTesting(test_list);
428*635a8641SAndroid Build Coastguard Worker   ip_list.AppendSetValueToWriter(&writer);
429*635a8641SAndroid Build Coastguard Worker 
430*635a8641SAndroid Build Coastguard Worker   MessageReader reader(message.get());
431*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(ip_list.PopValueFromReader(&reader));
432*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(test_list, ip_list.value());
433*635a8641SAndroid Build Coastguard Worker }
434*635a8641SAndroid Build Coastguard Worker 
TEST(PropertyTestStatic,ReadWriteStringToByteVectorMap)435*635a8641SAndroid Build Coastguard Worker TEST(PropertyTestStatic, ReadWriteStringToByteVectorMap) {
436*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<Response> message(Response::CreateEmpty());
437*635a8641SAndroid Build Coastguard Worker   MessageWriter writer(message.get());
438*635a8641SAndroid Build Coastguard Worker   MessageWriter variant_writer(nullptr);
439*635a8641SAndroid Build Coastguard Worker   MessageWriter dict_writer(nullptr);
440*635a8641SAndroid Build Coastguard Worker 
441*635a8641SAndroid Build Coastguard Worker   writer.OpenVariant("a{sv}", &variant_writer);
442*635a8641SAndroid Build Coastguard Worker   variant_writer.OpenArray("{sv}", &dict_writer);
443*635a8641SAndroid Build Coastguard Worker 
444*635a8641SAndroid Build Coastguard Worker   const char* keys[] = {"One", "Two", "Three", "Four"};
445*635a8641SAndroid Build Coastguard Worker   const std::vector<uint8_t> values[] = {{1}, {1, 2}, {1, 2, 3}, {1, 2, 3, 4}};
446*635a8641SAndroid Build Coastguard Worker   for (unsigned i = 0; i < arraysize(keys); ++i) {
447*635a8641SAndroid Build Coastguard Worker     MessageWriter entry_writer(nullptr);
448*635a8641SAndroid Build Coastguard Worker     dict_writer.OpenDictEntry(&entry_writer);
449*635a8641SAndroid Build Coastguard Worker 
450*635a8641SAndroid Build Coastguard Worker     entry_writer.AppendString(keys[i]);
451*635a8641SAndroid Build Coastguard Worker 
452*635a8641SAndroid Build Coastguard Worker     MessageWriter value_varient_writer(nullptr);
453*635a8641SAndroid Build Coastguard Worker     entry_writer.OpenVariant("ay", &value_varient_writer);
454*635a8641SAndroid Build Coastguard Worker     value_varient_writer.AppendArrayOfBytes(values[i].data(), values[i].size());
455*635a8641SAndroid Build Coastguard Worker     entry_writer.CloseContainer(&value_varient_writer);
456*635a8641SAndroid Build Coastguard Worker 
457*635a8641SAndroid Build Coastguard Worker     dict_writer.CloseContainer(&entry_writer);
458*635a8641SAndroid Build Coastguard Worker   }
459*635a8641SAndroid Build Coastguard Worker 
460*635a8641SAndroid Build Coastguard Worker   variant_writer.CloseContainer(&dict_writer);
461*635a8641SAndroid Build Coastguard Worker   writer.CloseContainer(&variant_writer);
462*635a8641SAndroid Build Coastguard Worker 
463*635a8641SAndroid Build Coastguard Worker   MessageReader reader(message.get());
464*635a8641SAndroid Build Coastguard Worker   Property<std::map<std::string, std::vector<uint8_t>>> test_property;
465*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(test_property.PopValueFromReader(&reader));
466*635a8641SAndroid Build Coastguard Worker 
467*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(arraysize(keys), test_property.value().size());
468*635a8641SAndroid Build Coastguard Worker   for (unsigned i = 0; i < arraysize(keys); ++i)
469*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(values[i], test_property.value().at(keys[i]));
470*635a8641SAndroid Build Coastguard Worker }
471*635a8641SAndroid Build Coastguard Worker 
TEST(PropertyTestStatic,SerializeStringToByteVectorMap)472*635a8641SAndroid Build Coastguard Worker TEST(PropertyTestStatic, SerializeStringToByteVectorMap) {
473*635a8641SAndroid Build Coastguard Worker   std::map<std::string, std::vector<uint8_t>> test_map;
474*635a8641SAndroid Build Coastguard Worker   test_map["Hi"] = {1, 2, 3};
475*635a8641SAndroid Build Coastguard Worker   test_map["Map"] = {0xab, 0xcd};
476*635a8641SAndroid Build Coastguard Worker   test_map["Random"] = {0x0};
477*635a8641SAndroid Build Coastguard Worker 
478*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<Response> message(Response::CreateEmpty());
479*635a8641SAndroid Build Coastguard Worker   MessageWriter writer(message.get());
480*635a8641SAndroid Build Coastguard Worker 
481*635a8641SAndroid Build Coastguard Worker   Property<std::map<std::string, std::vector<uint8_t>>> test_property;
482*635a8641SAndroid Build Coastguard Worker   test_property.ReplaceSetValueForTesting(test_map);
483*635a8641SAndroid Build Coastguard Worker   test_property.AppendSetValueToWriter(&writer);
484*635a8641SAndroid Build Coastguard Worker 
485*635a8641SAndroid Build Coastguard Worker   MessageReader reader(message.get());
486*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(test_property.PopValueFromReader(&reader));
487*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(test_map, test_property.value());
488*635a8641SAndroid Build Coastguard Worker }
489*635a8641SAndroid Build Coastguard Worker 
TEST(PropertyTestStatic,ReadWriteUInt16ToByteVectorMap)490*635a8641SAndroid Build Coastguard Worker TEST(PropertyTestStatic, ReadWriteUInt16ToByteVectorMap) {
491*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<Response> message(Response::CreateEmpty());
492*635a8641SAndroid Build Coastguard Worker   MessageWriter writer(message.get());
493*635a8641SAndroid Build Coastguard Worker   MessageWriter variant_writer(nullptr);
494*635a8641SAndroid Build Coastguard Worker   MessageWriter dict_writer(nullptr);
495*635a8641SAndroid Build Coastguard Worker 
496*635a8641SAndroid Build Coastguard Worker   writer.OpenVariant("a{qv}", &variant_writer);
497*635a8641SAndroid Build Coastguard Worker   variant_writer.OpenArray("{qv}", &dict_writer);
498*635a8641SAndroid Build Coastguard Worker 
499*635a8641SAndroid Build Coastguard Worker   const uint16_t keys[] = {11, 12, 13, 14};
500*635a8641SAndroid Build Coastguard Worker   const std::vector<uint8_t> values[] = {{1}, {1, 2}, {1, 2, 3}, {1, 2, 3, 4}};
501*635a8641SAndroid Build Coastguard Worker   for (unsigned i = 0; i < arraysize(keys); ++i) {
502*635a8641SAndroid Build Coastguard Worker     MessageWriter entry_writer(nullptr);
503*635a8641SAndroid Build Coastguard Worker     dict_writer.OpenDictEntry(&entry_writer);
504*635a8641SAndroid Build Coastguard Worker 
505*635a8641SAndroid Build Coastguard Worker     entry_writer.AppendUint16(keys[i]);
506*635a8641SAndroid Build Coastguard Worker 
507*635a8641SAndroid Build Coastguard Worker     MessageWriter value_varient_writer(nullptr);
508*635a8641SAndroid Build Coastguard Worker     entry_writer.OpenVariant("ay", &value_varient_writer);
509*635a8641SAndroid Build Coastguard Worker     value_varient_writer.AppendArrayOfBytes(values[i].data(), values[i].size());
510*635a8641SAndroid Build Coastguard Worker     entry_writer.CloseContainer(&value_varient_writer);
511*635a8641SAndroid Build Coastguard Worker 
512*635a8641SAndroid Build Coastguard Worker     dict_writer.CloseContainer(&entry_writer);
513*635a8641SAndroid Build Coastguard Worker   }
514*635a8641SAndroid Build Coastguard Worker 
515*635a8641SAndroid Build Coastguard Worker   variant_writer.CloseContainer(&dict_writer);
516*635a8641SAndroid Build Coastguard Worker   writer.CloseContainer(&variant_writer);
517*635a8641SAndroid Build Coastguard Worker 
518*635a8641SAndroid Build Coastguard Worker   MessageReader reader(message.get());
519*635a8641SAndroid Build Coastguard Worker   Property<std::map<uint16_t, std::vector<uint8_t>>> test_property;
520*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(test_property.PopValueFromReader(&reader));
521*635a8641SAndroid Build Coastguard Worker 
522*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(arraysize(keys), test_property.value().size());
523*635a8641SAndroid Build Coastguard Worker   for (unsigned i = 0; i < arraysize(keys); ++i)
524*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(values[i], test_property.value().at(keys[i]));
525*635a8641SAndroid Build Coastguard Worker }
526*635a8641SAndroid Build Coastguard Worker 
TEST(PropertyTestStatic,SerializeUInt16ToByteVectorMap)527*635a8641SAndroid Build Coastguard Worker TEST(PropertyTestStatic, SerializeUInt16ToByteVectorMap) {
528*635a8641SAndroid Build Coastguard Worker   std::map<uint16_t, std::vector<uint8_t>> test_map;
529*635a8641SAndroid Build Coastguard Worker   test_map[11] = {1, 2, 3};
530*635a8641SAndroid Build Coastguard Worker   test_map[12] = {0xab, 0xcd};
531*635a8641SAndroid Build Coastguard Worker   test_map[13] = {0x0};
532*635a8641SAndroid Build Coastguard Worker 
533*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<Response> message(Response::CreateEmpty());
534*635a8641SAndroid Build Coastguard Worker   MessageWriter writer(message.get());
535*635a8641SAndroid Build Coastguard Worker 
536*635a8641SAndroid Build Coastguard Worker   Property<std::map<uint16_t, std::vector<uint8_t>>> test_property;
537*635a8641SAndroid Build Coastguard Worker   test_property.ReplaceSetValueForTesting(test_map);
538*635a8641SAndroid Build Coastguard Worker   test_property.AppendSetValueToWriter(&writer);
539*635a8641SAndroid Build Coastguard Worker 
540*635a8641SAndroid Build Coastguard Worker   MessageReader reader(message.get());
541*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(test_property.PopValueFromReader(&reader));
542*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(test_map, test_property.value());
543*635a8641SAndroid Build Coastguard Worker }
544*635a8641SAndroid Build Coastguard Worker 
545*635a8641SAndroid Build Coastguard Worker }  // namespace dbus
546