1 // Copyright 2014 The Chromium OS Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <brillo/dbus/dbus_param_writer.h>
6
7 #include <memory>
8 #include <string>
9
10 #include <brillo/any.h>
11 #include <gtest/gtest.h>
12
13 using dbus::MessageReader;
14 using dbus::MessageWriter;
15 using dbus::ObjectPath;
16 using dbus::Response;
17
18 namespace brillo {
19 namespace dbus_utils {
20
TEST(DBusParamWriter,Append_NoArgs)21 TEST(DBusParamWriter, Append_NoArgs) {
22 std::unique_ptr<Response> message = Response::CreateEmpty();
23 MessageWriter writer(message.get());
24 DBusParamWriter::Append(&writer);
25 EXPECT_EQ("", message->GetSignature());
26 }
27
TEST(DBusParamWriter,Append_OneArg)28 TEST(DBusParamWriter, Append_OneArg) {
29 std::unique_ptr<Response> message = Response::CreateEmpty();
30 MessageWriter writer(message.get());
31 DBusParamWriter::Append(&writer, int32_t{2});
32 EXPECT_EQ("i", message->GetSignature());
33 DBusParamWriter::Append(&writer, std::string{"foo"});
34 EXPECT_EQ("is", message->GetSignature());
35 DBusParamWriter::Append(&writer, ObjectPath{"/o"});
36 EXPECT_EQ("iso", message->GetSignature());
37
38 int32_t int_value = 0;
39 std::string string_value;
40 ObjectPath path_value;
41
42 MessageReader reader(message.get());
43 EXPECT_TRUE(PopValueFromReader(&reader, &int_value));
44 EXPECT_TRUE(PopValueFromReader(&reader, &string_value));
45 EXPECT_TRUE(PopValueFromReader(&reader, &path_value));
46
47 EXPECT_EQ(2, int_value);
48 EXPECT_EQ("foo", string_value);
49 EXPECT_EQ(ObjectPath{"/o"}, path_value);
50 }
51
TEST(DBusParamWriter,Append_ManyArgs)52 TEST(DBusParamWriter, Append_ManyArgs) {
53 std::unique_ptr<Response> message = Response::CreateEmpty();
54 MessageWriter writer(message.get());
55 DBusParamWriter::Append(&writer, int32_t{9}, Any{7.5}, true);
56 EXPECT_EQ("ivb", message->GetSignature());
57
58 int32_t int_value = 0;
59 Any variant_value;
60 bool bool_value = false;
61
62 MessageReader reader(message.get());
63 EXPECT_TRUE(PopValueFromReader(&reader, &int_value));
64 EXPECT_TRUE(PopValueFromReader(&reader, &variant_value));
65 EXPECT_TRUE(PopValueFromReader(&reader, &bool_value));
66
67 EXPECT_EQ(9, int_value);
68 EXPECT_DOUBLE_EQ(7.5, variant_value.Get<double>());
69 EXPECT_TRUE(bool_value);
70 }
71
TEST(DBusParamWriter,AppendDBusOutParams_NoArgs)72 TEST(DBusParamWriter, AppendDBusOutParams_NoArgs) {
73 std::unique_ptr<Response> message = Response::CreateEmpty();
74 MessageWriter writer(message.get());
75 DBusParamWriter::AppendDBusOutParams(&writer);
76 EXPECT_EQ("", message->GetSignature());
77 }
78
TEST(DBusParamWriter,AppendDBusOutParams_OneArg)79 TEST(DBusParamWriter, AppendDBusOutParams_OneArg) {
80 std::unique_ptr<Response> message = Response::CreateEmpty();
81 MessageWriter writer(message.get());
82 int32_t int_value_in{5};
83 std::string string_value_in{"bar"};
84 ObjectPath path_value_in{"/obj/path"};
85
86 DBusParamWriter::AppendDBusOutParams(&writer, &int_value_in);
87 EXPECT_EQ("i", message->GetSignature());
88 DBusParamWriter::AppendDBusOutParams(&writer, &string_value_in);
89 EXPECT_EQ("is", message->GetSignature());
90 DBusParamWriter::AppendDBusOutParams(&writer, &path_value_in);
91 EXPECT_EQ("iso", message->GetSignature());
92
93 int32_t int_value = 0;
94 std::string string_value;
95 ObjectPath path_value;
96
97 MessageReader reader(message.get());
98 EXPECT_TRUE(PopValueFromReader(&reader, &int_value));
99 EXPECT_TRUE(PopValueFromReader(&reader, &string_value));
100 EXPECT_TRUE(PopValueFromReader(&reader, &path_value));
101
102 EXPECT_EQ(5, int_value);
103 EXPECT_EQ("bar", string_value);
104 EXPECT_EQ(ObjectPath{"/obj/path"}, path_value);
105 }
106
TEST(DBusParamWriter,AppendDBusOutParams_ManyArgs)107 TEST(DBusParamWriter, AppendDBusOutParams_ManyArgs) {
108 std::unique_ptr<Response> message = Response::CreateEmpty();
109 MessageWriter writer(message.get());
110 int32_t int_value_in{8};
111 Any variant_value_in{8.5};
112 bool bool_value_in{true};
113 DBusParamWriter::AppendDBusOutParams(
114 &writer, &int_value_in, &variant_value_in, &bool_value_in);
115 EXPECT_EQ("ivb", message->GetSignature());
116
117 int32_t int_value = 0;
118 Any variant_value;
119 bool bool_value = false;
120
121 MessageReader reader(message.get());
122 EXPECT_TRUE(PopValueFromReader(&reader, &int_value));
123 EXPECT_TRUE(PopValueFromReader(&reader, &variant_value));
124 EXPECT_TRUE(PopValueFromReader(&reader, &bool_value));
125
126 EXPECT_EQ(8, int_value);
127 EXPECT_DOUBLE_EQ(8.5, variant_value.Get<double>());
128 EXPECT_TRUE(bool_value);
129 }
130
TEST(DBusParamWriter,AppendDBusOutParams_Mixed_NoArgs)131 TEST(DBusParamWriter, AppendDBusOutParams_Mixed_NoArgs) {
132 std::unique_ptr<Response> message = Response::CreateEmpty();
133 MessageWriter writer(message.get());
134 DBusParamWriter::AppendDBusOutParams(&writer, 3, 5);
135 EXPECT_EQ("", message->GetSignature());
136 }
137
TEST(DBusParamWriter,AppendDBusOutParams_Mixed_OneArg)138 TEST(DBusParamWriter, AppendDBusOutParams_Mixed_OneArg) {
139 std::unique_ptr<Response> message = Response::CreateEmpty();
140 MessageWriter writer(message.get());
141 int32_t int_value_in{5};
142 std::string str_value_in{"bar"};
143 ObjectPath path_value_in{"/obj"};
144
145 DBusParamWriter::AppendDBusOutParams(&writer, 2, &int_value_in);
146 EXPECT_EQ("i", message->GetSignature());
147 DBusParamWriter::AppendDBusOutParams(&writer, &str_value_in, 0);
148 EXPECT_EQ("is", message->GetSignature());
149 DBusParamWriter::AppendDBusOutParams(&writer, 1, &path_value_in, 2);
150 EXPECT_EQ("iso", message->GetSignature());
151
152 int32_t int_value = 0;
153 std::string string_value;
154 ObjectPath path_value;
155
156 MessageReader reader(message.get());
157 EXPECT_TRUE(PopValueFromReader(&reader, &int_value));
158 EXPECT_TRUE(PopValueFromReader(&reader, &string_value));
159 EXPECT_TRUE(PopValueFromReader(&reader, &path_value));
160
161 EXPECT_EQ(5, int_value);
162 EXPECT_EQ("bar", string_value);
163 EXPECT_EQ(ObjectPath{"/obj"}, path_value);
164 }
165
TEST(DBusParamWriter,AppendDBusOutParams_Mixed_ManyArgs)166 TEST(DBusParamWriter, AppendDBusOutParams_Mixed_ManyArgs) {
167 std::unique_ptr<Response> message = Response::CreateEmpty();
168 MessageWriter writer(message.get());
169 int32_t int_value_in{8};
170 Any variant_value_in{7.5};
171 bool bool_value_in{true};
172 DBusParamWriter::AppendDBusOutParams(
173 &writer, 0, &int_value_in, 1, &variant_value_in, 2, &bool_value_in, 3);
174 EXPECT_EQ("ivb", message->GetSignature());
175
176 int32_t int_value = 0;
177 Any variant_value;
178 bool bool_value = false;
179
180 MessageReader reader(message.get());
181 EXPECT_TRUE(PopValueFromReader(&reader, &int_value));
182 EXPECT_TRUE(PopValueFromReader(&reader, &variant_value));
183 EXPECT_TRUE(PopValueFromReader(&reader, &bool_value));
184
185 EXPECT_EQ(8, int_value);
186 EXPECT_DOUBLE_EQ(7.5, variant_value.Get<double>());
187 EXPECT_TRUE(bool_value);
188 }
189 } // namespace dbus_utils
190 } // namespace brillo
191