xref: /aosp_15_r20/external/libbrillo/brillo/dbus/data_serialization_test.cc (revision 1a96fba65179ea7d3f56207137718607415c5953)
1*1a96fba6SXin Li // Copyright 2014 The Chromium OS Authors. All rights reserved.
2*1a96fba6SXin Li // Use of this source code is governed by a BSD-style license that can be
3*1a96fba6SXin Li // found in the LICENSE file.
4*1a96fba6SXin Li 
5*1a96fba6SXin Li #include <brillo/dbus/data_serialization.h>
6*1a96fba6SXin Li 
7*1a96fba6SXin Li #include <limits>
8*1a96fba6SXin Li #include <tuple>
9*1a96fba6SXin Li 
10*1a96fba6SXin Li #include <base/files/scoped_file.h>
11*1a96fba6SXin Li #include <brillo/variant_dictionary.h>
12*1a96fba6SXin Li #include <gtest/gtest.h>
13*1a96fba6SXin Li 
14*1a96fba6SXin Li #include "brillo/dbus/test.pb.h"
15*1a96fba6SXin Li 
16*1a96fba6SXin Li using dbus::Message;
17*1a96fba6SXin Li using dbus::MessageReader;
18*1a96fba6SXin Li using dbus::MessageWriter;
19*1a96fba6SXin Li using dbus::ObjectPath;
20*1a96fba6SXin Li using dbus::Response;
21*1a96fba6SXin Li 
22*1a96fba6SXin Li namespace brillo {
23*1a96fba6SXin Li namespace dbus_utils {
24*1a96fba6SXin Li 
TEST(DBusUtils,Supported_BasicTypes)25*1a96fba6SXin Li TEST(DBusUtils, Supported_BasicTypes) {
26*1a96fba6SXin Li   EXPECT_TRUE(IsTypeSupported<bool>::value);
27*1a96fba6SXin Li   EXPECT_TRUE(IsTypeSupported<uint8_t>::value);
28*1a96fba6SXin Li   EXPECT_TRUE(IsTypeSupported<int16_t>::value);
29*1a96fba6SXin Li   EXPECT_TRUE(IsTypeSupported<uint16_t>::value);
30*1a96fba6SXin Li   EXPECT_TRUE(IsTypeSupported<int32_t>::value);
31*1a96fba6SXin Li   EXPECT_TRUE(IsTypeSupported<uint32_t>::value);
32*1a96fba6SXin Li   EXPECT_TRUE(IsTypeSupported<int64_t>::value);
33*1a96fba6SXin Li   EXPECT_TRUE(IsTypeSupported<uint64_t>::value);
34*1a96fba6SXin Li   EXPECT_TRUE(IsTypeSupported<double>::value);
35*1a96fba6SXin Li   EXPECT_TRUE(IsTypeSupported<std::string>::value);
36*1a96fba6SXin Li   EXPECT_TRUE(IsTypeSupported<ObjectPath>::value);
37*1a96fba6SXin Li   EXPECT_TRUE(IsTypeSupported<FileDescriptor>::value);
38*1a96fba6SXin Li   EXPECT_TRUE(IsTypeSupported<base::ScopedFD>::value);
39*1a96fba6SXin Li   EXPECT_TRUE(IsTypeSupported<Any>::value);
40*1a96fba6SXin Li   EXPECT_TRUE(IsTypeSupported<google::protobuf::MessageLite>::value);
41*1a96fba6SXin Li   EXPECT_TRUE(IsTypeSupported<dbus_utils_test::TestMessage>::value);
42*1a96fba6SXin Li }
43*1a96fba6SXin Li 
TEST(DBusUtils,Unsupported_BasicTypes)44*1a96fba6SXin Li TEST(DBusUtils, Unsupported_BasicTypes) {
45*1a96fba6SXin Li   EXPECT_FALSE(IsTypeSupported<char>::value);
46*1a96fba6SXin Li   EXPECT_FALSE(IsTypeSupported<float>::value);
47*1a96fba6SXin Li }
48*1a96fba6SXin Li 
TEST(DBusUtils,Supported_ComplexTypes)49*1a96fba6SXin Li TEST(DBusUtils, Supported_ComplexTypes) {
50*1a96fba6SXin Li   EXPECT_TRUE(IsTypeSupported<std::vector<bool>>::value);
51*1a96fba6SXin Li   EXPECT_TRUE(IsTypeSupported<std::vector<uint8_t>>::value);
52*1a96fba6SXin Li   EXPECT_TRUE((IsTypeSupported<std::pair<int16_t, double>>::value));
53*1a96fba6SXin Li   EXPECT_TRUE(
54*1a96fba6SXin Li       (IsTypeSupported<std::map<uint16_t, std::vector<int64_t>>>::value));
55*1a96fba6SXin Li   EXPECT_TRUE((IsTypeSupported<std::tuple<bool, double, int32_t>>::value));
56*1a96fba6SXin Li   EXPECT_TRUE(
57*1a96fba6SXin Li       IsTypeSupported<std::vector<dbus_utils_test::TestMessage>>::value);
58*1a96fba6SXin Li }
59*1a96fba6SXin Li 
TEST(DBusUtils,Unsupported_ComplexTypes)60*1a96fba6SXin Li TEST(DBusUtils, Unsupported_ComplexTypes) {
61*1a96fba6SXin Li   EXPECT_FALSE(IsTypeSupported<std::vector<char>>::value);
62*1a96fba6SXin Li   EXPECT_FALSE((IsTypeSupported<std::pair<int16_t, float>>::value));
63*1a96fba6SXin Li   EXPECT_FALSE((IsTypeSupported<std::pair<char, int32_t>>::value));
64*1a96fba6SXin Li   EXPECT_FALSE((IsTypeSupported<std::map<int16_t, float>>::value));
65*1a96fba6SXin Li   EXPECT_FALSE((IsTypeSupported<std::map<char, int32_t>>::value));
66*1a96fba6SXin Li   EXPECT_FALSE((IsTypeSupported<std::tuple<bool, char, int32_t>>::value));
67*1a96fba6SXin Li }
68*1a96fba6SXin Li 
TEST(DBusUtils,Supported_TypeSet)69*1a96fba6SXin Li TEST(DBusUtils, Supported_TypeSet) {
70*1a96fba6SXin Li   EXPECT_TRUE((IsTypeSupported<int32_t, double, std::string>::value));
71*1a96fba6SXin Li   EXPECT_TRUE((IsTypeSupported<bool, std::vector<int32_t>, uint8_t>::value));
72*1a96fba6SXin Li }
73*1a96fba6SXin Li 
TEST(DBusUtils,Unupported_TypeSet)74*1a96fba6SXin Li TEST(DBusUtils, Unupported_TypeSet) {
75*1a96fba6SXin Li   EXPECT_FALSE((IsTypeSupported<int32_t, double, std::string, char>::value));
76*1a96fba6SXin Li   EXPECT_FALSE(
77*1a96fba6SXin Li       (IsTypeSupported<bool, std::pair<std::vector<float>, uint8_t>>::value));
78*1a96fba6SXin Li   EXPECT_FALSE((IsTypeSupported<char, double, std::string, int16_t>::value));
79*1a96fba6SXin Li   EXPECT_FALSE((IsTypeSupported<char, std::vector<float>, float>::value));
80*1a96fba6SXin Li }
81*1a96fba6SXin Li 
TEST(DBusUtils,Signatures_BasicTypes)82*1a96fba6SXin Li TEST(DBusUtils, Signatures_BasicTypes) {
83*1a96fba6SXin Li   EXPECT_EQ("b", GetDBusSignature<bool>());
84*1a96fba6SXin Li   EXPECT_EQ("y", GetDBusSignature<uint8_t>());
85*1a96fba6SXin Li   EXPECT_EQ("n", GetDBusSignature<int16_t>());
86*1a96fba6SXin Li   EXPECT_EQ("q", GetDBusSignature<uint16_t>());
87*1a96fba6SXin Li   EXPECT_EQ("i", GetDBusSignature<int32_t>());
88*1a96fba6SXin Li   EXPECT_EQ("u", GetDBusSignature<uint32_t>());
89*1a96fba6SXin Li   EXPECT_EQ("x", GetDBusSignature<int64_t>());
90*1a96fba6SXin Li   EXPECT_EQ("t", GetDBusSignature<uint64_t>());
91*1a96fba6SXin Li   EXPECT_EQ("d", GetDBusSignature<double>());
92*1a96fba6SXin Li   EXPECT_EQ("s", GetDBusSignature<std::string>());
93*1a96fba6SXin Li   EXPECT_EQ("o", GetDBusSignature<ObjectPath>());
94*1a96fba6SXin Li   EXPECT_EQ("h", GetDBusSignature<FileDescriptor>());
95*1a96fba6SXin Li   EXPECT_EQ("h", GetDBusSignature<base::ScopedFD>());
96*1a96fba6SXin Li   EXPECT_EQ("v", GetDBusSignature<Any>());
97*1a96fba6SXin Li }
98*1a96fba6SXin Li 
TEST(DBusUtils,Signatures_Arrays)99*1a96fba6SXin Li TEST(DBusUtils, Signatures_Arrays) {
100*1a96fba6SXin Li   EXPECT_EQ("ab", GetDBusSignature<std::vector<bool>>());
101*1a96fba6SXin Li   EXPECT_EQ("ay", GetDBusSignature<std::vector<uint8_t>>());
102*1a96fba6SXin Li   EXPECT_EQ("an", GetDBusSignature<std::vector<int16_t>>());
103*1a96fba6SXin Li   EXPECT_EQ("aq", GetDBusSignature<std::vector<uint16_t>>());
104*1a96fba6SXin Li   EXPECT_EQ("ai", GetDBusSignature<std::vector<int32_t>>());
105*1a96fba6SXin Li   EXPECT_EQ("au", GetDBusSignature<std::vector<uint32_t>>());
106*1a96fba6SXin Li   EXPECT_EQ("ax", GetDBusSignature<std::vector<int64_t>>());
107*1a96fba6SXin Li   EXPECT_EQ("at", GetDBusSignature<std::vector<uint64_t>>());
108*1a96fba6SXin Li   EXPECT_EQ("ad", GetDBusSignature<std::vector<double>>());
109*1a96fba6SXin Li   EXPECT_EQ("as", GetDBusSignature<std::vector<std::string>>());
110*1a96fba6SXin Li   EXPECT_EQ("ao", GetDBusSignature<std::vector<ObjectPath>>());
111*1a96fba6SXin Li   EXPECT_EQ("ah", GetDBusSignature<std::vector<FileDescriptor>>());
112*1a96fba6SXin Li   EXPECT_EQ("ah", GetDBusSignature<std::vector<base::ScopedFD>>());
113*1a96fba6SXin Li   EXPECT_EQ("av", GetDBusSignature<std::vector<Any>>());
114*1a96fba6SXin Li   EXPECT_EQ("a(is)",
115*1a96fba6SXin Li             (GetDBusSignature<std::vector<std::pair<int, std::string>>>()));
116*1a96fba6SXin Li   EXPECT_EQ("aad", GetDBusSignature<std::vector<std::vector<double>>>());
117*1a96fba6SXin Li }
118*1a96fba6SXin Li 
TEST(DBusUtils,Signatures_Maps)119*1a96fba6SXin Li TEST(DBusUtils, Signatures_Maps) {
120*1a96fba6SXin Li   EXPECT_EQ("a{sb}", (GetDBusSignature<std::map<std::string, bool>>()));
121*1a96fba6SXin Li   EXPECT_EQ("a{ss}", (GetDBusSignature<std::map<std::string, std::string>>()));
122*1a96fba6SXin Li   EXPECT_EQ("a{sv}", (GetDBusSignature<std::map<std::string, Any>>()));
123*1a96fba6SXin Li   EXPECT_EQ("a{id}", (GetDBusSignature<std::map<int, double>>()));
124*1a96fba6SXin Li   EXPECT_EQ(
125*1a96fba6SXin Li       "a{ia{ss}}",
126*1a96fba6SXin Li       (GetDBusSignature<std::map<int, std::map<std::string, std::string>>>()));
127*1a96fba6SXin Li }
128*1a96fba6SXin Li 
TEST(DBusUtils,Signatures_Pairs)129*1a96fba6SXin Li TEST(DBusUtils, Signatures_Pairs) {
130*1a96fba6SXin Li   EXPECT_EQ("(sb)", (GetDBusSignature<std::pair<std::string, bool>>()));
131*1a96fba6SXin Li   EXPECT_EQ("(sv)", (GetDBusSignature<std::pair<std::string, Any>>()));
132*1a96fba6SXin Li   EXPECT_EQ("(id)", (GetDBusSignature<std::pair<int, double>>()));
133*1a96fba6SXin Li }
134*1a96fba6SXin Li 
TEST(DBusUtils,Signatures_Tuples)135*1a96fba6SXin Li TEST(DBusUtils, Signatures_Tuples) {
136*1a96fba6SXin Li   EXPECT_EQ("(i)", (GetDBusSignature<std::tuple<int>>()));
137*1a96fba6SXin Li   EXPECT_EQ("(sv)", (GetDBusSignature<std::tuple<std::string, Any>>()));
138*1a96fba6SXin Li   EXPECT_EQ("(id(si))",
139*1a96fba6SXin Li             (GetDBusSignature<
140*1a96fba6SXin Li                 std::tuple<int, double, std::tuple<std::string, int>>>()));
141*1a96fba6SXin Li }
142*1a96fba6SXin Li 
TEST(DBusUtils,Signatures_Protobufs)143*1a96fba6SXin Li TEST(DBusUtils, Signatures_Protobufs) {
144*1a96fba6SXin Li   EXPECT_EQ("ay", (GetDBusSignature<google::protobuf::MessageLite>()));
145*1a96fba6SXin Li   EXPECT_EQ("ay", (GetDBusSignature<dbus_utils_test::TestMessage>()));
146*1a96fba6SXin Li }
147*1a96fba6SXin Li 
148*1a96fba6SXin Li // Test that a byte can be properly written and read. We only have this
149*1a96fba6SXin Li // test for byte, as repeating this for other basic types is too redundant.
TEST(DBusUtils,AppendAndPopByte)150*1a96fba6SXin Li TEST(DBusUtils, AppendAndPopByte) {
151*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
152*1a96fba6SXin Li   MessageWriter writer(message.get());
153*1a96fba6SXin Li   AppendValueToWriter(&writer, uint8_t{123});
154*1a96fba6SXin Li   EXPECT_EQ("y", message->GetSignature());
155*1a96fba6SXin Li 
156*1a96fba6SXin Li   MessageReader reader(message.get());
157*1a96fba6SXin Li   EXPECT_TRUE(reader.HasMoreData());  // Should have data to read.
158*1a96fba6SXin Li   EXPECT_EQ(Message::BYTE, reader.GetDataType());
159*1a96fba6SXin Li 
160*1a96fba6SXin Li   bool bool_value = false;
161*1a96fba6SXin Li   // Should fail as the type is not bool here.
162*1a96fba6SXin Li   EXPECT_FALSE(PopValueFromReader(&reader, &bool_value));
163*1a96fba6SXin Li 
164*1a96fba6SXin Li   uint8_t byte_value = 0;
165*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &byte_value));
166*1a96fba6SXin Li   EXPECT_EQ(123, byte_value);          // Should match with the input.
167*1a96fba6SXin Li   EXPECT_FALSE(reader.HasMoreData());  // Should not have more data to read.
168*1a96fba6SXin Li 
169*1a96fba6SXin Li   // Try to get another byte. Should fail.
170*1a96fba6SXin Li   EXPECT_FALSE(PopValueFromReader(&reader, &byte_value));
171*1a96fba6SXin Li }
172*1a96fba6SXin Li 
173*1a96fba6SXin Li // Check all basic types can be properly written and read.
TEST(DBusUtils,AppendAndPopBasicDataTypes)174*1a96fba6SXin Li TEST(DBusUtils, AppendAndPopBasicDataTypes) {
175*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
176*1a96fba6SXin Li   MessageWriter writer(message.get());
177*1a96fba6SXin Li 
178*1a96fba6SXin Li   // Append 0, true, 2, 3, 4, 5, 6, 7, 8.0, "string", "/object/path".
179*1a96fba6SXin Li   AppendValueToWriter(&writer, uint8_t{0});
180*1a96fba6SXin Li   AppendValueToWriter(&writer, bool{true});
181*1a96fba6SXin Li   AppendValueToWriter(&writer, int16_t{2});
182*1a96fba6SXin Li   AppendValueToWriter(&writer, uint16_t{3});
183*1a96fba6SXin Li   AppendValueToWriter(&writer, int32_t{4});
184*1a96fba6SXin Li   AppendValueToWriter(&writer, uint32_t{5});
185*1a96fba6SXin Li   AppendValueToWriter(&writer, int64_t{6});
186*1a96fba6SXin Li   AppendValueToWriter(&writer, uint64_t{7});
187*1a96fba6SXin Li   AppendValueToWriter(&writer, double{8.0});
188*1a96fba6SXin Li   AppendValueToWriter(&writer, std::string{"string"});
189*1a96fba6SXin Li   AppendValueToWriter(&writer, ObjectPath{"/object/path"});
190*1a96fba6SXin Li 
191*1a96fba6SXin Li   EXPECT_EQ("ybnqiuxtdso", message->GetSignature());
192*1a96fba6SXin Li 
193*1a96fba6SXin Li   uint8_t byte_value = 0;
194*1a96fba6SXin Li   bool bool_value = false;
195*1a96fba6SXin Li   int16_t int16_value = 0;
196*1a96fba6SXin Li   uint16_t uint16_value = 0;
197*1a96fba6SXin Li   int32_t int32_value = 0;
198*1a96fba6SXin Li   uint32_t uint32_value = 0;
199*1a96fba6SXin Li   int64_t int64_value = 0;
200*1a96fba6SXin Li   uint64_t uint64_value = 0;
201*1a96fba6SXin Li   double double_value = 0;
202*1a96fba6SXin Li   std::string string_value;
203*1a96fba6SXin Li   ObjectPath object_path_value;
204*1a96fba6SXin Li 
205*1a96fba6SXin Li   MessageReader reader(message.get());
206*1a96fba6SXin Li   EXPECT_TRUE(reader.HasMoreData());
207*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &byte_value));
208*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &bool_value));
209*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &int16_value));
210*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &uint16_value));
211*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &int32_value));
212*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &uint32_value));
213*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &int64_value));
214*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &uint64_value));
215*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &double_value));
216*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &string_value));
217*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &object_path_value));
218*1a96fba6SXin Li   EXPECT_FALSE(reader.HasMoreData());
219*1a96fba6SXin Li 
220*1a96fba6SXin Li   // 0, true, 2, 3, 4, 5, 6, 7, 8, "string", "/object/path" should be returned.
221*1a96fba6SXin Li   EXPECT_EQ(0, byte_value);
222*1a96fba6SXin Li   EXPECT_TRUE(bool_value);
223*1a96fba6SXin Li   EXPECT_EQ(2, int16_value);
224*1a96fba6SXin Li   EXPECT_EQ(3U, uint16_value);
225*1a96fba6SXin Li   EXPECT_EQ(4, int32_value);
226*1a96fba6SXin Li   EXPECT_EQ(5U, uint32_value);
227*1a96fba6SXin Li   EXPECT_EQ(6, int64_value);
228*1a96fba6SXin Li   EXPECT_EQ(7U, uint64_value);
229*1a96fba6SXin Li   EXPECT_DOUBLE_EQ(8.0, double_value);
230*1a96fba6SXin Li   EXPECT_EQ("string", string_value);
231*1a96fba6SXin Li   EXPECT_EQ(ObjectPath{"/object/path"}, object_path_value);
232*1a96fba6SXin Li }
233*1a96fba6SXin Li 
234*1a96fba6SXin Li // Check all basic types can be properly written and read.
TEST(DBusUtils,AppendAndPopFileDescriptor)235*1a96fba6SXin Li TEST(DBusUtils, AppendAndPopFileDescriptor) {
236*1a96fba6SXin Li   if (!dbus::IsDBusTypeUnixFdSupported()) {
237*1a96fba6SXin Li     LOG(WARNING) << "FD passing is not supported";
238*1a96fba6SXin Li     return;
239*1a96fba6SXin Li   }
240*1a96fba6SXin Li 
241*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
242*1a96fba6SXin Li   MessageWriter writer(message.get());
243*1a96fba6SXin Li 
244*1a96fba6SXin Li   // Append stdout.
245*1a96fba6SXin Li   FileDescriptor temp = 1;
246*1a96fba6SXin Li   AppendValueToWriter(&writer, temp);
247*1a96fba6SXin Li 
248*1a96fba6SXin Li   EXPECT_EQ("h", message->GetSignature());
249*1a96fba6SXin Li 
250*1a96fba6SXin Li   base::ScopedFD fd_value;
251*1a96fba6SXin Li 
252*1a96fba6SXin Li   MessageReader reader(message.get());
253*1a96fba6SXin Li   EXPECT_TRUE(reader.HasMoreData());
254*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &fd_value));
255*1a96fba6SXin Li   EXPECT_FALSE(reader.HasMoreData());
256*1a96fba6SXin Li   EXPECT_TRUE(fd_value.is_valid());
257*1a96fba6SXin Li }
258*1a96fba6SXin Li 
259*1a96fba6SXin Li // Check all variant types can be properly written and read.
TEST(DBusUtils,AppendAndPopVariantDataTypes)260*1a96fba6SXin Li TEST(DBusUtils, AppendAndPopVariantDataTypes) {
261*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
262*1a96fba6SXin Li   MessageWriter writer(message.get());
263*1a96fba6SXin Li 
264*1a96fba6SXin Li   // Append 10, false, 12, 13, 14, 15, 16, 17, 18.5, "data", "/obj/path".
265*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, uint8_t{10});
266*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, bool{false});
267*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, int16_t{12});
268*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, uint16_t{13});
269*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, int32_t{14});
270*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, uint32_t{15});
271*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, int64_t{16});
272*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, uint64_t{17});
273*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, double{18.5});
274*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, std::string{"data"});
275*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, ObjectPath{"/obj/path"});
276*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, Any{17});
277*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer,
278*1a96fba6SXin Li                                Any{std::vector<std::vector<int>>{{6, 7}}});
279*1a96fba6SXin Li 
280*1a96fba6SXin Li   EXPECT_EQ("vvvvvvvvvvvvv", message->GetSignature());
281*1a96fba6SXin Li 
282*1a96fba6SXin Li   uint8_t byte_value = 0;
283*1a96fba6SXin Li   bool bool_value = true;
284*1a96fba6SXin Li   int16_t int16_value = 0;
285*1a96fba6SXin Li   uint16_t uint16_value = 0;
286*1a96fba6SXin Li   int32_t int32_value = 0;
287*1a96fba6SXin Li   uint32_t uint32_value = 0;
288*1a96fba6SXin Li   int64_t int64_value = 0;
289*1a96fba6SXin Li   uint64_t uint64_value = 0;
290*1a96fba6SXin Li   double double_value = 0;
291*1a96fba6SXin Li   std::string string_value;
292*1a96fba6SXin Li   ObjectPath object_path_value;
293*1a96fba6SXin Li   Any any_value;
294*1a96fba6SXin Li   Any any_vector_vector;
295*1a96fba6SXin Li 
296*1a96fba6SXin Li   MessageReader reader(message.get());
297*1a96fba6SXin Li   EXPECT_TRUE(reader.HasMoreData());
298*1a96fba6SXin Li   EXPECT_TRUE(PopVariantValueFromReader(&reader, &byte_value));
299*1a96fba6SXin Li   EXPECT_TRUE(PopVariantValueFromReader(&reader, &bool_value));
300*1a96fba6SXin Li   EXPECT_TRUE(PopVariantValueFromReader(&reader, &int16_value));
301*1a96fba6SXin Li   EXPECT_TRUE(PopVariantValueFromReader(&reader, &uint16_value));
302*1a96fba6SXin Li   EXPECT_TRUE(PopVariantValueFromReader(&reader, &int32_value));
303*1a96fba6SXin Li   EXPECT_TRUE(PopVariantValueFromReader(&reader, &uint32_value));
304*1a96fba6SXin Li   EXPECT_TRUE(PopVariantValueFromReader(&reader, &int64_value));
305*1a96fba6SXin Li   EXPECT_TRUE(PopVariantValueFromReader(&reader, &uint64_value));
306*1a96fba6SXin Li   EXPECT_TRUE(PopVariantValueFromReader(&reader, &double_value));
307*1a96fba6SXin Li   EXPECT_TRUE(PopVariantValueFromReader(&reader, &string_value));
308*1a96fba6SXin Li   EXPECT_TRUE(PopVariantValueFromReader(&reader, &object_path_value));
309*1a96fba6SXin Li   EXPECT_TRUE(PopVariantValueFromReader(&reader, &any_value));
310*1a96fba6SXin Li   // Not implemented.
311*1a96fba6SXin Li   EXPECT_FALSE(PopVariantValueFromReader(&reader, &any_vector_vector));
312*1a96fba6SXin Li   EXPECT_FALSE(reader.HasMoreData());
313*1a96fba6SXin Li 
314*1a96fba6SXin Li   EXPECT_EQ(10, byte_value);
315*1a96fba6SXin Li   EXPECT_FALSE(bool_value);
316*1a96fba6SXin Li   EXPECT_EQ(12, int16_value);
317*1a96fba6SXin Li   EXPECT_EQ(13U, uint16_value);
318*1a96fba6SXin Li   EXPECT_EQ(14, int32_value);
319*1a96fba6SXin Li   EXPECT_EQ(15U, uint32_value);
320*1a96fba6SXin Li   EXPECT_EQ(16, int64_value);
321*1a96fba6SXin Li   EXPECT_EQ(17U, uint64_value);
322*1a96fba6SXin Li   EXPECT_DOUBLE_EQ(18.5, double_value);
323*1a96fba6SXin Li   EXPECT_EQ("data", string_value);
324*1a96fba6SXin Li   EXPECT_EQ(ObjectPath{"/obj/path"}, object_path_value);
325*1a96fba6SXin Li   EXPECT_EQ(17, any_value.Get<int>());
326*1a96fba6SXin Li   EXPECT_TRUE(any_vector_vector.IsEmpty());
327*1a96fba6SXin Li }
328*1a96fba6SXin Li 
TEST(DBusUtils,AppendAndPopBasicAny)329*1a96fba6SXin Li TEST(DBusUtils, AppendAndPopBasicAny) {
330*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
331*1a96fba6SXin Li   MessageWriter writer(message.get());
332*1a96fba6SXin Li 
333*1a96fba6SXin Li   // Append 10, true, 12, 13, 14, 15, 16, 17, 18.5, "data", "/obj/path".
334*1a96fba6SXin Li   AppendValueToWriter(&writer, Any(uint8_t{10}));
335*1a96fba6SXin Li   AppendValueToWriter(&writer, Any(bool{true}));
336*1a96fba6SXin Li   AppendValueToWriter(&writer, Any(int16_t{12}));
337*1a96fba6SXin Li   AppendValueToWriter(&writer, Any(uint16_t{13}));
338*1a96fba6SXin Li   AppendValueToWriter(&writer, Any(int32_t{14}));
339*1a96fba6SXin Li   AppendValueToWriter(&writer, Any(uint32_t{15}));
340*1a96fba6SXin Li   AppendValueToWriter(&writer, Any(int64_t{16}));
341*1a96fba6SXin Li   AppendValueToWriter(&writer, Any(uint64_t{17}));
342*1a96fba6SXin Li   AppendValueToWriter(&writer, Any(double{18.5}));
343*1a96fba6SXin Li   AppendValueToWriter(&writer, Any(std::string{"data"}));
344*1a96fba6SXin Li   AppendValueToWriter(&writer, Any(ObjectPath{"/obj/path"}));
345*1a96fba6SXin Li   EXPECT_EQ("vvvvvvvvvvv", message->GetSignature());
346*1a96fba6SXin Li 
347*1a96fba6SXin Li   Any byte_value;
348*1a96fba6SXin Li   Any bool_value;
349*1a96fba6SXin Li   Any int16_value;
350*1a96fba6SXin Li   Any uint16_value;
351*1a96fba6SXin Li   Any int32_value;
352*1a96fba6SXin Li   Any uint32_value;
353*1a96fba6SXin Li   Any int64_value;
354*1a96fba6SXin Li   Any uint64_value;
355*1a96fba6SXin Li   Any double_value;
356*1a96fba6SXin Li   Any string_value;
357*1a96fba6SXin Li   Any object_path_value;
358*1a96fba6SXin Li 
359*1a96fba6SXin Li   MessageReader reader(message.get());
360*1a96fba6SXin Li   EXPECT_TRUE(reader.HasMoreData());
361*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &byte_value));
362*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &bool_value));
363*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &int16_value));
364*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &uint16_value));
365*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &int32_value));
366*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &uint32_value));
367*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &int64_value));
368*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &uint64_value));
369*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &double_value));
370*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &string_value));
371*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &object_path_value));
372*1a96fba6SXin Li   EXPECT_FALSE(reader.HasMoreData());
373*1a96fba6SXin Li 
374*1a96fba6SXin Li   // Must be: 10, true, 12, 13, 14, 15, 16, 17, 18.5, "data", "/obj/path".
375*1a96fba6SXin Li   EXPECT_EQ(10, byte_value.Get<uint8_t>());
376*1a96fba6SXin Li   EXPECT_TRUE(bool_value.Get<bool>());
377*1a96fba6SXin Li   EXPECT_EQ(12, int16_value.Get<int16_t>());
378*1a96fba6SXin Li   EXPECT_EQ(13U, uint16_value.Get<uint16_t>());
379*1a96fba6SXin Li   EXPECT_EQ(14, int32_value.Get<int32_t>());
380*1a96fba6SXin Li   EXPECT_EQ(15U, uint32_value.Get<uint32_t>());
381*1a96fba6SXin Li   EXPECT_EQ(16, int64_value.Get<int64_t>());
382*1a96fba6SXin Li   EXPECT_EQ(17U, uint64_value.Get<uint64_t>());
383*1a96fba6SXin Li   EXPECT_DOUBLE_EQ(18.5, double_value.Get<double>());
384*1a96fba6SXin Li   EXPECT_EQ("data", string_value.Get<std::string>());
385*1a96fba6SXin Li   EXPECT_EQ(ObjectPath{"/obj/path"}, object_path_value.Get<ObjectPath>());
386*1a96fba6SXin Li }
387*1a96fba6SXin Li 
TEST(DBusUtils,ArrayOfBytes)388*1a96fba6SXin Li TEST(DBusUtils, ArrayOfBytes) {
389*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
390*1a96fba6SXin Li   MessageWriter writer(message.get());
391*1a96fba6SXin Li   std::vector<uint8_t> bytes{1, 2, 3};
392*1a96fba6SXin Li   AppendValueToWriter(&writer, bytes);
393*1a96fba6SXin Li 
394*1a96fba6SXin Li   EXPECT_EQ("ay", message->GetSignature());
395*1a96fba6SXin Li 
396*1a96fba6SXin Li   MessageReader reader(message.get());
397*1a96fba6SXin Li   std::vector<uint8_t> bytes_out;
398*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &bytes_out));
399*1a96fba6SXin Li   EXPECT_FALSE(reader.HasMoreData());
400*1a96fba6SXin Li   EXPECT_EQ(bytes, bytes_out);
401*1a96fba6SXin Li }
402*1a96fba6SXin Li 
TEST(DBusUtils,ArrayOfBytes_Empty)403*1a96fba6SXin Li TEST(DBusUtils, ArrayOfBytes_Empty) {
404*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
405*1a96fba6SXin Li   MessageWriter writer(message.get());
406*1a96fba6SXin Li   std::vector<uint8_t> bytes;
407*1a96fba6SXin Li   AppendValueToWriter(&writer, bytes);
408*1a96fba6SXin Li 
409*1a96fba6SXin Li   EXPECT_EQ("ay", message->GetSignature());
410*1a96fba6SXin Li 
411*1a96fba6SXin Li   MessageReader reader(message.get());
412*1a96fba6SXin Li   std::vector<uint8_t> bytes_out;
413*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &bytes_out));
414*1a96fba6SXin Li   EXPECT_FALSE(reader.HasMoreData());
415*1a96fba6SXin Li   EXPECT_EQ(bytes, bytes_out);
416*1a96fba6SXin Li }
417*1a96fba6SXin Li 
TEST(DBusUtils,ArrayOfStrings)418*1a96fba6SXin Li TEST(DBusUtils, ArrayOfStrings) {
419*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
420*1a96fba6SXin Li   MessageWriter writer(message.get());
421*1a96fba6SXin Li   std::vector<std::string> strings{"foo", "bar", "baz"};
422*1a96fba6SXin Li   AppendValueToWriter(&writer, strings);
423*1a96fba6SXin Li 
424*1a96fba6SXin Li   EXPECT_EQ("as", message->GetSignature());
425*1a96fba6SXin Li 
426*1a96fba6SXin Li   MessageReader reader(message.get());
427*1a96fba6SXin Li   std::vector<std::string> strings_out;
428*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &strings_out));
429*1a96fba6SXin Li   EXPECT_FALSE(reader.HasMoreData());
430*1a96fba6SXin Li   EXPECT_EQ(strings, strings_out);
431*1a96fba6SXin Li }
432*1a96fba6SXin Li 
TEST(DBusUtils,ArrayOfInt64)433*1a96fba6SXin Li TEST(DBusUtils, ArrayOfInt64) {
434*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
435*1a96fba6SXin Li   MessageWriter writer(message.get());
436*1a96fba6SXin Li   std::vector<int64_t> values{-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5,
437*1a96fba6SXin Li                               std::numeric_limits<int64_t>::min(),
438*1a96fba6SXin Li                               std::numeric_limits<int64_t>::max()};
439*1a96fba6SXin Li   AppendValueToWriter(&writer, values);
440*1a96fba6SXin Li 
441*1a96fba6SXin Li   EXPECT_EQ("ax", message->GetSignature());
442*1a96fba6SXin Li 
443*1a96fba6SXin Li   MessageReader reader(message.get());
444*1a96fba6SXin Li   std::vector<int64_t> values_out;
445*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &values_out));
446*1a96fba6SXin Li   EXPECT_FALSE(reader.HasMoreData());
447*1a96fba6SXin Li   EXPECT_EQ(values, values_out);
448*1a96fba6SXin Li }
449*1a96fba6SXin Li 
TEST(DBusUtils,ArrayOfObjectPaths)450*1a96fba6SXin Li TEST(DBusUtils, ArrayOfObjectPaths) {
451*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
452*1a96fba6SXin Li   MessageWriter writer(message.get());
453*1a96fba6SXin Li   std::vector<ObjectPath> object_paths{
454*1a96fba6SXin Li       ObjectPath("/object/path/1"),
455*1a96fba6SXin Li       ObjectPath("/object/path/2"),
456*1a96fba6SXin Li       ObjectPath("/object/path/3"),
457*1a96fba6SXin Li   };
458*1a96fba6SXin Li   AppendValueToWriter(&writer, object_paths);
459*1a96fba6SXin Li 
460*1a96fba6SXin Li   EXPECT_EQ("ao", message->GetSignature());
461*1a96fba6SXin Li 
462*1a96fba6SXin Li   MessageReader reader(message.get());
463*1a96fba6SXin Li   std::vector<ObjectPath> object_paths_out;
464*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &object_paths_out));
465*1a96fba6SXin Li   EXPECT_FALSE(reader.HasMoreData());
466*1a96fba6SXin Li   EXPECT_EQ(object_paths, object_paths_out);
467*1a96fba6SXin Li }
468*1a96fba6SXin Li 
TEST(DBusUtils,ArraysAsVariant)469*1a96fba6SXin Li TEST(DBusUtils, ArraysAsVariant) {
470*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
471*1a96fba6SXin Li   MessageWriter writer(message.get());
472*1a96fba6SXin Li   std::vector<int> int_array{1, 2, 3};
473*1a96fba6SXin Li   std::vector<std::string> str_array{"foo", "bar", "baz"};
474*1a96fba6SXin Li   std::vector<double> dbl_array_empty{};
475*1a96fba6SXin Li   std::map<std::string, std::string> dict_ss{{"k1", "v1"}, {"k2", "v2"}};
476*1a96fba6SXin Li   VariantDictionary dict_sv{{"k1", 1}, {"k2", "v2"}};
477*1a96fba6SXin Li   using ComplexStructArray =
478*1a96fba6SXin Li       std::vector<std::tuple<uint32_t, bool, std::vector<uint8_t>>>;
479*1a96fba6SXin Li   ComplexStructArray complex_struct_array{
480*1a96fba6SXin Li       {123, true, {0xaa, 0xbb, 0xcc}},
481*1a96fba6SXin Li       {456, false, {0xdd}},
482*1a96fba6SXin Li       {789, false, {}},
483*1a96fba6SXin Li   };
484*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, int_array);
485*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, str_array);
486*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, dbl_array_empty);
487*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, dict_ss);
488*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, dict_sv);
489*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, complex_struct_array);
490*1a96fba6SXin Li 
491*1a96fba6SXin Li   EXPECT_EQ("vvvvvv", message->GetSignature());
492*1a96fba6SXin Li 
493*1a96fba6SXin Li   Any int_array_out;
494*1a96fba6SXin Li   Any str_array_out;
495*1a96fba6SXin Li   Any dbl_array_out;
496*1a96fba6SXin Li   Any dict_ss_out;
497*1a96fba6SXin Li   Any dict_sv_out;
498*1a96fba6SXin Li   Any complex_struct_array_out;
499*1a96fba6SXin Li 
500*1a96fba6SXin Li   MessageReader reader(message.get());
501*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &int_array_out));
502*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &str_array_out));
503*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &dbl_array_out));
504*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &dict_ss_out));
505*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &dict_sv_out));
506*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &complex_struct_array_out));
507*1a96fba6SXin Li   EXPECT_FALSE(reader.HasMoreData());
508*1a96fba6SXin Li 
509*1a96fba6SXin Li   EXPECT_EQ(int_array, int_array_out.Get<std::vector<int>>());
510*1a96fba6SXin Li   EXPECT_EQ(str_array, str_array_out.Get<std::vector<std::string>>());
511*1a96fba6SXin Li   EXPECT_EQ(dbl_array_empty, dbl_array_out.Get<std::vector<double>>());
512*1a96fba6SXin Li   EXPECT_EQ(dict_ss, (dict_ss_out.Get<std::map<std::string, std::string>>()));
513*1a96fba6SXin Li   EXPECT_EQ(dict_sv["k1"].Get<int>(),
514*1a96fba6SXin Li             dict_sv_out.Get<VariantDictionary>().at("k1").Get<int>());
515*1a96fba6SXin Li   EXPECT_EQ(dict_sv["k2"].Get<const char*>(),
516*1a96fba6SXin Li             dict_sv_out.Get<VariantDictionary>().at("k2").Get<std::string>());
517*1a96fba6SXin Li   EXPECT_EQ(complex_struct_array,
518*1a96fba6SXin Li             complex_struct_array_out.Get<ComplexStructArray>());
519*1a96fba6SXin Li }
520*1a96fba6SXin Li 
TEST(DBusUtils,StructsAsVariant)521*1a96fba6SXin Li TEST(DBusUtils, StructsAsVariant) {
522*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
523*1a96fba6SXin Li   MessageWriter writer(message.get());
524*1a96fba6SXin Li   VariantDictionary dict_sv{{"k1", 1}, {"k2", "v2"}};
525*1a96fba6SXin Li   std::tuple<uint32_t, VariantDictionary> u32_dict_sv_struct =
526*1a96fba6SXin Li       std::make_tuple(1, dict_sv);
527*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, u32_dict_sv_struct);
528*1a96fba6SXin Li 
529*1a96fba6SXin Li   EXPECT_EQ("v", message->GetSignature());
530*1a96fba6SXin Li 
531*1a96fba6SXin Li   Any u32_dict_sv_struct_out_any;
532*1a96fba6SXin Li 
533*1a96fba6SXin Li   MessageReader reader(message.get());
534*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &u32_dict_sv_struct_out_any));
535*1a96fba6SXin Li   EXPECT_FALSE(reader.HasMoreData());
536*1a96fba6SXin Li 
537*1a96fba6SXin Li   auto u32_dict_sv_struct_out =
538*1a96fba6SXin Li       u32_dict_sv_struct_out_any.Get<std::tuple<uint32_t, VariantDictionary>>();
539*1a96fba6SXin Li   EXPECT_EQ(std::get<0>(u32_dict_sv_struct),
540*1a96fba6SXin Li             std::get<0>(u32_dict_sv_struct_out));
541*1a96fba6SXin Li   VariantDictionary dict_sv_out = std::get<1>(u32_dict_sv_struct_out);
542*1a96fba6SXin Li   EXPECT_EQ(dict_sv.size(), dict_sv_out.size());
543*1a96fba6SXin Li   EXPECT_EQ(dict_sv["k1"].Get<int>(), dict_sv_out["k1"].Get<int>());
544*1a96fba6SXin Li   EXPECT_EQ(dict_sv["k2"].Get<const char*>(),
545*1a96fba6SXin Li             dict_sv_out["k2"].Get<std::string>());
546*1a96fba6SXin Li }
547*1a96fba6SXin Li 
TEST(DBusUtils,VariantDictionary)548*1a96fba6SXin Li TEST(DBusUtils, VariantDictionary) {
549*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
550*1a96fba6SXin Li   MessageWriter writer(message.get());
551*1a96fba6SXin Li   VariantDictionary values{
552*1a96fba6SXin Li       {"key1", uint8_t{10}},
553*1a96fba6SXin Li       {"key2", bool{true}},
554*1a96fba6SXin Li       {"key3", int16_t{12}},
555*1a96fba6SXin Li       {"key4", uint16_t{13}},
556*1a96fba6SXin Li       {"key5", int32_t{14}},
557*1a96fba6SXin Li       {"key6", uint32_t{15}},
558*1a96fba6SXin Li       {"key7", int64_t{16}},
559*1a96fba6SXin Li       {"key8", uint64_t{17}},
560*1a96fba6SXin Li       {"key9", double{18.5}},
561*1a96fba6SXin Li       {"keyA", std::string{"data"}},
562*1a96fba6SXin Li       {"keyB", ObjectPath{"/obj/path"}},
563*1a96fba6SXin Li   };
564*1a96fba6SXin Li   AppendValueToWriter(&writer, values);
565*1a96fba6SXin Li 
566*1a96fba6SXin Li   EXPECT_EQ("a{sv}", message->GetSignature());
567*1a96fba6SXin Li 
568*1a96fba6SXin Li   MessageReader reader(message.get());
569*1a96fba6SXin Li   VariantDictionary values_out;
570*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &values_out));
571*1a96fba6SXin Li   EXPECT_FALSE(reader.HasMoreData());
572*1a96fba6SXin Li   EXPECT_EQ(values.size(), values_out.size());
573*1a96fba6SXin Li   EXPECT_EQ(values["key1"].Get<uint8_t>(), values_out["key1"].Get<uint8_t>());
574*1a96fba6SXin Li   EXPECT_EQ(values["key2"].Get<bool>(), values_out["key2"].Get<bool>());
575*1a96fba6SXin Li   EXPECT_EQ(values["key3"].Get<int16_t>(), values_out["key3"].Get<int16_t>());
576*1a96fba6SXin Li   EXPECT_EQ(values["key4"].Get<uint16_t>(), values_out["key4"].Get<uint16_t>());
577*1a96fba6SXin Li   EXPECT_EQ(values["key5"].Get<int32_t>(), values_out["key5"].Get<int32_t>());
578*1a96fba6SXin Li   EXPECT_EQ(values["key6"].Get<uint32_t>(), values_out["key6"].Get<uint32_t>());
579*1a96fba6SXin Li   EXPECT_EQ(values["key7"].Get<int64_t>(), values_out["key7"].Get<int64_t>());
580*1a96fba6SXin Li   EXPECT_EQ(values["key8"].Get<uint64_t>(), values_out["key8"].Get<uint64_t>());
581*1a96fba6SXin Li   EXPECT_EQ(values["key9"].Get<double>(), values_out["key9"].Get<double>());
582*1a96fba6SXin Li   EXPECT_EQ(values["keyA"].Get<std::string>(),
583*1a96fba6SXin Li             values_out["keyA"].Get<std::string>());
584*1a96fba6SXin Li   EXPECT_EQ(values["keyB"].Get<ObjectPath>(),
585*1a96fba6SXin Li             values_out["keyB"].Get<ObjectPath>());
586*1a96fba6SXin Li }
587*1a96fba6SXin Li 
TEST(DBusUtils,StringToStringMap)588*1a96fba6SXin Li TEST(DBusUtils, StringToStringMap) {
589*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
590*1a96fba6SXin Li   MessageWriter writer(message.get());
591*1a96fba6SXin Li   std::map<std::string, std::string> values{
592*1a96fba6SXin Li       {"key1", "value1"},
593*1a96fba6SXin Li       {"key2", "value2"},
594*1a96fba6SXin Li       {"key3", "value3"},
595*1a96fba6SXin Li       {"key4", "value4"},
596*1a96fba6SXin Li       {"key5", "value5"},
597*1a96fba6SXin Li   };
598*1a96fba6SXin Li   AppendValueToWriter(&writer, values);
599*1a96fba6SXin Li 
600*1a96fba6SXin Li   EXPECT_EQ("a{ss}", message->GetSignature());
601*1a96fba6SXin Li 
602*1a96fba6SXin Li   MessageReader reader(message.get());
603*1a96fba6SXin Li   std::map<std::string, std::string> values_out;
604*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &values_out));
605*1a96fba6SXin Li   EXPECT_FALSE(reader.HasMoreData());
606*1a96fba6SXin Li   EXPECT_EQ(values, values_out);
607*1a96fba6SXin Li }
608*1a96fba6SXin Li 
TEST(DBusUtils,Pair)609*1a96fba6SXin Li TEST(DBusUtils, Pair) {
610*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
611*1a96fba6SXin Li   MessageWriter writer(message.get());
612*1a96fba6SXin Li   std::pair<std::string, int> struct1{"value2", 3};
613*1a96fba6SXin Li   AppendValueToWriter(&writer, struct1);
614*1a96fba6SXin Li   std::pair<int, std::pair<int, int>> struct2{1, {2, 3}};
615*1a96fba6SXin Li   AppendValueToWriter(&writer, struct2);
616*1a96fba6SXin Li 
617*1a96fba6SXin Li   EXPECT_EQ("(si)(i(ii))", message->GetSignature());
618*1a96fba6SXin Li 
619*1a96fba6SXin Li   std::pair<std::string, int> struct1_out;
620*1a96fba6SXin Li   std::pair<int, std::pair<int, int>> struct2_out;
621*1a96fba6SXin Li 
622*1a96fba6SXin Li   MessageReader reader(message.get());
623*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &struct1_out));
624*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &struct2_out));
625*1a96fba6SXin Li   EXPECT_FALSE(reader.HasMoreData());
626*1a96fba6SXin Li   EXPECT_EQ(struct1, struct1_out);
627*1a96fba6SXin Li   EXPECT_EQ(struct2, struct2_out);
628*1a96fba6SXin Li }
629*1a96fba6SXin Li 
TEST(DBusUtils,Tuple)630*1a96fba6SXin Li TEST(DBusUtils, Tuple) {
631*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
632*1a96fba6SXin Li   MessageWriter writer(message.get());
633*1a96fba6SXin Li   std::tuple<std::string, int> struct1{"value2", 3};
634*1a96fba6SXin Li   AppendValueToWriter(&writer, struct1);
635*1a96fba6SXin Li   std::tuple<int, std::string, std::vector<std::pair<int, int>>> struct2{
636*1a96fba6SXin Li     1, "a", {{2, 3}}
637*1a96fba6SXin Li   };
638*1a96fba6SXin Li   AppendValueToWriter(&writer, struct2);
639*1a96fba6SXin Li 
640*1a96fba6SXin Li   EXPECT_EQ("(si)(isa(ii))", message->GetSignature());
641*1a96fba6SXin Li 
642*1a96fba6SXin Li   std::tuple<std::string, int> struct1_out;
643*1a96fba6SXin Li   std::tuple<int, std::string, std::vector<std::pair<int, int>>> struct2_out;
644*1a96fba6SXin Li 
645*1a96fba6SXin Li   MessageReader reader(message.get());
646*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &struct1_out));
647*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &struct2_out));
648*1a96fba6SXin Li   EXPECT_FALSE(reader.HasMoreData());
649*1a96fba6SXin Li   EXPECT_EQ(struct1, struct1_out);
650*1a96fba6SXin Li   EXPECT_EQ(struct2, struct2_out);
651*1a96fba6SXin Li }
652*1a96fba6SXin Li 
TEST(DBusUtils,ReinterpretVariant)653*1a96fba6SXin Li TEST(DBusUtils, ReinterpretVariant) {
654*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
655*1a96fba6SXin Li   MessageWriter writer(message.get());
656*1a96fba6SXin Li   std::vector<std::string> str_array{"foo", "bar", "baz"};
657*1a96fba6SXin Li   std::map<std::string, std::string> dict_ss{{"k1", "v1"}, {"k2", "v2"}};
658*1a96fba6SXin Li   VariantDictionary dict_sv{{"k1", "v1"}, {"k2", "v2"}};
659*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, 123);
660*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, str_array);
661*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, 1.7);
662*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, dict_ss);
663*1a96fba6SXin Li   AppendValueToWriter(&writer, dict_sv);
664*1a96fba6SXin Li 
665*1a96fba6SXin Li   EXPECT_EQ("vvvva{sv}", message->GetSignature());
666*1a96fba6SXin Li 
667*1a96fba6SXin Li   int int_out = 0;
668*1a96fba6SXin Li   std::vector<std::string> str_array_out;
669*1a96fba6SXin Li   double dbl_out = 0.0;
670*1a96fba6SXin Li   std::map<std::string, std::string> dict_ss_out;
671*1a96fba6SXin Li   std::map<std::string, std::string> dict_ss_out2;
672*1a96fba6SXin Li 
673*1a96fba6SXin Li   MessageReader reader(message.get());
674*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &int_out));
675*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &str_array_out));
676*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &dbl_out));
677*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &dict_ss_out));
678*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader,
679*1a96fba6SXin Li                                  &dict_ss_out2));  // Read "a{sv}" as "a{ss}".
680*1a96fba6SXin Li   EXPECT_FALSE(reader.HasMoreData());
681*1a96fba6SXin Li 
682*1a96fba6SXin Li   EXPECT_EQ(123, int_out);
683*1a96fba6SXin Li   EXPECT_EQ(str_array, str_array_out);
684*1a96fba6SXin Li   EXPECT_DOUBLE_EQ(1.7, dbl_out);
685*1a96fba6SXin Li   EXPECT_EQ(dict_ss, dict_ss_out);
686*1a96fba6SXin Li   EXPECT_EQ(dict_ss, dict_ss_out2);
687*1a96fba6SXin Li }
688*1a96fba6SXin Li 
689*1a96fba6SXin Li // Test handling of custom data types.
690*1a96fba6SXin Li struct Person {
691*1a96fba6SXin Li   std::string first_name;
692*1a96fba6SXin Li   std::string last_name;
693*1a96fba6SXin Li   int age;
694*1a96fba6SXin Li   // Provide == operator so we can easily compare arrays of Person.
operator ==brillo::dbus_utils::Person695*1a96fba6SXin Li   bool operator==(const Person& rhs) const {
696*1a96fba6SXin Li     return first_name == rhs.first_name && last_name == rhs.last_name &&
697*1a96fba6SXin Li            age == rhs.age;
698*1a96fba6SXin Li   }
699*1a96fba6SXin Li };
700*1a96fba6SXin Li 
701*1a96fba6SXin Li // Overload AppendValueToWriter() for "Person" structure.
AppendValueToWriter(dbus::MessageWriter * writer,const Person & value)702*1a96fba6SXin Li void AppendValueToWriter(dbus::MessageWriter* writer, const Person& value) {
703*1a96fba6SXin Li   dbus::MessageWriter struct_writer(nullptr);
704*1a96fba6SXin Li   writer->OpenStruct(&struct_writer);
705*1a96fba6SXin Li   AppendValueToWriter(&struct_writer, value.first_name);
706*1a96fba6SXin Li   AppendValueToWriter(&struct_writer, value.last_name);
707*1a96fba6SXin Li   AppendValueToWriter(&struct_writer, value.age);
708*1a96fba6SXin Li   writer->CloseContainer(&struct_writer);
709*1a96fba6SXin Li }
710*1a96fba6SXin Li 
711*1a96fba6SXin Li // Overload PopValueFromReader() for "Person" structure.
PopValueFromReader(dbus::MessageReader * reader,Person * value)712*1a96fba6SXin Li bool PopValueFromReader(dbus::MessageReader* reader, Person* value) {
713*1a96fba6SXin Li   dbus::MessageReader variant_reader(nullptr);
714*1a96fba6SXin Li   dbus::MessageReader struct_reader(nullptr);
715*1a96fba6SXin Li   if (!details::DescendIntoVariantIfPresent(&reader, &variant_reader) ||
716*1a96fba6SXin Li       !reader->PopStruct(&struct_reader))
717*1a96fba6SXin Li     return false;
718*1a96fba6SXin Li   return PopValueFromReader(&struct_reader, &value->first_name) &&
719*1a96fba6SXin Li          PopValueFromReader(&struct_reader, &value->last_name) &&
720*1a96fba6SXin Li          PopValueFromReader(&struct_reader, &value->age);
721*1a96fba6SXin Li }
722*1a96fba6SXin Li 
723*1a96fba6SXin Li // Specialize DBusType<T> for "Person" structure.
724*1a96fba6SXin Li template<>
725*1a96fba6SXin Li struct DBusType<Person> {
GetSignaturebrillo::dbus_utils::DBusType726*1a96fba6SXin Li   inline static std::string GetSignature() {
727*1a96fba6SXin Li     return GetStructDBusSignature<std::string, std::string, int>();
728*1a96fba6SXin Li   }
Writebrillo::dbus_utils::DBusType729*1a96fba6SXin Li   inline static void Write(dbus::MessageWriter* writer, const Person& value) {
730*1a96fba6SXin Li     AppendValueToWriter(writer, value);
731*1a96fba6SXin Li   }
Readbrillo::dbus_utils::DBusType732*1a96fba6SXin Li   inline static bool Read(dbus::MessageReader* reader, Person* value) {
733*1a96fba6SXin Li     return PopValueFromReader(reader, value);
734*1a96fba6SXin Li   }
735*1a96fba6SXin Li };
736*1a96fba6SXin Li 
TEST(DBusUtils,CustomStruct)737*1a96fba6SXin Li TEST(DBusUtils, CustomStruct) {
738*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
739*1a96fba6SXin Li   MessageWriter writer(message.get());
740*1a96fba6SXin Li   std::vector<Person> people{{"John", "Doe", 32}, {"Jane", "Smith", 48}};
741*1a96fba6SXin Li   AppendValueToWriter(&writer, people);
742*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, people);
743*1a96fba6SXin Li   AppendValueToWriterAsVariant(&writer, people);
744*1a96fba6SXin Li 
745*1a96fba6SXin Li   EXPECT_EQ("a(ssi)vv", message->GetSignature());
746*1a96fba6SXin Li 
747*1a96fba6SXin Li   std::vector<Person> people_out1;
748*1a96fba6SXin Li   std::vector<Person> people_out2;
749*1a96fba6SXin Li   std::vector<Person> people_out3;
750*1a96fba6SXin Li 
751*1a96fba6SXin Li   MessageReader reader(message.get());
752*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &people_out1));
753*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &people_out2));
754*1a96fba6SXin Li   EXPECT_TRUE(PopVariantValueFromReader(&reader, &people_out3));
755*1a96fba6SXin Li   EXPECT_FALSE(reader.HasMoreData());
756*1a96fba6SXin Li 
757*1a96fba6SXin Li   EXPECT_EQ(people, people_out1);
758*1a96fba6SXin Li   EXPECT_EQ(people, people_out2);
759*1a96fba6SXin Li   EXPECT_EQ(people, people_out3);
760*1a96fba6SXin Li }
761*1a96fba6SXin Li 
TEST(DBusUtils,CustomStructInComplexTypes)762*1a96fba6SXin Li TEST(DBusUtils, CustomStructInComplexTypes) {
763*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
764*1a96fba6SXin Li   MessageWriter writer(message.get());
765*1a96fba6SXin Li   std::vector<Person> people{{"John", "Doe", 32}, {"Jane", "Smith", 48}};
766*1a96fba6SXin Li   std::vector<std::map<int, Person>> data{
767*1a96fba6SXin Li     {
768*1a96fba6SXin Li       {1, Person{"John", "Doe", 32}},
769*1a96fba6SXin Li       {2, Person{"Jane", "Smith", 48}},
770*1a96fba6SXin Li     }
771*1a96fba6SXin Li   };
772*1a96fba6SXin Li   AppendValueToWriter(&writer, data);
773*1a96fba6SXin Li 
774*1a96fba6SXin Li   EXPECT_EQ("aa{i(ssi)}", message->GetSignature());
775*1a96fba6SXin Li 
776*1a96fba6SXin Li   std::vector<std::map<int, Person>> data_out;
777*1a96fba6SXin Li 
778*1a96fba6SXin Li   MessageReader reader(message.get());
779*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &data_out));
780*1a96fba6SXin Li   EXPECT_FALSE(reader.HasMoreData());
781*1a96fba6SXin Li 
782*1a96fba6SXin Li   EXPECT_EQ(data, data_out);
783*1a96fba6SXin Li }
784*1a96fba6SXin Li 
TEST(DBusUtils,EmptyVariant)785*1a96fba6SXin Li TEST(DBusUtils, EmptyVariant) {
786*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
787*1a96fba6SXin Li   MessageWriter writer(message.get());
788*1a96fba6SXin Li   EXPECT_DEATH(AppendValueToWriter(&writer, Any{}),
789*1a96fba6SXin Li                "Must not be called on an empty Any");
790*1a96fba6SXin Li }
791*1a96fba6SXin Li 
TEST(DBusUtils,IncompatibleVariant)792*1a96fba6SXin Li TEST(DBusUtils, IncompatibleVariant) {
793*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
794*1a96fba6SXin Li   MessageWriter writer(message.get());
795*1a96fba6SXin Li   EXPECT_DEATH(AppendValueToWriter(&writer, Any{2.2f}),
796*1a96fba6SXin Li                "Type 'float' is not supported by D-Bus");
797*1a96fba6SXin Li }
798*1a96fba6SXin Li 
TEST(DBusUtils,Protobuf)799*1a96fba6SXin Li TEST(DBusUtils, Protobuf) {
800*1a96fba6SXin Li   std::unique_ptr<Response> message = Response::CreateEmpty();
801*1a96fba6SXin Li   MessageWriter writer(message.get());
802*1a96fba6SXin Li 
803*1a96fba6SXin Li   dbus_utils_test::TestMessage test_message;
804*1a96fba6SXin Li   test_message.set_foo(123);
805*1a96fba6SXin Li   test_message.set_bar("abcd");
806*1a96fba6SXin Li 
807*1a96fba6SXin Li   AppendValueToWriter(&writer, test_message);
808*1a96fba6SXin Li 
809*1a96fba6SXin Li   EXPECT_EQ("ay", message->GetSignature());
810*1a96fba6SXin Li 
811*1a96fba6SXin Li   dbus_utils_test::TestMessage test_message_out;
812*1a96fba6SXin Li 
813*1a96fba6SXin Li   MessageReader reader(message.get());
814*1a96fba6SXin Li   EXPECT_TRUE(PopValueFromReader(&reader, &test_message_out));
815*1a96fba6SXin Li   EXPECT_FALSE(reader.HasMoreData());
816*1a96fba6SXin Li 
817*1a96fba6SXin Li   EXPECT_EQ(123, test_message_out.foo());
818*1a96fba6SXin Li   EXPECT_EQ("abcd", test_message_out.bar());
819*1a96fba6SXin Li }
820*1a96fba6SXin Li 
821*1a96fba6SXin Li }  // namespace dbus_utils
822*1a96fba6SXin Li }  // namespace brillo
823