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/message.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
12*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
13*635a8641SAndroid Build Coastguard Worker #include "base/posix/eintr_wrapper.h"
14*635a8641SAndroid Build Coastguard Worker #include "dbus/object_path.h"
15*635a8641SAndroid Build Coastguard Worker #include "dbus/test_proto.pb.h"
16*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
17*635a8641SAndroid Build Coastguard Worker
18*635a8641SAndroid Build Coastguard Worker namespace dbus {
19*635a8641SAndroid Build Coastguard Worker
20*635a8641SAndroid Build Coastguard Worker // Test that a byte can be properly written and read. We only have this
21*635a8641SAndroid Build Coastguard Worker // test for byte, as repeating this for other basic types is too redundant.
TEST(MessageTest,AppendAndPopByte)22*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, AppendAndPopByte) {
23*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Response> message(Response::CreateEmpty());
24*635a8641SAndroid Build Coastguard Worker MessageWriter writer(message.get());
25*635a8641SAndroid Build Coastguard Worker writer.AppendByte(123); // The input is 123.
26*635a8641SAndroid Build Coastguard Worker
27*635a8641SAndroid Build Coastguard Worker MessageReader reader(message.get());
28*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.HasMoreData()); // Should have data to read.
29*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(Message::BYTE, reader.GetDataType());
30*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("y", reader.GetDataSignature());
31*635a8641SAndroid Build Coastguard Worker
32*635a8641SAndroid Build Coastguard Worker bool bool_value = false;
33*635a8641SAndroid Build Coastguard Worker // Should fail as the type is not bool here.
34*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(reader.PopBool(&bool_value));
35*635a8641SAndroid Build Coastguard Worker
36*635a8641SAndroid Build Coastguard Worker uint8_t byte_value = 0;
37*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopByte(&byte_value));
38*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(123, byte_value); // Should match with the input.
39*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(reader.HasMoreData()); // Should not have more data to read.
40*635a8641SAndroid Build Coastguard Worker
41*635a8641SAndroid Build Coastguard Worker // Try to get another byte. Should fail.
42*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(reader.PopByte(&byte_value));
43*635a8641SAndroid Build Coastguard Worker }
44*635a8641SAndroid Build Coastguard Worker
45*635a8641SAndroid Build Coastguard Worker // Check all basic types can be properly written and read.
TEST(MessageTest,AppendAndPopBasicDataTypes)46*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, AppendAndPopBasicDataTypes) {
47*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Response> message(Response::CreateEmpty());
48*635a8641SAndroid Build Coastguard Worker MessageWriter writer(message.get());
49*635a8641SAndroid Build Coastguard Worker
50*635a8641SAndroid Build Coastguard Worker // Append 0, 1, 2, 3, 4, 5, 6, 7, 8, "string", "/object/path".
51*635a8641SAndroid Build Coastguard Worker writer.AppendByte(0);
52*635a8641SAndroid Build Coastguard Worker writer.AppendBool(true);
53*635a8641SAndroid Build Coastguard Worker writer.AppendInt16(2);
54*635a8641SAndroid Build Coastguard Worker writer.AppendUint16(3);
55*635a8641SAndroid Build Coastguard Worker writer.AppendInt32(4);
56*635a8641SAndroid Build Coastguard Worker writer.AppendUint32(5);
57*635a8641SAndroid Build Coastguard Worker writer.AppendInt64(6);
58*635a8641SAndroid Build Coastguard Worker writer.AppendUint64(7);
59*635a8641SAndroid Build Coastguard Worker writer.AppendDouble(8.0);
60*635a8641SAndroid Build Coastguard Worker writer.AppendString("string");
61*635a8641SAndroid Build Coastguard Worker writer.AppendObjectPath(ObjectPath("/object/path"));
62*635a8641SAndroid Build Coastguard Worker
63*635a8641SAndroid Build Coastguard Worker uint8_t byte_value = 0;
64*635a8641SAndroid Build Coastguard Worker bool bool_value = false;
65*635a8641SAndroid Build Coastguard Worker int16_t int16_value = 0;
66*635a8641SAndroid Build Coastguard Worker uint16_t uint16_value = 0;
67*635a8641SAndroid Build Coastguard Worker int32_t int32_value = 0;
68*635a8641SAndroid Build Coastguard Worker uint32_t uint32_value = 0;
69*635a8641SAndroid Build Coastguard Worker int64_t int64_value = 0;
70*635a8641SAndroid Build Coastguard Worker uint64_t uint64_value = 0;
71*635a8641SAndroid Build Coastguard Worker double double_value = 0;
72*635a8641SAndroid Build Coastguard Worker std::string string_value;
73*635a8641SAndroid Build Coastguard Worker ObjectPath object_path_value;
74*635a8641SAndroid Build Coastguard Worker
75*635a8641SAndroid Build Coastguard Worker MessageReader reader(message.get());
76*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.HasMoreData());
77*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("y", reader.GetDataSignature());
78*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopByte(&byte_value));
79*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("b", reader.GetDataSignature());
80*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopBool(&bool_value));
81*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("n", reader.GetDataSignature());
82*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopInt16(&int16_value));
83*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("q", reader.GetDataSignature());
84*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopUint16(&uint16_value));
85*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("i", reader.GetDataSignature());
86*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopInt32(&int32_value));
87*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("u", reader.GetDataSignature());
88*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopUint32(&uint32_value));
89*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("x", reader.GetDataSignature());
90*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopInt64(&int64_value));
91*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("t", reader.GetDataSignature());
92*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopUint64(&uint64_value));
93*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("d", reader.GetDataSignature());
94*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopDouble(&double_value));
95*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("s", reader.GetDataSignature());
96*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopString(&string_value));
97*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("o", reader.GetDataSignature());
98*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopObjectPath(&object_path_value));
99*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("", reader.GetDataSignature());
100*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(reader.HasMoreData());
101*635a8641SAndroid Build Coastguard Worker
102*635a8641SAndroid Build Coastguard Worker // 0, 1, 2, 3, 4, 5, 6, 7, 8, "string", "/object/path" should be returned.
103*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, byte_value);
104*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(true, bool_value);
105*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, int16_value);
106*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3U, uint16_value);
107*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4, int32_value);
108*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(5U, uint32_value);
109*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(6, int64_value);
110*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(7U, uint64_value);
111*635a8641SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(8.0, double_value);
112*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("string", string_value);
113*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ObjectPath("/object/path"), object_path_value);
114*635a8641SAndroid Build Coastguard Worker }
115*635a8641SAndroid Build Coastguard Worker
116*635a8641SAndroid Build Coastguard Worker // Check all basic types can be properly written and read.
TEST(MessageTest,AppendAndPopFileDescriptor)117*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, AppendAndPopFileDescriptor) {
118*635a8641SAndroid Build Coastguard Worker if (!IsDBusTypeUnixFdSupported()) {
119*635a8641SAndroid Build Coastguard Worker LOG(WARNING) << "FD passing is not supported";
120*635a8641SAndroid Build Coastguard Worker return;
121*635a8641SAndroid Build Coastguard Worker }
122*635a8641SAndroid Build Coastguard Worker
123*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Response> message(Response::CreateEmpty());
124*635a8641SAndroid Build Coastguard Worker MessageWriter writer(message.get());
125*635a8641SAndroid Build Coastguard Worker
126*635a8641SAndroid Build Coastguard Worker // Append stdout.
127*635a8641SAndroid Build Coastguard Worker const int fd_in = 1;
128*635a8641SAndroid Build Coastguard Worker writer.AppendFileDescriptor(fd_in);
129*635a8641SAndroid Build Coastguard Worker
130*635a8641SAndroid Build Coastguard Worker base::ScopedFD fd_out;
131*635a8641SAndroid Build Coastguard Worker
132*635a8641SAndroid Build Coastguard Worker MessageReader reader(message.get());
133*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.HasMoreData());
134*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(Message::UNIX_FD, reader.GetDataType());
135*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("h", reader.GetDataSignature());
136*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopFileDescriptor(&fd_out));
137*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(reader.HasMoreData());
138*635a8641SAndroid Build Coastguard Worker
139*635a8641SAndroid Build Coastguard Worker // Stdout should be returned but we cannot check the descriptor
140*635a8641SAndroid Build Coastguard Worker // value because stdout will be dup'd. Instead check st_rdev
141*635a8641SAndroid Build Coastguard Worker // which should be identical.
142*635a8641SAndroid Build Coastguard Worker struct stat sb_stdout;
143*635a8641SAndroid Build Coastguard Worker int status_stdout = HANDLE_EINTR(fstat(fd_in, &sb_stdout));
144*635a8641SAndroid Build Coastguard Worker ASSERT_GE(status_stdout, 0);
145*635a8641SAndroid Build Coastguard Worker struct stat sb_fd;
146*635a8641SAndroid Build Coastguard Worker int status_fd = HANDLE_EINTR(fstat(fd_out.get(), &sb_fd));
147*635a8641SAndroid Build Coastguard Worker ASSERT_GE(status_fd, 0);
148*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(sb_stdout.st_rdev, sb_fd.st_rdev);
149*635a8641SAndroid Build Coastguard Worker }
150*635a8641SAndroid Build Coastguard Worker
151*635a8641SAndroid Build Coastguard Worker // Check all variant types can be properly written and read.
TEST(MessageTest,AppendAndPopVariantDataTypes)152*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, AppendAndPopVariantDataTypes) {
153*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Response> message(Response::CreateEmpty());
154*635a8641SAndroid Build Coastguard Worker MessageWriter writer(message.get());
155*635a8641SAndroid Build Coastguard Worker
156*635a8641SAndroid Build Coastguard Worker // Append 0, 1, 2, 3, 4, 5, 6, 7, 8, "string", "/object/path".
157*635a8641SAndroid Build Coastguard Worker writer.AppendVariantOfByte(0);
158*635a8641SAndroid Build Coastguard Worker writer.AppendVariantOfBool(true);
159*635a8641SAndroid Build Coastguard Worker writer.AppendVariantOfInt16(2);
160*635a8641SAndroid Build Coastguard Worker writer.AppendVariantOfUint16(3);
161*635a8641SAndroid Build Coastguard Worker writer.AppendVariantOfInt32(4);
162*635a8641SAndroid Build Coastguard Worker writer.AppendVariantOfUint32(5);
163*635a8641SAndroid Build Coastguard Worker writer.AppendVariantOfInt64(6);
164*635a8641SAndroid Build Coastguard Worker writer.AppendVariantOfUint64(7);
165*635a8641SAndroid Build Coastguard Worker writer.AppendVariantOfDouble(8.0);
166*635a8641SAndroid Build Coastguard Worker writer.AppendVariantOfString("string");
167*635a8641SAndroid Build Coastguard Worker writer.AppendVariantOfObjectPath(ObjectPath("/object/path"));
168*635a8641SAndroid Build Coastguard Worker
169*635a8641SAndroid Build Coastguard Worker uint8_t byte_value = 0;
170*635a8641SAndroid Build Coastguard Worker bool bool_value = false;
171*635a8641SAndroid Build Coastguard Worker int16_t int16_value = 0;
172*635a8641SAndroid Build Coastguard Worker uint16_t uint16_value = 0;
173*635a8641SAndroid Build Coastguard Worker int32_t int32_value = 0;
174*635a8641SAndroid Build Coastguard Worker uint32_t uint32_value = 0;
175*635a8641SAndroid Build Coastguard Worker int64_t int64_value = 0;
176*635a8641SAndroid Build Coastguard Worker uint64_t uint64_value = 0;
177*635a8641SAndroid Build Coastguard Worker double double_value = 0;
178*635a8641SAndroid Build Coastguard Worker std::string string_value;
179*635a8641SAndroid Build Coastguard Worker ObjectPath object_path_value;
180*635a8641SAndroid Build Coastguard Worker
181*635a8641SAndroid Build Coastguard Worker MessageReader reader(message.get());
182*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.HasMoreData());
183*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("v", reader.GetDataSignature());
184*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopVariantOfByte(&byte_value));
185*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("v", reader.GetDataSignature());
186*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopVariantOfBool(&bool_value));
187*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("v", reader.GetDataSignature());
188*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopVariantOfInt16(&int16_value));
189*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("v", reader.GetDataSignature());
190*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopVariantOfUint16(&uint16_value));
191*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("v", reader.GetDataSignature());
192*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopVariantOfInt32(&int32_value));
193*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("v", reader.GetDataSignature());
194*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopVariantOfUint32(&uint32_value));
195*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("v", reader.GetDataSignature());
196*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopVariantOfInt64(&int64_value));
197*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("v", reader.GetDataSignature());
198*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopVariantOfUint64(&uint64_value));
199*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("v", reader.GetDataSignature());
200*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopVariantOfDouble(&double_value));
201*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("v", reader.GetDataSignature());
202*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopVariantOfString(&string_value));
203*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("v", reader.GetDataSignature());
204*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopVariantOfObjectPath(&object_path_value));
205*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("", reader.GetDataSignature());
206*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(reader.HasMoreData());
207*635a8641SAndroid Build Coastguard Worker
208*635a8641SAndroid Build Coastguard Worker // 0, 1, 2, 3, 4, 5, 6, 7, 8, "string", "/object/path" should be returned.
209*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, byte_value);
210*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(true, bool_value);
211*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, int16_value);
212*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3U, uint16_value);
213*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4, int32_value);
214*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(5U, uint32_value);
215*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(6, int64_value);
216*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(7U, uint64_value);
217*635a8641SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(8.0, double_value);
218*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("string", string_value);
219*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ObjectPath("/object/path"), object_path_value);
220*635a8641SAndroid Build Coastguard Worker }
221*635a8641SAndroid Build Coastguard Worker
TEST(MessageTest,ArrayOfBytes)222*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, ArrayOfBytes) {
223*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Response> message(Response::CreateEmpty());
224*635a8641SAndroid Build Coastguard Worker MessageWriter writer(message.get());
225*635a8641SAndroid Build Coastguard Worker std::vector<uint8_t> bytes;
226*635a8641SAndroid Build Coastguard Worker bytes.push_back(1);
227*635a8641SAndroid Build Coastguard Worker bytes.push_back(2);
228*635a8641SAndroid Build Coastguard Worker bytes.push_back(3);
229*635a8641SAndroid Build Coastguard Worker writer.AppendArrayOfBytes(bytes.data(), bytes.size());
230*635a8641SAndroid Build Coastguard Worker
231*635a8641SAndroid Build Coastguard Worker MessageReader reader(message.get());
232*635a8641SAndroid Build Coastguard Worker const uint8_t* output_bytes = nullptr;
233*635a8641SAndroid Build Coastguard Worker size_t length = 0;
234*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("ay", reader.GetDataSignature());
235*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopArrayOfBytes(&output_bytes, &length));
236*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(reader.HasMoreData());
237*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(3U, length);
238*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, output_bytes[0]);
239*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, output_bytes[1]);
240*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3, output_bytes[2]);
241*635a8641SAndroid Build Coastguard Worker }
242*635a8641SAndroid Build Coastguard Worker
TEST(MessageTest,ArrayOfInt32s)243*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, ArrayOfInt32s) {
244*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Response> message(Response::CreateEmpty());
245*635a8641SAndroid Build Coastguard Worker MessageWriter writer(message.get());
246*635a8641SAndroid Build Coastguard Worker std::vector<int32_t> int32s;
247*635a8641SAndroid Build Coastguard Worker int32s.push_back(1);
248*635a8641SAndroid Build Coastguard Worker int32s.push_back(2);
249*635a8641SAndroid Build Coastguard Worker int32s.push_back(3);
250*635a8641SAndroid Build Coastguard Worker writer.AppendArrayOfInt32s(int32s.data(), int32s.size());
251*635a8641SAndroid Build Coastguard Worker
252*635a8641SAndroid Build Coastguard Worker MessageReader reader(message.get());
253*635a8641SAndroid Build Coastguard Worker const int32_t* output_int32s = nullptr;
254*635a8641SAndroid Build Coastguard Worker size_t length = 0;
255*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("ai", reader.GetDataSignature());
256*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopArrayOfInt32s(&output_int32s, &length));
257*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(reader.HasMoreData());
258*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(3U, length);
259*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, output_int32s[0]);
260*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, output_int32s[1]);
261*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3, output_int32s[2]);
262*635a8641SAndroid Build Coastguard Worker }
263*635a8641SAndroid Build Coastguard Worker
TEST(MessageTest,ArrayOfUint32s)264*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, ArrayOfUint32s) {
265*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Response> message(Response::CreateEmpty());
266*635a8641SAndroid Build Coastguard Worker MessageWriter writer(message.get());
267*635a8641SAndroid Build Coastguard Worker std::vector<uint32_t> uint32s;
268*635a8641SAndroid Build Coastguard Worker uint32s.push_back(1);
269*635a8641SAndroid Build Coastguard Worker uint32s.push_back(2);
270*635a8641SAndroid Build Coastguard Worker uint32s.push_back(3);
271*635a8641SAndroid Build Coastguard Worker writer.AppendArrayOfUint32s(uint32s.data(), uint32s.size());
272*635a8641SAndroid Build Coastguard Worker
273*635a8641SAndroid Build Coastguard Worker MessageReader reader(message.get());
274*635a8641SAndroid Build Coastguard Worker const uint32_t* output_uint32s = nullptr;
275*635a8641SAndroid Build Coastguard Worker size_t length = 0;
276*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("au", reader.GetDataSignature());
277*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopArrayOfUint32s(&output_uint32s, &length));
278*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(reader.HasMoreData());
279*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(3U, length);
280*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1U, output_uint32s[0]);
281*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2U, output_uint32s[1]);
282*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3U, output_uint32s[2]);
283*635a8641SAndroid Build Coastguard Worker }
284*635a8641SAndroid Build Coastguard Worker
TEST(MessageTest,ArrayOfDoubles)285*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, ArrayOfDoubles) {
286*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Response> message(Response::CreateEmpty());
287*635a8641SAndroid Build Coastguard Worker MessageWriter writer(message.get());
288*635a8641SAndroid Build Coastguard Worker std::vector<double> doubles;
289*635a8641SAndroid Build Coastguard Worker doubles.push_back(0.2);
290*635a8641SAndroid Build Coastguard Worker doubles.push_back(0.5);
291*635a8641SAndroid Build Coastguard Worker doubles.push_back(1);
292*635a8641SAndroid Build Coastguard Worker writer.AppendArrayOfDoubles(doubles.data(), doubles.size());
293*635a8641SAndroid Build Coastguard Worker
294*635a8641SAndroid Build Coastguard Worker MessageReader reader(message.get());
295*635a8641SAndroid Build Coastguard Worker const double* output_doubles = nullptr;
296*635a8641SAndroid Build Coastguard Worker size_t length = 0;
297*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("ad", reader.GetDataSignature());
298*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopArrayOfDoubles(&output_doubles, &length));
299*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(reader.HasMoreData());
300*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(3U, length);
301*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0.2, output_doubles[0]);
302*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0.5, output_doubles[1]);
303*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, output_doubles[2]);
304*635a8641SAndroid Build Coastguard Worker }
305*635a8641SAndroid Build Coastguard Worker
TEST(MessageTest,ArrayOfBytes_Empty)306*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, ArrayOfBytes_Empty) {
307*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Response> message(Response::CreateEmpty());
308*635a8641SAndroid Build Coastguard Worker MessageWriter writer(message.get());
309*635a8641SAndroid Build Coastguard Worker std::vector<uint8_t> bytes;
310*635a8641SAndroid Build Coastguard Worker writer.AppendArrayOfBytes(bytes.data(), bytes.size());
311*635a8641SAndroid Build Coastguard Worker
312*635a8641SAndroid Build Coastguard Worker MessageReader reader(message.get());
313*635a8641SAndroid Build Coastguard Worker const uint8_t* output_bytes = nullptr;
314*635a8641SAndroid Build Coastguard Worker size_t length = 0;
315*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("ay", reader.GetDataSignature());
316*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopArrayOfBytes(&output_bytes, &length));
317*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(reader.HasMoreData());
318*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(0U, length);
319*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, output_bytes);
320*635a8641SAndroid Build Coastguard Worker }
321*635a8641SAndroid Build Coastguard Worker
TEST(MessageTest,ArrayOfStrings)322*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, ArrayOfStrings) {
323*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Response> message(Response::CreateEmpty());
324*635a8641SAndroid Build Coastguard Worker MessageWriter writer(message.get());
325*635a8641SAndroid Build Coastguard Worker std::vector<std::string> strings;
326*635a8641SAndroid Build Coastguard Worker strings.push_back("fee");
327*635a8641SAndroid Build Coastguard Worker strings.push_back("fie");
328*635a8641SAndroid Build Coastguard Worker strings.push_back("foe");
329*635a8641SAndroid Build Coastguard Worker strings.push_back("fum");
330*635a8641SAndroid Build Coastguard Worker writer.AppendArrayOfStrings(strings);
331*635a8641SAndroid Build Coastguard Worker
332*635a8641SAndroid Build Coastguard Worker MessageReader reader(message.get());
333*635a8641SAndroid Build Coastguard Worker std::vector<std::string> output_strings;
334*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("as", reader.GetDataSignature());
335*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopArrayOfStrings(&output_strings));
336*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(reader.HasMoreData());
337*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(4U, output_strings.size());
338*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("fee", output_strings[0]);
339*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("fie", output_strings[1]);
340*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("foe", output_strings[2]);
341*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("fum", output_strings[3]);
342*635a8641SAndroid Build Coastguard Worker }
343*635a8641SAndroid Build Coastguard Worker
TEST(MessageTest,ArrayOfObjectPaths)344*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, ArrayOfObjectPaths) {
345*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Response> message(Response::CreateEmpty());
346*635a8641SAndroid Build Coastguard Worker MessageWriter writer(message.get());
347*635a8641SAndroid Build Coastguard Worker std::vector<ObjectPath> object_paths;
348*635a8641SAndroid Build Coastguard Worker object_paths.push_back(ObjectPath("/object/path/1"));
349*635a8641SAndroid Build Coastguard Worker object_paths.push_back(ObjectPath("/object/path/2"));
350*635a8641SAndroid Build Coastguard Worker object_paths.push_back(ObjectPath("/object/path/3"));
351*635a8641SAndroid Build Coastguard Worker writer.AppendArrayOfObjectPaths(object_paths);
352*635a8641SAndroid Build Coastguard Worker
353*635a8641SAndroid Build Coastguard Worker MessageReader reader(message.get());
354*635a8641SAndroid Build Coastguard Worker std::vector<ObjectPath> output_object_paths;
355*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("ao", reader.GetDataSignature());
356*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopArrayOfObjectPaths(&output_object_paths));
357*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(reader.HasMoreData());
358*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(3U, output_object_paths.size());
359*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ObjectPath("/object/path/1"), output_object_paths[0]);
360*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ObjectPath("/object/path/2"), output_object_paths[1]);
361*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ObjectPath("/object/path/3"), output_object_paths[2]);
362*635a8641SAndroid Build Coastguard Worker }
363*635a8641SAndroid Build Coastguard Worker
TEST(MessageTest,ProtoBuf)364*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, ProtoBuf) {
365*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Response> message(Response::CreateEmpty());
366*635a8641SAndroid Build Coastguard Worker MessageWriter writer(message.get());
367*635a8641SAndroid Build Coastguard Worker TestProto send_message;
368*635a8641SAndroid Build Coastguard Worker send_message.set_text("testing");
369*635a8641SAndroid Build Coastguard Worker send_message.set_number(123);
370*635a8641SAndroid Build Coastguard Worker writer.AppendProtoAsArrayOfBytes(send_message);
371*635a8641SAndroid Build Coastguard Worker
372*635a8641SAndroid Build Coastguard Worker MessageReader reader(message.get());
373*635a8641SAndroid Build Coastguard Worker TestProto receive_message;
374*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("ay", reader.GetDataSignature());
375*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopArrayOfBytesAsProto(&receive_message));
376*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(receive_message.text(), send_message.text());
377*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(receive_message.number(), send_message.number());
378*635a8641SAndroid Build Coastguard Worker }
379*635a8641SAndroid Build Coastguard Worker
380*635a8641SAndroid Build Coastguard Worker // Test that an array can be properly written and read. We only have this
381*635a8641SAndroid Build Coastguard Worker // test for array, as repeating this for other container types is too
382*635a8641SAndroid Build Coastguard Worker // redundant.
TEST(MessageTest,OpenArrayAndPopArray)383*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, OpenArrayAndPopArray) {
384*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Response> message(Response::CreateEmpty());
385*635a8641SAndroid Build Coastguard Worker MessageWriter writer(message.get());
386*635a8641SAndroid Build Coastguard Worker MessageWriter array_writer(nullptr);
387*635a8641SAndroid Build Coastguard Worker writer.OpenArray("s", &array_writer); // Open an array of strings.
388*635a8641SAndroid Build Coastguard Worker array_writer.AppendString("foo");
389*635a8641SAndroid Build Coastguard Worker array_writer.AppendString("bar");
390*635a8641SAndroid Build Coastguard Worker array_writer.AppendString("baz");
391*635a8641SAndroid Build Coastguard Worker writer.CloseContainer(&array_writer);
392*635a8641SAndroid Build Coastguard Worker
393*635a8641SAndroid Build Coastguard Worker MessageReader reader(message.get());
394*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(Message::ARRAY, reader.GetDataType());
395*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("as", reader.GetDataSignature());
396*635a8641SAndroid Build Coastguard Worker MessageReader array_reader(nullptr);
397*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopArray(&array_reader));
398*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(reader.HasMoreData()); // Should not have more data to read.
399*635a8641SAndroid Build Coastguard Worker
400*635a8641SAndroid Build Coastguard Worker std::string string_value;
401*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(array_reader.PopString(&string_value));
402*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("foo", string_value);
403*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(array_reader.PopString(&string_value));
404*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("bar", string_value);
405*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(array_reader.PopString(&string_value));
406*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("baz", string_value);
407*635a8641SAndroid Build Coastguard Worker // Should not have more data to read.
408*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(array_reader.HasMoreData());
409*635a8641SAndroid Build Coastguard Worker }
410*635a8641SAndroid Build Coastguard Worker
411*635a8641SAndroid Build Coastguard Worker // Create a complex message using array, struct, variant, dict entry, and
412*635a8641SAndroid Build Coastguard Worker // make sure it can be read properly.
TEST(MessageTest,CreateComplexMessageAndReadIt)413*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, CreateComplexMessageAndReadIt) {
414*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Response> message(Response::CreateEmpty());
415*635a8641SAndroid Build Coastguard Worker MessageWriter writer(message.get());
416*635a8641SAndroid Build Coastguard Worker {
417*635a8641SAndroid Build Coastguard Worker MessageWriter array_writer(nullptr);
418*635a8641SAndroid Build Coastguard Worker // Open an array of variants.
419*635a8641SAndroid Build Coastguard Worker writer.OpenArray("v", &array_writer);
420*635a8641SAndroid Build Coastguard Worker {
421*635a8641SAndroid Build Coastguard Worker // The first value in the array.
422*635a8641SAndroid Build Coastguard Worker {
423*635a8641SAndroid Build Coastguard Worker MessageWriter variant_writer(nullptr);
424*635a8641SAndroid Build Coastguard Worker // Open a variant of a boolean.
425*635a8641SAndroid Build Coastguard Worker array_writer.OpenVariant("b", &variant_writer);
426*635a8641SAndroid Build Coastguard Worker variant_writer.AppendBool(true);
427*635a8641SAndroid Build Coastguard Worker array_writer.CloseContainer(&variant_writer);
428*635a8641SAndroid Build Coastguard Worker }
429*635a8641SAndroid Build Coastguard Worker
430*635a8641SAndroid Build Coastguard Worker // The second value in the array.
431*635a8641SAndroid Build Coastguard Worker {
432*635a8641SAndroid Build Coastguard Worker MessageWriter variant_writer(nullptr);
433*635a8641SAndroid Build Coastguard Worker // Open a variant of a struct that contains a string and an int32_t.
434*635a8641SAndroid Build Coastguard Worker array_writer.OpenVariant("(si)", &variant_writer);
435*635a8641SAndroid Build Coastguard Worker {
436*635a8641SAndroid Build Coastguard Worker MessageWriter struct_writer(nullptr);
437*635a8641SAndroid Build Coastguard Worker variant_writer.OpenStruct(&struct_writer);
438*635a8641SAndroid Build Coastguard Worker struct_writer.AppendString("string");
439*635a8641SAndroid Build Coastguard Worker struct_writer.AppendInt32(123);
440*635a8641SAndroid Build Coastguard Worker variant_writer.CloseContainer(&struct_writer);
441*635a8641SAndroid Build Coastguard Worker }
442*635a8641SAndroid Build Coastguard Worker array_writer.CloseContainer(&variant_writer);
443*635a8641SAndroid Build Coastguard Worker }
444*635a8641SAndroid Build Coastguard Worker
445*635a8641SAndroid Build Coastguard Worker // The third value in the array.
446*635a8641SAndroid Build Coastguard Worker {
447*635a8641SAndroid Build Coastguard Worker MessageWriter variant_writer(nullptr);
448*635a8641SAndroid Build Coastguard Worker // Open a variant of an array of string-to-int64_t dict entries.
449*635a8641SAndroid Build Coastguard Worker array_writer.OpenVariant("a{sx}", &variant_writer);
450*635a8641SAndroid Build Coastguard Worker {
451*635a8641SAndroid Build Coastguard Worker // Opens an array of string-to-int64_t dict entries.
452*635a8641SAndroid Build Coastguard Worker MessageWriter dict_array_writer(nullptr);
453*635a8641SAndroid Build Coastguard Worker variant_writer.OpenArray("{sx}", &dict_array_writer);
454*635a8641SAndroid Build Coastguard Worker {
455*635a8641SAndroid Build Coastguard Worker // Opens a string-to-int64_t dict entries.
456*635a8641SAndroid Build Coastguard Worker MessageWriter dict_entry_writer(nullptr);
457*635a8641SAndroid Build Coastguard Worker dict_array_writer.OpenDictEntry(&dict_entry_writer);
458*635a8641SAndroid Build Coastguard Worker dict_entry_writer.AppendString("foo");
459*635a8641SAndroid Build Coastguard Worker dict_entry_writer.AppendInt64(INT64_C(1234567890123456789));
460*635a8641SAndroid Build Coastguard Worker dict_array_writer.CloseContainer(&dict_entry_writer);
461*635a8641SAndroid Build Coastguard Worker }
462*635a8641SAndroid Build Coastguard Worker variant_writer.CloseContainer(&dict_array_writer);
463*635a8641SAndroid Build Coastguard Worker }
464*635a8641SAndroid Build Coastguard Worker array_writer.CloseContainer(&variant_writer);
465*635a8641SAndroid Build Coastguard Worker }
466*635a8641SAndroid Build Coastguard Worker }
467*635a8641SAndroid Build Coastguard Worker writer.CloseContainer(&array_writer);
468*635a8641SAndroid Build Coastguard Worker }
469*635a8641SAndroid Build Coastguard Worker // What we have created looks like this:
470*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(
471*635a8641SAndroid Build Coastguard Worker "message_type: MESSAGE_METHOD_RETURN\n"
472*635a8641SAndroid Build Coastguard Worker "signature: av\n"
473*635a8641SAndroid Build Coastguard Worker "\n"
474*635a8641SAndroid Build Coastguard Worker "array [\n"
475*635a8641SAndroid Build Coastguard Worker " variant bool true\n"
476*635a8641SAndroid Build Coastguard Worker " variant struct {\n"
477*635a8641SAndroid Build Coastguard Worker " string \"string\"\n"
478*635a8641SAndroid Build Coastguard Worker " int32_t 123\n"
479*635a8641SAndroid Build Coastguard Worker " }\n"
480*635a8641SAndroid Build Coastguard Worker " variant array [\n"
481*635a8641SAndroid Build Coastguard Worker " dict entry {\n"
482*635a8641SAndroid Build Coastguard Worker " string \"foo\"\n"
483*635a8641SAndroid Build Coastguard Worker " int64_t 1234567890123456789\n"
484*635a8641SAndroid Build Coastguard Worker " }\n"
485*635a8641SAndroid Build Coastguard Worker " ]\n"
486*635a8641SAndroid Build Coastguard Worker "]\n",
487*635a8641SAndroid Build Coastguard Worker message->ToString());
488*635a8641SAndroid Build Coastguard Worker
489*635a8641SAndroid Build Coastguard Worker MessageReader reader(message.get());
490*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("av", reader.GetDataSignature());
491*635a8641SAndroid Build Coastguard Worker MessageReader array_reader(nullptr);
492*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopArray(&array_reader));
493*635a8641SAndroid Build Coastguard Worker
494*635a8641SAndroid Build Coastguard Worker // The first value in the array.
495*635a8641SAndroid Build Coastguard Worker bool bool_value = false;
496*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("v", array_reader.GetDataSignature());
497*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(array_reader.PopVariantOfBool(&bool_value));
498*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(true, bool_value);
499*635a8641SAndroid Build Coastguard Worker
500*635a8641SAndroid Build Coastguard Worker // The second value in the array.
501*635a8641SAndroid Build Coastguard Worker {
502*635a8641SAndroid Build Coastguard Worker MessageReader variant_reader(nullptr);
503*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(array_reader.PopVariant(&variant_reader));
504*635a8641SAndroid Build Coastguard Worker {
505*635a8641SAndroid Build Coastguard Worker MessageReader struct_reader(nullptr);
506*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("(si)", variant_reader.GetDataSignature());
507*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(variant_reader.PopStruct(&struct_reader));
508*635a8641SAndroid Build Coastguard Worker std::string string_value;
509*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(struct_reader.PopString(&string_value));
510*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("string", string_value);
511*635a8641SAndroid Build Coastguard Worker int32_t int32_value = 0;
512*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(struct_reader.PopInt32(&int32_value));
513*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(123, int32_value);
514*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(struct_reader.HasMoreData());
515*635a8641SAndroid Build Coastguard Worker }
516*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(variant_reader.HasMoreData());
517*635a8641SAndroid Build Coastguard Worker }
518*635a8641SAndroid Build Coastguard Worker
519*635a8641SAndroid Build Coastguard Worker // The third value in the array.
520*635a8641SAndroid Build Coastguard Worker {
521*635a8641SAndroid Build Coastguard Worker MessageReader variant_reader(nullptr);
522*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(array_reader.PopVariant(&variant_reader));
523*635a8641SAndroid Build Coastguard Worker {
524*635a8641SAndroid Build Coastguard Worker MessageReader dict_array_reader(nullptr);
525*635a8641SAndroid Build Coastguard Worker ASSERT_EQ("a{sx}", variant_reader.GetDataSignature());
526*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(variant_reader.PopArray(&dict_array_reader));
527*635a8641SAndroid Build Coastguard Worker {
528*635a8641SAndroid Build Coastguard Worker MessageReader dict_entry_reader(nullptr);
529*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(dict_array_reader.PopDictEntry(&dict_entry_reader));
530*635a8641SAndroid Build Coastguard Worker std::string string_value;
531*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(dict_entry_reader.PopString(&string_value));
532*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("foo", string_value);
533*635a8641SAndroid Build Coastguard Worker int64_t int64_value = 0;
534*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(dict_entry_reader.PopInt64(&int64_value));
535*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(INT64_C(1234567890123456789), int64_value);
536*635a8641SAndroid Build Coastguard Worker }
537*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(dict_array_reader.HasMoreData());
538*635a8641SAndroid Build Coastguard Worker }
539*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(variant_reader.HasMoreData());
540*635a8641SAndroid Build Coastguard Worker }
541*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(array_reader.HasMoreData());
542*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(reader.HasMoreData());
543*635a8641SAndroid Build Coastguard Worker }
544*635a8641SAndroid Build Coastguard Worker
TEST(MessageTest,MethodCall)545*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, MethodCall) {
546*635a8641SAndroid Build Coastguard Worker MethodCall method_call("com.example.Interface", "SomeMethod");
547*635a8641SAndroid Build Coastguard Worker EXPECT_NE(nullptr, method_call.raw_message());
548*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Message::MESSAGE_METHOD_CALL, method_call.GetMessageType());
549*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("MESSAGE_METHOD_CALL", method_call.GetMessageTypeAsString());
550*635a8641SAndroid Build Coastguard Worker method_call.SetDestination("com.example.Service");
551*635a8641SAndroid Build Coastguard Worker method_call.SetPath(ObjectPath("/com/example/Object"));
552*635a8641SAndroid Build Coastguard Worker
553*635a8641SAndroid Build Coastguard Worker MessageWriter writer(&method_call);
554*635a8641SAndroid Build Coastguard Worker writer.AppendString("payload");
555*635a8641SAndroid Build Coastguard Worker
556*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(
557*635a8641SAndroid Build Coastguard Worker "message_type: MESSAGE_METHOD_CALL\n"
558*635a8641SAndroid Build Coastguard Worker "destination: com.example.Service\n"
559*635a8641SAndroid Build Coastguard Worker "path: /com/example/Object\n"
560*635a8641SAndroid Build Coastguard Worker "interface: com.example.Interface\n"
561*635a8641SAndroid Build Coastguard Worker "member: SomeMethod\n"
562*635a8641SAndroid Build Coastguard Worker "signature: s\n"
563*635a8641SAndroid Build Coastguard Worker "\n"
564*635a8641SAndroid Build Coastguard Worker "string \"payload\"\n",
565*635a8641SAndroid Build Coastguard Worker method_call.ToString());
566*635a8641SAndroid Build Coastguard Worker }
567*635a8641SAndroid Build Coastguard Worker
TEST(MessageTest,MethodCall_FromRawMessage)568*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, MethodCall_FromRawMessage) {
569*635a8641SAndroid Build Coastguard Worker DBusMessage* raw_message = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_CALL);
570*635a8641SAndroid Build Coastguard Worker dbus_message_set_interface(raw_message, "com.example.Interface");
571*635a8641SAndroid Build Coastguard Worker dbus_message_set_member(raw_message, "SomeMethod");
572*635a8641SAndroid Build Coastguard Worker
573*635a8641SAndroid Build Coastguard Worker std::unique_ptr<MethodCall> method_call(
574*635a8641SAndroid Build Coastguard Worker MethodCall::FromRawMessage(raw_message));
575*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("com.example.Interface", method_call->GetInterface());
576*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("SomeMethod", method_call->GetMember());
577*635a8641SAndroid Build Coastguard Worker }
578*635a8641SAndroid Build Coastguard Worker
TEST(MessageTest,Signal)579*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, Signal) {
580*635a8641SAndroid Build Coastguard Worker Signal signal("com.example.Interface", "SomeSignal");
581*635a8641SAndroid Build Coastguard Worker EXPECT_NE(nullptr, signal.raw_message());
582*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Message::MESSAGE_SIGNAL, signal.GetMessageType());
583*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("MESSAGE_SIGNAL", signal.GetMessageTypeAsString());
584*635a8641SAndroid Build Coastguard Worker signal.SetPath(ObjectPath("/com/example/Object"));
585*635a8641SAndroid Build Coastguard Worker
586*635a8641SAndroid Build Coastguard Worker MessageWriter writer(&signal);
587*635a8641SAndroid Build Coastguard Worker writer.AppendString("payload");
588*635a8641SAndroid Build Coastguard Worker
589*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(
590*635a8641SAndroid Build Coastguard Worker "message_type: MESSAGE_SIGNAL\n"
591*635a8641SAndroid Build Coastguard Worker "path: /com/example/Object\n"
592*635a8641SAndroid Build Coastguard Worker "interface: com.example.Interface\n"
593*635a8641SAndroid Build Coastguard Worker "member: SomeSignal\n"
594*635a8641SAndroid Build Coastguard Worker "signature: s\n"
595*635a8641SAndroid Build Coastguard Worker "\n"
596*635a8641SAndroid Build Coastguard Worker "string \"payload\"\n",
597*635a8641SAndroid Build Coastguard Worker signal.ToString());
598*635a8641SAndroid Build Coastguard Worker }
599*635a8641SAndroid Build Coastguard Worker
TEST(MessageTest,Signal_FromRawMessage)600*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, Signal_FromRawMessage) {
601*635a8641SAndroid Build Coastguard Worker DBusMessage* raw_message = dbus_message_new(DBUS_MESSAGE_TYPE_SIGNAL);
602*635a8641SAndroid Build Coastguard Worker dbus_message_set_interface(raw_message, "com.example.Interface");
603*635a8641SAndroid Build Coastguard Worker dbus_message_set_member(raw_message, "SomeSignal");
604*635a8641SAndroid Build Coastguard Worker
605*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Signal> signal(Signal::FromRawMessage(raw_message));
606*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("com.example.Interface", signal->GetInterface());
607*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("SomeSignal", signal->GetMember());
608*635a8641SAndroid Build Coastguard Worker }
609*635a8641SAndroid Build Coastguard Worker
TEST(MessageTest,Response)610*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, Response) {
611*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Response> response(Response::CreateEmpty());
612*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(response->raw_message());
613*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Message::MESSAGE_METHOD_RETURN, response->GetMessageType());
614*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("MESSAGE_METHOD_RETURN", response->GetMessageTypeAsString());
615*635a8641SAndroid Build Coastguard Worker }
616*635a8641SAndroid Build Coastguard Worker
TEST(MessageTest,Response_FromMethodCall)617*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, Response_FromMethodCall) {
618*635a8641SAndroid Build Coastguard Worker const uint32_t kSerial = 123;
619*635a8641SAndroid Build Coastguard Worker MethodCall method_call("com.example.Interface", "SomeMethod");
620*635a8641SAndroid Build Coastguard Worker method_call.SetSerial(kSerial);
621*635a8641SAndroid Build Coastguard Worker
622*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Response> response(Response::FromMethodCall(&method_call));
623*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Message::MESSAGE_METHOD_RETURN, response->GetMessageType());
624*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("MESSAGE_METHOD_RETURN", response->GetMessageTypeAsString());
625*635a8641SAndroid Build Coastguard Worker // The serial should be copied to the reply serial.
626*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kSerial, response->GetReplySerial());
627*635a8641SAndroid Build Coastguard Worker }
628*635a8641SAndroid Build Coastguard Worker
TEST(MessageTest,ErrorResponse_FromMethodCall)629*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, ErrorResponse_FromMethodCall) {
630*635a8641SAndroid Build Coastguard Worker const uint32_t kSerial = 123;
631*635a8641SAndroid Build Coastguard Worker const char kErrorMessage[] = "error message";
632*635a8641SAndroid Build Coastguard Worker
633*635a8641SAndroid Build Coastguard Worker MethodCall method_call("com.example.Interface", "SomeMethod");
634*635a8641SAndroid Build Coastguard Worker method_call.SetSerial(kSerial);
635*635a8641SAndroid Build Coastguard Worker
636*635a8641SAndroid Build Coastguard Worker std::unique_ptr<ErrorResponse> error_response(ErrorResponse::FromMethodCall(
637*635a8641SAndroid Build Coastguard Worker &method_call, DBUS_ERROR_FAILED, kErrorMessage));
638*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Message::MESSAGE_ERROR, error_response->GetMessageType());
639*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("MESSAGE_ERROR", error_response->GetMessageTypeAsString());
640*635a8641SAndroid Build Coastguard Worker // The serial should be copied to the reply serial.
641*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kSerial, error_response->GetReplySerial());
642*635a8641SAndroid Build Coastguard Worker
643*635a8641SAndroid Build Coastguard Worker // Error message should be added to the payload.
644*635a8641SAndroid Build Coastguard Worker MessageReader reader(error_response.get());
645*635a8641SAndroid Build Coastguard Worker std::string error_message;
646*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(reader.PopString(&error_message));
647*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kErrorMessage, error_message);
648*635a8641SAndroid Build Coastguard Worker }
649*635a8641SAndroid Build Coastguard Worker
TEST(MessageTest,GetAndSetHeaders)650*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, GetAndSetHeaders) {
651*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Response> message(Response::CreateEmpty());
652*635a8641SAndroid Build Coastguard Worker
653*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("", message->GetDestination());
654*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ObjectPath(std::string()), message->GetPath());
655*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("", message->GetInterface());
656*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("", message->GetMember());
657*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("", message->GetErrorName());
658*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("", message->GetSender());
659*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0U, message->GetSerial());
660*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0U, message->GetReplySerial());
661*635a8641SAndroid Build Coastguard Worker
662*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(message->SetDestination("org.chromium.destination"));
663*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(message->SetPath(ObjectPath("/org/chromium/path")));
664*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(message->SetInterface("org.chromium.interface"));
665*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(message->SetMember("member"));
666*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(message->SetErrorName("org.chromium.error"));
667*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(message->SetSender(":1.2"));
668*635a8641SAndroid Build Coastguard Worker message->SetSerial(123);
669*635a8641SAndroid Build Coastguard Worker message->SetReplySerial(456);
670*635a8641SAndroid Build Coastguard Worker
671*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("org.chromium.destination", message->GetDestination());
672*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ObjectPath("/org/chromium/path"), message->GetPath());
673*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("org.chromium.interface", message->GetInterface());
674*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("member", message->GetMember());
675*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("org.chromium.error", message->GetErrorName());
676*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(":1.2", message->GetSender());
677*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(123U, message->GetSerial());
678*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(456U, message->GetReplySerial());
679*635a8641SAndroid Build Coastguard Worker }
680*635a8641SAndroid Build Coastguard Worker
TEST(MessageTest,SetInvalidHeaders)681*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, SetInvalidHeaders) {
682*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Response> message(Response::CreateEmpty());
683*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("", message->GetDestination());
684*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ObjectPath(std::string()), message->GetPath());
685*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("", message->GetInterface());
686*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("", message->GetMember());
687*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("", message->GetErrorName());
688*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("", message->GetSender());
689*635a8641SAndroid Build Coastguard Worker
690*635a8641SAndroid Build Coastguard Worker // Empty element between periods.
691*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(message->SetDestination("org..chromium"));
692*635a8641SAndroid Build Coastguard Worker // Trailing '/' is only allowed for the root path.
693*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(message->SetPath(ObjectPath("/org/chromium/")));
694*635a8641SAndroid Build Coastguard Worker // Interface name cannot contain '/'.
695*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(message->SetInterface("org/chromium/interface"));
696*635a8641SAndroid Build Coastguard Worker // Member name cannot begin with a digit.
697*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(message->SetMember("1member"));
698*635a8641SAndroid Build Coastguard Worker // Error name cannot begin with a period.
699*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(message->SetErrorName(".org.chromium.error"));
700*635a8641SAndroid Build Coastguard Worker // Disallowed characters.
701*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(message->SetSender("?!#*"));
702*635a8641SAndroid Build Coastguard Worker
703*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("", message->GetDestination());
704*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ObjectPath(std::string()), message->GetPath());
705*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("", message->GetInterface());
706*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("", message->GetMember());
707*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("", message->GetErrorName());
708*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("", message->GetSender());
709*635a8641SAndroid Build Coastguard Worker }
710*635a8641SAndroid Build Coastguard Worker
TEST(MessageTest,ToString_LongString)711*635a8641SAndroid Build Coastguard Worker TEST(MessageTest, ToString_LongString) {
712*635a8641SAndroid Build Coastguard Worker const std::string kLongString(1000, 'o');
713*635a8641SAndroid Build Coastguard Worker
714*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Response> message(Response::CreateEmpty());
715*635a8641SAndroid Build Coastguard Worker MessageWriter writer(message.get());
716*635a8641SAndroid Build Coastguard Worker writer.AppendString(kLongString);
717*635a8641SAndroid Build Coastguard Worker
718*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(
719*635a8641SAndroid Build Coastguard Worker "message_type: MESSAGE_METHOD_RETURN\n"
720*635a8641SAndroid Build Coastguard Worker "signature: s\n\n"
721*635a8641SAndroid Build Coastguard Worker "string \"oooooooooooooooooooooooooooooooooooooooooooooooo"
722*635a8641SAndroid Build Coastguard Worker "oooooooooooooooooooooooooooooooooooooooooooooooooooo... "
723*635a8641SAndroid Build Coastguard Worker "(1000 bytes in total)\"\n",
724*635a8641SAndroid Build Coastguard Worker message->ToString());
725*635a8641SAndroid Build Coastguard Worker }
726*635a8641SAndroid Build Coastguard Worker
727*635a8641SAndroid Build Coastguard Worker } // namespace dbus
728