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