xref: /openbmc/sdbusplus/test/message/append.cpp (revision cb2fbeb9)
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>
5127b8abeSPatrick Williams 
6127b8abeSPatrick Williams #include <array>
7127b8abeSPatrick Williams #include <map>
828dc36d5SEd Tanous #include <set>
9b7329a90SPatrick Williams #include <span>
10a1e9e2aeSWilliam A. Kennington III #include <string>
11a1e9e2aeSWilliam A. Kennington III #include <tuple>
12a1e9e2aeSWilliam A. Kennington III #include <unordered_map>
13b98bdc6fSPatrick Williams #include <unordered_set>
144274c117SWilliam A. Kennington III #include <variant>
15a1e9e2aeSWilliam A. Kennington III #include <vector>
161807fa47SPatrick Williams 
1795269dbcSPatrick Venture #include <gmock/gmock.h>
1895269dbcSPatrick Venture #include <gtest/gtest.h>
1995269dbcSPatrick Venture 
20a1e9e2aeSWilliam A. Kennington III namespace
211807fa47SPatrick Williams {
225b485794SPatrick Williams 
23a1e9e2aeSWilliam A. Kennington III using testing::Eq;
24a1e9e2aeSWilliam A. Kennington III using testing::MatcherCast;
25a1e9e2aeSWilliam A. Kennington III using testing::Pointee;
26a1e9e2aeSWilliam A. Kennington III using testing::Return;
27a1e9e2aeSWilliam A. Kennington III using testing::SafeMatcherCast;
28a1e9e2aeSWilliam A. Kennington III using testing::StrEq;
29a1e9e2aeSWilliam A. Kennington III 
30640a7d56SEd Tanous MATCHER_P(iovec_equal, match_string, "")
31640a7d56SEd Tanous {
32640a7d56SEd Tanous     const char* start = std::bit_cast<char*>(arg->iov_base);
33640a7d56SEd Tanous     return std::string(start, arg->iov_len) == match_string;
34640a7d56SEd Tanous }
35640a7d56SEd Tanous 
36a1e9e2aeSWilliam A. Kennington III class AppendTest : public testing::Test
37a1e9e2aeSWilliam A. Kennington III {
38a1e9e2aeSWilliam A. Kennington III   protected:
39a1e9e2aeSWilliam A. Kennington III     testing::StrictMock<sdbusplus::SdBusMock> mock;
40a1e9e2aeSWilliam A. Kennington III 
SetUp()41a1e9e2aeSWilliam A. Kennington III     void SetUp() override
42a1e9e2aeSWilliam A. Kennington III     {
43a1e9e2aeSWilliam A. Kennington III         EXPECT_CALL(mock, sd_bus_message_new_method_call(testing::_, testing::_,
44a1e9e2aeSWilliam A. Kennington III                                                          nullptr, nullptr,
45a1e9e2aeSWilliam A. Kennington III                                                          nullptr, nullptr))
46a1e9e2aeSWilliam A. Kennington III             .WillRepeatedly(Return(0));
47*cb2fbeb9SEd Tanous     }
48a1e9e2aeSWilliam A. Kennington III 
new_message()4910d7aa12SPatrick Williams     sdbusplus::message_t new_message()
50a1e9e2aeSWilliam A. Kennington III     {
51a1e9e2aeSWilliam A. Kennington III         return sdbusplus::get_mocked_new(&mock).new_method_call(
52a1e9e2aeSWilliam A. Kennington III             nullptr, nullptr, nullptr, nullptr);
531807fa47SPatrick Williams     }
541807fa47SPatrick Williams 
552b238afbSPatrick Venture     template <typename T>
expect_basic(char type,T val)562b238afbSPatrick Venture     void expect_basic(char type, T val)
571807fa47SPatrick Williams     {
58e0d6965eSWilliam 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 T*>(Pointee(Eq(val))))))
62a1e9e2aeSWilliam A. Kennington III             .WillOnce(Return(0));
631807fa47SPatrick Williams     }
641807fa47SPatrick Williams 
expect_basic_string(char type,const char * str)65a1e9e2aeSWilliam A. Kennington III     void expect_basic_string(char type, const char* str)
661807fa47SPatrick Williams     {
67a1e9e2aeSWilliam A. Kennington III         EXPECT_CALL(mock, sd_bus_message_append_basic(
68a1e9e2aeSWilliam A. Kennington III                               nullptr, type,
69a1e9e2aeSWilliam A. Kennington III                               MatcherCast<const void*>(
70a1e9e2aeSWilliam A. Kennington III                                   SafeMatcherCast<const char*>(StrEq(str)))))
71a1e9e2aeSWilliam A. Kennington III             .WillOnce(Return(0));
72a1e9e2aeSWilliam A. Kennington III     }
expect_basic_string_iovec(const char * str,size_t size)73640a7d56SEd Tanous     void expect_basic_string_iovec(const char* str, size_t size)
74640a7d56SEd Tanous     {
75640a7d56SEd Tanous         std::string tmp = {str, size};
76640a7d56SEd Tanous         EXPECT_CALL(mock, sd_bus_message_append_string_iovec(
77640a7d56SEd Tanous                               nullptr, iovec_equal(tmp), 1))
78640a7d56SEd Tanous             .WillOnce(Return(0));
79640a7d56SEd Tanous     }
80a1e9e2aeSWilliam A. Kennington III 
expect_open_container(char type,const char * contents)81a1e9e2aeSWilliam A. Kennington III     void expect_open_container(char type, const char* contents)
8207e1d6f3SPatrick Williams     {
83a1e9e2aeSWilliam A. Kennington III         EXPECT_CALL(
84a1e9e2aeSWilliam A. Kennington III             mock, sd_bus_message_open_container(nullptr, type, StrEq(contents)))
85a1e9e2aeSWilliam A. Kennington III             .WillOnce(Return(0));
86a1e9e2aeSWilliam A. Kennington III     }
87a1e9e2aeSWilliam A. Kennington III 
expect_close_container()88a1e9e2aeSWilliam A. Kennington III     void expect_close_container()
89a1e9e2aeSWilliam A. Kennington III     {
90a1e9e2aeSWilliam A. Kennington III         EXPECT_CALL(mock, sd_bus_message_close_container(nullptr))
91a1e9e2aeSWilliam A. Kennington III             .WillOnce(Return(0));
92a1e9e2aeSWilliam A. Kennington III     }
93a1e9e2aeSWilliam A. Kennington III };
94a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,RValueInt)95a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, RValueInt)
96a1e9e2aeSWilliam A. Kennington III {
97b7329a90SPatrick Williams     static_assert(
98b7329a90SPatrick Williams         sdbusplus::message::details::can_append_multiple_v<decltype(1)>);
99a1e9e2aeSWilliam A. Kennington III     expect_basic<int>(SD_BUS_TYPE_INT32, 1);
100a1e9e2aeSWilliam A. Kennington III     new_message().append(1);
101a1e9e2aeSWilliam A. Kennington III }
102a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,LValueInt)103a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, LValueInt)
104a1e9e2aeSWilliam A. Kennington III {
105a1e9e2aeSWilliam A. Kennington III     const int a = 1;
106b7329a90SPatrick Williams     static_assert(
107b7329a90SPatrick Williams         sdbusplus::message::details::can_append_multiple_v<decltype(a)>);
108a1e9e2aeSWilliam A. Kennington III     expect_basic<int>(SD_BUS_TYPE_INT32, a);
109a1e9e2aeSWilliam A. Kennington III     new_message().append(a);
110a1e9e2aeSWilliam A. Kennington III }
111a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,XValueInt)112a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, XValueInt)
113a1e9e2aeSWilliam A. Kennington III {
114a1e9e2aeSWilliam A. Kennington III     int a = 1;
115a1e9e2aeSWilliam A. Kennington III     expect_basic<int>(SD_BUS_TYPE_INT32, a);
116a1e9e2aeSWilliam A. Kennington III     new_message().append(std::move(a));
117a1e9e2aeSWilliam A. Kennington III }
118a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,RValueBool)119a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, RValueBool)
120a1e9e2aeSWilliam A. Kennington III {
121a1e9e2aeSWilliam A. Kennington III     expect_basic<int>(SD_BUS_TYPE_BOOLEAN, true);
122a1e9e2aeSWilliam A. Kennington III     new_message().append(true);
123a1e9e2aeSWilliam A. Kennington III }
124a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,LValueBool)125a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, LValueBool)
126a1e9e2aeSWilliam A. Kennington III {
127a1e9e2aeSWilliam A. Kennington III     const bool a = false;
128a1e9e2aeSWilliam A. Kennington III     expect_basic<int>(SD_BUS_TYPE_BOOLEAN, false);
129a1e9e2aeSWilliam A. Kennington III     new_message().append(a);
130a1e9e2aeSWilliam A. Kennington III }
131a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,XValueBool)132a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, XValueBool)
133a1e9e2aeSWilliam A. Kennington III {
134a1e9e2aeSWilliam A. Kennington III     bool a = false;
135a1e9e2aeSWilliam A. Kennington III     expect_basic<int>(SD_BUS_TYPE_BOOLEAN, false);
136a1e9e2aeSWilliam A. Kennington III     new_message().append(std::move(a));
137a1e9e2aeSWilliam A. Kennington III }
138a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,RValueDouble)139a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, RValueDouble)
140a1e9e2aeSWilliam A. Kennington III {
141a1e9e2aeSWilliam A. Kennington III     expect_basic<double>(SD_BUS_TYPE_DOUBLE, 1.1);
142a1e9e2aeSWilliam A. Kennington III     new_message().append(1.1);
143a1e9e2aeSWilliam A. Kennington III }
144a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,LValueDouble)145a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, LValueDouble)
146a1e9e2aeSWilliam A. Kennington III {
147a1e9e2aeSWilliam A. Kennington III     const double a = 1.1;
148a1e9e2aeSWilliam A. Kennington III     expect_basic<double>(SD_BUS_TYPE_DOUBLE, a);
149a1e9e2aeSWilliam A. Kennington III     new_message().append(a);
150a1e9e2aeSWilliam A. Kennington III }
151a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,XValueDouble)152a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, XValueDouble)
153a1e9e2aeSWilliam A. Kennington III {
154a1e9e2aeSWilliam A. Kennington III     double a = 1.1;
155a1e9e2aeSWilliam A. Kennington III     expect_basic<double>(SD_BUS_TYPE_DOUBLE, a);
156a1e9e2aeSWilliam A. Kennington III     new_message().append(std::move(a));
157a1e9e2aeSWilliam A. Kennington III }
158a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,RValueCString)159a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, RValueCString)
160a1e9e2aeSWilliam A. Kennington III {
161a1e9e2aeSWilliam A. Kennington III     expect_basic_string(SD_BUS_TYPE_STRING, "asdf");
162a1e9e2aeSWilliam A. Kennington III     new_message().append("asdf");
163a1e9e2aeSWilliam A. Kennington III }
164a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,LValueCString)165a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, LValueCString)
166a1e9e2aeSWilliam A. Kennington III {
167a1e9e2aeSWilliam A. Kennington III     const char* const s = "asdf";
168a1e9e2aeSWilliam A. Kennington III     expect_basic_string(SD_BUS_TYPE_STRING, s);
169a1e9e2aeSWilliam A. Kennington III     new_message().append(s);
170a1e9e2aeSWilliam A. Kennington III }
171a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,XValueCString)172a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, XValueCString)
173a1e9e2aeSWilliam A. Kennington III {
174a1e9e2aeSWilliam A. Kennington III     const char* s = "asdf";
175b7329a90SPatrick Williams     static_assert(
176b7329a90SPatrick Williams         sdbusplus::message::details::can_append_multiple_v<decltype(s)>);
177a1e9e2aeSWilliam A. Kennington III     expect_basic_string(SD_BUS_TYPE_STRING, s);
178a1e9e2aeSWilliam A. Kennington III     new_message().append(std::move(s));
179a1e9e2aeSWilliam A. Kennington III }
180a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,RValueString)181a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, RValueString)
182a1e9e2aeSWilliam A. Kennington III {
183a1e9e2aeSWilliam A. Kennington III     expect_basic_string(SD_BUS_TYPE_STRING, "asdf");
184a1e9e2aeSWilliam A. Kennington III     new_message().append(std::string{"asdf"});
185a1e9e2aeSWilliam A. Kennington III }
186a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,LValueString)187a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, LValueString)
188a1e9e2aeSWilliam A. Kennington III {
189a1e9e2aeSWilliam A. Kennington III     std::string s{"asdf"};
190b7329a90SPatrick Williams     static_assert(
191b7329a90SPatrick Williams         !sdbusplus::message::details::can_append_multiple_v<decltype(s)>);
192a1e9e2aeSWilliam A. Kennington III     expect_basic_string(SD_BUS_TYPE_STRING, s.c_str());
193a1e9e2aeSWilliam A. Kennington III     new_message().append(s);
194a1e9e2aeSWilliam A. Kennington III }
195a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,XValueString)196a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, XValueString)
197a1e9e2aeSWilliam A. Kennington III {
198a1e9e2aeSWilliam A. Kennington III     std::string s{"asdf"};
199a1e9e2aeSWilliam A. Kennington III     expect_basic_string(SD_BUS_TYPE_STRING, s.c_str());
200a1e9e2aeSWilliam A. Kennington III     new_message().append(std::move(s));
201a1e9e2aeSWilliam A. Kennington III }
202a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,LValueStringView)203640a7d56SEd Tanous TEST_F(AppendTest, LValueStringView)
204640a7d56SEd Tanous {
205640a7d56SEd Tanous     std::string_view s{"asdf"};
206640a7d56SEd Tanous     expect_basic_string_iovec(s.data(), s.size());
207640a7d56SEd Tanous     new_message().append(s);
208640a7d56SEd Tanous }
209640a7d56SEd Tanous 
TEST_F(AppendTest,RValueStringView)210640a7d56SEd Tanous TEST_F(AppendTest, RValueStringView)
211640a7d56SEd Tanous {
212640a7d56SEd Tanous     std::string_view s{"asdf"};
213640a7d56SEd Tanous     expect_basic_string_iovec(s.data(), s.size());
214640a7d56SEd Tanous     new_message().append(std::string_view{"asdf"});
215640a7d56SEd Tanous }
216640a7d56SEd Tanous 
TEST_F(AppendTest,ObjectPath)217a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, ObjectPath)
218a1e9e2aeSWilliam A. Kennington III {
219a1e9e2aeSWilliam A. Kennington III     sdbusplus::message::object_path o{"/asdf"};
220a1e9e2aeSWilliam A. Kennington III     expect_basic_string(SD_BUS_TYPE_OBJECT_PATH, o.str.c_str());
221a1e9e2aeSWilliam A. Kennington III     new_message().append(o);
222a1e9e2aeSWilliam A. Kennington III }
223a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,Signature)224a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, Signature)
225a1e9e2aeSWilliam A. Kennington III {
226a1e9e2aeSWilliam A. Kennington III     sdbusplus::message::signature g{"ii"};
227a1e9e2aeSWilliam A. Kennington III     expect_basic_string(SD_BUS_TYPE_SIGNATURE, g.str.c_str());
228a1e9e2aeSWilliam A. Kennington III     new_message().append(g);
229a1e9e2aeSWilliam A. Kennington III }
230a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,CombinedBasic)231a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, CombinedBasic)
232a1e9e2aeSWilliam A. Kennington III {
233a1e9e2aeSWilliam A. Kennington III     const int c = 3;
234a1e9e2aeSWilliam A. Kennington III     const std::string s1{"fdsa"};
235a1e9e2aeSWilliam A. Kennington III     const char* const s2 = "asdf";
236a1e9e2aeSWilliam A. Kennington III 
237a1e9e2aeSWilliam A. Kennington III     {
238a1e9e2aeSWilliam A. Kennington III         testing::InSequence seq;
239a1e9e2aeSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_INT32, 1);
240a1e9e2aeSWilliam A. Kennington III         expect_basic<double>(SD_BUS_TYPE_DOUBLE, 2.2);
241a1e9e2aeSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_INT32, c);
242a1e9e2aeSWilliam A. Kennington III         expect_basic_string(SD_BUS_TYPE_STRING, s1.c_str());
243a1e9e2aeSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_BOOLEAN, false);
244a1e9e2aeSWilliam A. Kennington III         expect_basic_string(SD_BUS_TYPE_STRING, s2);
245a1e9e2aeSWilliam A. Kennington III     }
246a1e9e2aeSWilliam A. Kennington III     new_message().append(1, 2.2, c, s1, false, s2);
247a1e9e2aeSWilliam A. Kennington III }
248a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,Array)249a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, Array)
250a1e9e2aeSWilliam A. Kennington III {
251a1e9e2aeSWilliam A. Kennington III     const std::array<double, 4> a{1.1, 2.2, 3.3, 4.4};
252b7329a90SPatrick Williams     static_assert(
253b7329a90SPatrick Williams         !sdbusplus::message::details::can_append_multiple_v<decltype(a)>);
254a1e9e2aeSWilliam A. Kennington III 
255a1e9e2aeSWilliam A. Kennington III     {
256a1e9e2aeSWilliam A. Kennington III         testing::InSequence seq;
257a1e9e2aeSWilliam A. Kennington III         expect_open_container(SD_BUS_TYPE_ARRAY, "d");
258a1e9e2aeSWilliam A. Kennington III         for (const auto& i : a)
259a1e9e2aeSWilliam A. Kennington III         {
260a1e9e2aeSWilliam A. Kennington III             expect_basic<double>(SD_BUS_TYPE_DOUBLE, i);
261a1e9e2aeSWilliam A. Kennington III         }
262a1e9e2aeSWilliam A. Kennington III         expect_close_container();
263a1e9e2aeSWilliam A. Kennington III     }
264a1e9e2aeSWilliam A. Kennington III     new_message().append(a);
265a1e9e2aeSWilliam A. Kennington III }
266a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,Span)267b7329a90SPatrick Williams TEST_F(AppendTest, Span)
268b7329a90SPatrick Williams {
269b7329a90SPatrick Williams     const std::array<double, 4> a{1.1, 2.2, 3.3, 4.4};
270b7329a90SPatrick Williams     auto s = std::span{a};
271b7329a90SPatrick Williams     static_assert(
272b7329a90SPatrick Williams         !sdbusplus::message::details::can_append_multiple_v<decltype(s)>);
273b7329a90SPatrick Williams 
274b7329a90SPatrick Williams     {
275b7329a90SPatrick Williams         testing::InSequence seq;
276b7329a90SPatrick Williams         expect_open_container(SD_BUS_TYPE_ARRAY, "d");
277b7329a90SPatrick Williams         for (const auto& i : s)
278b7329a90SPatrick Williams         {
279b7329a90SPatrick Williams             expect_basic<double>(SD_BUS_TYPE_DOUBLE, i);
280b7329a90SPatrick Williams         }
281b7329a90SPatrick Williams         expect_close_container();
282b7329a90SPatrick Williams     }
283b7329a90SPatrick Williams     new_message().append(s);
284b7329a90SPatrick Williams }
285b7329a90SPatrick Williams 
TEST_F(AppendTest,Vector)286a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, Vector)
287a1e9e2aeSWilliam A. Kennington III {
288a1e9e2aeSWilliam A. Kennington III     const std::vector<int> v{1, 2, 3, 4};
289a1e9e2aeSWilliam A. Kennington III 
290a1e9e2aeSWilliam A. Kennington III     {
291a1e9e2aeSWilliam A. Kennington III         testing::InSequence seq;
292a1e9e2aeSWilliam A. Kennington III         expect_open_container(SD_BUS_TYPE_ARRAY, "i");
293a1e9e2aeSWilliam A. Kennington III         for (const auto& i : v)
294a1e9e2aeSWilliam A. Kennington III         {
295a1e9e2aeSWilliam A. Kennington III             expect_basic<int>(SD_BUS_TYPE_INT32, i);
296a1e9e2aeSWilliam A. Kennington III         }
297a1e9e2aeSWilliam A. Kennington III         expect_close_container();
298a1e9e2aeSWilliam A. Kennington III     }
299a1e9e2aeSWilliam A. Kennington III     new_message().append(v);
300a1e9e2aeSWilliam A. Kennington III }
301a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,Set)302a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, Set)
303a1e9e2aeSWilliam A. Kennington III {
304a1e9e2aeSWilliam A. Kennington III     const std::set<std::string> s{"one", "two", "eight"};
305a1e9e2aeSWilliam A. Kennington III 
306a1e9e2aeSWilliam A. Kennington III     {
307a1e9e2aeSWilliam A. Kennington III         testing::InSequence seq;
308a1e9e2aeSWilliam A. Kennington III         expect_open_container(SD_BUS_TYPE_ARRAY, "s");
309a1e9e2aeSWilliam A. Kennington III         for (const auto& i : s)
310a1e9e2aeSWilliam A. Kennington III         {
311a1e9e2aeSWilliam A. Kennington III             expect_basic_string(SD_BUS_TYPE_STRING, i.c_str());
312a1e9e2aeSWilliam A. Kennington III         }
313a1e9e2aeSWilliam A. Kennington III         expect_close_container();
314a1e9e2aeSWilliam A. Kennington III     }
315a1e9e2aeSWilliam A. Kennington III     new_message().append(s);
316a1e9e2aeSWilliam A. Kennington III }
317a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,UnorderedSet)318b98bdc6fSPatrick Williams TEST_F(AppendTest, UnorderedSet)
319b98bdc6fSPatrick Williams {
320b98bdc6fSPatrick Williams     const std::unordered_set<std::string> s{"one", "two", "eight"};
321b98bdc6fSPatrick Williams 
322b98bdc6fSPatrick Williams     {
323b98bdc6fSPatrick Williams         testing::InSequence seq;
324b98bdc6fSPatrick Williams         expect_open_container(SD_BUS_TYPE_ARRAY, "s");
325b98bdc6fSPatrick Williams         for (const auto& i : s)
326b98bdc6fSPatrick Williams         {
327b98bdc6fSPatrick Williams             expect_basic_string(SD_BUS_TYPE_STRING, i.c_str());
328b98bdc6fSPatrick Williams         }
329b98bdc6fSPatrick Williams         expect_close_container();
330b98bdc6fSPatrick Williams     }
331b98bdc6fSPatrick Williams     new_message().append(s);
332b98bdc6fSPatrick Williams }
333b98bdc6fSPatrick Williams 
TEST_F(AppendTest,Map)334a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, Map)
335a1e9e2aeSWilliam A. Kennington III {
336a1e9e2aeSWilliam A. Kennington III     const std::map<int, std::string> m{
337a1e9e2aeSWilliam A. Kennington III         {1, "a"},
338a1e9e2aeSWilliam A. Kennington III         {2, "bc"},
339a1e9e2aeSWilliam A. Kennington III         {3, "def"},
340a1e9e2aeSWilliam A. Kennington III         {4, "ghij"},
341a1e9e2aeSWilliam A. Kennington III     };
342a1e9e2aeSWilliam A. Kennington III 
343a1e9e2aeSWilliam A. Kennington III     {
344a1e9e2aeSWilliam A. Kennington III         testing::InSequence seq;
345a1e9e2aeSWilliam A. Kennington III         expect_open_container(SD_BUS_TYPE_ARRAY, "{is}");
346a1e9e2aeSWilliam A. Kennington III         for (const auto& i : m)
347a1e9e2aeSWilliam A. Kennington III         {
348a1e9e2aeSWilliam A. Kennington III             expect_open_container(SD_BUS_TYPE_DICT_ENTRY, "is");
349a1e9e2aeSWilliam A. Kennington III             expect_basic<int>(SD_BUS_TYPE_INT32, i.first);
350a1e9e2aeSWilliam A. Kennington III             expect_basic_string(SD_BUS_TYPE_STRING, i.second.c_str());
351a1e9e2aeSWilliam A. Kennington III             expect_close_container();
352a1e9e2aeSWilliam A. Kennington III         }
353a1e9e2aeSWilliam A. Kennington III         expect_close_container();
354a1e9e2aeSWilliam A. Kennington III     }
355a1e9e2aeSWilliam A. Kennington III     new_message().append(m);
356a1e9e2aeSWilliam A. Kennington III }
357a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,UnorderedMap)358a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, UnorderedMap)
359a1e9e2aeSWilliam A. Kennington III {
360a1e9e2aeSWilliam A. Kennington III     const std::unordered_map<int, bool> m{
361a1e9e2aeSWilliam A. Kennington III         {1, false},
362a1e9e2aeSWilliam A. Kennington III         {2, true},
363a1e9e2aeSWilliam A. Kennington III         {3, true},
364a1e9e2aeSWilliam A. Kennington III         {4, false},
365a1e9e2aeSWilliam A. Kennington III     };
366a1e9e2aeSWilliam A. Kennington III 
367a1e9e2aeSWilliam A. Kennington III     {
368a1e9e2aeSWilliam A. Kennington III         testing::InSequence seq;
369a1e9e2aeSWilliam A. Kennington III         expect_open_container(SD_BUS_TYPE_ARRAY, "{ib}");
370a1e9e2aeSWilliam A. Kennington III         for (const auto& i : m)
371a1e9e2aeSWilliam A. Kennington III         {
372a1e9e2aeSWilliam A. Kennington III             expect_open_container(SD_BUS_TYPE_DICT_ENTRY, "ib");
373a1e9e2aeSWilliam A. Kennington III             expect_basic<int>(SD_BUS_TYPE_INT32, i.first);
374a1e9e2aeSWilliam A. Kennington III             expect_basic<int>(SD_BUS_TYPE_BOOLEAN, i.second);
375a1e9e2aeSWilliam A. Kennington III             expect_close_container();
376a1e9e2aeSWilliam A. Kennington III         }
377a1e9e2aeSWilliam A. Kennington III         expect_close_container();
378a1e9e2aeSWilliam A. Kennington III     }
379a1e9e2aeSWilliam A. Kennington III     new_message().append(m);
380a1e9e2aeSWilliam A. Kennington III }
381a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,Tuple)382a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, Tuple)
383a1e9e2aeSWilliam A. Kennington III {
384a1e9e2aeSWilliam A. Kennington III     const std::tuple<int, std::string, bool> t{5, "asdf", false};
385a1e9e2aeSWilliam A. Kennington III 
386a1e9e2aeSWilliam A. Kennington III     {
387a1e9e2aeSWilliam A. Kennington III         testing::InSequence seq;
388a1e9e2aeSWilliam A. Kennington III         expect_open_container(SD_BUS_TYPE_STRUCT, "isb");
389a1e9e2aeSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_INT32, std::get<0>(t));
390a1e9e2aeSWilliam A. Kennington III         expect_basic_string(SD_BUS_TYPE_STRING, std::get<1>(t).c_str());
391a1e9e2aeSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_BOOLEAN, std::get<2>(t));
392a1e9e2aeSWilliam A. Kennington III         expect_close_container();
393a1e9e2aeSWilliam A. Kennington III     }
394a1e9e2aeSWilliam A. Kennington III     new_message().append(t);
395a1e9e2aeSWilliam A. Kennington III }
396a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,Variant)397a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, Variant)
398a1e9e2aeSWilliam A. Kennington III {
399a1e9e2aeSWilliam A. Kennington III     const bool b1 = false;
400a1e9e2aeSWilliam A. Kennington III     const std::string s2{"asdf"};
4014274c117SWilliam A. Kennington III     const std::variant<int, std::string, bool> v1{b1}, v2{s2};
402a1e9e2aeSWilliam A. Kennington III 
403a1e9e2aeSWilliam A. Kennington III     {
404a1e9e2aeSWilliam A. Kennington III         testing::InSequence seq;
405a1e9e2aeSWilliam A. Kennington III         expect_open_container(SD_BUS_TYPE_VARIANT, "b");
406a1e9e2aeSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_BOOLEAN, b1);
407a1e9e2aeSWilliam A. Kennington III         expect_close_container();
408a1e9e2aeSWilliam A. Kennington III         expect_open_container(SD_BUS_TYPE_VARIANT, "s");
409a1e9e2aeSWilliam A. Kennington III         expect_basic_string(SD_BUS_TYPE_STRING, s2.c_str());
410a1e9e2aeSWilliam A. Kennington III         expect_close_container();
411a1e9e2aeSWilliam A. Kennington III     }
412a1e9e2aeSWilliam A. Kennington III     new_message().append(v1, v2);
413a1e9e2aeSWilliam A. Kennington III }
414a1e9e2aeSWilliam A. Kennington III 
TEST_F(AppendTest,LargeCombo)415a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, LargeCombo)
416a1e9e2aeSWilliam A. Kennington III {
417a1e9e2aeSWilliam A. Kennington III     std::vector<std::array<std::string, 3>> vas{{"a", "b", "c"},
418a1e9e2aeSWilliam A. Kennington III                                                 {"d", "", "e"}};
4194274c117SWilliam A. Kennington III     std::map<std::string, std::variant<int, double>> msv = {
420a1e9e2aeSWilliam A. Kennington III         {"a", 3.3}, {"b", 1}, {"c", 4.4}};
421a1e9e2aeSWilliam A. Kennington III 
422a1e9e2aeSWilliam A. Kennington III     {
423a1e9e2aeSWilliam A. Kennington III         testing::InSequence seq;
424a1e9e2aeSWilliam A. Kennington III 
425a1e9e2aeSWilliam A. Kennington III         expect_open_container(SD_BUS_TYPE_ARRAY, "as");
426a1e9e2aeSWilliam A. Kennington III         for (const auto& as : vas)
427a1e9e2aeSWilliam A. Kennington III         {
428a1e9e2aeSWilliam A. Kennington III             expect_open_container(SD_BUS_TYPE_ARRAY, "s");
429a1e9e2aeSWilliam A. Kennington III             for (const auto& s : as)
430a1e9e2aeSWilliam A. Kennington III             {
431a1e9e2aeSWilliam A. Kennington III                 expect_basic_string(SD_BUS_TYPE_STRING, s.c_str());
432a1e9e2aeSWilliam A. Kennington III             }
433a1e9e2aeSWilliam A. Kennington III             expect_close_container();
434a1e9e2aeSWilliam A. Kennington III         }
435a1e9e2aeSWilliam A. Kennington III         expect_close_container();
436a1e9e2aeSWilliam A. Kennington III 
437a1e9e2aeSWilliam A. Kennington III         expect_open_container(SD_BUS_TYPE_ARRAY, "{sv}");
438a1e9e2aeSWilliam A. Kennington III         for (const auto& sv : msv)
439a1e9e2aeSWilliam A. Kennington III         {
440a1e9e2aeSWilliam A. Kennington III             expect_open_container(SD_BUS_TYPE_DICT_ENTRY, "sv");
441a1e9e2aeSWilliam A. Kennington III             expect_basic_string(SD_BUS_TYPE_STRING, sv.first.c_str());
4424274c117SWilliam A. Kennington III             if (std::holds_alternative<int>(sv.second))
443a1e9e2aeSWilliam A. Kennington III             {
444a1e9e2aeSWilliam A. Kennington III                 expect_open_container(SD_BUS_TYPE_VARIANT, "i");
4454274c117SWilliam A. Kennington III                 expect_basic<int>(SD_BUS_TYPE_INT32, std::get<int>(sv.second));
446a1e9e2aeSWilliam A. Kennington III                 expect_close_container();
44707e1d6f3SPatrick Williams             }
44807e1d6f3SPatrick Williams             else
44907e1d6f3SPatrick Williams             {
450a1e9e2aeSWilliam A. Kennington III                 expect_open_container(SD_BUS_TYPE_VARIANT, "d");
451a1e9e2aeSWilliam A. Kennington III                 expect_basic<double>(SD_BUS_TYPE_DOUBLE,
4524274c117SWilliam A. Kennington III                                      std::get<double>(sv.second));
453a1e9e2aeSWilliam A. Kennington III                 expect_close_container();
45407e1d6f3SPatrick Williams             }
455a1e9e2aeSWilliam A. Kennington III             expect_close_container();
4561807fa47SPatrick Williams         }
457a1e9e2aeSWilliam A. Kennington III         expect_close_container();
458a1e9e2aeSWilliam A. Kennington III     }
459a1e9e2aeSWilliam A. Kennington III     new_message().append(vas, msv);
4601807fa47SPatrick Williams }
461b5645509SWilliam A. Kennington III 
462a1e9e2aeSWilliam A. Kennington III } // namespace
463