xref: /openbmc/sdbusplus/test/message/read.cpp (revision 60a728351ee5f5ed1a1c180b1a40eabc45a7794b)
1b4b4fa1fSWilliam A. Kennington III #include <gtest/gtest.h>
2b4b4fa1fSWilliam A. Kennington III #include <gmock/gmock.h>
3b4b4fa1fSWilliam A. Kennington III #include <map>
44fe85a30SPatrick Williams #include <sdbusplus/message.hpp>
5b4b4fa1fSWilliam A. Kennington III #include <sdbusplus/test/sdbus_mock.hpp>
628dc36d5SEd Tanous #include <set>
7b4b4fa1fSWilliam A. Kennington III #include <string>
8b4b4fa1fSWilliam A. Kennington III #include <systemd/sd-bus-protocol.h>
9b4b4fa1fSWilliam A. Kennington III #include <tuple>
10b4b4fa1fSWilliam A. Kennington III #include <unordered_map>
11b4b4fa1fSWilliam A. Kennington III #include <vector>
124fe85a30SPatrick Williams 
13b4b4fa1fSWilliam A. Kennington III namespace
144fe85a30SPatrick Williams {
154fe85a30SPatrick Williams 
16b4b4fa1fSWilliam A. Kennington III using testing::DoAll;
17b4b4fa1fSWilliam A. Kennington III using testing::Return;
18b4b4fa1fSWilliam A. Kennington III using testing::StrEq;
19b4b4fa1fSWilliam A. Kennington III 
20b4b4fa1fSWilliam A. Kennington III ACTION_TEMPLATE(AssignReadVal, HAS_1_TEMPLATE_PARAMS(typename, T),
21b4b4fa1fSWilliam A. Kennington III                 AND_1_VALUE_PARAMS(val))
22b4b4fa1fSWilliam A. Kennington III {
23b4b4fa1fSWilliam A. Kennington III     *static_cast<T *>(arg2) = val;
244fe85a30SPatrick Williams }
254fe85a30SPatrick Williams 
26b4b4fa1fSWilliam A. Kennington III class ReadTest : public testing::Test
274fe85a30SPatrick Williams {
28b4b4fa1fSWilliam A. Kennington III   protected:
29b4b4fa1fSWilliam A. Kennington III     testing::StrictMock<sdbusplus::SdBusMock> mock;
304fe85a30SPatrick Williams 
31b4b4fa1fSWilliam A. Kennington III     void SetUp() override
324fe85a30SPatrick Williams     {
33b4b4fa1fSWilliam A. Kennington III         EXPECT_CALL(mock, sd_bus_message_new_method_call(testing::_, testing::_,
34b4b4fa1fSWilliam A. Kennington III                                                          nullptr, nullptr,
35b4b4fa1fSWilliam A. Kennington III                                                          nullptr, nullptr))
36b4b4fa1fSWilliam A. Kennington III             .WillRepeatedly(Return(0));
37b4b4fa1fSWilliam A. Kennington III     };
384fe85a30SPatrick Williams 
39b4b4fa1fSWilliam A. Kennington III     sdbusplus::message::message new_message()
404fe85a30SPatrick Williams     {
41b4b4fa1fSWilliam A. Kennington III         return sdbusplus::get_mocked_new(&mock).new_method_call(
42b4b4fa1fSWilliam A. Kennington III             nullptr, nullptr, nullptr, nullptr);
434fe85a30SPatrick Williams     }
444fe85a30SPatrick Williams 
45b4b4fa1fSWilliam A. Kennington III     template <typename T> void expect_basic(char type, T val)
464fe85a30SPatrick Williams     {
47b4b4fa1fSWilliam A. Kennington III         EXPECT_CALL(mock, sd_bus_message_read_basic(nullptr, type, testing::_))
48b4b4fa1fSWilliam A. Kennington III             .WillOnce(DoAll(AssignReadVal<T>(val), Return(0)));
49b4b4fa1fSWilliam A. Kennington III     }
504fe85a30SPatrick Williams 
51b4b4fa1fSWilliam A. Kennington III     void expect_verify_type(char type, const char *contents, int ret)
524fe85a30SPatrick Williams     {
53b4b4fa1fSWilliam A. Kennington III         EXPECT_CALL(mock,
54b4b4fa1fSWilliam A. Kennington III                     sd_bus_message_verify_type(nullptr, type, StrEq(contents)))
55b4b4fa1fSWilliam A. Kennington III             .WillOnce(Return(ret));
56b4b4fa1fSWilliam A. Kennington III     }
574fe85a30SPatrick Williams 
58b4b4fa1fSWilliam A. Kennington III     void expect_at_end(bool complete, int ret)
59b4b4fa1fSWilliam A. Kennington III     {
60b4b4fa1fSWilliam A. Kennington III         EXPECT_CALL(mock, sd_bus_message_at_end(nullptr, complete))
61b4b4fa1fSWilliam A. Kennington III             .WillOnce(Return(ret));
62b4b4fa1fSWilliam A. Kennington III     }
63b4b4fa1fSWilliam A. Kennington III 
64*60a72835SWilliam A. Kennington III     void expect_skip(const char *contents)
65*60a72835SWilliam A. Kennington III     {
66*60a72835SWilliam A. Kennington III         EXPECT_CALL(mock, sd_bus_message_skip(nullptr, StrEq(contents)))
67*60a72835SWilliam A. Kennington III             .WillOnce(Return(0));
68*60a72835SWilliam A. Kennington III     }
69*60a72835SWilliam A. Kennington III 
70b4b4fa1fSWilliam A. Kennington III     void expect_enter_container(char type, const char *contents)
71b4b4fa1fSWilliam A. Kennington III     {
72b4b4fa1fSWilliam A. Kennington III         EXPECT_CALL(mock, sd_bus_message_enter_container(nullptr, type,
73b4b4fa1fSWilliam A. Kennington III                                                          StrEq(contents)))
74b4b4fa1fSWilliam A. Kennington III             .WillOnce(Return(0));
75b4b4fa1fSWilliam A. Kennington III     }
76b4b4fa1fSWilliam A. Kennington III 
77b4b4fa1fSWilliam A. Kennington III     void expect_exit_container()
78b4b4fa1fSWilliam A. Kennington III     {
79b4b4fa1fSWilliam A. Kennington III         EXPECT_CALL(mock, sd_bus_message_exit_container(nullptr))
80b4b4fa1fSWilliam A. Kennington III             .WillOnce(Return(0));
81b4b4fa1fSWilliam A. Kennington III     }
82b4b4fa1fSWilliam A. Kennington III };
83b4b4fa1fSWilliam A. Kennington III 
84b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Int)
85b4b4fa1fSWilliam A. Kennington III {
86b4b4fa1fSWilliam A. Kennington III     const int i = 1;
87b4b4fa1fSWilliam A. Kennington III     expect_basic<int>(SD_BUS_TYPE_INT32, i);
88b4b4fa1fSWilliam A. Kennington III     int ret;
89b4b4fa1fSWilliam A. Kennington III     new_message().read(ret);
90b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(i, ret);
91b4b4fa1fSWilliam A. Kennington III }
92b4b4fa1fSWilliam A. Kennington III 
93b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Bool)
94b4b4fa1fSWilliam A. Kennington III {
95b4b4fa1fSWilliam A. Kennington III     const bool b = true;
96b4b4fa1fSWilliam A. Kennington III     expect_basic<int>(SD_BUS_TYPE_BOOLEAN, b);
97b4b4fa1fSWilliam A. Kennington III     bool ret;
98b4b4fa1fSWilliam A. Kennington III     new_message().read(ret);
99b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(b, ret);
100b4b4fa1fSWilliam A. Kennington III }
101b4b4fa1fSWilliam A. Kennington III 
102b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Double)
103b4b4fa1fSWilliam A. Kennington III {
104b4b4fa1fSWilliam A. Kennington III     const double d = 1.1;
105b4b4fa1fSWilliam A. Kennington III     expect_basic<double>(SD_BUS_TYPE_DOUBLE, d);
106b4b4fa1fSWilliam A. Kennington III     double ret;
107b4b4fa1fSWilliam A. Kennington III     new_message().read(ret);
108b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(d, ret);
109b4b4fa1fSWilliam A. Kennington III }
110b4b4fa1fSWilliam A. Kennington III 
111b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, CString)
112b4b4fa1fSWilliam A. Kennington III {
113b4b4fa1fSWilliam A. Kennington III     const char *const s = "asdf";
114b4b4fa1fSWilliam A. Kennington III     expect_basic<const char *>(SD_BUS_TYPE_STRING, s);
115b4b4fa1fSWilliam A. Kennington III     const char *ret;
116b4b4fa1fSWilliam A. Kennington III     new_message().read(ret);
117b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(s, ret);
118b4b4fa1fSWilliam A. Kennington III }
119b4b4fa1fSWilliam A. Kennington III 
120b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, String)
121b4b4fa1fSWilliam A. Kennington III {
122b4b4fa1fSWilliam A. Kennington III     const char *const s = "fsda";
123b4b4fa1fSWilliam A. Kennington III     expect_basic<const char *>(SD_BUS_TYPE_STRING, s);
124b4b4fa1fSWilliam A. Kennington III     std::string ret;
125b4b4fa1fSWilliam A. Kennington III     new_message().read(ret);
126b4b4fa1fSWilliam A. Kennington III     // Pointer comparison here is intentional as we don't expect a copy
127b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(s, ret);
128b4b4fa1fSWilliam A. Kennington III }
129b4b4fa1fSWilliam A. Kennington III 
130b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, ObjectPath)
131b4b4fa1fSWilliam A. Kennington III {
132b4b4fa1fSWilliam A. Kennington III     const char *const s = "/fsda";
133b4b4fa1fSWilliam A. Kennington III     expect_basic<const char *>(SD_BUS_TYPE_OBJECT_PATH, s);
134b4b4fa1fSWilliam A. Kennington III     sdbusplus::message::object_path ret;
135b4b4fa1fSWilliam A. Kennington III     new_message().read(ret);
136b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(s, ret.str);
137b4b4fa1fSWilliam A. Kennington III }
138b4b4fa1fSWilliam A. Kennington III 
139b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Signature)
140b4b4fa1fSWilliam A. Kennington III {
141b4b4fa1fSWilliam A. Kennington III     const char *const s = "{ii}";
142b4b4fa1fSWilliam A. Kennington III     expect_basic<const char *>(SD_BUS_TYPE_SIGNATURE, s);
143b4b4fa1fSWilliam A. Kennington III     sdbusplus::message::signature ret;
144b4b4fa1fSWilliam A. Kennington III     new_message().read(ret);
145b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(s, ret.str);
146b4b4fa1fSWilliam A. Kennington III }
147b4b4fa1fSWilliam A. Kennington III 
148b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, CombinedBasic)
149b4b4fa1fSWilliam A. Kennington III {
150b4b4fa1fSWilliam A. Kennington III     const double a = 2.2;
151b4b4fa1fSWilliam A. Kennington III     const char *const b = "ijkd";
152b4b4fa1fSWilliam A. Kennington III     const bool c = false;
153b4b4fa1fSWilliam A. Kennington III     const int d = 18;
154b4b4fa1fSWilliam A. Kennington III 
155b4b4fa1fSWilliam A. Kennington III     {
156b4b4fa1fSWilliam A. Kennington III         testing::InSequence seq;
157b4b4fa1fSWilliam A. Kennington III         expect_basic<double>(SD_BUS_TYPE_DOUBLE, a);
158b4b4fa1fSWilliam A. Kennington III         expect_basic<const char *>(SD_BUS_TYPE_STRING, b);
159b4b4fa1fSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_BOOLEAN, c);
160b4b4fa1fSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_INT32, d);
161b4b4fa1fSWilliam A. Kennington III     }
162b4b4fa1fSWilliam A. Kennington III 
163b4b4fa1fSWilliam A. Kennington III     double ret_a;
164b4b4fa1fSWilliam A. Kennington III     const char *ret_b;
165b4b4fa1fSWilliam A. Kennington III     bool ret_c;
166b4b4fa1fSWilliam A. Kennington III     int ret_d;
167b4b4fa1fSWilliam A. Kennington III     new_message().read(ret_a, ret_b, ret_c, ret_d);
168b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(a, ret_a);
169b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(b, ret_b);
170b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(c, ret_c);
171b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(d, ret_d);
172b4b4fa1fSWilliam A. Kennington III }
173b4b4fa1fSWilliam A. Kennington III 
174b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Vector)
175b4b4fa1fSWilliam A. Kennington III {
176b4b4fa1fSWilliam A. Kennington III     const std::vector<int> vi{1, 2, 3, 4};
177b4b4fa1fSWilliam A. Kennington III 
178b4b4fa1fSWilliam A. Kennington III     {
179b4b4fa1fSWilliam A. Kennington III         testing::InSequence seq;
180b4b4fa1fSWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_ARRAY, "i");
181b4b4fa1fSWilliam A. Kennington III         for (const auto &i : vi)
182b4b4fa1fSWilliam A. Kennington III         {
183b4b4fa1fSWilliam A. Kennington III             expect_at_end(false, 0);
184b4b4fa1fSWilliam A. Kennington III             expect_basic<int>(SD_BUS_TYPE_INT32, i);
185b4b4fa1fSWilliam A. Kennington III         }
186b4b4fa1fSWilliam A. Kennington III         expect_at_end(false, 1);
187b4b4fa1fSWilliam A. Kennington III         expect_exit_container();
188b4b4fa1fSWilliam A. Kennington III     }
189b4b4fa1fSWilliam A. Kennington III 
190b4b4fa1fSWilliam A. Kennington III     std::vector<int> ret_vi;
191b4b4fa1fSWilliam A. Kennington III     new_message().read(ret_vi);
192b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(vi, ret_vi);
193b4b4fa1fSWilliam A. Kennington III }
194b4b4fa1fSWilliam A. Kennington III 
195b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Set)
196b4b4fa1fSWilliam A. Kennington III {
197b4b4fa1fSWilliam A. Kennington III     const std::set<std::string> ss{"one", "two", "eight"};
198b4b4fa1fSWilliam A. Kennington III 
199b4b4fa1fSWilliam A. Kennington III     {
200b4b4fa1fSWilliam A. Kennington III         testing::InSequence seq;
201b4b4fa1fSWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_ARRAY, "s");
202b4b4fa1fSWilliam A. Kennington III         for (const auto &s : ss)
203b4b4fa1fSWilliam A. Kennington III         {
204b4b4fa1fSWilliam A. Kennington III             expect_at_end(false, 0);
205b4b4fa1fSWilliam A. Kennington III             expect_basic<const char *>(SD_BUS_TYPE_STRING, s.c_str());
206b4b4fa1fSWilliam A. Kennington III         }
207b4b4fa1fSWilliam A. Kennington III         expect_at_end(false, 1);
208b4b4fa1fSWilliam A. Kennington III         expect_exit_container();
209b4b4fa1fSWilliam A. Kennington III     }
210b4b4fa1fSWilliam A. Kennington III 
211b4b4fa1fSWilliam A. Kennington III     std::set<std::string> ret_ss;
212b4b4fa1fSWilliam A. Kennington III     new_message().read(ret_ss);
213b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(ss, ret_ss);
214b4b4fa1fSWilliam A. Kennington III }
215b4b4fa1fSWilliam A. Kennington III 
216b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Map)
217b4b4fa1fSWilliam A. Kennington III {
218b4b4fa1fSWilliam A. Kennington III     const std::map<int, std::string> mis{
219b4b4fa1fSWilliam A. Kennington III         {1, "a"},
220b4b4fa1fSWilliam A. Kennington III         {2, "bc"},
221b4b4fa1fSWilliam A. Kennington III         {3, "def"},
222b4b4fa1fSWilliam A. Kennington III         {4, "ghij"},
223b4b4fa1fSWilliam A. Kennington III     };
224b4b4fa1fSWilliam A. Kennington III 
225b4b4fa1fSWilliam A. Kennington III     {
226b4b4fa1fSWilliam A. Kennington III         testing::InSequence seq;
227b4b4fa1fSWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_ARRAY, "{is}");
228b4b4fa1fSWilliam A. Kennington III         for (const auto &is : mis)
229b4b4fa1fSWilliam A. Kennington III         {
230b4b4fa1fSWilliam A. Kennington III             expect_at_end(false, 0);
231b4b4fa1fSWilliam A. Kennington III             expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "is");
232b4b4fa1fSWilliam A. Kennington III             expect_basic<int>(SD_BUS_TYPE_INT32, is.first);
233b4b4fa1fSWilliam A. Kennington III             expect_basic<const char *>(SD_BUS_TYPE_STRING, is.second.c_str());
234b4b4fa1fSWilliam A. Kennington III             expect_exit_container();
235b4b4fa1fSWilliam A. Kennington III         }
236b4b4fa1fSWilliam A. Kennington III         expect_at_end(false, 1);
237b4b4fa1fSWilliam A. Kennington III         expect_exit_container();
238b4b4fa1fSWilliam A. Kennington III     }
239b4b4fa1fSWilliam A. Kennington III 
240b4b4fa1fSWilliam A. Kennington III     std::map<int, std::string> ret_mis;
241b4b4fa1fSWilliam A. Kennington III     new_message().read(ret_mis);
242b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(mis, ret_mis);
243b4b4fa1fSWilliam A. Kennington III }
244b4b4fa1fSWilliam A. Kennington III 
245b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, UnorderedMap)
246b4b4fa1fSWilliam A. Kennington III {
247b4b4fa1fSWilliam A. Kennington III     const std::unordered_map<int, std::string> mis{
248b4b4fa1fSWilliam A. Kennington III         {1, "a"},
249b4b4fa1fSWilliam A. Kennington III         {2, "bc"},
250b4b4fa1fSWilliam A. Kennington III         {3, "def"},
251b4b4fa1fSWilliam A. Kennington III         {4, "ghij"},
252b4b4fa1fSWilliam A. Kennington III     };
253b4b4fa1fSWilliam A. Kennington III 
254b4b4fa1fSWilliam A. Kennington III     {
255b4b4fa1fSWilliam A. Kennington III         testing::InSequence seq;
256b4b4fa1fSWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_ARRAY, "{is}");
257b4b4fa1fSWilliam A. Kennington III         for (const auto &is : mis)
258b4b4fa1fSWilliam A. Kennington III         {
259b4b4fa1fSWilliam A. Kennington III             expect_at_end(false, 0);
260b4b4fa1fSWilliam A. Kennington III             expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "is");
261b4b4fa1fSWilliam A. Kennington III             expect_basic<int>(SD_BUS_TYPE_INT32, is.first);
262b4b4fa1fSWilliam A. Kennington III             expect_basic<const char *>(SD_BUS_TYPE_STRING, is.second.c_str());
263b4b4fa1fSWilliam A. Kennington III             expect_exit_container();
264b4b4fa1fSWilliam A. Kennington III         }
265b4b4fa1fSWilliam A. Kennington III         expect_at_end(false, 1);
266b4b4fa1fSWilliam A. Kennington III         expect_exit_container();
267b4b4fa1fSWilliam A. Kennington III     }
268b4b4fa1fSWilliam A. Kennington III 
269b4b4fa1fSWilliam A. Kennington III     std::unordered_map<int, std::string> ret_mis;
270b4b4fa1fSWilliam A. Kennington III     new_message().read(ret_mis);
271b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(mis, ret_mis);
272b4b4fa1fSWilliam A. Kennington III }
273b4b4fa1fSWilliam A. Kennington III 
274b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Tuple)
275b4b4fa1fSWilliam A. Kennington III {
276b4b4fa1fSWilliam A. Kennington III     const std::tuple<int, std::string, bool> tisb{3, "hi", false};
277b4b4fa1fSWilliam A. Kennington III 
278b4b4fa1fSWilliam A. Kennington III     {
279b4b4fa1fSWilliam A. Kennington III         testing::InSequence seq;
280b4b4fa1fSWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_STRUCT, "isb");
281b4b4fa1fSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_INT32, std::get<0>(tisb));
282b4b4fa1fSWilliam A. Kennington III         expect_basic<const char *>(SD_BUS_TYPE_STRING,
283b4b4fa1fSWilliam A. Kennington III                                    std::get<1>(tisb).c_str());
284b4b4fa1fSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_BOOLEAN, std::get<2>(tisb));
285b4b4fa1fSWilliam A. Kennington III         expect_exit_container();
286b4b4fa1fSWilliam A. Kennington III     }
287b4b4fa1fSWilliam A. Kennington III 
288b4b4fa1fSWilliam A. Kennington III     std::tuple<int, std::string, bool> ret_tisb;
289b4b4fa1fSWilliam A. Kennington III     new_message().read(ret_tisb);
290b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(tisb, ret_tisb);
291b4b4fa1fSWilliam A. Kennington III }
292b4b4fa1fSWilliam A. Kennington III 
293b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Variant)
294b4b4fa1fSWilliam A. Kennington III {
295b4b4fa1fSWilliam A. Kennington III     const bool b1 = false;
296b4b4fa1fSWilliam A. Kennington III     const std::string s2{"asdf"};
297b4b4fa1fSWilliam A. Kennington III     const sdbusplus::message::variant<int, std::string, bool> v1{b1}, v2{s2};
298b4b4fa1fSWilliam A. Kennington III 
299b4b4fa1fSWilliam A. Kennington III     {
300b4b4fa1fSWilliam A. Kennington III         testing::InSequence seq;
301b4b4fa1fSWilliam A. Kennington III         expect_verify_type(SD_BUS_TYPE_VARIANT, "i", false);
302b4b4fa1fSWilliam A. Kennington III         expect_verify_type(SD_BUS_TYPE_VARIANT, "s", false);
303b4b4fa1fSWilliam A. Kennington III         expect_verify_type(SD_BUS_TYPE_VARIANT, "b", true);
304b4b4fa1fSWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_VARIANT, "b");
305b4b4fa1fSWilliam A. Kennington III         expect_basic<int>(SD_BUS_TYPE_BOOLEAN, b1);
306b4b4fa1fSWilliam A. Kennington III         expect_exit_container();
307b4b4fa1fSWilliam A. Kennington III         expect_verify_type(SD_BUS_TYPE_VARIANT, "i", false);
308b4b4fa1fSWilliam A. Kennington III         expect_verify_type(SD_BUS_TYPE_VARIANT, "s", true);
309b4b4fa1fSWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_VARIANT, "s");
310b4b4fa1fSWilliam A. Kennington III         expect_basic<const char *>(SD_BUS_TYPE_STRING, s2.c_str());
311b4b4fa1fSWilliam A. Kennington III         expect_exit_container();
312b4b4fa1fSWilliam A. Kennington III     }
313b4b4fa1fSWilliam A. Kennington III 
314b4b4fa1fSWilliam A. Kennington III     sdbusplus::message::variant<int, std::string, bool> ret_v1, ret_v2;
315b4b4fa1fSWilliam A. Kennington III     new_message().read(ret_v1, ret_v2);
316b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(v1, ret_v1);
317b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(v2, ret_v2);
318b4b4fa1fSWilliam A. Kennington III }
319b4b4fa1fSWilliam A. Kennington III 
320*60a72835SWilliam A. Kennington III TEST_F(ReadTest, VariantSkipUnmatched)
321*60a72835SWilliam A. Kennington III {
322*60a72835SWilliam A. Kennington III     {
323*60a72835SWilliam A. Kennington III         testing::InSequence seq;
324*60a72835SWilliam A. Kennington III         expect_verify_type(SD_BUS_TYPE_VARIANT, "i", false);
325*60a72835SWilliam A. Kennington III         expect_verify_type(SD_BUS_TYPE_VARIANT, "b", false);
326*60a72835SWilliam A. Kennington III         expect_skip("v");
327*60a72835SWilliam A. Kennington III     }
328*60a72835SWilliam A. Kennington III     sdbusplus::message::variant<int, bool> ret;
329*60a72835SWilliam A. Kennington III     new_message().read(ret);
330*60a72835SWilliam A. Kennington III }
331*60a72835SWilliam A. Kennington III 
332b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, LargeCombo)
333b4b4fa1fSWilliam A. Kennington III {
334b4b4fa1fSWilliam A. Kennington III     const std::vector<std::set<std::string>> vas{
335b4b4fa1fSWilliam A. Kennington III         {"a", "b", "c"},
336b4b4fa1fSWilliam A. Kennington III         {"d", "", "e"},
337b4b4fa1fSWilliam A. Kennington III     };
338b4b4fa1fSWilliam A. Kennington III     const std::map<std::string, sdbusplus::message::variant<int, double>> msv =
339b4b4fa1fSWilliam A. Kennington III         {{"a", 3.3}, {"b", 1}, {"c", 4.4}};
340b4b4fa1fSWilliam A. Kennington III 
341b4b4fa1fSWilliam A. Kennington III     {
342b4b4fa1fSWilliam A. Kennington III         testing::InSequence seq;
343b4b4fa1fSWilliam A. Kennington III 
344b4b4fa1fSWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_ARRAY, "as");
345b4b4fa1fSWilliam A. Kennington III         for (const auto &as : vas)
346b4b4fa1fSWilliam A. Kennington III         {
347b4b4fa1fSWilliam A. Kennington III             expect_at_end(false, 0);
348b4b4fa1fSWilliam A. Kennington III             expect_enter_container(SD_BUS_TYPE_ARRAY, "s");
349b4b4fa1fSWilliam A. Kennington III             for (const auto &s : as)
350b4b4fa1fSWilliam A. Kennington III             {
351b4b4fa1fSWilliam A. Kennington III                 expect_at_end(false, 0);
352b4b4fa1fSWilliam A. Kennington III                 expect_basic<const char *>(SD_BUS_TYPE_STRING, s.c_str());
353b4b4fa1fSWilliam A. Kennington III             }
354b4b4fa1fSWilliam A. Kennington III             expect_at_end(false, 1);
355b4b4fa1fSWilliam A. Kennington III             expect_exit_container();
356b4b4fa1fSWilliam A. Kennington III         }
357b4b4fa1fSWilliam A. Kennington III         expect_at_end(false, 1);
358b4b4fa1fSWilliam A. Kennington III         expect_exit_container();
359b4b4fa1fSWilliam A. Kennington III 
360b4b4fa1fSWilliam A. Kennington III         expect_enter_container(SD_BUS_TYPE_ARRAY, "{sv}");
361b4b4fa1fSWilliam A. Kennington III         for (const auto &sv : msv)
362b4b4fa1fSWilliam A. Kennington III         {
363b4b4fa1fSWilliam A. Kennington III             expect_at_end(false, 0);
364b4b4fa1fSWilliam A. Kennington III             expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "sv");
365b4b4fa1fSWilliam A. Kennington III             expect_basic<const char *>(SD_BUS_TYPE_STRING, sv.first.c_str());
366b4b4fa1fSWilliam A. Kennington III             if (sv.second.is<int>())
367b4b4fa1fSWilliam A. Kennington III             {
368b4b4fa1fSWilliam A. Kennington III                 expect_verify_type(SD_BUS_TYPE_VARIANT, "i", true);
369b4b4fa1fSWilliam A. Kennington III                 expect_enter_container(SD_BUS_TYPE_VARIANT, "i");
370b4b4fa1fSWilliam A. Kennington III                 expect_basic<int>(SD_BUS_TYPE_INT32, sv.second.get<int>());
371b4b4fa1fSWilliam A. Kennington III                 expect_exit_container();
3724fe85a30SPatrick Williams             }
3734fe85a30SPatrick Williams             else
3744fe85a30SPatrick Williams             {
375b4b4fa1fSWilliam A. Kennington III                 expect_verify_type(SD_BUS_TYPE_VARIANT, "i", false);
376b4b4fa1fSWilliam A. Kennington III                 expect_verify_type(SD_BUS_TYPE_VARIANT, "d", true);
377b4b4fa1fSWilliam A. Kennington III                 expect_enter_container(SD_BUS_TYPE_VARIANT, "d");
378b4b4fa1fSWilliam A. Kennington III                 expect_basic<double>(SD_BUS_TYPE_DOUBLE,
379b4b4fa1fSWilliam A. Kennington III                                      sv.second.get<double>());
380b4b4fa1fSWilliam A. Kennington III                 expect_exit_container();
3814fe85a30SPatrick Williams             }
382b4b4fa1fSWilliam A. Kennington III             expect_exit_container();
3834fe85a30SPatrick Williams         }
384b4b4fa1fSWilliam A. Kennington III         expect_at_end(false, 1);
385b4b4fa1fSWilliam A. Kennington III         expect_exit_container();
3864fe85a30SPatrick Williams     }
387696e3159SPatrick Williams 
388b4b4fa1fSWilliam A. Kennington III     std::vector<std::set<std::string>> ret_vas;
389b4b4fa1fSWilliam A. Kennington III     std::map<std::string, sdbusplus::message::variant<int, double>> ret_msv;
390b4b4fa1fSWilliam A. Kennington III     new_message().read(ret_vas, ret_msv);
391b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(vas, ret_vas);
392b4b4fa1fSWilliam A. Kennington III     EXPECT_EQ(msv, ret_msv);
3934fe85a30SPatrick Williams }
3944fe85a30SPatrick Williams 
395b4b4fa1fSWilliam A. Kennington III } // namespace
396