xref: /openbmc/sdbusplus/test/message/append.cpp (revision 95269dbc)
1*95269dbcSPatrick Venture #include <systemd/sd-bus-protocol.h>
2*95269dbcSPatrick Venture 
3a1e9e2aeSWilliam A. Kennington III #include <array>
4a1e9e2aeSWilliam A. Kennington III #include <map>
57802c074SPatrick Williams #include <sdbusplus/message.hpp>
6a1e9e2aeSWilliam A. Kennington III #include <sdbusplus/test/sdbus_mock.hpp>
728dc36d5SEd Tanous #include <set>
8a1e9e2aeSWilliam A. Kennington III #include <string>
9a1e9e2aeSWilliam A. Kennington III #include <tuple>
10a1e9e2aeSWilliam A. Kennington III #include <unordered_map>
11a1e9e2aeSWilliam A. Kennington III #include <vector>
121807fa47SPatrick Williams 
13*95269dbcSPatrick Venture #include <gmock/gmock.h>
14*95269dbcSPatrick Venture #include <gtest/gtest.h>
15*95269dbcSPatrick Venture 
16a1e9e2aeSWilliam A. Kennington III namespace
171807fa47SPatrick Williams {
185b485794SPatrick Williams 
19a1e9e2aeSWilliam A. Kennington III using testing::Eq;
20a1e9e2aeSWilliam A. Kennington III using testing::MatcherCast;
21a1e9e2aeSWilliam A. Kennington III using testing::Pointee;
22a1e9e2aeSWilliam A. Kennington III using testing::Return;
23a1e9e2aeSWilliam A. Kennington III using testing::SafeMatcherCast;
24a1e9e2aeSWilliam A. Kennington III using testing::StrEq;
25a1e9e2aeSWilliam A. Kennington III 
26a1e9e2aeSWilliam A. Kennington III class AppendTest : public testing::Test
27a1e9e2aeSWilliam A. Kennington III {
28a1e9e2aeSWilliam A. Kennington III   protected:
29a1e9e2aeSWilliam A. Kennington III     testing::StrictMock<sdbusplus::SdBusMock> mock;
30a1e9e2aeSWilliam A. Kennington III 
31a1e9e2aeSWilliam A. Kennington III     void SetUp() override
32a1e9e2aeSWilliam A. Kennington III     {
33a1e9e2aeSWilliam A. Kennington III         EXPECT_CALL(mock, sd_bus_message_new_method_call(testing::_, testing::_,
34a1e9e2aeSWilliam A. Kennington III                                                          nullptr, nullptr,
35a1e9e2aeSWilliam A. Kennington III                                                          nullptr, nullptr))
36a1e9e2aeSWilliam A. Kennington III             .WillRepeatedly(Return(0));
37a1e9e2aeSWilliam A. Kennington III     };
38a1e9e2aeSWilliam A. Kennington III 
39a1e9e2aeSWilliam A. Kennington III     sdbusplus::message::message new_message()
40a1e9e2aeSWilliam A. Kennington III     {
41a1e9e2aeSWilliam A. Kennington III         return sdbusplus::get_mocked_new(&mock).new_method_call(
42a1e9e2aeSWilliam A. Kennington III             nullptr, nullptr, nullptr, nullptr);
431807fa47SPatrick Williams     }
441807fa47SPatrick Williams 
45a1e9e2aeSWilliam A. Kennington III     template <typename T> void expect_basic(char type, T val)
461807fa47SPatrick Williams     {
47a1e9e2aeSWilliam A. Kennington III         EXPECT_CALL(mock,
48a1e9e2aeSWilliam A. Kennington III                     sd_bus_message_append_basic(
49a1e9e2aeSWilliam A. Kennington III                         nullptr, type,
50a1e9e2aeSWilliam A. Kennington III                         MatcherCast<const void *>(
51a1e9e2aeSWilliam A. Kennington III                             SafeMatcherCast<const T *>(Pointee(Eq(val))))))
52a1e9e2aeSWilliam A. Kennington III             .WillOnce(Return(0));
531807fa47SPatrick Williams     }
541807fa47SPatrick Williams 
55a1e9e2aeSWilliam A. Kennington III     void expect_basic_string(char type, const char *str)
561807fa47SPatrick Williams     {
57a1e9e2aeSWilliam A. Kennington III         EXPECT_CALL(mock, sd_bus_message_append_basic(
58a1e9e2aeSWilliam A. Kennington III                               nullptr, type,
59a1e9e2aeSWilliam A. Kennington III                               MatcherCast<const void *>(
60a1e9e2aeSWilliam A. Kennington III                                   SafeMatcherCast<const char *>(StrEq(str)))))
61a1e9e2aeSWilliam A. Kennington III             .WillOnce(Return(0));
62a1e9e2aeSWilliam A. Kennington III     }
63a1e9e2aeSWilliam A. Kennington III 
64a1e9e2aeSWilliam A. Kennington III     void expect_open_container(char type, const char *contents)
6507e1d6f3SPatrick Williams     {
66a1e9e2aeSWilliam A. Kennington III         EXPECT_CALL(
67a1e9e2aeSWilliam A. Kennington III             mock, sd_bus_message_open_container(nullptr, type, StrEq(contents)))
68a1e9e2aeSWilliam A. Kennington III             .WillOnce(Return(0));
69a1e9e2aeSWilliam A. Kennington III     }
70a1e9e2aeSWilliam A. Kennington III 
71a1e9e2aeSWilliam A. Kennington III     void expect_close_container()
72a1e9e2aeSWilliam A. Kennington III     {
73a1e9e2aeSWilliam A. Kennington III         EXPECT_CALL(mock, sd_bus_message_close_container(nullptr))
74a1e9e2aeSWilliam A. Kennington III             .WillOnce(Return(0));
75a1e9e2aeSWilliam A. Kennington III     }
76a1e9e2aeSWilliam A. Kennington III };
77a1e9e2aeSWilliam A. Kennington III 
78a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, RValueInt)
79a1e9e2aeSWilliam A. Kennington III {
80a1e9e2aeSWilliam A. Kennington III     expect_basic<int>(SD_BUS_TYPE_INT32, 1);
81a1e9e2aeSWilliam A. Kennington III     new_message().append(1);
82a1e9e2aeSWilliam A. Kennington III }
83a1e9e2aeSWilliam A. Kennington III 
84a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, LValueInt)
85a1e9e2aeSWilliam A. Kennington III {
86a1e9e2aeSWilliam A. Kennington III     const int a = 1;
87a1e9e2aeSWilliam A. Kennington III     expect_basic<int>(SD_BUS_TYPE_INT32, a);
88a1e9e2aeSWilliam A. Kennington III     new_message().append(a);
89a1e9e2aeSWilliam A. Kennington III }
90a1e9e2aeSWilliam A. Kennington III 
91a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, XValueInt)
92a1e9e2aeSWilliam A. Kennington III {
93a1e9e2aeSWilliam A. Kennington III     int a = 1;
94a1e9e2aeSWilliam A. Kennington III     expect_basic<int>(SD_BUS_TYPE_INT32, a);
95a1e9e2aeSWilliam A. Kennington III     new_message().append(std::move(a));
96a1e9e2aeSWilliam A. Kennington III }
97a1e9e2aeSWilliam A. Kennington III 
98a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, RValueBool)
99a1e9e2aeSWilliam A. Kennington III {
100a1e9e2aeSWilliam A. Kennington III     expect_basic<int>(SD_BUS_TYPE_BOOLEAN, true);
101a1e9e2aeSWilliam A. Kennington III     new_message().append(true);
102a1e9e2aeSWilliam A. Kennington III }
103a1e9e2aeSWilliam A. Kennington III 
104a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, LValueBool)
105a1e9e2aeSWilliam A. Kennington III {
106a1e9e2aeSWilliam A. Kennington III     const bool a = false;
107a1e9e2aeSWilliam A. Kennington III     expect_basic<int>(SD_BUS_TYPE_BOOLEAN, false);
108a1e9e2aeSWilliam A. Kennington III     new_message().append(a);
109a1e9e2aeSWilliam A. Kennington III }
110a1e9e2aeSWilliam A. Kennington III 
111a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, XValueBool)
112a1e9e2aeSWilliam A. Kennington III {
113a1e9e2aeSWilliam A. Kennington III     bool a = false;
114a1e9e2aeSWilliam A. Kennington III     expect_basic<int>(SD_BUS_TYPE_BOOLEAN, false);
115a1e9e2aeSWilliam A. Kennington III     new_message().append(std::move(a));
116a1e9e2aeSWilliam A. Kennington III }
117a1e9e2aeSWilliam A. Kennington III 
118a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, RValueDouble)
119a1e9e2aeSWilliam A. Kennington III {
120a1e9e2aeSWilliam A. Kennington III     expect_basic<double>(SD_BUS_TYPE_DOUBLE, 1.1);
121a1e9e2aeSWilliam A. Kennington III     new_message().append(1.1);
122a1e9e2aeSWilliam A. Kennington III }
123a1e9e2aeSWilliam A. Kennington III 
124a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, LValueDouble)
125a1e9e2aeSWilliam A. Kennington III {
126a1e9e2aeSWilliam A. Kennington III     const double a = 1.1;
127a1e9e2aeSWilliam A. Kennington III     expect_basic<double>(SD_BUS_TYPE_DOUBLE, a);
128a1e9e2aeSWilliam A. Kennington III     new_message().append(a);
129a1e9e2aeSWilliam A. Kennington III }
130a1e9e2aeSWilliam A. Kennington III 
131a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, XValueDouble)
132a1e9e2aeSWilliam A. Kennington III {
133a1e9e2aeSWilliam A. Kennington III     double a = 1.1;
134a1e9e2aeSWilliam A. Kennington III     expect_basic<double>(SD_BUS_TYPE_DOUBLE, a);
135a1e9e2aeSWilliam A. Kennington III     new_message().append(std::move(a));
136a1e9e2aeSWilliam A. Kennington III }
137a1e9e2aeSWilliam A. Kennington III 
138a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, RValueCString)
139a1e9e2aeSWilliam A. Kennington III {
140a1e9e2aeSWilliam A. Kennington III     expect_basic_string(SD_BUS_TYPE_STRING, "asdf");
141a1e9e2aeSWilliam A. Kennington III     new_message().append("asdf");
142a1e9e2aeSWilliam A. Kennington III }
143a1e9e2aeSWilliam A. Kennington III 
144a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, LValueCString)
145a1e9e2aeSWilliam A. Kennington III {
146a1e9e2aeSWilliam A. Kennington III     const char *const s = "asdf";
147a1e9e2aeSWilliam A. Kennington III     expect_basic_string(SD_BUS_TYPE_STRING, s);
148a1e9e2aeSWilliam A. Kennington III     new_message().append(s);
149a1e9e2aeSWilliam A. Kennington III }
150a1e9e2aeSWilliam A. Kennington III 
151a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, XValueCString)
152a1e9e2aeSWilliam A. Kennington III {
153a1e9e2aeSWilliam A. Kennington III     const char *s = "asdf";
154a1e9e2aeSWilliam A. Kennington III     expect_basic_string(SD_BUS_TYPE_STRING, s);
155a1e9e2aeSWilliam A. Kennington III     new_message().append(std::move(s));
156a1e9e2aeSWilliam A. Kennington III }
157a1e9e2aeSWilliam A. Kennington III 
158a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, RValueString)
159a1e9e2aeSWilliam A. Kennington III {
160a1e9e2aeSWilliam A. Kennington III     expect_basic_string(SD_BUS_TYPE_STRING, "asdf");
161a1e9e2aeSWilliam A. Kennington III     new_message().append(std::string{"asdf"});
162a1e9e2aeSWilliam A. Kennington III }
163a1e9e2aeSWilliam A. Kennington III 
164a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, LValueString)
165a1e9e2aeSWilliam A. Kennington III {
166a1e9e2aeSWilliam A. Kennington III     std::string s{"asdf"};
167a1e9e2aeSWilliam A. Kennington III     expect_basic_string(SD_BUS_TYPE_STRING, s.c_str());
168a1e9e2aeSWilliam A. Kennington III     new_message().append(s);
169a1e9e2aeSWilliam A. Kennington III }
170a1e9e2aeSWilliam A. Kennington III 
171a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, XValueString)
172a1e9e2aeSWilliam A. Kennington III {
173a1e9e2aeSWilliam A. Kennington III     std::string s{"asdf"};
174a1e9e2aeSWilliam A. Kennington III     expect_basic_string(SD_BUS_TYPE_STRING, s.c_str());
175a1e9e2aeSWilliam A. Kennington III     new_message().append(std::move(s));
176a1e9e2aeSWilliam A. Kennington III }
177a1e9e2aeSWilliam A. Kennington III 
178a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, ObjectPath)
179a1e9e2aeSWilliam A. Kennington III {
180a1e9e2aeSWilliam A. Kennington III     sdbusplus::message::object_path o{"/asdf"};
181a1e9e2aeSWilliam A. Kennington III     expect_basic_string(SD_BUS_TYPE_OBJECT_PATH, o.str.c_str());
182a1e9e2aeSWilliam A. Kennington III     new_message().append(o);
183a1e9e2aeSWilliam A. Kennington III }
184a1e9e2aeSWilliam A. Kennington III 
185a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, Signature)
186a1e9e2aeSWilliam A. Kennington III {
187a1e9e2aeSWilliam A. Kennington III     sdbusplus::message::signature g{"ii"};
188a1e9e2aeSWilliam A. Kennington III     expect_basic_string(SD_BUS_TYPE_SIGNATURE, g.str.c_str());
189a1e9e2aeSWilliam A. Kennington III     new_message().append(g);
190a1e9e2aeSWilliam A. Kennington III }
191a1e9e2aeSWilliam A. Kennington III 
192a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, CombinedBasic)
193a1e9e2aeSWilliam A. Kennington III {
194a1e9e2aeSWilliam A. Kennington III     const int c = 3;
195a1e9e2aeSWilliam A. Kennington III     const std::string s1{"fdsa"};
196a1e9e2aeSWilliam A. Kennington III     const char *const s2 = "asdf";
197a1e9e2aeSWilliam A. Kennington III 
198a1e9e2aeSWilliam A. Kennington III     {
199a1e9e2aeSWilliam A. Kennington III         testing::InSequence seq;
200a1e9e2aeSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_INT32, 1);
201a1e9e2aeSWilliam A. Kennington III         expect_basic<double>(SD_BUS_TYPE_DOUBLE, 2.2);
202a1e9e2aeSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_INT32, c);
203a1e9e2aeSWilliam A. Kennington III         expect_basic_string(SD_BUS_TYPE_STRING, s1.c_str());
204a1e9e2aeSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_BOOLEAN, false);
205a1e9e2aeSWilliam A. Kennington III         expect_basic_string(SD_BUS_TYPE_STRING, s2);
206a1e9e2aeSWilliam A. Kennington III     }
207a1e9e2aeSWilliam A. Kennington III     new_message().append(1, 2.2, c, s1, false, s2);
208a1e9e2aeSWilliam A. Kennington III }
209a1e9e2aeSWilliam A. Kennington III 
210a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, Array)
211a1e9e2aeSWilliam A. Kennington III {
212a1e9e2aeSWilliam A. Kennington III     const std::array<double, 4> a{1.1, 2.2, 3.3, 4.4};
213a1e9e2aeSWilliam A. Kennington III 
214a1e9e2aeSWilliam A. Kennington III     {
215a1e9e2aeSWilliam A. Kennington III         testing::InSequence seq;
216a1e9e2aeSWilliam A. Kennington III         expect_open_container(SD_BUS_TYPE_ARRAY, "d");
217a1e9e2aeSWilliam A. Kennington III         for (const auto &i : a)
218a1e9e2aeSWilliam A. Kennington III         {
219a1e9e2aeSWilliam A. Kennington III             expect_basic<double>(SD_BUS_TYPE_DOUBLE, i);
220a1e9e2aeSWilliam A. Kennington III         }
221a1e9e2aeSWilliam A. Kennington III         expect_close_container();
222a1e9e2aeSWilliam A. Kennington III     }
223a1e9e2aeSWilliam A. Kennington III     new_message().append(a);
224a1e9e2aeSWilliam A. Kennington III }
225a1e9e2aeSWilliam A. Kennington III 
226a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, Vector)
227a1e9e2aeSWilliam A. Kennington III {
228a1e9e2aeSWilliam A. Kennington III     const std::vector<int> v{1, 2, 3, 4};
229a1e9e2aeSWilliam A. Kennington III 
230a1e9e2aeSWilliam A. Kennington III     {
231a1e9e2aeSWilliam A. Kennington III         testing::InSequence seq;
232a1e9e2aeSWilliam A. Kennington III         expect_open_container(SD_BUS_TYPE_ARRAY, "i");
233a1e9e2aeSWilliam A. Kennington III         for (const auto &i : v)
234a1e9e2aeSWilliam A. Kennington III         {
235a1e9e2aeSWilliam A. Kennington III             expect_basic<int>(SD_BUS_TYPE_INT32, i);
236a1e9e2aeSWilliam A. Kennington III         }
237a1e9e2aeSWilliam A. Kennington III         expect_close_container();
238a1e9e2aeSWilliam A. Kennington III     }
239a1e9e2aeSWilliam A. Kennington III     new_message().append(v);
240a1e9e2aeSWilliam A. Kennington III }
241a1e9e2aeSWilliam A. Kennington III 
242a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, Set)
243a1e9e2aeSWilliam A. Kennington III {
244a1e9e2aeSWilliam A. Kennington III     const std::set<std::string> s{"one", "two", "eight"};
245a1e9e2aeSWilliam A. Kennington III 
246a1e9e2aeSWilliam A. Kennington III     {
247a1e9e2aeSWilliam A. Kennington III         testing::InSequence seq;
248a1e9e2aeSWilliam A. Kennington III         expect_open_container(SD_BUS_TYPE_ARRAY, "s");
249a1e9e2aeSWilliam A. Kennington III         for (const auto &i : s)
250a1e9e2aeSWilliam A. Kennington III         {
251a1e9e2aeSWilliam A. Kennington III             expect_basic_string(SD_BUS_TYPE_STRING, i.c_str());
252a1e9e2aeSWilliam A. Kennington III         }
253a1e9e2aeSWilliam A. Kennington III         expect_close_container();
254a1e9e2aeSWilliam A. Kennington III     }
255a1e9e2aeSWilliam A. Kennington III     new_message().append(s);
256a1e9e2aeSWilliam A. Kennington III }
257a1e9e2aeSWilliam A. Kennington III 
258a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, Map)
259a1e9e2aeSWilliam A. Kennington III {
260a1e9e2aeSWilliam A. Kennington III     const std::map<int, std::string> m{
261a1e9e2aeSWilliam A. Kennington III         {1, "a"},
262a1e9e2aeSWilliam A. Kennington III         {2, "bc"},
263a1e9e2aeSWilliam A. Kennington III         {3, "def"},
264a1e9e2aeSWilliam A. Kennington III         {4, "ghij"},
265a1e9e2aeSWilliam A. Kennington III     };
266a1e9e2aeSWilliam A. Kennington III 
267a1e9e2aeSWilliam A. Kennington III     {
268a1e9e2aeSWilliam A. Kennington III         testing::InSequence seq;
269a1e9e2aeSWilliam A. Kennington III         expect_open_container(SD_BUS_TYPE_ARRAY, "{is}");
270a1e9e2aeSWilliam A. Kennington III         for (const auto &i : m)
271a1e9e2aeSWilliam A. Kennington III         {
272a1e9e2aeSWilliam A. Kennington III             expect_open_container(SD_BUS_TYPE_DICT_ENTRY, "is");
273a1e9e2aeSWilliam A. Kennington III             expect_basic<int>(SD_BUS_TYPE_INT32, i.first);
274a1e9e2aeSWilliam A. Kennington III             expect_basic_string(SD_BUS_TYPE_STRING, i.second.c_str());
275a1e9e2aeSWilliam A. Kennington III             expect_close_container();
276a1e9e2aeSWilliam A. Kennington III         }
277a1e9e2aeSWilliam A. Kennington III         expect_close_container();
278a1e9e2aeSWilliam A. Kennington III     }
279a1e9e2aeSWilliam A. Kennington III     new_message().append(m);
280a1e9e2aeSWilliam A. Kennington III }
281a1e9e2aeSWilliam A. Kennington III 
282a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, UnorderedMap)
283a1e9e2aeSWilliam A. Kennington III {
284a1e9e2aeSWilliam A. Kennington III     const std::unordered_map<int, bool> m{
285a1e9e2aeSWilliam A. Kennington III         {1, false},
286a1e9e2aeSWilliam A. Kennington III         {2, true},
287a1e9e2aeSWilliam A. Kennington III         {3, true},
288a1e9e2aeSWilliam A. Kennington III         {4, false},
289a1e9e2aeSWilliam A. Kennington III     };
290a1e9e2aeSWilliam A. Kennington III 
291a1e9e2aeSWilliam A. Kennington III     {
292a1e9e2aeSWilliam A. Kennington III         testing::InSequence seq;
293a1e9e2aeSWilliam A. Kennington III         expect_open_container(SD_BUS_TYPE_ARRAY, "{ib}");
294a1e9e2aeSWilliam A. Kennington III         for (const auto &i : m)
295a1e9e2aeSWilliam A. Kennington III         {
296a1e9e2aeSWilliam A. Kennington III             expect_open_container(SD_BUS_TYPE_DICT_ENTRY, "ib");
297a1e9e2aeSWilliam A. Kennington III             expect_basic<int>(SD_BUS_TYPE_INT32, i.first);
298a1e9e2aeSWilliam A. Kennington III             expect_basic<int>(SD_BUS_TYPE_BOOLEAN, i.second);
299a1e9e2aeSWilliam A. Kennington III             expect_close_container();
300a1e9e2aeSWilliam A. Kennington III         }
301a1e9e2aeSWilliam A. Kennington III         expect_close_container();
302a1e9e2aeSWilliam A. Kennington III     }
303a1e9e2aeSWilliam A. Kennington III     new_message().append(m);
304a1e9e2aeSWilliam A. Kennington III }
305a1e9e2aeSWilliam A. Kennington III 
306a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, Tuple)
307a1e9e2aeSWilliam A. Kennington III {
308a1e9e2aeSWilliam A. Kennington III     const std::tuple<int, std::string, bool> t{5, "asdf", false};
309a1e9e2aeSWilliam A. Kennington III 
310a1e9e2aeSWilliam A. Kennington III     {
311a1e9e2aeSWilliam A. Kennington III         testing::InSequence seq;
312a1e9e2aeSWilliam A. Kennington III         expect_open_container(SD_BUS_TYPE_STRUCT, "isb");
313a1e9e2aeSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_INT32, std::get<0>(t));
314a1e9e2aeSWilliam A. Kennington III         expect_basic_string(SD_BUS_TYPE_STRING, std::get<1>(t).c_str());
315a1e9e2aeSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_BOOLEAN, std::get<2>(t));
316a1e9e2aeSWilliam A. Kennington III         expect_close_container();
317a1e9e2aeSWilliam A. Kennington III     }
318a1e9e2aeSWilliam A. Kennington III     new_message().append(t);
319a1e9e2aeSWilliam A. Kennington III }
320a1e9e2aeSWilliam A. Kennington III 
321a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, Variant)
322a1e9e2aeSWilliam A. Kennington III {
323a1e9e2aeSWilliam A. Kennington III     const bool b1 = false;
324a1e9e2aeSWilliam A. Kennington III     const std::string s2{"asdf"};
325a1e9e2aeSWilliam A. Kennington III     const sdbusplus::message::variant<int, std::string, bool> v1{b1}, v2{s2};
326a1e9e2aeSWilliam A. Kennington III 
327a1e9e2aeSWilliam A. Kennington III     {
328a1e9e2aeSWilliam A. Kennington III         testing::InSequence seq;
329a1e9e2aeSWilliam A. Kennington III         expect_open_container(SD_BUS_TYPE_VARIANT, "b");
330a1e9e2aeSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_BOOLEAN, b1);
331a1e9e2aeSWilliam A. Kennington III         expect_close_container();
332a1e9e2aeSWilliam A. Kennington III         expect_open_container(SD_BUS_TYPE_VARIANT, "s");
333a1e9e2aeSWilliam A. Kennington III         expect_basic_string(SD_BUS_TYPE_STRING, s2.c_str());
334a1e9e2aeSWilliam A. Kennington III         expect_close_container();
335a1e9e2aeSWilliam A. Kennington III     }
336a1e9e2aeSWilliam A. Kennington III     new_message().append(v1, v2);
337a1e9e2aeSWilliam A. Kennington III }
338a1e9e2aeSWilliam A. Kennington III 
339a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, LargeCombo)
340a1e9e2aeSWilliam A. Kennington III {
341a1e9e2aeSWilliam A. Kennington III     std::vector<std::array<std::string, 3>> vas{{"a", "b", "c"},
342a1e9e2aeSWilliam A. Kennington III                                                 {"d", "", "e"}};
343a1e9e2aeSWilliam A. Kennington III     std::map<std::string, sdbusplus::message::variant<int, double>> msv = {
344a1e9e2aeSWilliam A. Kennington III         {"a", 3.3}, {"b", 1}, {"c", 4.4}};
345a1e9e2aeSWilliam A. Kennington III 
346a1e9e2aeSWilliam A. Kennington III     {
347a1e9e2aeSWilliam A. Kennington III         testing::InSequence seq;
348a1e9e2aeSWilliam A. Kennington III 
349a1e9e2aeSWilliam A. Kennington III         expect_open_container(SD_BUS_TYPE_ARRAY, "as");
350a1e9e2aeSWilliam A. Kennington III         for (const auto &as : vas)
351a1e9e2aeSWilliam A. Kennington III         {
352a1e9e2aeSWilliam A. Kennington III             expect_open_container(SD_BUS_TYPE_ARRAY, "s");
353a1e9e2aeSWilliam A. Kennington III             for (const auto &s : as)
354a1e9e2aeSWilliam A. Kennington III             {
355a1e9e2aeSWilliam A. Kennington III                 expect_basic_string(SD_BUS_TYPE_STRING, s.c_str());
356a1e9e2aeSWilliam A. Kennington III             }
357a1e9e2aeSWilliam A. Kennington III             expect_close_container();
358a1e9e2aeSWilliam A. Kennington III         }
359a1e9e2aeSWilliam A. Kennington III         expect_close_container();
360a1e9e2aeSWilliam A. Kennington III 
361a1e9e2aeSWilliam A. Kennington III         expect_open_container(SD_BUS_TYPE_ARRAY, "{sv}");
362a1e9e2aeSWilliam A. Kennington III         for (const auto &sv : msv)
363a1e9e2aeSWilliam A. Kennington III         {
364a1e9e2aeSWilliam A. Kennington III             expect_open_container(SD_BUS_TYPE_DICT_ENTRY, "sv");
365a1e9e2aeSWilliam A. Kennington III             expect_basic_string(SD_BUS_TYPE_STRING, sv.first.c_str());
366a1e9e2aeSWilliam A. Kennington III             if (sv.second.is<int>())
367a1e9e2aeSWilliam A. Kennington III             {
368a1e9e2aeSWilliam A. Kennington III                 expect_open_container(SD_BUS_TYPE_VARIANT, "i");
369a1e9e2aeSWilliam A. Kennington III                 expect_basic<int>(SD_BUS_TYPE_INT32, sv.second.get<int>());
370a1e9e2aeSWilliam A. Kennington III                 expect_close_container();
37107e1d6f3SPatrick Williams             }
37207e1d6f3SPatrick Williams             else
37307e1d6f3SPatrick Williams             {
374a1e9e2aeSWilliam A. Kennington III                 expect_open_container(SD_BUS_TYPE_VARIANT, "d");
375a1e9e2aeSWilliam A. Kennington III                 expect_basic<double>(SD_BUS_TYPE_DOUBLE,
376a1e9e2aeSWilliam A. Kennington III                                      sv.second.get<double>());
377a1e9e2aeSWilliam A. Kennington III                 expect_close_container();
37807e1d6f3SPatrick Williams             }
379a1e9e2aeSWilliam A. Kennington III             expect_close_container();
3801807fa47SPatrick Williams         }
381a1e9e2aeSWilliam A. Kennington III         expect_close_container();
382a1e9e2aeSWilliam A. Kennington III     }
383a1e9e2aeSWilliam A. Kennington III     new_message().append(vas, msv);
3841807fa47SPatrick Williams }
385b5645509SWilliam A. Kennington III 
386a1e9e2aeSWilliam A. Kennington III } // namespace
387