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