blob: c17ecf6ed89f90147014394a95f731d8e3da9516 [file] [log] [blame]
[email protected]9400ff82012-02-07 23:48:351// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]a9e91492011-07-30 19:13:312// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]a9e91492011-07-30 19:13:315#include "dbus/message.h"
[email protected]3820b962011-07-30 20:36:276
avi22437c692015-12-22 18:12:457#include <stddef.h>
tfarina689b7ac2015-04-20 20:35:208#include <stdint.h>
9
dcheng2a193282016-04-08 22:55:0410#include <memory>
11
[email protected]3820b962011-07-30 20:36:2712#include "base/logging.h"
[email protected]2025d002012-11-14 20:54:3513#include "base/posix/eintr_wrapper.h"
[email protected]216ed0b2012-02-14 21:29:0614#include "dbus/object_path.h"
[email protected]c033c5082012-02-09 18:14:0815#include "dbus/test_proto.pb.h"
[email protected]a9e91492011-07-30 19:13:3116#include "testing/gtest/include/gtest/gtest.h"
17
[email protected]2a57ca642013-06-13 06:37:1918namespace dbus {
19
[email protected]a9e91492011-07-30 19:13:3120// Test that a byte can be properly written and read. We only have this
21// test for byte, as repeating this for other basic types is too redundant.
22TEST(MessageTest, AppendAndPopByte) {
dcheng2a193282016-04-08 22:55:0423 std::unique_ptr<Response> message(Response::CreateEmpty());
[email protected]2a57ca642013-06-13 06:37:1924 MessageWriter writer(message.get());
[email protected]a9e91492011-07-30 19:13:3125 writer.AppendByte(123); // The input is 123.
26
[email protected]2a57ca642013-06-13 06:37:1927 MessageReader reader(message.get());
[email protected]a9e91492011-07-30 19:13:3128 ASSERT_TRUE(reader.HasMoreData()); // Should have data to read.
[email protected]2a57ca642013-06-13 06:37:1929 ASSERT_EQ(Message::BYTE, reader.GetDataType());
benchand2c6ebe2014-08-25 06:50:2930 ASSERT_EQ("y", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:3131
32 bool bool_value = false;
33 // Should fail as the type is not bool here.
34 ASSERT_FALSE(reader.PopBool(&bool_value));
35
avi22437c692015-12-22 18:12:4536 uint8_t byte_value = 0;
[email protected]a9e91492011-07-30 19:13:3137 ASSERT_TRUE(reader.PopByte(&byte_value));
Abhishek Bhardwaj34928ece2018-05-23 07:22:1938 EXPECT_EQ(123, byte_value); // Should match with the input.
[email protected]a9e91492011-07-30 19:13:3139 ASSERT_FALSE(reader.HasMoreData()); // Should not have more data to read.
40
41 // Try to get another byte. Should fail.
42 ASSERT_FALSE(reader.PopByte(&byte_value));
43}
44
45// Check all basic types can be properly written and read.
46TEST(MessageTest, AppendAndPopBasicDataTypes) {
dcheng2a193282016-04-08 22:55:0447 std::unique_ptr<Response> message(Response::CreateEmpty());
[email protected]2a57ca642013-06-13 06:37:1948 MessageWriter writer(message.get());
[email protected]a9e91492011-07-30 19:13:3149
50 // Append 0, 1, 2, 3, 4, 5, 6, 7, 8, "string", "/object/path".
51 writer.AppendByte(0);
52 writer.AppendBool(true);
53 writer.AppendInt16(2);
54 writer.AppendUint16(3);
55 writer.AppendInt32(4);
56 writer.AppendUint32(5);
57 writer.AppendInt64(6);
58 writer.AppendUint64(7);
59 writer.AppendDouble(8.0);
60 writer.AppendString("string");
[email protected]2a57ca642013-06-13 06:37:1961 writer.AppendObjectPath(ObjectPath("/object/path"));
[email protected]a9e91492011-07-30 19:13:3162
avi22437c692015-12-22 18:12:4563 uint8_t byte_value = 0;
[email protected]a9e91492011-07-30 19:13:3164 bool bool_value = false;
avi22437c692015-12-22 18:12:4565 int16_t int16_value = 0;
66 uint16_t uint16_value = 0;
67 int32_t int32_value = 0;
68 uint32_t uint32_value = 0;
69 int64_t int64_value = 0;
70 uint64_t uint64_value = 0;
[email protected]a9e91492011-07-30 19:13:3171 double double_value = 0;
72 std::string string_value;
[email protected]2a57ca642013-06-13 06:37:1973 ObjectPath object_path_value;
[email protected]a9e91492011-07-30 19:13:3174
[email protected]2a57ca642013-06-13 06:37:1975 MessageReader reader(message.get());
[email protected]a9e91492011-07-30 19:13:3176 ASSERT_TRUE(reader.HasMoreData());
benchand2c6ebe2014-08-25 06:50:2977 ASSERT_EQ("y", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:3178 ASSERT_TRUE(reader.PopByte(&byte_value));
benchand2c6ebe2014-08-25 06:50:2979 ASSERT_EQ("b", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:3180 ASSERT_TRUE(reader.PopBool(&bool_value));
benchand2c6ebe2014-08-25 06:50:2981 ASSERT_EQ("n", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:3182 ASSERT_TRUE(reader.PopInt16(&int16_value));
benchand2c6ebe2014-08-25 06:50:2983 ASSERT_EQ("q", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:3184 ASSERT_TRUE(reader.PopUint16(&uint16_value));
benchand2c6ebe2014-08-25 06:50:2985 ASSERT_EQ("i", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:3186 ASSERT_TRUE(reader.PopInt32(&int32_value));
benchand2c6ebe2014-08-25 06:50:2987 ASSERT_EQ("u", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:3188 ASSERT_TRUE(reader.PopUint32(&uint32_value));
benchand2c6ebe2014-08-25 06:50:2989 ASSERT_EQ("x", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:3190 ASSERT_TRUE(reader.PopInt64(&int64_value));
benchand2c6ebe2014-08-25 06:50:2991 ASSERT_EQ("t", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:3192 ASSERT_TRUE(reader.PopUint64(&uint64_value));
benchand2c6ebe2014-08-25 06:50:2993 ASSERT_EQ("d", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:3194 ASSERT_TRUE(reader.PopDouble(&double_value));
benchand2c6ebe2014-08-25 06:50:2995 ASSERT_EQ("s", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:3196 ASSERT_TRUE(reader.PopString(&string_value));
benchand2c6ebe2014-08-25 06:50:2997 ASSERT_EQ("o", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:3198 ASSERT_TRUE(reader.PopObjectPath(&object_path_value));
benchand2c6ebe2014-08-25 06:50:2999 ASSERT_EQ("", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:31100 ASSERT_FALSE(reader.HasMoreData());
101
102 // 0, 1, 2, 3, 4, 5, 6, 7, 8, "string", "/object/path" should be returned.
103 EXPECT_EQ(0, byte_value);
104 EXPECT_EQ(true, bool_value);
105 EXPECT_EQ(2, int16_value);
106 EXPECT_EQ(3U, uint16_value);
107 EXPECT_EQ(4, int32_value);
108 EXPECT_EQ(5U, uint32_value);
109 EXPECT_EQ(6, int64_value);
110 EXPECT_EQ(7U, uint64_value);
111 EXPECT_DOUBLE_EQ(8.0, double_value);
112 EXPECT_EQ("string", string_value);
[email protected]2a57ca642013-06-13 06:37:19113 EXPECT_EQ(ObjectPath("/object/path"), object_path_value);
[email protected]a9e91492011-07-30 19:13:31114}
115
[email protected]e146bfc2012-03-30 06:46:20116// Check all basic types can be properly written and read.
117TEST(MessageTest, AppendAndPopFileDescriptor) {
[email protected]2a57ca642013-06-13 06:37:19118 if (!IsDBusTypeUnixFdSupported()) {
[email protected]e146bfc2012-03-30 06:46:20119 LOG(WARNING) << "FD passing is not supported";
120 return;
121 }
122
dcheng2a193282016-04-08 22:55:04123 std::unique_ptr<Response> message(Response::CreateEmpty());
[email protected]2a57ca642013-06-13 06:37:19124 MessageWriter writer(message.get());
[email protected]e146bfc2012-03-30 06:46:20125
126 // Append stdout.
hashimotodc693af2016-09-14 04:05:02127 const int fd_in = 1;
128 writer.AppendFileDescriptor(fd_in);
[email protected]e146bfc2012-03-30 06:46:20129
hashimotodc693af2016-09-14 04:05:02130 base::ScopedFD fd_out;
[email protected]e146bfc2012-03-30 06:46:20131
[email protected]2a57ca642013-06-13 06:37:19132 MessageReader reader(message.get());
[email protected]e146bfc2012-03-30 06:46:20133 ASSERT_TRUE(reader.HasMoreData());
benchand2c6ebe2014-08-25 06:50:29134 ASSERT_EQ(Message::UNIX_FD, reader.GetDataType());
135 ASSERT_EQ("h", reader.GetDataSignature());
hashimotodc693af2016-09-14 04:05:02136 ASSERT_TRUE(reader.PopFileDescriptor(&fd_out));
[email protected]e146bfc2012-03-30 06:46:20137 ASSERT_FALSE(reader.HasMoreData());
138
139 // Stdout should be returned but we cannot check the descriptor
140 // value because stdout will be dup'd. Instead check st_rdev
141 // which should be identical.
142 struct stat sb_stdout;
hashimotodc693af2016-09-14 04:05:02143 int status_stdout = HANDLE_EINTR(fstat(fd_in, &sb_stdout));
[email protected]2a57ca642013-06-13 06:37:19144 ASSERT_GE(status_stdout, 0);
[email protected]e146bfc2012-03-30 06:46:20145 struct stat sb_fd;
hashimotodc693af2016-09-14 04:05:02146 int status_fd = HANDLE_EINTR(fstat(fd_out.get(), &sb_fd));
[email protected]2a57ca642013-06-13 06:37:19147 ASSERT_GE(status_fd, 0);
[email protected]e146bfc2012-03-30 06:46:20148 EXPECT_EQ(sb_stdout.st_rdev, sb_fd.st_rdev);
149}
150
[email protected]a9e91492011-07-30 19:13:31151// Check all variant types can be properly written and read.
152TEST(MessageTest, AppendAndPopVariantDataTypes) {
dcheng2a193282016-04-08 22:55:04153 std::unique_ptr<Response> message(Response::CreateEmpty());
[email protected]2a57ca642013-06-13 06:37:19154 MessageWriter writer(message.get());
[email protected]a9e91492011-07-30 19:13:31155
156 // Append 0, 1, 2, 3, 4, 5, 6, 7, 8, "string", "/object/path".
157 writer.AppendVariantOfByte(0);
158 writer.AppendVariantOfBool(true);
159 writer.AppendVariantOfInt16(2);
160 writer.AppendVariantOfUint16(3);
161 writer.AppendVariantOfInt32(4);
162 writer.AppendVariantOfUint32(5);
163 writer.AppendVariantOfInt64(6);
164 writer.AppendVariantOfUint64(7);
165 writer.AppendVariantOfDouble(8.0);
166 writer.AppendVariantOfString("string");
[email protected]2a57ca642013-06-13 06:37:19167 writer.AppendVariantOfObjectPath(ObjectPath("/object/path"));
[email protected]a9e91492011-07-30 19:13:31168
avi22437c692015-12-22 18:12:45169 uint8_t byte_value = 0;
[email protected]a9e91492011-07-30 19:13:31170 bool bool_value = false;
avi22437c692015-12-22 18:12:45171 int16_t int16_value = 0;
172 uint16_t uint16_value = 0;
173 int32_t int32_value = 0;
174 uint32_t uint32_value = 0;
175 int64_t int64_value = 0;
176 uint64_t uint64_value = 0;
[email protected]a9e91492011-07-30 19:13:31177 double double_value = 0;
178 std::string string_value;
[email protected]2a57ca642013-06-13 06:37:19179 ObjectPath object_path_value;
[email protected]a9e91492011-07-30 19:13:31180
[email protected]2a57ca642013-06-13 06:37:19181 MessageReader reader(message.get());
[email protected]a9e91492011-07-30 19:13:31182 ASSERT_TRUE(reader.HasMoreData());
benchand2c6ebe2014-08-25 06:50:29183 ASSERT_EQ("v", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:31184 ASSERT_TRUE(reader.PopVariantOfByte(&byte_value));
benchand2c6ebe2014-08-25 06:50:29185 ASSERT_EQ("v", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:31186 ASSERT_TRUE(reader.PopVariantOfBool(&bool_value));
benchand2c6ebe2014-08-25 06:50:29187 ASSERT_EQ("v", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:31188 ASSERT_TRUE(reader.PopVariantOfInt16(&int16_value));
benchand2c6ebe2014-08-25 06:50:29189 ASSERT_EQ("v", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:31190 ASSERT_TRUE(reader.PopVariantOfUint16(&uint16_value));
benchand2c6ebe2014-08-25 06:50:29191 ASSERT_EQ("v", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:31192 ASSERT_TRUE(reader.PopVariantOfInt32(&int32_value));
benchand2c6ebe2014-08-25 06:50:29193 ASSERT_EQ("v", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:31194 ASSERT_TRUE(reader.PopVariantOfUint32(&uint32_value));
benchand2c6ebe2014-08-25 06:50:29195 ASSERT_EQ("v", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:31196 ASSERT_TRUE(reader.PopVariantOfInt64(&int64_value));
benchand2c6ebe2014-08-25 06:50:29197 ASSERT_EQ("v", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:31198 ASSERT_TRUE(reader.PopVariantOfUint64(&uint64_value));
benchand2c6ebe2014-08-25 06:50:29199 ASSERT_EQ("v", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:31200 ASSERT_TRUE(reader.PopVariantOfDouble(&double_value));
benchand2c6ebe2014-08-25 06:50:29201 ASSERT_EQ("v", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:31202 ASSERT_TRUE(reader.PopVariantOfString(&string_value));
benchand2c6ebe2014-08-25 06:50:29203 ASSERT_EQ("v", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:31204 ASSERT_TRUE(reader.PopVariantOfObjectPath(&object_path_value));
benchand2c6ebe2014-08-25 06:50:29205 ASSERT_EQ("", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:31206 ASSERT_FALSE(reader.HasMoreData());
207
208 // 0, 1, 2, 3, 4, 5, 6, 7, 8, "string", "/object/path" should be returned.
209 EXPECT_EQ(0, byte_value);
210 EXPECT_EQ(true, bool_value);
211 EXPECT_EQ(2, int16_value);
212 EXPECT_EQ(3U, uint16_value);
213 EXPECT_EQ(4, int32_value);
214 EXPECT_EQ(5U, uint32_value);
215 EXPECT_EQ(6, int64_value);
216 EXPECT_EQ(7U, uint64_value);
217 EXPECT_DOUBLE_EQ(8.0, double_value);
218 EXPECT_EQ("string", string_value);
[email protected]2a57ca642013-06-13 06:37:19219 EXPECT_EQ(ObjectPath("/object/path"), object_path_value);
[email protected]a9e91492011-07-30 19:13:31220}
221
222TEST(MessageTest, ArrayOfBytes) {
dcheng2a193282016-04-08 22:55:04223 std::unique_ptr<Response> message(Response::CreateEmpty());
[email protected]2a57ca642013-06-13 06:37:19224 MessageWriter writer(message.get());
avi22437c692015-12-22 18:12:45225 std::vector<uint8_t> bytes;
[email protected]a9e91492011-07-30 19:13:31226 bytes.push_back(1);
227 bytes.push_back(2);
228 bytes.push_back(3);
229 writer.AppendArrayOfBytes(bytes.data(), bytes.size());
230
[email protected]2a57ca642013-06-13 06:37:19231 MessageReader reader(message.get());
Ben Chan14d500372017-11-09 20:20:16232 const uint8_t* output_bytes = nullptr;
[email protected]a9e91492011-07-30 19:13:31233 size_t length = 0;
benchand2c6ebe2014-08-25 06:50:29234 ASSERT_EQ("ay", reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:31235 ASSERT_TRUE(reader.PopArrayOfBytes(&output_bytes, &length));
236 ASSERT_FALSE(reader.HasMoreData());
237 ASSERT_EQ(3U, length);
[email protected]8bc83fd2011-09-19 18:22:14238 EXPECT_EQ(1, output_bytes[0]);
239 EXPECT_EQ(2, output_bytes[1]);
240 EXPECT_EQ(3, output_bytes[2]);
241}
242
Abhishek Bhardwajb460dff2018-06-04 19:27:37243TEST(MessageTest, ArrayOfInt32s) {
244 std::unique_ptr<Response> message(Response::CreateEmpty());
245 MessageWriter writer(message.get());
246 std::vector<int32_t> int32s;
247 int32s.push_back(1);
248 int32s.push_back(2);
249 int32s.push_back(3);
250 writer.AppendArrayOfInt32s(int32s.data(), int32s.size());
251
252 MessageReader reader(message.get());
253 const int32_t* output_int32s = nullptr;
254 size_t length = 0;
255 ASSERT_EQ("ai", reader.GetDataSignature());
256 ASSERT_TRUE(reader.PopArrayOfInt32s(&output_int32s, &length));
257 ASSERT_FALSE(reader.HasMoreData());
258 ASSERT_EQ(3U, length);
259 EXPECT_EQ(1, output_int32s[0]);
260 EXPECT_EQ(2, output_int32s[1]);
261 EXPECT_EQ(3, output_int32s[2]);
262}
263
264TEST(MessageTest, ArrayOfUint32s) {
265 std::unique_ptr<Response> message(Response::CreateEmpty());
266 MessageWriter writer(message.get());
267 std::vector<uint32_t> uint32s;
268 uint32s.push_back(1);
269 uint32s.push_back(2);
270 uint32s.push_back(3);
271 writer.AppendArrayOfUint32s(uint32s.data(), uint32s.size());
272
273 MessageReader reader(message.get());
274 const uint32_t* output_uint32s = nullptr;
275 size_t length = 0;
276 ASSERT_EQ("au", reader.GetDataSignature());
277 ASSERT_TRUE(reader.PopArrayOfUint32s(&output_uint32s, &length));
278 ASSERT_FALSE(reader.HasMoreData());
279 ASSERT_EQ(3U, length);
280 EXPECT_EQ(1U, output_uint32s[0]);
281 EXPECT_EQ(2U, output_uint32s[1]);
282 EXPECT_EQ(3U, output_uint32s[2]);
283}
284
warxa377c042016-03-30 21:27:41285TEST(MessageTest, ArrayOfDoubles) {
dcheng2a193282016-04-08 22:55:04286 std::unique_ptr<Response> message(Response::CreateEmpty());
warxa377c042016-03-30 21:27:41287 MessageWriter writer(message.get());
288 std::vector<double> doubles;
289 doubles.push_back(0.2);
290 doubles.push_back(0.5);
291 doubles.push_back(1);
292 writer.AppendArrayOfDoubles(doubles.data(), doubles.size());
293
294 MessageReader reader(message.get());
Ben Chan14d500372017-11-09 20:20:16295 const double* output_doubles = nullptr;
warxa377c042016-03-30 21:27:41296 size_t length = 0;
297 ASSERT_EQ("ad", reader.GetDataSignature());
298 ASSERT_TRUE(reader.PopArrayOfDoubles(&output_doubles, &length));
299 ASSERT_FALSE(reader.HasMoreData());
300 ASSERT_EQ(3U, length);
301 EXPECT_EQ(0.2, output_doubles[0]);
302 EXPECT_EQ(0.5, output_doubles[1]);
303 EXPECT_EQ(1, output_doubles[2]);
304}
305
[email protected]3ed06262011-11-11 02:13:56306TEST(MessageTest, ArrayOfBytes_Empty) {
dcheng2a193282016-04-08 22:55:04307 std::unique_ptr<Response> message(Response::CreateEmpty());
[email protected]2a57ca642013-06-13 06:37:19308 MessageWriter writer(message.get());
avi22437c692015-12-22 18:12:45309 std::vector<uint8_t> bytes;
[email protected]3ed06262011-11-11 02:13:56310 writer.AppendArrayOfBytes(bytes.data(), bytes.size());
311
[email protected]2a57ca642013-06-13 06:37:19312 MessageReader reader(message.get());
Ben Chan14d500372017-11-09 20:20:16313 const uint8_t* output_bytes = nullptr;
[email protected]3ed06262011-11-11 02:13:56314 size_t length = 0;
benchand2c6ebe2014-08-25 06:50:29315 ASSERT_EQ("ay", reader.GetDataSignature());
[email protected]3ed06262011-11-11 02:13:56316 ASSERT_TRUE(reader.PopArrayOfBytes(&output_bytes, &length));
317 ASSERT_FALSE(reader.HasMoreData());
318 ASSERT_EQ(0U, length);
Ben Chan14d500372017-11-09 20:20:16319 EXPECT_EQ(nullptr, output_bytes);
[email protected]3ed06262011-11-11 02:13:56320}
321
[email protected]8bc83fd2011-09-19 18:22:14322TEST(MessageTest, ArrayOfStrings) {
dcheng2a193282016-04-08 22:55:04323 std::unique_ptr<Response> message(Response::CreateEmpty());
[email protected]2a57ca642013-06-13 06:37:19324 MessageWriter writer(message.get());
[email protected]8bc83fd2011-09-19 18:22:14325 std::vector<std::string> strings;
326 strings.push_back("fee");
327 strings.push_back("fie");
328 strings.push_back("foe");
329 strings.push_back("fum");
330 writer.AppendArrayOfStrings(strings);
331
[email protected]2a57ca642013-06-13 06:37:19332 MessageReader reader(message.get());
[email protected]8bc83fd2011-09-19 18:22:14333 std::vector<std::string> output_strings;
benchand2c6ebe2014-08-25 06:50:29334 ASSERT_EQ("as", reader.GetDataSignature());
[email protected]8bc83fd2011-09-19 18:22:14335 ASSERT_TRUE(reader.PopArrayOfStrings(&output_strings));
336 ASSERT_FALSE(reader.HasMoreData());
337 ASSERT_EQ(4U, output_strings.size());
338 EXPECT_EQ("fee", output_strings[0]);
339 EXPECT_EQ("fie", output_strings[1]);
340 EXPECT_EQ("foe", output_strings[2]);
341 EXPECT_EQ("fum", output_strings[3]);
[email protected]a9e91492011-07-30 19:13:31342}
343
[email protected]090d8e512011-08-22 18:28:42344TEST(MessageTest, ArrayOfObjectPaths) {
dcheng2a193282016-04-08 22:55:04345 std::unique_ptr<Response> message(Response::CreateEmpty());
[email protected]2a57ca642013-06-13 06:37:19346 MessageWriter writer(message.get());
347 std::vector<ObjectPath> object_paths;
348 object_paths.push_back(ObjectPath("/object/path/1"));
349 object_paths.push_back(ObjectPath("/object/path/2"));
350 object_paths.push_back(ObjectPath("/object/path/3"));
[email protected]090d8e512011-08-22 18:28:42351 writer.AppendArrayOfObjectPaths(object_paths);
352
[email protected]2a57ca642013-06-13 06:37:19353 MessageReader reader(message.get());
354 std::vector<ObjectPath> output_object_paths;
benchand2c6ebe2014-08-25 06:50:29355 ASSERT_EQ("ao", reader.GetDataSignature());
[email protected]090d8e512011-08-22 18:28:42356 ASSERT_TRUE(reader.PopArrayOfObjectPaths(&output_object_paths));
357 ASSERT_FALSE(reader.HasMoreData());
358 ASSERT_EQ(3U, output_object_paths.size());
[email protected]2a57ca642013-06-13 06:37:19359 EXPECT_EQ(ObjectPath("/object/path/1"), output_object_paths[0]);
360 EXPECT_EQ(ObjectPath("/object/path/2"), output_object_paths[1]);
361 EXPECT_EQ(ObjectPath("/object/path/3"), output_object_paths[2]);
[email protected]090d8e512011-08-22 18:28:42362}
363
[email protected]c033c5082012-02-09 18:14:08364TEST(MessageTest, ProtoBuf) {
dcheng2a193282016-04-08 22:55:04365 std::unique_ptr<Response> message(Response::CreateEmpty());
[email protected]2a57ca642013-06-13 06:37:19366 MessageWriter writer(message.get());
[email protected]c033c5082012-02-09 18:14:08367 TestProto send_message;
368 send_message.set_text("testing");
369 send_message.set_number(123);
370 writer.AppendProtoAsArrayOfBytes(send_message);
371
[email protected]2a57ca642013-06-13 06:37:19372 MessageReader reader(message.get());
[email protected]c033c5082012-02-09 18:14:08373 TestProto receive_message;
benchand2c6ebe2014-08-25 06:50:29374 ASSERT_EQ("ay", reader.GetDataSignature());
[email protected]c033c5082012-02-09 18:14:08375 ASSERT_TRUE(reader.PopArrayOfBytesAsProto(&receive_message));
376 EXPECT_EQ(receive_message.text(), send_message.text());
377 EXPECT_EQ(receive_message.number(), send_message.number());
378}
379
[email protected]a9e91492011-07-30 19:13:31380// Test that an array can be properly written and read. We only have this
381// test for array, as repeating this for other container types is too
382// redundant.
383TEST(MessageTest, OpenArrayAndPopArray) {
dcheng2a193282016-04-08 22:55:04384 std::unique_ptr<Response> message(Response::CreateEmpty());
[email protected]2a57ca642013-06-13 06:37:19385 MessageWriter writer(message.get());
Ben Chan14d500372017-11-09 20:20:16386 MessageWriter array_writer(nullptr);
[email protected]a9e91492011-07-30 19:13:31387 writer.OpenArray("s", &array_writer); // Open an array of strings.
388 array_writer.AppendString("foo");
389 array_writer.AppendString("bar");
390 array_writer.AppendString("baz");
391 writer.CloseContainer(&array_writer);
392
[email protected]2a57ca642013-06-13 06:37:19393 MessageReader reader(message.get());
394 ASSERT_EQ(Message::ARRAY, reader.GetDataType());
benchand2c6ebe2014-08-25 06:50:29395 ASSERT_EQ("as", reader.GetDataSignature());
Ben Chan14d500372017-11-09 20:20:16396 MessageReader array_reader(nullptr);
[email protected]a9e91492011-07-30 19:13:31397 ASSERT_TRUE(reader.PopArray(&array_reader));
398 ASSERT_FALSE(reader.HasMoreData()); // Should not have more data to read.
399
400 std::string string_value;
401 ASSERT_TRUE(array_reader.PopString(&string_value));
402 EXPECT_EQ("foo", string_value);
403 ASSERT_TRUE(array_reader.PopString(&string_value));
404 EXPECT_EQ("bar", string_value);
405 ASSERT_TRUE(array_reader.PopString(&string_value));
406 EXPECT_EQ("baz", string_value);
407 // Should not have more data to read.
408 ASSERT_FALSE(array_reader.HasMoreData());
409}
410
411// Create a complex message using array, struct, variant, dict entry, and
412// make sure it can be read properly.
413TEST(MessageTest, CreateComplexMessageAndReadIt) {
dcheng2a193282016-04-08 22:55:04414 std::unique_ptr<Response> message(Response::CreateEmpty());
[email protected]2a57ca642013-06-13 06:37:19415 MessageWriter writer(message.get());
[email protected]a9e91492011-07-30 19:13:31416 {
Ben Chan14d500372017-11-09 20:20:16417 MessageWriter array_writer(nullptr);
[email protected]a9e91492011-07-30 19:13:31418 // Open an array of variants.
419 writer.OpenArray("v", &array_writer);
420 {
421 // The first value in the array.
422 {
Ben Chan14d500372017-11-09 20:20:16423 MessageWriter variant_writer(nullptr);
[email protected]a9e91492011-07-30 19:13:31424 // Open a variant of a boolean.
425 array_writer.OpenVariant("b", &variant_writer);
426 variant_writer.AppendBool(true);
427 array_writer.CloseContainer(&variant_writer);
428 }
429
430 // The second value in the array.
431 {
Ben Chan14d500372017-11-09 20:20:16432 MessageWriter variant_writer(nullptr);
avi22437c692015-12-22 18:12:45433 // Open a variant of a struct that contains a string and an int32_t.
[email protected]a9e91492011-07-30 19:13:31434 array_writer.OpenVariant("(si)", &variant_writer);
435 {
Ben Chan14d500372017-11-09 20:20:16436 MessageWriter struct_writer(nullptr);
[email protected]a9e91492011-07-30 19:13:31437 variant_writer.OpenStruct(&struct_writer);
438 struct_writer.AppendString("string");
439 struct_writer.AppendInt32(123);
440 variant_writer.CloseContainer(&struct_writer);
441 }
442 array_writer.CloseContainer(&variant_writer);
443 }
444
445 // The third value in the array.
446 {
Ben Chan14d500372017-11-09 20:20:16447 MessageWriter variant_writer(nullptr);
avi22437c692015-12-22 18:12:45448 // Open a variant of an array of string-to-int64_t dict entries.
[email protected]a9e91492011-07-30 19:13:31449 array_writer.OpenVariant("a{sx}", &variant_writer);
450 {
avi22437c692015-12-22 18:12:45451 // Opens an array of string-to-int64_t dict entries.
Ben Chan14d500372017-11-09 20:20:16452 MessageWriter dict_array_writer(nullptr);
[email protected]a9e91492011-07-30 19:13:31453 variant_writer.OpenArray("{sx}", &dict_array_writer);
454 {
avi22437c692015-12-22 18:12:45455 // Opens a string-to-int64_t dict entries.
Ben Chan14d500372017-11-09 20:20:16456 MessageWriter dict_entry_writer(nullptr);
[email protected]a9e91492011-07-30 19:13:31457 dict_array_writer.OpenDictEntry(&dict_entry_writer);
458 dict_entry_writer.AppendString("foo");
tfarina689b7ac2015-04-20 20:35:20459 dict_entry_writer.AppendInt64(INT64_C(1234567890123456789));
[email protected]a9e91492011-07-30 19:13:31460 dict_array_writer.CloseContainer(&dict_entry_writer);
461 }
462 variant_writer.CloseContainer(&dict_array_writer);
463 }
464 array_writer.CloseContainer(&variant_writer);
465 }
466 }
467 writer.CloseContainer(&array_writer);
468 }
469 // What we have created looks like this:
avi22437c692015-12-22 18:12:45470 EXPECT_EQ(
471 "message_type: MESSAGE_METHOD_RETURN\n"
472 "signature: av\n"
473 "\n"
474 "array [\n"
475 " variant bool true\n"
476 " variant struct {\n"
477 " string \"string\"\n"
478 " int32_t 123\n"
479 " }\n"
480 " variant array [\n"
481 " dict entry {\n"
482 " string \"foo\"\n"
483 " int64_t 1234567890123456789\n"
484 " }\n"
485 " ]\n"
486 "]\n",
487 message->ToString());
[email protected]a9e91492011-07-30 19:13:31488
[email protected]2a57ca642013-06-13 06:37:19489 MessageReader reader(message.get());
benchand2c6ebe2014-08-25 06:50:29490 ASSERT_EQ("av", reader.GetDataSignature());
Ben Chan14d500372017-11-09 20:20:16491 MessageReader array_reader(nullptr);
[email protected]a9e91492011-07-30 19:13:31492 ASSERT_TRUE(reader.PopArray(&array_reader));
493
494 // The first value in the array.
495 bool bool_value = false;
benchand2c6ebe2014-08-25 06:50:29496 ASSERT_EQ("v", array_reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:31497 ASSERT_TRUE(array_reader.PopVariantOfBool(&bool_value));
498 EXPECT_EQ(true, bool_value);
499
500 // The second value in the array.
501 {
Ben Chan14d500372017-11-09 20:20:16502 MessageReader variant_reader(nullptr);
[email protected]a9e91492011-07-30 19:13:31503 ASSERT_TRUE(array_reader.PopVariant(&variant_reader));
504 {
Ben Chan14d500372017-11-09 20:20:16505 MessageReader struct_reader(nullptr);
benchand2c6ebe2014-08-25 06:50:29506 ASSERT_EQ("(si)", variant_reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:31507 ASSERT_TRUE(variant_reader.PopStruct(&struct_reader));
508 std::string string_value;
509 ASSERT_TRUE(struct_reader.PopString(&string_value));
510 EXPECT_EQ("string", string_value);
avi22437c692015-12-22 18:12:45511 int32_t int32_value = 0;
[email protected]a9e91492011-07-30 19:13:31512 ASSERT_TRUE(struct_reader.PopInt32(&int32_value));
513 EXPECT_EQ(123, int32_value);
514 ASSERT_FALSE(struct_reader.HasMoreData());
515 }
516 ASSERT_FALSE(variant_reader.HasMoreData());
517 }
518
519 // The third value in the array.
520 {
Ben Chan14d500372017-11-09 20:20:16521 MessageReader variant_reader(nullptr);
[email protected]a9e91492011-07-30 19:13:31522 ASSERT_TRUE(array_reader.PopVariant(&variant_reader));
523 {
Ben Chan14d500372017-11-09 20:20:16524 MessageReader dict_array_reader(nullptr);
benchand2c6ebe2014-08-25 06:50:29525 ASSERT_EQ("a{sx}", variant_reader.GetDataSignature());
[email protected]a9e91492011-07-30 19:13:31526 ASSERT_TRUE(variant_reader.PopArray(&dict_array_reader));
527 {
Ben Chan14d500372017-11-09 20:20:16528 MessageReader dict_entry_reader(nullptr);
[email protected]a9e91492011-07-30 19:13:31529 ASSERT_TRUE(dict_array_reader.PopDictEntry(&dict_entry_reader));
530 std::string string_value;
531 ASSERT_TRUE(dict_entry_reader.PopString(&string_value));
532 EXPECT_EQ("foo", string_value);
avi22437c692015-12-22 18:12:45533 int64_t int64_value = 0;
[email protected]a9e91492011-07-30 19:13:31534 ASSERT_TRUE(dict_entry_reader.PopInt64(&int64_value));
tfarina689b7ac2015-04-20 20:35:20535 EXPECT_EQ(INT64_C(1234567890123456789), int64_value);
[email protected]a9e91492011-07-30 19:13:31536 }
537 ASSERT_FALSE(dict_array_reader.HasMoreData());
538 }
539 ASSERT_FALSE(variant_reader.HasMoreData());
540 }
541 ASSERT_FALSE(array_reader.HasMoreData());
542 ASSERT_FALSE(reader.HasMoreData());
543}
544
[email protected]a9e91492011-07-30 19:13:31545TEST(MessageTest, MethodCall) {
[email protected]2a57ca642013-06-13 06:37:19546 MethodCall method_call("com.example.Interface", "SomeMethod");
Ben Chan14d500372017-11-09 20:20:16547 EXPECT_NE(nullptr, method_call.raw_message());
[email protected]2a57ca642013-06-13 06:37:19548 EXPECT_EQ(Message::MESSAGE_METHOD_CALL, method_call.GetMessageType());
[email protected]06ead872011-08-24 03:32:06549 EXPECT_EQ("MESSAGE_METHOD_CALL", method_call.GetMessageTypeAsString());
[email protected]9cce2d32011-08-10 22:34:02550 method_call.SetDestination("com.example.Service");
[email protected]2a57ca642013-06-13 06:37:19551 method_call.SetPath(ObjectPath("/com/example/Object"));
[email protected]a9e91492011-07-30 19:13:31552
[email protected]2a57ca642013-06-13 06:37:19553 MessageWriter writer(&method_call);
[email protected]a9e91492011-07-30 19:13:31554 writer.AppendString("payload");
555
Abhishek Bhardwaj34928ece2018-05-23 07:22:19556 EXPECT_EQ(
557 "message_type: MESSAGE_METHOD_CALL\n"
558 "destination: com.example.Service\n"
559 "path: /com/example/Object\n"
560 "interface: com.example.Interface\n"
561 "member: SomeMethod\n"
562 "signature: s\n"
563 "\n"
564 "string \"payload\"\n",
565 method_call.ToString());
[email protected]a9e91492011-07-30 19:13:31566}
567
[email protected]9cce2d32011-08-10 22:34:02568TEST(MessageTest, MethodCall_FromRawMessage) {
569 DBusMessage* raw_message = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_CALL);
570 dbus_message_set_interface(raw_message, "com.example.Interface");
571 dbus_message_set_member(raw_message, "SomeMethod");
572
dcheng2a193282016-04-08 22:55:04573 std::unique_ptr<MethodCall> method_call(
574 MethodCall::FromRawMessage(raw_message));
[email protected]9cce2d32011-08-10 22:34:02575 EXPECT_EQ("com.example.Interface", method_call->GetInterface());
576 EXPECT_EQ("SomeMethod", method_call->GetMember());
577}
578
[email protected]3beaaa4e2011-08-23 07:29:21579TEST(MessageTest, Signal) {
[email protected]2a57ca642013-06-13 06:37:19580 Signal signal("com.example.Interface", "SomeSignal");
Ben Chan14d500372017-11-09 20:20:16581 EXPECT_NE(nullptr, signal.raw_message());
[email protected]2a57ca642013-06-13 06:37:19582 EXPECT_EQ(Message::MESSAGE_SIGNAL, signal.GetMessageType());
[email protected]06ead872011-08-24 03:32:06583 EXPECT_EQ("MESSAGE_SIGNAL", signal.GetMessageTypeAsString());
[email protected]2a57ca642013-06-13 06:37:19584 signal.SetPath(ObjectPath("/com/example/Object"));
[email protected]3beaaa4e2011-08-23 07:29:21585
[email protected]2a57ca642013-06-13 06:37:19586 MessageWriter writer(&signal);
[email protected]3beaaa4e2011-08-23 07:29:21587 writer.AppendString("payload");
588
Abhishek Bhardwaj34928ece2018-05-23 07:22:19589 EXPECT_EQ(
590 "message_type: MESSAGE_SIGNAL\n"
591 "path: /com/example/Object\n"
592 "interface: com.example.Interface\n"
593 "member: SomeSignal\n"
594 "signature: s\n"
595 "\n"
596 "string \"payload\"\n",
597 signal.ToString());
[email protected]3beaaa4e2011-08-23 07:29:21598}
599
600TEST(MessageTest, Signal_FromRawMessage) {
601 DBusMessage* raw_message = dbus_message_new(DBUS_MESSAGE_TYPE_SIGNAL);
602 dbus_message_set_interface(raw_message, "com.example.Interface");
603 dbus_message_set_member(raw_message, "SomeSignal");
604
dcheng2a193282016-04-08 22:55:04605 std::unique_ptr<Signal> signal(Signal::FromRawMessage(raw_message));
[email protected]3beaaa4e2011-08-23 07:29:21606 EXPECT_EQ("com.example.Interface", signal->GetInterface());
607 EXPECT_EQ("SomeSignal", signal->GetMember());
608}
609
[email protected]a9e91492011-07-30 19:13:31610TEST(MessageTest, Response) {
dcheng2a193282016-04-08 22:55:04611 std::unique_ptr<Response> response(Response::CreateEmpty());
[email protected]06ead872011-08-24 03:32:06612 EXPECT_TRUE(response->raw_message());
[email protected]2a57ca642013-06-13 06:37:19613 EXPECT_EQ(Message::MESSAGE_METHOD_RETURN, response->GetMessageType());
[email protected]06ead872011-08-24 03:32:06614 EXPECT_EQ("MESSAGE_METHOD_RETURN", response->GetMessageTypeAsString());
[email protected]a9e91492011-07-30 19:13:31615}
616
[email protected]f78a9092011-08-16 23:22:23617TEST(MessageTest, Response_FromMethodCall) {
avi22437c692015-12-22 18:12:45618 const uint32_t kSerial = 123;
[email protected]2a57ca642013-06-13 06:37:19619 MethodCall method_call("com.example.Interface", "SomeMethod");
[email protected]9cce2d32011-08-10 22:34:02620 method_call.SetSerial(kSerial);
621
dcheng2a193282016-04-08 22:55:04622 std::unique_ptr<Response> response(Response::FromMethodCall(&method_call));
[email protected]2a57ca642013-06-13 06:37:19623 EXPECT_EQ(Message::MESSAGE_METHOD_RETURN, response->GetMessageType());
[email protected]06ead872011-08-24 03:32:06624 EXPECT_EQ("MESSAGE_METHOD_RETURN", response->GetMessageTypeAsString());
[email protected]9cce2d32011-08-10 22:34:02625 // The serial should be copied to the reply serial.
626 EXPECT_EQ(kSerial, response->GetReplySerial());
627}
628
[email protected]f78a9092011-08-16 23:22:23629TEST(MessageTest, ErrorResponse_FromMethodCall) {
avi22437c692015-12-22 18:12:45630 const uint32_t kSerial = 123;
Abhishek Bhardwaj34928ece2018-05-23 07:22:19631 const char kErrorMessage[] = "error message";
[email protected]9cce2d32011-08-10 22:34:02632
[email protected]2a57ca642013-06-13 06:37:19633 MethodCall method_call("com.example.Interface", "SomeMethod");
[email protected]9cce2d32011-08-10 22:34:02634 method_call.SetSerial(kSerial);
635
dcheng2a193282016-04-08 22:55:04636 std::unique_ptr<ErrorResponse> error_response(ErrorResponse::FromMethodCall(
637 &method_call, DBUS_ERROR_FAILED, kErrorMessage));
[email protected]2a57ca642013-06-13 06:37:19638 EXPECT_EQ(Message::MESSAGE_ERROR, error_response->GetMessageType());
[email protected]06ead872011-08-24 03:32:06639 EXPECT_EQ("MESSAGE_ERROR", error_response->GetMessageTypeAsString());
[email protected]9cce2d32011-08-10 22:34:02640 // The serial should be copied to the reply serial.
641 EXPECT_EQ(kSerial, error_response->GetReplySerial());
642
643 // Error message should be added to the payload.
[email protected]2a57ca642013-06-13 06:37:19644 MessageReader reader(error_response.get());
[email protected]9cce2d32011-08-10 22:34:02645 std::string error_message;
646 ASSERT_TRUE(reader.PopString(&error_message));
647 EXPECT_EQ(kErrorMessage, error_message);
648}
649
[email protected]9cce2d32011-08-10 22:34:02650TEST(MessageTest, GetAndSetHeaders) {
dcheng2a193282016-04-08 22:55:04651 std::unique_ptr<Response> message(Response::CreateEmpty());
[email protected]9cce2d32011-08-10 22:34:02652
[email protected]06ead872011-08-24 03:32:06653 EXPECT_EQ("", message->GetDestination());
[email protected]2a57ca642013-06-13 06:37:19654 EXPECT_EQ(ObjectPath(std::string()), message->GetPath());
[email protected]06ead872011-08-24 03:32:06655 EXPECT_EQ("", message->GetInterface());
656 EXPECT_EQ("", message->GetMember());
657 EXPECT_EQ("", message->GetErrorName());
658 EXPECT_EQ("", message->GetSender());
659 EXPECT_EQ(0U, message->GetSerial());
660 EXPECT_EQ(0U, message->GetReplySerial());
[email protected]9cce2d32011-08-10 22:34:02661
[email protected]ca72ff22012-05-23 06:55:22662 EXPECT_TRUE(message->SetDestination("org.chromium.destination"));
[email protected]2a57ca642013-06-13 06:37:19663 EXPECT_TRUE(message->SetPath(ObjectPath("/org/chromium/path")));
[email protected]ca72ff22012-05-23 06:55:22664 EXPECT_TRUE(message->SetInterface("org.chromium.interface"));
665 EXPECT_TRUE(message->SetMember("member"));
666 EXPECT_TRUE(message->SetErrorName("org.chromium.error"));
667 EXPECT_TRUE(message->SetSender(":1.2"));
[email protected]06ead872011-08-24 03:32:06668 message->SetSerial(123);
669 message->SetReplySerial(456);
[email protected]9cce2d32011-08-10 22:34:02670
[email protected]06ead872011-08-24 03:32:06671 EXPECT_EQ("org.chromium.destination", message->GetDestination());
[email protected]2a57ca642013-06-13 06:37:19672 EXPECT_EQ(ObjectPath("/org/chromium/path"), message->GetPath());
[email protected]06ead872011-08-24 03:32:06673 EXPECT_EQ("org.chromium.interface", message->GetInterface());
674 EXPECT_EQ("member", message->GetMember());
675 EXPECT_EQ("org.chromium.error", message->GetErrorName());
676 EXPECT_EQ(":1.2", message->GetSender());
677 EXPECT_EQ(123U, message->GetSerial());
678 EXPECT_EQ(456U, message->GetReplySerial());
[email protected]9cce2d32011-08-10 22:34:02679}
[email protected]ca72ff22012-05-23 06:55:22680
681TEST(MessageTest, SetInvalidHeaders) {
dcheng2a193282016-04-08 22:55:04682 std::unique_ptr<Response> message(Response::CreateEmpty());
[email protected]ca72ff22012-05-23 06:55:22683 EXPECT_EQ("", message->GetDestination());
[email protected]2a57ca642013-06-13 06:37:19684 EXPECT_EQ(ObjectPath(std::string()), message->GetPath());
[email protected]ca72ff22012-05-23 06:55:22685 EXPECT_EQ("", message->GetInterface());
686 EXPECT_EQ("", message->GetMember());
687 EXPECT_EQ("", message->GetErrorName());
688 EXPECT_EQ("", message->GetSender());
689
690 // Empty element between periods.
691 EXPECT_FALSE(message->SetDestination("org..chromium"));
692 // Trailing '/' is only allowed for the root path.
[email protected]2a57ca642013-06-13 06:37:19693 EXPECT_FALSE(message->SetPath(ObjectPath("/org/chromium/")));
[email protected]ca72ff22012-05-23 06:55:22694 // Interface name cannot contain '/'.
695 EXPECT_FALSE(message->SetInterface("org/chromium/interface"));
696 // Member name cannot begin with a digit.
697 EXPECT_FALSE(message->SetMember("1member"));
698 // Error name cannot begin with a period.
699 EXPECT_FALSE(message->SetErrorName(".org.chromium.error"));
700 // Disallowed characters.
701 EXPECT_FALSE(message->SetSender("?!#*"));
702
703 EXPECT_EQ("", message->GetDestination());
[email protected]2a57ca642013-06-13 06:37:19704 EXPECT_EQ(ObjectPath(std::string()), message->GetPath());
[email protected]ca72ff22012-05-23 06:55:22705 EXPECT_EQ("", message->GetInterface());
706 EXPECT_EQ("", message->GetMember());
707 EXPECT_EQ("", message->GetErrorName());
708 EXPECT_EQ("", message->GetSender());
709}
[email protected]6df1b9592012-06-07 16:41:26710
711TEST(MessageTest, ToString_LongString) {
712 const std::string kLongString(1000, 'o');
713
dcheng2a193282016-04-08 22:55:04714 std::unique_ptr<Response> message(Response::CreateEmpty());
[email protected]2a57ca642013-06-13 06:37:19715 MessageWriter writer(message.get());
[email protected]6df1b9592012-06-07 16:41:26716 writer.AppendString(kLongString);
717
Abhishek Bhardwaj34928ece2018-05-23 07:22:19718 ASSERT_EQ(
719 "message_type: MESSAGE_METHOD_RETURN\n"
720 "signature: s\n\n"
721 "string \"oooooooooooooooooooooooooooooooooooooooooooooooo"
722 "oooooooooooooooooooooooooooooooooooooooooooooooooooo... "
723 "(1000 bytes in total)\"\n",
724 message->ToString());
[email protected]6df1b9592012-06-07 16:41:26725}
[email protected]2a57ca642013-06-13 06:37:19726
727} // namespace dbus