blob: 1e6d6684a45d9453aacedd6a58bddda4e8b9588b [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
7#include "base/basictypes.h"
8#include "base/logging.h"
[email protected]9cce2d32011-08-10 22:34:029#include "base/memory/scoped_ptr.h"
[email protected]c033c5082012-02-09 18:14:0810#include "dbus/test_proto.pb.h"
[email protected]a9e91492011-07-30 19:13:3111#include "testing/gtest/include/gtest/gtest.h"
12
13// Test that a byte can be properly written and read. We only have this
14// test for byte, as repeating this for other basic types is too redundant.
15TEST(MessageTest, AppendAndPopByte) {
[email protected]06ead872011-08-24 03:32:0616 scoped_ptr<dbus::Response> message(dbus::Response::CreateEmpty());
17 dbus::MessageWriter writer(message.get());
[email protected]a9e91492011-07-30 19:13:3118 writer.AppendByte(123); // The input is 123.
19
[email protected]06ead872011-08-24 03:32:0620 dbus::MessageReader reader(message.get());
[email protected]a9e91492011-07-30 19:13:3121 ASSERT_TRUE(reader.HasMoreData()); // Should have data to read.
22 ASSERT_EQ(dbus::Message::BYTE, reader.GetDataType());
23
24 bool bool_value = false;
25 // Should fail as the type is not bool here.
26 ASSERT_FALSE(reader.PopBool(&bool_value));
27
28 uint8 byte_value = 0;
29 ASSERT_TRUE(reader.PopByte(&byte_value));
30 EXPECT_EQ(123, byte_value); // Should match with the input.
31 ASSERT_FALSE(reader.HasMoreData()); // Should not have more data to read.
32
33 // Try to get another byte. Should fail.
34 ASSERT_FALSE(reader.PopByte(&byte_value));
35}
36
37// Check all basic types can be properly written and read.
38TEST(MessageTest, AppendAndPopBasicDataTypes) {
[email protected]06ead872011-08-24 03:32:0639 scoped_ptr<dbus::Response> message(dbus::Response::CreateEmpty());
40 dbus::MessageWriter writer(message.get());
[email protected]a9e91492011-07-30 19:13:3141
42 // Append 0, 1, 2, 3, 4, 5, 6, 7, 8, "string", "/object/path".
43 writer.AppendByte(0);
44 writer.AppendBool(true);
45 writer.AppendInt16(2);
46 writer.AppendUint16(3);
47 writer.AppendInt32(4);
48 writer.AppendUint32(5);
49 writer.AppendInt64(6);
50 writer.AppendUint64(7);
51 writer.AppendDouble(8.0);
52 writer.AppendString("string");
53 writer.AppendObjectPath("/object/path");
54
55 uint8 byte_value = 0;
56 bool bool_value = false;
57 int16 int16_value = 0;
58 uint16 uint16_value = 0;
59 int32 int32_value = 0;
60 uint32 uint32_value = 0;
61 int64 int64_value = 0;
62 uint64 uint64_value = 0;
63 double double_value = 0;
64 std::string string_value;
65 std::string object_path_value;
66
[email protected]06ead872011-08-24 03:32:0667 dbus::MessageReader reader(message.get());
[email protected]a9e91492011-07-30 19:13:3168 ASSERT_TRUE(reader.HasMoreData());
69 ASSERT_TRUE(reader.PopByte(&byte_value));
70 ASSERT_TRUE(reader.PopBool(&bool_value));
71 ASSERT_TRUE(reader.PopInt16(&int16_value));
72 ASSERT_TRUE(reader.PopUint16(&uint16_value));
73 ASSERT_TRUE(reader.PopInt32(&int32_value));
74 ASSERT_TRUE(reader.PopUint32(&uint32_value));
75 ASSERT_TRUE(reader.PopInt64(&int64_value));
76 ASSERT_TRUE(reader.PopUint64(&uint64_value));
77 ASSERT_TRUE(reader.PopDouble(&double_value));
78 ASSERT_TRUE(reader.PopString(&string_value));
79 ASSERT_TRUE(reader.PopObjectPath(&object_path_value));
80 ASSERT_FALSE(reader.HasMoreData());
81
82 // 0, 1, 2, 3, 4, 5, 6, 7, 8, "string", "/object/path" should be returned.
83 EXPECT_EQ(0, byte_value);
84 EXPECT_EQ(true, bool_value);
85 EXPECT_EQ(2, int16_value);
86 EXPECT_EQ(3U, uint16_value);
87 EXPECT_EQ(4, int32_value);
88 EXPECT_EQ(5U, uint32_value);
89 EXPECT_EQ(6, int64_value);
90 EXPECT_EQ(7U, uint64_value);
91 EXPECT_DOUBLE_EQ(8.0, double_value);
92 EXPECT_EQ("string", string_value);
93 EXPECT_EQ("/object/path", object_path_value);
94}
95
96// Check all variant types can be properly written and read.
97TEST(MessageTest, AppendAndPopVariantDataTypes) {
[email protected]06ead872011-08-24 03:32:0698 scoped_ptr<dbus::Response> message(dbus::Response::CreateEmpty());
99 dbus::MessageWriter writer(message.get());
[email protected]a9e91492011-07-30 19:13:31100
101 // Append 0, 1, 2, 3, 4, 5, 6, 7, 8, "string", "/object/path".
102 writer.AppendVariantOfByte(0);
103 writer.AppendVariantOfBool(true);
104 writer.AppendVariantOfInt16(2);
105 writer.AppendVariantOfUint16(3);
106 writer.AppendVariantOfInt32(4);
107 writer.AppendVariantOfUint32(5);
108 writer.AppendVariantOfInt64(6);
109 writer.AppendVariantOfUint64(7);
110 writer.AppendVariantOfDouble(8.0);
111 writer.AppendVariantOfString("string");
112 writer.AppendVariantOfObjectPath("/object/path");
113
114 uint8 byte_value = 0;
115 bool bool_value = false;
116 int16 int16_value = 0;
117 uint16 uint16_value = 0;
118 int32 int32_value = 0;
119 uint32 uint32_value = 0;
120 int64 int64_value = 0;
121 uint64 uint64_value = 0;
122 double double_value = 0;
123 std::string string_value;
124 std::string object_path_value;
125
[email protected]06ead872011-08-24 03:32:06126 dbus::MessageReader reader(message.get());
[email protected]a9e91492011-07-30 19:13:31127 ASSERT_TRUE(reader.HasMoreData());
128 ASSERT_TRUE(reader.PopVariantOfByte(&byte_value));
129 ASSERT_TRUE(reader.PopVariantOfBool(&bool_value));
130 ASSERT_TRUE(reader.PopVariantOfInt16(&int16_value));
131 ASSERT_TRUE(reader.PopVariantOfUint16(&uint16_value));
132 ASSERT_TRUE(reader.PopVariantOfInt32(&int32_value));
133 ASSERT_TRUE(reader.PopVariantOfUint32(&uint32_value));
134 ASSERT_TRUE(reader.PopVariantOfInt64(&int64_value));
135 ASSERT_TRUE(reader.PopVariantOfUint64(&uint64_value));
136 ASSERT_TRUE(reader.PopVariantOfDouble(&double_value));
137 ASSERT_TRUE(reader.PopVariantOfString(&string_value));
138 ASSERT_TRUE(reader.PopVariantOfObjectPath(&object_path_value));
139 ASSERT_FALSE(reader.HasMoreData());
140
141 // 0, 1, 2, 3, 4, 5, 6, 7, 8, "string", "/object/path" should be returned.
142 EXPECT_EQ(0, byte_value);
143 EXPECT_EQ(true, bool_value);
144 EXPECT_EQ(2, int16_value);
145 EXPECT_EQ(3U, uint16_value);
146 EXPECT_EQ(4, int32_value);
147 EXPECT_EQ(5U, uint32_value);
148 EXPECT_EQ(6, int64_value);
149 EXPECT_EQ(7U, uint64_value);
150 EXPECT_DOUBLE_EQ(8.0, double_value);
151 EXPECT_EQ("string", string_value);
152 EXPECT_EQ("/object/path", object_path_value);
153}
154
155TEST(MessageTest, ArrayOfBytes) {
[email protected]06ead872011-08-24 03:32:06156 scoped_ptr<dbus::Response> message(dbus::Response::CreateEmpty());
157 dbus::MessageWriter writer(message.get());
[email protected]a9e91492011-07-30 19:13:31158 std::vector<uint8> bytes;
159 bytes.push_back(1);
160 bytes.push_back(2);
161 bytes.push_back(3);
162 writer.AppendArrayOfBytes(bytes.data(), bytes.size());
163
[email protected]06ead872011-08-24 03:32:06164 dbus::MessageReader reader(message.get());
[email protected]a9e91492011-07-30 19:13:31165 uint8* output_bytes = NULL;
166 size_t length = 0;
167 ASSERT_TRUE(reader.PopArrayOfBytes(&output_bytes, &length));
168 ASSERT_FALSE(reader.HasMoreData());
169 ASSERT_EQ(3U, length);
[email protected]8bc83fd2011-09-19 18:22:14170 EXPECT_EQ(1, output_bytes[0]);
171 EXPECT_EQ(2, output_bytes[1]);
172 EXPECT_EQ(3, output_bytes[2]);
173}
174
[email protected]3ed06262011-11-11 02:13:56175TEST(MessageTest, ArrayOfBytes_Empty) {
176 scoped_ptr<dbus::Response> message(dbus::Response::CreateEmpty());
177 dbus::MessageWriter writer(message.get());
178 std::vector<uint8> bytes;
179 writer.AppendArrayOfBytes(bytes.data(), bytes.size());
180
181 dbus::MessageReader reader(message.get());
182 uint8* output_bytes = NULL;
183 size_t length = 0;
184 ASSERT_TRUE(reader.PopArrayOfBytes(&output_bytes, &length));
185 ASSERT_FALSE(reader.HasMoreData());
186 ASSERT_EQ(0U, length);
187 EXPECT_EQ(NULL, output_bytes);
188}
189
[email protected]8bc83fd2011-09-19 18:22:14190TEST(MessageTest, ArrayOfStrings) {
191 scoped_ptr<dbus::Response> message(dbus::Response::CreateEmpty());
192 dbus::MessageWriter writer(message.get());
193 std::vector<std::string> strings;
194 strings.push_back("fee");
195 strings.push_back("fie");
196 strings.push_back("foe");
197 strings.push_back("fum");
198 writer.AppendArrayOfStrings(strings);
199
200 dbus::MessageReader reader(message.get());
201 std::vector<std::string> output_strings;
202 ASSERT_TRUE(reader.PopArrayOfStrings(&output_strings));
203 ASSERT_FALSE(reader.HasMoreData());
204 ASSERT_EQ(4U, output_strings.size());
205 EXPECT_EQ("fee", output_strings[0]);
206 EXPECT_EQ("fie", output_strings[1]);
207 EXPECT_EQ("foe", output_strings[2]);
208 EXPECT_EQ("fum", output_strings[3]);
[email protected]a9e91492011-07-30 19:13:31209}
210
[email protected]090d8e512011-08-22 18:28:42211TEST(MessageTest, ArrayOfObjectPaths) {
[email protected]06ead872011-08-24 03:32:06212 scoped_ptr<dbus::Response> message(dbus::Response::CreateEmpty());
213 dbus::MessageWriter writer(message.get());
[email protected]090d8e512011-08-22 18:28:42214 std::vector<std::string> object_paths;
215 object_paths.push_back("/object/path/1");
216 object_paths.push_back("/object/path/2");
217 object_paths.push_back("/object/path/3");
218 writer.AppendArrayOfObjectPaths(object_paths);
219
[email protected]06ead872011-08-24 03:32:06220 dbus::MessageReader reader(message.get());
[email protected]090d8e512011-08-22 18:28:42221 std::vector<std::string> output_object_paths;
222 ASSERT_TRUE(reader.PopArrayOfObjectPaths(&output_object_paths));
223 ASSERT_FALSE(reader.HasMoreData());
224 ASSERT_EQ(3U, output_object_paths.size());
[email protected]8bc83fd2011-09-19 18:22:14225 EXPECT_EQ("/object/path/1", output_object_paths[0]);
226 EXPECT_EQ("/object/path/2", output_object_paths[1]);
227 EXPECT_EQ("/object/path/3", output_object_paths[2]);
[email protected]090d8e512011-08-22 18:28:42228}
229
[email protected]c033c5082012-02-09 18:14:08230TEST(MessageTest, ProtoBuf) {
231 scoped_ptr<dbus::Response> message(dbus::Response::CreateEmpty());
232 dbus::MessageWriter writer(message.get());
233 TestProto send_message;
234 send_message.set_text("testing");
235 send_message.set_number(123);
236 writer.AppendProtoAsArrayOfBytes(send_message);
237
238 dbus::MessageReader reader(message.get());
239 TestProto receive_message;
240 ASSERT_TRUE(reader.PopArrayOfBytesAsProto(&receive_message));
241 EXPECT_EQ(receive_message.text(), send_message.text());
242 EXPECT_EQ(receive_message.number(), send_message.number());
243}
244
245
[email protected]a9e91492011-07-30 19:13:31246// Test that an array can be properly written and read. We only have this
247// test for array, as repeating this for other container types is too
248// redundant.
249TEST(MessageTest, OpenArrayAndPopArray) {
[email protected]06ead872011-08-24 03:32:06250 scoped_ptr<dbus::Response> message(dbus::Response::CreateEmpty());
251 dbus::MessageWriter writer(message.get());
[email protected]9400ff82012-02-07 23:48:35252 dbus::MessageWriter array_writer(NULL);
[email protected]a9e91492011-07-30 19:13:31253 writer.OpenArray("s", &array_writer); // Open an array of strings.
254 array_writer.AppendString("foo");
255 array_writer.AppendString("bar");
256 array_writer.AppendString("baz");
257 writer.CloseContainer(&array_writer);
258
[email protected]06ead872011-08-24 03:32:06259 dbus::MessageReader reader(message.get());
[email protected]a9e91492011-07-30 19:13:31260 ASSERT_EQ(dbus::Message::ARRAY, reader.GetDataType());
[email protected]9400ff82012-02-07 23:48:35261 dbus::MessageReader array_reader(NULL);
[email protected]a9e91492011-07-30 19:13:31262 ASSERT_TRUE(reader.PopArray(&array_reader));
263 ASSERT_FALSE(reader.HasMoreData()); // Should not have more data to read.
264
265 std::string string_value;
266 ASSERT_TRUE(array_reader.PopString(&string_value));
267 EXPECT_EQ("foo", string_value);
268 ASSERT_TRUE(array_reader.PopString(&string_value));
269 EXPECT_EQ("bar", string_value);
270 ASSERT_TRUE(array_reader.PopString(&string_value));
271 EXPECT_EQ("baz", string_value);
272 // Should not have more data to read.
273 ASSERT_FALSE(array_reader.HasMoreData());
274}
275
276// Create a complex message using array, struct, variant, dict entry, and
277// make sure it can be read properly.
278TEST(MessageTest, CreateComplexMessageAndReadIt) {
[email protected]06ead872011-08-24 03:32:06279 scoped_ptr<dbus::Response> message(dbus::Response::CreateEmpty());
280 dbus::MessageWriter writer(message.get());
[email protected]a9e91492011-07-30 19:13:31281 {
[email protected]9400ff82012-02-07 23:48:35282 dbus::MessageWriter array_writer(NULL);
[email protected]a9e91492011-07-30 19:13:31283 // Open an array of variants.
284 writer.OpenArray("v", &array_writer);
285 {
286 // The first value in the array.
287 {
[email protected]9400ff82012-02-07 23:48:35288 dbus::MessageWriter variant_writer(NULL);
[email protected]a9e91492011-07-30 19:13:31289 // Open a variant of a boolean.
290 array_writer.OpenVariant("b", &variant_writer);
291 variant_writer.AppendBool(true);
292 array_writer.CloseContainer(&variant_writer);
293 }
294
295 // The second value in the array.
296 {
[email protected]9400ff82012-02-07 23:48:35297 dbus::MessageWriter variant_writer(NULL);
[email protected]a9e91492011-07-30 19:13:31298 // Open a variant of a struct that contains a string and an int32.
299 array_writer.OpenVariant("(si)", &variant_writer);
300 {
[email protected]9400ff82012-02-07 23:48:35301 dbus::MessageWriter struct_writer(NULL);
[email protected]a9e91492011-07-30 19:13:31302 variant_writer.OpenStruct(&struct_writer);
303 struct_writer.AppendString("string");
304 struct_writer.AppendInt32(123);
305 variant_writer.CloseContainer(&struct_writer);
306 }
307 array_writer.CloseContainer(&variant_writer);
308 }
309
310 // The third value in the array.
311 {
[email protected]9400ff82012-02-07 23:48:35312 dbus::MessageWriter variant_writer(NULL);
[email protected]a9e91492011-07-30 19:13:31313 // Open a variant of an array of string-to-int64 dict entries.
314 array_writer.OpenVariant("a{sx}", &variant_writer);
315 {
316 // Opens an array of string-to-int64 dict entries.
[email protected]9400ff82012-02-07 23:48:35317 dbus::MessageWriter dict_array_writer(NULL);
[email protected]a9e91492011-07-30 19:13:31318 variant_writer.OpenArray("{sx}", &dict_array_writer);
319 {
320 // Opens a string-to-int64 dict entries.
[email protected]9400ff82012-02-07 23:48:35321 dbus::MessageWriter dict_entry_writer(NULL);
[email protected]a9e91492011-07-30 19:13:31322 dict_array_writer.OpenDictEntry(&dict_entry_writer);
323 dict_entry_writer.AppendString("foo");
[email protected]3820b962011-07-30 20:36:27324 dict_entry_writer.AppendInt64(GG_INT64_C(1234567890123456789));
[email protected]a9e91492011-07-30 19:13:31325 dict_array_writer.CloseContainer(&dict_entry_writer);
326 }
327 variant_writer.CloseContainer(&dict_array_writer);
328 }
329 array_writer.CloseContainer(&variant_writer);
330 }
331 }
332 writer.CloseContainer(&array_writer);
333 }
334 // What we have created looks like this:
[email protected]06ead872011-08-24 03:32:06335 EXPECT_EQ("message_type: MESSAGE_METHOD_RETURN\n"
336 "signature: av\n"
[email protected]a9e91492011-07-30 19:13:31337 "\n"
338 "array [\n"
339 " variant bool true\n"
340 " variant struct {\n"
341 " string \"string\"\n"
342 " int32 123\n"
343 " }\n"
344 " variant array [\n"
345 " dict entry {\n"
346 " string \"foo\"\n"
347 " int64 1234567890123456789\n"
348 " }\n"
349 " ]\n"
350 "]\n",
[email protected]06ead872011-08-24 03:32:06351 message->ToString());
[email protected]a9e91492011-07-30 19:13:31352
[email protected]06ead872011-08-24 03:32:06353 dbus::MessageReader reader(message.get());
[email protected]9400ff82012-02-07 23:48:35354 dbus::MessageReader array_reader(NULL);
[email protected]a9e91492011-07-30 19:13:31355 ASSERT_TRUE(reader.PopArray(&array_reader));
356
357 // The first value in the array.
358 bool bool_value = false;
359 ASSERT_TRUE(array_reader.PopVariantOfBool(&bool_value));
360 EXPECT_EQ(true, bool_value);
361
362 // The second value in the array.
363 {
[email protected]9400ff82012-02-07 23:48:35364 dbus::MessageReader variant_reader(NULL);
[email protected]a9e91492011-07-30 19:13:31365 ASSERT_TRUE(array_reader.PopVariant(&variant_reader));
366 {
[email protected]9400ff82012-02-07 23:48:35367 dbus::MessageReader struct_reader(NULL);
[email protected]a9e91492011-07-30 19:13:31368 ASSERT_TRUE(variant_reader.PopStruct(&struct_reader));
369 std::string string_value;
370 ASSERT_TRUE(struct_reader.PopString(&string_value));
371 EXPECT_EQ("string", string_value);
372 int32 int32_value = 0;
373 ASSERT_TRUE(struct_reader.PopInt32(&int32_value));
374 EXPECT_EQ(123, int32_value);
375 ASSERT_FALSE(struct_reader.HasMoreData());
376 }
377 ASSERT_FALSE(variant_reader.HasMoreData());
378 }
379
380 // The third value in the array.
381 {
[email protected]9400ff82012-02-07 23:48:35382 dbus::MessageReader variant_reader(NULL);
[email protected]a9e91492011-07-30 19:13:31383 ASSERT_TRUE(array_reader.PopVariant(&variant_reader));
384 {
[email protected]9400ff82012-02-07 23:48:35385 dbus::MessageReader dict_array_reader(NULL);
[email protected]a9e91492011-07-30 19:13:31386 ASSERT_TRUE(variant_reader.PopArray(&dict_array_reader));
387 {
[email protected]9400ff82012-02-07 23:48:35388 dbus::MessageReader dict_entry_reader(NULL);
[email protected]a9e91492011-07-30 19:13:31389 ASSERT_TRUE(dict_array_reader.PopDictEntry(&dict_entry_reader));
390 std::string string_value;
391 ASSERT_TRUE(dict_entry_reader.PopString(&string_value));
392 EXPECT_EQ("foo", string_value);
393 int64 int64_value = 0;
394 ASSERT_TRUE(dict_entry_reader.PopInt64(&int64_value));
[email protected]3820b962011-07-30 20:36:27395 EXPECT_EQ(GG_INT64_C(1234567890123456789), int64_value);
[email protected]a9e91492011-07-30 19:13:31396 }
397 ASSERT_FALSE(dict_array_reader.HasMoreData());
398 }
399 ASSERT_FALSE(variant_reader.HasMoreData());
400 }
401 ASSERT_FALSE(array_reader.HasMoreData());
402 ASSERT_FALSE(reader.HasMoreData());
403}
404
[email protected]a9e91492011-07-30 19:13:31405TEST(MessageTest, MethodCall) {
406 dbus::MethodCall method_call("com.example.Interface", "SomeMethod");
407 EXPECT_TRUE(method_call.raw_message() != NULL);
408 EXPECT_EQ(dbus::Message::MESSAGE_METHOD_CALL, method_call.GetMessageType());
[email protected]06ead872011-08-24 03:32:06409 EXPECT_EQ("MESSAGE_METHOD_CALL", method_call.GetMessageTypeAsString());
[email protected]9cce2d32011-08-10 22:34:02410 method_call.SetDestination("com.example.Service");
411 method_call.SetPath("/com/example/Object");
[email protected]a9e91492011-07-30 19:13:31412
413 dbus::MessageWriter writer(&method_call);
414 writer.AppendString("payload");
415
[email protected]06ead872011-08-24 03:32:06416 EXPECT_EQ("message_type: MESSAGE_METHOD_CALL\n"
417 "destination: com.example.Service\n"
[email protected]a9e91492011-07-30 19:13:31418 "path: /com/example/Object\n"
419 "interface: com.example.Interface\n"
420 "member: SomeMethod\n"
421 "signature: s\n"
422 "\n"
423 "string \"payload\"\n",
424 method_call.ToString());
425}
426
[email protected]9cce2d32011-08-10 22:34:02427TEST(MessageTest, MethodCall_FromRawMessage) {
428 DBusMessage* raw_message = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_CALL);
429 dbus_message_set_interface(raw_message, "com.example.Interface");
430 dbus_message_set_member(raw_message, "SomeMethod");
431
432 scoped_ptr<dbus::MethodCall> method_call(
433 dbus::MethodCall::FromRawMessage(raw_message));
434 EXPECT_EQ("com.example.Interface", method_call->GetInterface());
435 EXPECT_EQ("SomeMethod", method_call->GetMember());
436}
437
[email protected]3beaaa4e2011-08-23 07:29:21438TEST(MessageTest, Signal) {
439 dbus::Signal signal("com.example.Interface", "SomeSignal");
440 EXPECT_TRUE(signal.raw_message() != NULL);
441 EXPECT_EQ(dbus::Message::MESSAGE_SIGNAL, signal.GetMessageType());
[email protected]06ead872011-08-24 03:32:06442 EXPECT_EQ("MESSAGE_SIGNAL", signal.GetMessageTypeAsString());
[email protected]3beaaa4e2011-08-23 07:29:21443 signal.SetPath("/com/example/Object");
444
445 dbus::MessageWriter writer(&signal);
446 writer.AppendString("payload");
447
[email protected]06ead872011-08-24 03:32:06448 EXPECT_EQ("message_type: MESSAGE_SIGNAL\n"
449 "path: /com/example/Object\n"
[email protected]3beaaa4e2011-08-23 07:29:21450 "interface: com.example.Interface\n"
451 "member: SomeSignal\n"
452 "signature: s\n"
453 "\n"
454 "string \"payload\"\n",
455 signal.ToString());
456}
457
458TEST(MessageTest, Signal_FromRawMessage) {
459 DBusMessage* raw_message = dbus_message_new(DBUS_MESSAGE_TYPE_SIGNAL);
460 dbus_message_set_interface(raw_message, "com.example.Interface");
461 dbus_message_set_member(raw_message, "SomeSignal");
462
463 scoped_ptr<dbus::Signal> signal(
464 dbus::Signal::FromRawMessage(raw_message));
465 EXPECT_EQ("com.example.Interface", signal->GetInterface());
466 EXPECT_EQ("SomeSignal", signal->GetMember());
467}
468
[email protected]a9e91492011-07-30 19:13:31469TEST(MessageTest, Response) {
[email protected]06ead872011-08-24 03:32:06470 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
471 EXPECT_TRUE(response->raw_message());
472 EXPECT_EQ(dbus::Message::MESSAGE_METHOD_RETURN, response->GetMessageType());
473 EXPECT_EQ("MESSAGE_METHOD_RETURN", response->GetMessageTypeAsString());
[email protected]a9e91492011-07-30 19:13:31474}
475
[email protected]f78a9092011-08-16 23:22:23476TEST(MessageTest, Response_FromMethodCall) {
[email protected]9cce2d32011-08-10 22:34:02477 const uint32 kSerial = 123;
478 dbus::MethodCall method_call("com.example.Interface", "SomeMethod");
479 method_call.SetSerial(kSerial);
480
481 scoped_ptr<dbus::Response> response(
482 dbus::Response::FromMethodCall(&method_call));
483 EXPECT_EQ(dbus::Message::MESSAGE_METHOD_RETURN, response->GetMessageType());
[email protected]06ead872011-08-24 03:32:06484 EXPECT_EQ("MESSAGE_METHOD_RETURN", response->GetMessageTypeAsString());
[email protected]9cce2d32011-08-10 22:34:02485 // The serial should be copied to the reply serial.
486 EXPECT_EQ(kSerial, response->GetReplySerial());
487}
488
[email protected]f78a9092011-08-16 23:22:23489TEST(MessageTest, ErrorResponse_FromMethodCall) {
[email protected]9cce2d32011-08-10 22:34:02490 const uint32 kSerial = 123;
491const char kErrorMessage[] = "error message";
492
493 dbus::MethodCall method_call("com.example.Interface", "SomeMethod");
494 method_call.SetSerial(kSerial);
495
496 scoped_ptr<dbus::ErrorResponse> error_response(
497 dbus::ErrorResponse::FromMethodCall(&method_call,
498 DBUS_ERROR_FAILED,
499 kErrorMessage));
500 EXPECT_EQ(dbus::Message::MESSAGE_ERROR, error_response->GetMessageType());
[email protected]06ead872011-08-24 03:32:06501 EXPECT_EQ("MESSAGE_ERROR", error_response->GetMessageTypeAsString());
[email protected]9cce2d32011-08-10 22:34:02502 // The serial should be copied to the reply serial.
503 EXPECT_EQ(kSerial, error_response->GetReplySerial());
504
505 // Error message should be added to the payload.
506 dbus::MessageReader reader(error_response.get());
507 std::string error_message;
508 ASSERT_TRUE(reader.PopString(&error_message));
509 EXPECT_EQ(kErrorMessage, error_message);
510}
511
[email protected]9cce2d32011-08-10 22:34:02512TEST(MessageTest, GetAndSetHeaders) {
[email protected]06ead872011-08-24 03:32:06513 scoped_ptr<dbus::Response> message(dbus::Response::CreateEmpty());
[email protected]9cce2d32011-08-10 22:34:02514
[email protected]06ead872011-08-24 03:32:06515 EXPECT_EQ("", message->GetDestination());
516 EXPECT_EQ("", message->GetPath());
517 EXPECT_EQ("", message->GetInterface());
518 EXPECT_EQ("", message->GetMember());
519 EXPECT_EQ("", message->GetErrorName());
520 EXPECT_EQ("", message->GetSender());
521 EXPECT_EQ(0U, message->GetSerial());
522 EXPECT_EQ(0U, message->GetReplySerial());
[email protected]9cce2d32011-08-10 22:34:02523
[email protected]06ead872011-08-24 03:32:06524 message->SetDestination("org.chromium.destination");
525 message->SetPath("/org/chromium/path");
526 message->SetInterface("org.chromium.interface");
527 message->SetMember("member");
528 message->SetErrorName("org.chromium.error");
529 message->SetSender(":1.2");
530 message->SetSerial(123);
531 message->SetReplySerial(456);
[email protected]9cce2d32011-08-10 22:34:02532
[email protected]06ead872011-08-24 03:32:06533 EXPECT_EQ("org.chromium.destination", message->GetDestination());
534 EXPECT_EQ("/org/chromium/path", message->GetPath());
535 EXPECT_EQ("org.chromium.interface", message->GetInterface());
536 EXPECT_EQ("member", message->GetMember());
537 EXPECT_EQ("org.chromium.error", message->GetErrorName());
538 EXPECT_EQ(":1.2", message->GetSender());
539 EXPECT_EQ(123U, message->GetSerial());
540 EXPECT_EQ(456U, message->GetReplySerial());
[email protected]9cce2d32011-08-10 22:34:02541}