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