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