xref: /openbmc/sdbusplus/test/message/read.cpp (revision 10d7aa12)
195269dbcSPatrick Venture #include <systemd/sd-bus-protocol.h>
295269dbcSPatrick Venture 
313367e49SWilliam A. Kennington III #include <sdbusplus/exception.hpp>
44fe85a30SPatrick Williams #include <sdbusplus/message.hpp>
5b4b4fa1fSWilliam A. Kennington III #include <sdbusplus/test/sdbus_mock.hpp>
6127b8abeSPatrick Williams 
7127b8abeSPatrick Williams #include <cerrno>
8127b8abeSPatrick Williams #include <map>
928dc36d5SEd Tanous #include <set>
10b4b4fa1fSWilliam A. Kennington III #include <string>
11b4b4fa1fSWilliam A. Kennington III #include <tuple>
12b4b4fa1fSWilliam A. Kennington III #include <unordered_map>
13b98bdc6fSPatrick Williams #include <unordered_set>
144274c117SWilliam A. Kennington III #include <variant>
15b4b4fa1fSWilliam A. Kennington III #include <vector>
164fe85a30SPatrick Williams 
1795269dbcSPatrick Venture #include <gmock/gmock.h>
1895269dbcSPatrick Venture #include <gtest/gtest.h>
1995269dbcSPatrick Venture 
20b4b4fa1fSWilliam A. Kennington III namespace
214fe85a30SPatrick Williams {
224fe85a30SPatrick Williams 
23b4b4fa1fSWilliam A. Kennington III using testing::DoAll;
24b4b4fa1fSWilliam A. Kennington III using testing::Return;
25b4b4fa1fSWilliam A. Kennington III using testing::StrEq;
26b4b4fa1fSWilliam A. Kennington III 
27b4b4fa1fSWilliam A. Kennington III ACTION_TEMPLATE(AssignReadVal, HAS_1_TEMPLATE_PARAMS(typename, T),
28b4b4fa1fSWilliam A. Kennington III                 AND_1_VALUE_PARAMS(val))
29b4b4fa1fSWilliam A. Kennington III {
30b4b4fa1fSWilliam A. Kennington III     *static_cast<T*>(arg2) = val;
314fe85a30SPatrick Williams }
324fe85a30SPatrick Williams 
33b4b4fa1fSWilliam A. Kennington III class ReadTest : public testing::Test
344fe85a30SPatrick Williams {
35b4b4fa1fSWilliam A. Kennington III   protected:
36b4b4fa1fSWilliam A. Kennington III     testing::StrictMock<sdbusplus::SdBusMock> mock;
374fe85a30SPatrick Williams 
38b4b4fa1fSWilliam A. Kennington III     void SetUp() override
394fe85a30SPatrick Williams     {
40b4b4fa1fSWilliam A. Kennington III         EXPECT_CALL(mock, sd_bus_message_new_method_call(testing::_, testing::_,
41b4b4fa1fSWilliam A. Kennington III                                                          nullptr, nullptr,
42b4b4fa1fSWilliam A. Kennington III                                                          nullptr, nullptr))
43b4b4fa1fSWilliam A. Kennington III             .WillRepeatedly(Return(0));
44b4b4fa1fSWilliam A. Kennington III     };
454fe85a30SPatrick Williams 
46*10d7aa12SPatrick Williams     sdbusplus::message_t new_message()
474fe85a30SPatrick Williams     {
48b4b4fa1fSWilliam A. Kennington III         return sdbusplus::get_mocked_new(&mock).new_method_call(
49b4b4fa1fSWilliam A. Kennington III             nullptr, nullptr, nullptr, nullptr);
504fe85a30SPatrick Williams     }
514fe85a30SPatrick Williams 
5213367e49SWilliam A. Kennington III     void expect_basic_error(char type, int ret)
5313367e49SWilliam A. Kennington III     {
5413367e49SWilliam A. Kennington III         EXPECT_CALL(mock, sd_bus_message_read_basic(nullptr, type, testing::_))
5513367e49SWilliam A. Kennington III             .WillOnce(Return(ret));
5613367e49SWilliam A. Kennington III     }
5713367e49SWilliam A. Kennington III 
582b238afbSPatrick Venture     template <typename T>
592b238afbSPatrick Venture     void expect_basic(char type, T val)
604fe85a30SPatrick Williams     {
61b4b4fa1fSWilliam A. Kennington III         EXPECT_CALL(mock, sd_bus_message_read_basic(nullptr, type, testing::_))
62b4b4fa1fSWilliam A. Kennington III             .WillOnce(DoAll(AssignReadVal<T>(val), Return(0)));
63b4b4fa1fSWilliam A. Kennington III     }
644fe85a30SPatrick Williams 
65b4b4fa1fSWilliam A. Kennington III     void expect_verify_type(char type, const char* contents, int ret)
664fe85a30SPatrick Williams     {
67b4b4fa1fSWilliam A. Kennington III         EXPECT_CALL(mock,
68b4b4fa1fSWilliam A. Kennington III                     sd_bus_message_verify_type(nullptr, type, StrEq(contents)))
69b4b4fa1fSWilliam A. Kennington III             .WillOnce(Return(ret));
70b4b4fa1fSWilliam A. Kennington III     }
714fe85a30SPatrick Williams 
72b4b4fa1fSWilliam A. Kennington III     void expect_at_end(bool complete, int ret)
73b4b4fa1fSWilliam A. Kennington III     {
74b4b4fa1fSWilliam A. Kennington III         EXPECT_CALL(mock, sd_bus_message_at_end(nullptr, complete))
75b4b4fa1fSWilliam A. Kennington III             .WillOnce(Return(ret));
76b4b4fa1fSWilliam A. Kennington III     }
77b4b4fa1fSWilliam A. Kennington III 
7813367e49SWilliam A. Kennington III     void expect_skip(const char* contents, int ret = 0)
7960a72835SWilliam A. Kennington III     {
8060a72835SWilliam A. Kennington III         EXPECT_CALL(mock, sd_bus_message_skip(nullptr, StrEq(contents)))
8113367e49SWilliam A. Kennington III             .WillOnce(Return(ret));
8260a72835SWilliam A. Kennington III     }
8360a72835SWilliam A. Kennington III 
8413367e49SWilliam A. Kennington III     void expect_enter_container(char type, const char* contents, int ret = 0)
85b4b4fa1fSWilliam A. Kennington III     {
86b4b4fa1fSWilliam A. Kennington III         EXPECT_CALL(mock, sd_bus_message_enter_container(nullptr, type,
87b4b4fa1fSWilliam A. Kennington III                                                          StrEq(contents)))
8813367e49SWilliam A. Kennington III             .WillOnce(Return(ret));
89b4b4fa1fSWilliam A. Kennington III     }
90b4b4fa1fSWilliam A. Kennington III 
9113367e49SWilliam A. Kennington III     void expect_exit_container(int ret = 0)
92b4b4fa1fSWilliam A. Kennington III     {
93b4b4fa1fSWilliam A. Kennington III         EXPECT_CALL(mock, sd_bus_message_exit_container(nullptr))
9413367e49SWilliam A. Kennington III             .WillOnce(Return(ret));
95b4b4fa1fSWilliam A. Kennington III     }
96b4b4fa1fSWilliam A. Kennington III };
97b4b4fa1fSWilliam A. Kennington III 
98b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Int)
99b4b4fa1fSWilliam A. Kennington III {
100b4b4fa1fSWilliam A. Kennington III     const int i = 1;
101b4b4fa1fSWilliam A. Kennington III     expect_basic<int>(SD_BUS_TYPE_INT32, i);
102b4b4fa1fSWilliam A. Kennington III     int ret;
103b4b4fa1fSWilliam A. Kennington III     new_message().read(ret);
104b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(i, ret);
105b4b4fa1fSWilliam A. Kennington III }
106b4b4fa1fSWilliam A. Kennington III 
107b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Bool)
108b4b4fa1fSWilliam A. Kennington III {
109b4b4fa1fSWilliam A. Kennington III     const bool b = true;
110b4b4fa1fSWilliam A. Kennington III     expect_basic<int>(SD_BUS_TYPE_BOOLEAN, b);
111b4b4fa1fSWilliam A. Kennington III     bool ret;
112b4b4fa1fSWilliam A. Kennington III     new_message().read(ret);
113b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(b, ret);
114b4b4fa1fSWilliam A. Kennington III }
115b4b4fa1fSWilliam A. Kennington III 
116b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Double)
117b4b4fa1fSWilliam A. Kennington III {
118b4b4fa1fSWilliam A. Kennington III     const double d = 1.1;
119b4b4fa1fSWilliam A. Kennington III     expect_basic<double>(SD_BUS_TYPE_DOUBLE, d);
120b4b4fa1fSWilliam A. Kennington III     double ret;
121b4b4fa1fSWilliam A. Kennington III     new_message().read(ret);
122b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(d, ret);
123b4b4fa1fSWilliam A. Kennington III }
124b4b4fa1fSWilliam A. Kennington III 
125b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, CString)
126b4b4fa1fSWilliam A. Kennington III {
127b4b4fa1fSWilliam A. Kennington III     const char* const s = "asdf";
128b4b4fa1fSWilliam A. Kennington III     expect_basic<const char*>(SD_BUS_TYPE_STRING, s);
129b4b4fa1fSWilliam A. Kennington III     const char* ret;
130b4b4fa1fSWilliam A. Kennington III     new_message().read(ret);
131b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(s, ret);
132b4b4fa1fSWilliam A. Kennington III }
133b4b4fa1fSWilliam A. Kennington III 
134b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, String)
135b4b4fa1fSWilliam A. Kennington III {
136b4b4fa1fSWilliam A. Kennington III     const char* const s = "fsda";
137b4b4fa1fSWilliam A. Kennington III     expect_basic<const char*>(SD_BUS_TYPE_STRING, s);
138b4b4fa1fSWilliam A. Kennington III     std::string ret;
139b4b4fa1fSWilliam A. Kennington III     new_message().read(ret);
140b4b4fa1fSWilliam A. Kennington III     // Pointer comparison here is intentional as we don't expect a copy
141b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(s, ret);
142b4b4fa1fSWilliam A. Kennington III }
143b4b4fa1fSWilliam A. Kennington III 
144b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, ObjectPath)
145b4b4fa1fSWilliam A. Kennington III {
146b4b4fa1fSWilliam A. Kennington III     const char* const s = "/fsda";
147b4b4fa1fSWilliam A. Kennington III     expect_basic<const char*>(SD_BUS_TYPE_OBJECT_PATH, s);
148b4b4fa1fSWilliam A. Kennington III     sdbusplus::message::object_path ret;
149b4b4fa1fSWilliam A. Kennington III     new_message().read(ret);
150b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(s, ret.str);
151b4b4fa1fSWilliam A. Kennington III }
152b4b4fa1fSWilliam A. Kennington III 
153b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Signature)
154b4b4fa1fSWilliam A. Kennington III {
155b4b4fa1fSWilliam A. Kennington III     const char* const s = "{ii}";
156b4b4fa1fSWilliam A. Kennington III     expect_basic<const char*>(SD_BUS_TYPE_SIGNATURE, s);
157b4b4fa1fSWilliam A. Kennington III     sdbusplus::message::signature ret;
158b4b4fa1fSWilliam A. Kennington III     new_message().read(ret);
159b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(s, ret.str);
160b4b4fa1fSWilliam A. Kennington III }
161b4b4fa1fSWilliam A. Kennington III 
162b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, CombinedBasic)
163b4b4fa1fSWilliam A. Kennington III {
164b4b4fa1fSWilliam A. Kennington III     const double a = 2.2;
165b4b4fa1fSWilliam A. Kennington III     const char* const b = "ijkd";
166b4b4fa1fSWilliam A. Kennington III     const bool c = false;
167b4b4fa1fSWilliam A. Kennington III     const int d = 18;
168b4b4fa1fSWilliam A. Kennington III 
169b4b4fa1fSWilliam A. Kennington III     {
170b4b4fa1fSWilliam A. Kennington III         testing::InSequence seq;
171b4b4fa1fSWilliam A. Kennington III         expect_basic<double>(SD_BUS_TYPE_DOUBLE, a);
172b4b4fa1fSWilliam A. Kennington III         expect_basic<const char*>(SD_BUS_TYPE_STRING, b);
173b4b4fa1fSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_BOOLEAN, c);
174b4b4fa1fSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_INT32, d);
175b4b4fa1fSWilliam A. Kennington III     }
176b4b4fa1fSWilliam A. Kennington III 
177b4b4fa1fSWilliam A. Kennington III     double ret_a;
178b4b4fa1fSWilliam A. Kennington III     const char* ret_b;
179b4b4fa1fSWilliam A. Kennington III     bool ret_c;
180b4b4fa1fSWilliam A. Kennington III     int ret_d;
181b4b4fa1fSWilliam A. Kennington III     new_message().read(ret_a, ret_b, ret_c, ret_d);
182b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(a, ret_a);
183b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(b, ret_b);
184b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(c, ret_c);
185b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(d, ret_d);
186b4b4fa1fSWilliam A. Kennington III }
187b4b4fa1fSWilliam A. Kennington III 
18813367e49SWilliam A. Kennington III TEST_F(ReadTest, BasicError)
18913367e49SWilliam A. Kennington III {
19013367e49SWilliam A. Kennington III     expect_basic_error(SD_BUS_TYPE_INT32, -EINVAL);
19113367e49SWilliam A. Kennington III     int ret;
19213367e49SWilliam A. Kennington III     EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError);
19313367e49SWilliam A. Kennington III }
19413367e49SWilliam A. Kennington III 
19513367e49SWilliam A. Kennington III TEST_F(ReadTest, BasicStringError)
19613367e49SWilliam A. Kennington III {
19713367e49SWilliam A. Kennington III     expect_basic_error(SD_BUS_TYPE_STRING, -EINVAL);
19813367e49SWilliam A. Kennington III     std::string ret;
19913367e49SWilliam A. Kennington III     EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError);
20013367e49SWilliam A. Kennington III }
20113367e49SWilliam A. Kennington III 
20213367e49SWilliam A. Kennington III TEST_F(ReadTest, BasicStringWrapperError)
20313367e49SWilliam A. Kennington III {
20413367e49SWilliam A. Kennington III     expect_basic_error(SD_BUS_TYPE_SIGNATURE, -EINVAL);
20513367e49SWilliam A. Kennington III     sdbusplus::message::signature ret;
20613367e49SWilliam A. Kennington III     EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError);
20713367e49SWilliam A. Kennington III }
20813367e49SWilliam A. Kennington III 
20913367e49SWilliam A. Kennington III TEST_F(ReadTest, BasicBoolError)
21013367e49SWilliam A. Kennington III {
21113367e49SWilliam A. Kennington III     expect_basic_error(SD_BUS_TYPE_BOOLEAN, -EINVAL);
21213367e49SWilliam A. Kennington III     bool ret;
21313367e49SWilliam A. Kennington III     EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError);
21413367e49SWilliam A. Kennington III }
21513367e49SWilliam A. Kennington III 
216b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Vector)
217b4b4fa1fSWilliam A. Kennington III {
218b4b4fa1fSWilliam A. Kennington III     const std::vector<int> vi{1, 2, 3, 4};
219b4b4fa1fSWilliam A. Kennington III 
220b4b4fa1fSWilliam A. Kennington III     {
221b4b4fa1fSWilliam A. Kennington III         testing::InSequence seq;
222b4b4fa1fSWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_ARRAY, "i");
223b4b4fa1fSWilliam A. Kennington III         for (const auto& i : vi)
224b4b4fa1fSWilliam A. Kennington III         {
225b4b4fa1fSWilliam A. Kennington III             expect_at_end(false, 0);
226b4b4fa1fSWilliam A. Kennington III             expect_basic<int>(SD_BUS_TYPE_INT32, i);
227b4b4fa1fSWilliam A. Kennington III         }
228b4b4fa1fSWilliam A. Kennington III         expect_at_end(false, 1);
229b4b4fa1fSWilliam A. Kennington III         expect_exit_container();
230b4b4fa1fSWilliam A. Kennington III     }
231b4b4fa1fSWilliam A. Kennington III 
232b4b4fa1fSWilliam A. Kennington III     std::vector<int> ret_vi;
233b4b4fa1fSWilliam A. Kennington III     new_message().read(ret_vi);
234b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(vi, ret_vi);
235b4b4fa1fSWilliam A. Kennington III }
236b4b4fa1fSWilliam A. Kennington III 
23713367e49SWilliam A. Kennington III TEST_F(ReadTest, VectorEnterError)
23813367e49SWilliam A. Kennington III {
23913367e49SWilliam A. Kennington III     {
24013367e49SWilliam A. Kennington III         testing::InSequence seq;
24113367e49SWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_ARRAY, "i", -EINVAL);
24213367e49SWilliam A. Kennington III     }
24313367e49SWilliam A. Kennington III 
24413367e49SWilliam A. Kennington III     std::vector<int> ret;
24513367e49SWilliam A. Kennington III     EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError);
24613367e49SWilliam A. Kennington III }
24713367e49SWilliam A. Kennington III 
24813367e49SWilliam A. Kennington III TEST_F(ReadTest, VectorIterError)
24913367e49SWilliam A. Kennington III {
25013367e49SWilliam A. Kennington III     {
25113367e49SWilliam A. Kennington III         testing::InSequence seq;
25213367e49SWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_ARRAY, "i");
25313367e49SWilliam A. Kennington III         expect_at_end(false, 0);
25413367e49SWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_INT32, 1);
25513367e49SWilliam A. Kennington III         expect_at_end(false, -EINVAL);
25613367e49SWilliam A. Kennington III     }
25713367e49SWilliam A. Kennington III 
25813367e49SWilliam A. Kennington III     std::vector<int> ret;
25913367e49SWilliam A. Kennington III     EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError);
26013367e49SWilliam A. Kennington III }
26113367e49SWilliam A. Kennington III 
26213367e49SWilliam A. Kennington III TEST_F(ReadTest, VectorExitError)
26313367e49SWilliam A. Kennington III {
26413367e49SWilliam A. Kennington III     {
26513367e49SWilliam A. Kennington III         testing::InSequence seq;
26613367e49SWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_ARRAY, "i");
26713367e49SWilliam A. Kennington III         expect_at_end(false, 0);
26813367e49SWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_INT32, 1);
26913367e49SWilliam A. Kennington III         expect_at_end(false, 0);
27013367e49SWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_INT32, 2);
27113367e49SWilliam A. Kennington III         expect_at_end(false, 1);
27213367e49SWilliam A. Kennington III         expect_exit_container(-EINVAL);
27313367e49SWilliam A. Kennington III     }
27413367e49SWilliam A. Kennington III 
27513367e49SWilliam A. Kennington III     std::vector<int> ret;
27613367e49SWilliam A. Kennington III     EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError);
27713367e49SWilliam A. Kennington III }
27813367e49SWilliam A. Kennington III 
279b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Set)
280b4b4fa1fSWilliam A. Kennington III {
281b4b4fa1fSWilliam A. Kennington III     const std::set<std::string> ss{"one", "two", "eight"};
282b4b4fa1fSWilliam A. Kennington III 
283b4b4fa1fSWilliam A. Kennington III     {
284b4b4fa1fSWilliam A. Kennington III         testing::InSequence seq;
285b4b4fa1fSWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_ARRAY, "s");
286b4b4fa1fSWilliam A. Kennington III         for (const auto& s : ss)
287b4b4fa1fSWilliam A. Kennington III         {
288b4b4fa1fSWilliam A. Kennington III             expect_at_end(false, 0);
289b4b4fa1fSWilliam A. Kennington III             expect_basic<const char*>(SD_BUS_TYPE_STRING, s.c_str());
290b4b4fa1fSWilliam A. Kennington III         }
291b4b4fa1fSWilliam A. Kennington III         expect_at_end(false, 1);
292b4b4fa1fSWilliam A. Kennington III         expect_exit_container();
293b4b4fa1fSWilliam A. Kennington III     }
294b4b4fa1fSWilliam A. Kennington III 
295b4b4fa1fSWilliam A. Kennington III     std::set<std::string> ret_ss;
296b4b4fa1fSWilliam A. Kennington III     new_message().read(ret_ss);
297b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(ss, ret_ss);
298b4b4fa1fSWilliam A. Kennington III }
299b4b4fa1fSWilliam A. Kennington III 
300b98bdc6fSPatrick Williams TEST_F(ReadTest, UnorderedSet)
301b98bdc6fSPatrick Williams {
302b98bdc6fSPatrick Williams     const std::unordered_set<std::string> ss{"one", "two", "eight"};
303b98bdc6fSPatrick Williams 
304b98bdc6fSPatrick Williams     {
305b98bdc6fSPatrick Williams         testing::InSequence seq;
306b98bdc6fSPatrick Williams         expect_enter_container(SD_BUS_TYPE_ARRAY, "s");
307b98bdc6fSPatrick Williams         for (const auto& s : ss)
308b98bdc6fSPatrick Williams         {
309b98bdc6fSPatrick Williams             expect_at_end(false, 0);
310b98bdc6fSPatrick Williams             expect_basic<const char*>(SD_BUS_TYPE_STRING, s.c_str());
311b98bdc6fSPatrick Williams         }
312b98bdc6fSPatrick Williams         expect_at_end(false, 1);
313b98bdc6fSPatrick Williams         expect_exit_container();
314b98bdc6fSPatrick Williams     }
315b98bdc6fSPatrick Williams 
316b98bdc6fSPatrick Williams     std::unordered_set<std::string> ret_ss;
317b98bdc6fSPatrick Williams     new_message().read(ret_ss);
318b98bdc6fSPatrick Williams     EXPECT_EQ(ss, ret_ss);
319b98bdc6fSPatrick Williams }
320b98bdc6fSPatrick Williams 
321b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Map)
322b4b4fa1fSWilliam A. Kennington III {
323b4b4fa1fSWilliam A. Kennington III     const std::map<int, std::string> mis{
324b4b4fa1fSWilliam A. Kennington III         {1, "a"},
325b4b4fa1fSWilliam A. Kennington III         {2, "bc"},
326b4b4fa1fSWilliam A. Kennington III         {3, "def"},
327b4b4fa1fSWilliam A. Kennington III         {4, "ghij"},
328b4b4fa1fSWilliam A. Kennington III     };
329b4b4fa1fSWilliam A. Kennington III 
330b4b4fa1fSWilliam A. Kennington III     {
331b4b4fa1fSWilliam A. Kennington III         testing::InSequence seq;
332b4b4fa1fSWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_ARRAY, "{is}");
333b4b4fa1fSWilliam A. Kennington III         for (const auto& is : mis)
334b4b4fa1fSWilliam A. Kennington III         {
335b4b4fa1fSWilliam A. Kennington III             expect_at_end(false, 0);
336b4b4fa1fSWilliam A. Kennington III             expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "is");
337b4b4fa1fSWilliam A. Kennington III             expect_basic<int>(SD_BUS_TYPE_INT32, is.first);
338b4b4fa1fSWilliam A. Kennington III             expect_basic<const char*>(SD_BUS_TYPE_STRING, is.second.c_str());
339b4b4fa1fSWilliam A. Kennington III             expect_exit_container();
340b4b4fa1fSWilliam A. Kennington III         }
341b4b4fa1fSWilliam A. Kennington III         expect_at_end(false, 1);
342b4b4fa1fSWilliam A. Kennington III         expect_exit_container();
343b4b4fa1fSWilliam A. Kennington III     }
344b4b4fa1fSWilliam A. Kennington III 
345b4b4fa1fSWilliam A. Kennington III     std::map<int, std::string> ret_mis;
346b4b4fa1fSWilliam A. Kennington III     new_message().read(ret_mis);
347b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(mis, ret_mis);
348b4b4fa1fSWilliam A. Kennington III }
349b4b4fa1fSWilliam A. Kennington III 
35013367e49SWilliam A. Kennington III TEST_F(ReadTest, MapEnterError)
35113367e49SWilliam A. Kennington III {
35213367e49SWilliam A. Kennington III     {
35313367e49SWilliam A. Kennington III         testing::InSequence seq;
35413367e49SWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_ARRAY, "{si}", -EINVAL);
35513367e49SWilliam A. Kennington III     }
35613367e49SWilliam A. Kennington III 
35713367e49SWilliam A. Kennington III     std::map<std::string, int> ret;
35813367e49SWilliam A. Kennington III     EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError);
35913367e49SWilliam A. Kennington III }
36013367e49SWilliam A. Kennington III 
36113367e49SWilliam A. Kennington III TEST_F(ReadTest, MapEntryEnterError)
36213367e49SWilliam A. Kennington III {
36313367e49SWilliam A. Kennington III     {
36413367e49SWilliam A. Kennington III         testing::InSequence seq;
36513367e49SWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_ARRAY, "{si}");
36613367e49SWilliam A. Kennington III         expect_at_end(false, 0);
36713367e49SWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "si", -EINVAL);
36813367e49SWilliam A. Kennington III     }
36913367e49SWilliam A. Kennington III 
37013367e49SWilliam A. Kennington III     std::map<std::string, int> ret;
37113367e49SWilliam A. Kennington III     EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError);
37213367e49SWilliam A. Kennington III }
37313367e49SWilliam A. Kennington III 
37413367e49SWilliam A. Kennington III TEST_F(ReadTest, MapEntryExitError)
37513367e49SWilliam A. Kennington III {
37613367e49SWilliam A. Kennington III     {
37713367e49SWilliam A. Kennington III         testing::InSequence seq;
37813367e49SWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_ARRAY, "{si}");
37913367e49SWilliam A. Kennington III         expect_at_end(false, 0);
38013367e49SWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "si");
38113367e49SWilliam A. Kennington III         expect_basic<const char*>(SD_BUS_TYPE_STRING, "ab");
38213367e49SWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_INT32, 1);
38313367e49SWilliam A. Kennington III         expect_exit_container(-EINVAL);
38413367e49SWilliam A. Kennington III     }
38513367e49SWilliam A. Kennington III 
38613367e49SWilliam A. Kennington III     std::map<std::string, int> ret;
38713367e49SWilliam A. Kennington III     EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError);
38813367e49SWilliam A. Kennington III }
38913367e49SWilliam A. Kennington III 
39013367e49SWilliam A. Kennington III TEST_F(ReadTest, MapIterError)
39113367e49SWilliam A. Kennington III {
39213367e49SWilliam A. Kennington III     {
39313367e49SWilliam A. Kennington III         testing::InSequence seq;
39413367e49SWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_ARRAY, "{si}");
39513367e49SWilliam A. Kennington III         expect_at_end(false, 0);
39613367e49SWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "si");
39713367e49SWilliam A. Kennington III         expect_basic<const char*>(SD_BUS_TYPE_STRING, "ab");
39813367e49SWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_INT32, 1);
39913367e49SWilliam A. Kennington III         expect_exit_container();
40013367e49SWilliam A. Kennington III         expect_at_end(false, -EINVAL);
40113367e49SWilliam A. Kennington III     }
40213367e49SWilliam A. Kennington III 
40313367e49SWilliam A. Kennington III     std::map<std::string, int> ret;
40413367e49SWilliam A. Kennington III     EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError);
40513367e49SWilliam A. Kennington III }
40613367e49SWilliam A. Kennington III 
40713367e49SWilliam A. Kennington III TEST_F(ReadTest, MapExitError)
40813367e49SWilliam A. Kennington III {
40913367e49SWilliam A. Kennington III     {
41013367e49SWilliam A. Kennington III         testing::InSequence seq;
41113367e49SWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_ARRAY, "{si}");
41213367e49SWilliam A. Kennington III         expect_at_end(false, 0);
41313367e49SWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "si");
41413367e49SWilliam A. Kennington III         expect_basic<const char*>(SD_BUS_TYPE_STRING, "ab");
41513367e49SWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_INT32, 1);
41613367e49SWilliam A. Kennington III         expect_exit_container();
41713367e49SWilliam A. Kennington III         expect_at_end(false, 1);
41813367e49SWilliam A. Kennington III         expect_exit_container(-EINVAL);
41913367e49SWilliam A. Kennington III     }
42013367e49SWilliam A. Kennington III 
42113367e49SWilliam A. Kennington III     std::map<std::string, int> ret;
42213367e49SWilliam A. Kennington III     EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError);
42313367e49SWilliam A. Kennington III }
42413367e49SWilliam A. Kennington III 
425b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, UnorderedMap)
426b4b4fa1fSWilliam A. Kennington III {
427b4b4fa1fSWilliam A. Kennington III     const std::unordered_map<int, std::string> mis{
428b4b4fa1fSWilliam A. Kennington III         {1, "a"},
429b4b4fa1fSWilliam A. Kennington III         {2, "bc"},
430b4b4fa1fSWilliam A. Kennington III         {3, "def"},
431b4b4fa1fSWilliam A. Kennington III         {4, "ghij"},
432b4b4fa1fSWilliam A. Kennington III     };
433b4b4fa1fSWilliam A. Kennington III 
434b4b4fa1fSWilliam A. Kennington III     {
435b4b4fa1fSWilliam A. Kennington III         testing::InSequence seq;
436b4b4fa1fSWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_ARRAY, "{is}");
437b4b4fa1fSWilliam A. Kennington III         for (const auto& is : mis)
438b4b4fa1fSWilliam A. Kennington III         {
439b4b4fa1fSWilliam A. Kennington III             expect_at_end(false, 0);
440b4b4fa1fSWilliam A. Kennington III             expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "is");
441b4b4fa1fSWilliam A. Kennington III             expect_basic<int>(SD_BUS_TYPE_INT32, is.first);
442b4b4fa1fSWilliam A. Kennington III             expect_basic<const char*>(SD_BUS_TYPE_STRING, is.second.c_str());
443b4b4fa1fSWilliam A. Kennington III             expect_exit_container();
444b4b4fa1fSWilliam A. Kennington III         }
445b4b4fa1fSWilliam A. Kennington III         expect_at_end(false, 1);
446b4b4fa1fSWilliam A. Kennington III         expect_exit_container();
447b4b4fa1fSWilliam A. Kennington III     }
448b4b4fa1fSWilliam A. Kennington III 
449b4b4fa1fSWilliam A. Kennington III     std::unordered_map<int, std::string> ret_mis;
450b4b4fa1fSWilliam A. Kennington III     new_message().read(ret_mis);
451b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(mis, ret_mis);
452b4b4fa1fSWilliam A. Kennington III }
453b4b4fa1fSWilliam A. Kennington III 
454b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Tuple)
455b4b4fa1fSWilliam A. Kennington III {
456b4b4fa1fSWilliam A. Kennington III     const std::tuple<int, std::string, bool> tisb{3, "hi", false};
457b4b4fa1fSWilliam A. Kennington III 
458b4b4fa1fSWilliam A. Kennington III     {
459b4b4fa1fSWilliam A. Kennington III         testing::InSequence seq;
460b4b4fa1fSWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_STRUCT, "isb");
461b4b4fa1fSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_INT32, std::get<0>(tisb));
462b4b4fa1fSWilliam A. Kennington III         expect_basic<const char*>(SD_BUS_TYPE_STRING,
463b4b4fa1fSWilliam A. Kennington III                                   std::get<1>(tisb).c_str());
464b4b4fa1fSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_BOOLEAN, std::get<2>(tisb));
465b4b4fa1fSWilliam A. Kennington III         expect_exit_container();
466b4b4fa1fSWilliam A. Kennington III     }
467b4b4fa1fSWilliam A. Kennington III 
468b4b4fa1fSWilliam A. Kennington III     std::tuple<int, std::string, bool> ret_tisb;
469b4b4fa1fSWilliam A. Kennington III     new_message().read(ret_tisb);
470b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(tisb, ret_tisb);
471b4b4fa1fSWilliam A. Kennington III }
472b4b4fa1fSWilliam A. Kennington III 
47313367e49SWilliam A. Kennington III TEST_F(ReadTest, TupleEnterError)
47413367e49SWilliam A. Kennington III {
47513367e49SWilliam A. Kennington III     {
47613367e49SWilliam A. Kennington III         testing::InSequence seq;
47713367e49SWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_STRUCT, "bis", -EINVAL);
47813367e49SWilliam A. Kennington III     }
47913367e49SWilliam A. Kennington III 
48013367e49SWilliam A. Kennington III     std::tuple<bool, int, std::string> ret;
48113367e49SWilliam A. Kennington III     EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError);
48213367e49SWilliam A. Kennington III }
48313367e49SWilliam A. Kennington III 
48413367e49SWilliam A. Kennington III TEST_F(ReadTest, TupleExitError)
48513367e49SWilliam A. Kennington III {
48613367e49SWilliam A. Kennington III     {
48713367e49SWilliam A. Kennington III         testing::InSequence seq;
48813367e49SWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_STRUCT, "bis");
48913367e49SWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_BOOLEAN, false);
49013367e49SWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_INT32, 1);
49113367e49SWilliam A. Kennington III         expect_basic<const char*>(SD_BUS_TYPE_STRING, "ab");
49213367e49SWilliam A. Kennington III         expect_exit_container(-EINVAL);
49313367e49SWilliam A. Kennington III     }
49413367e49SWilliam A. Kennington III 
49513367e49SWilliam A. Kennington III     std::tuple<bool, int, std::string> ret;
49613367e49SWilliam A. Kennington III     EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError);
49713367e49SWilliam A. Kennington III }
49813367e49SWilliam A. Kennington III 
499b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Variant)
500b4b4fa1fSWilliam A. Kennington III {
501b4b4fa1fSWilliam A. Kennington III     const bool b1 = false;
502b4b4fa1fSWilliam A. Kennington III     const std::string s2{"asdf"};
5034274c117SWilliam A. Kennington III     const std::variant<int, std::string, bool> v1{b1}, v2{s2};
504b4b4fa1fSWilliam A. Kennington III 
505b4b4fa1fSWilliam A. Kennington III     {
506b4b4fa1fSWilliam A. Kennington III         testing::InSequence seq;
507b4b4fa1fSWilliam A. Kennington III         expect_verify_type(SD_BUS_TYPE_VARIANT, "i", false);
508b4b4fa1fSWilliam A. Kennington III         expect_verify_type(SD_BUS_TYPE_VARIANT, "s", false);
509b4b4fa1fSWilliam A. Kennington III         expect_verify_type(SD_BUS_TYPE_VARIANT, "b", true);
510b4b4fa1fSWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_VARIANT, "b");
511b4b4fa1fSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_BOOLEAN, b1);
512b4b4fa1fSWilliam A. Kennington III         expect_exit_container();
513b4b4fa1fSWilliam A. Kennington III         expect_verify_type(SD_BUS_TYPE_VARIANT, "i", false);
514b4b4fa1fSWilliam A. Kennington III         expect_verify_type(SD_BUS_TYPE_VARIANT, "s", true);
515b4b4fa1fSWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_VARIANT, "s");
516b4b4fa1fSWilliam A. Kennington III         expect_basic<const char*>(SD_BUS_TYPE_STRING, s2.c_str());
517b4b4fa1fSWilliam A. Kennington III         expect_exit_container();
518b4b4fa1fSWilliam A. Kennington III     }
519b4b4fa1fSWilliam A. Kennington III 
5204274c117SWilliam A. Kennington III     std::variant<int, std::string, bool> ret_v1, ret_v2;
521b4b4fa1fSWilliam A. Kennington III     new_message().read(ret_v1, ret_v2);
522b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(v1, ret_v1);
523b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(v2, ret_v2);
524b4b4fa1fSWilliam A. Kennington III }
525b4b4fa1fSWilliam A. Kennington III 
52613367e49SWilliam A. Kennington III TEST_F(ReadTest, VariantVerifyError)
52713367e49SWilliam A. Kennington III {
52813367e49SWilliam A. Kennington III     {
52913367e49SWilliam A. Kennington III         testing::InSequence seq;
53013367e49SWilliam A. Kennington III         expect_verify_type(SD_BUS_TYPE_VARIANT, "i", -EINVAL);
53113367e49SWilliam A. Kennington III     }
53213367e49SWilliam A. Kennington III 
5334274c117SWilliam A. Kennington III     std::variant<int, bool> ret;
53413367e49SWilliam A. Kennington III     EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError);
53513367e49SWilliam A. Kennington III }
53613367e49SWilliam A. Kennington III 
53760a72835SWilliam A. Kennington III TEST_F(ReadTest, VariantSkipUnmatched)
53860a72835SWilliam A. Kennington III {
53960a72835SWilliam A. Kennington III     {
54060a72835SWilliam A. Kennington III         testing::InSequence seq;
54160a72835SWilliam A. Kennington III         expect_verify_type(SD_BUS_TYPE_VARIANT, "i", false);
54260a72835SWilliam A. Kennington III         expect_verify_type(SD_BUS_TYPE_VARIANT, "b", false);
54360a72835SWilliam A. Kennington III         expect_skip("v");
54460a72835SWilliam A. Kennington III     }
54513367e49SWilliam A. Kennington III 
5464274c117SWilliam A. Kennington III     std::variant<int, bool> ret;
54760a72835SWilliam A. Kennington III     new_message().read(ret);
54860a72835SWilliam A. Kennington III }
54960a72835SWilliam A. Kennington III 
55013367e49SWilliam A. Kennington III TEST_F(ReadTest, VariantSkipError)
55113367e49SWilliam A. Kennington III {
55213367e49SWilliam A. Kennington III     {
55313367e49SWilliam A. Kennington III         testing::InSequence seq;
55413367e49SWilliam A. Kennington III         expect_verify_type(SD_BUS_TYPE_VARIANT, "i", false);
55513367e49SWilliam A. Kennington III         expect_verify_type(SD_BUS_TYPE_VARIANT, "b", false);
55613367e49SWilliam A. Kennington III         expect_skip("v", -EINVAL);
55713367e49SWilliam A. Kennington III     }
55813367e49SWilliam A. Kennington III 
5594274c117SWilliam A. Kennington III     std::variant<int, bool> ret;
56013367e49SWilliam A. Kennington III     EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError);
56113367e49SWilliam A. Kennington III }
56213367e49SWilliam A. Kennington III 
56313367e49SWilliam A. Kennington III TEST_F(ReadTest, VariantEnterError)
56413367e49SWilliam A. Kennington III {
56513367e49SWilliam A. Kennington III     {
56613367e49SWilliam A. Kennington III         testing::InSequence seq;
56713367e49SWilliam A. Kennington III         expect_verify_type(SD_BUS_TYPE_VARIANT, "i", true);
56813367e49SWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_VARIANT, "i", -EINVAL);
56913367e49SWilliam A. Kennington III     }
57013367e49SWilliam A. Kennington III 
5714274c117SWilliam A. Kennington III     std::variant<int, bool> ret;
57213367e49SWilliam A. Kennington III     EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError);
57313367e49SWilliam A. Kennington III }
57413367e49SWilliam A. Kennington III 
57513367e49SWilliam A. Kennington III TEST_F(ReadTest, VariantExitError)
57613367e49SWilliam A. Kennington III {
57713367e49SWilliam A. Kennington III     {
57813367e49SWilliam A. Kennington III         testing::InSequence seq;
57913367e49SWilliam A. Kennington III         expect_verify_type(SD_BUS_TYPE_VARIANT, "i", true);
58013367e49SWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_VARIANT, "i");
58113367e49SWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_INT32, 10);
58213367e49SWilliam A. Kennington III         expect_exit_container(-EINVAL);
58313367e49SWilliam A. Kennington III     }
58413367e49SWilliam A. Kennington III 
5854274c117SWilliam A. Kennington III     std::variant<int, bool> ret;
58613367e49SWilliam A. Kennington III     EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError);
58713367e49SWilliam A. Kennington III }
58813367e49SWilliam A. Kennington III 
589b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, LargeCombo)
590b4b4fa1fSWilliam A. Kennington III {
591b4b4fa1fSWilliam A. Kennington III     const std::vector<std::set<std::string>> vas{
592b4b4fa1fSWilliam A. Kennington III         {"a", "b", "c"},
593b4b4fa1fSWilliam A. Kennington III         {"d", "", "e"},
594b4b4fa1fSWilliam A. Kennington III     };
5954274c117SWilliam A. Kennington III     const std::map<std::string, std::variant<int, double>> msv = {
5964274c117SWilliam A. Kennington III         {"a", 3.3}, {"b", 1}, {"c", 4.4}};
597b4b4fa1fSWilliam A. Kennington III 
598b4b4fa1fSWilliam A. Kennington III     {
599b4b4fa1fSWilliam A. Kennington III         testing::InSequence seq;
600b4b4fa1fSWilliam A. Kennington III 
601b4b4fa1fSWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_ARRAY, "as");
602b4b4fa1fSWilliam A. Kennington III         for (const auto& as : vas)
603b4b4fa1fSWilliam A. Kennington III         {
604b4b4fa1fSWilliam A. Kennington III             expect_at_end(false, 0);
605b4b4fa1fSWilliam A. Kennington III             expect_enter_container(SD_BUS_TYPE_ARRAY, "s");
606b4b4fa1fSWilliam A. Kennington III             for (const auto& s : as)
607b4b4fa1fSWilliam A. Kennington III             {
608b4b4fa1fSWilliam A. Kennington III                 expect_at_end(false, 0);
609b4b4fa1fSWilliam A. Kennington III                 expect_basic<const char*>(SD_BUS_TYPE_STRING, s.c_str());
610b4b4fa1fSWilliam A. Kennington III             }
611b4b4fa1fSWilliam A. Kennington III             expect_at_end(false, 1);
612b4b4fa1fSWilliam A. Kennington III             expect_exit_container();
613b4b4fa1fSWilliam A. Kennington III         }
614b4b4fa1fSWilliam A. Kennington III         expect_at_end(false, 1);
615b4b4fa1fSWilliam A. Kennington III         expect_exit_container();
616b4b4fa1fSWilliam A. Kennington III 
617b4b4fa1fSWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_ARRAY, "{sv}");
618b4b4fa1fSWilliam A. Kennington III         for (const auto& sv : msv)
619b4b4fa1fSWilliam A. Kennington III         {
620b4b4fa1fSWilliam A. Kennington III             expect_at_end(false, 0);
621b4b4fa1fSWilliam A. Kennington III             expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "sv");
622b4b4fa1fSWilliam A. Kennington III             expect_basic<const char*>(SD_BUS_TYPE_STRING, sv.first.c_str());
6234274c117SWilliam A. Kennington III             if (std::holds_alternative<int>(sv.second))
624b4b4fa1fSWilliam A. Kennington III             {
625b4b4fa1fSWilliam A. Kennington III                 expect_verify_type(SD_BUS_TYPE_VARIANT, "i", true);
626b4b4fa1fSWilliam A. Kennington III                 expect_enter_container(SD_BUS_TYPE_VARIANT, "i");
6274274c117SWilliam A. Kennington III                 expect_basic<int>(SD_BUS_TYPE_INT32, std::get<int>(sv.second));
628b4b4fa1fSWilliam A. Kennington III                 expect_exit_container();
6294fe85a30SPatrick Williams             }
6304fe85a30SPatrick Williams             else
6314fe85a30SPatrick Williams             {
632b4b4fa1fSWilliam A. Kennington III                 expect_verify_type(SD_BUS_TYPE_VARIANT, "i", false);
633b4b4fa1fSWilliam A. Kennington III                 expect_verify_type(SD_BUS_TYPE_VARIANT, "d", true);
634b4b4fa1fSWilliam A. Kennington III                 expect_enter_container(SD_BUS_TYPE_VARIANT, "d");
635b4b4fa1fSWilliam A. Kennington III                 expect_basic<double>(SD_BUS_TYPE_DOUBLE,
6364274c117SWilliam A. Kennington III                                      std::get<double>(sv.second));
637b4b4fa1fSWilliam A. Kennington III                 expect_exit_container();
6384fe85a30SPatrick Williams             }
639b4b4fa1fSWilliam A. Kennington III             expect_exit_container();
6404fe85a30SPatrick Williams         }
641b4b4fa1fSWilliam A. Kennington III         expect_at_end(false, 1);
642b4b4fa1fSWilliam A. Kennington III         expect_exit_container();
6434fe85a30SPatrick Williams     }
644696e3159SPatrick Williams 
645b4b4fa1fSWilliam A. Kennington III     std::vector<std::set<std::string>> ret_vas;
6464274c117SWilliam A. Kennington III     std::map<std::string, std::variant<int, double>> ret_msv;
647b4b4fa1fSWilliam A. Kennington III     new_message().read(ret_vas, ret_msv);
648b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(vas, ret_vas);
649b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(msv, ret_msv);
6504fe85a30SPatrick Williams }
6514fe85a30SPatrick Williams 
652b4b4fa1fSWilliam A. Kennington III } // namespace
653