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