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)); 44*cb2fbeb9SEd Tanous } 454fe85a30SPatrick Williams 4610d7aa12SPatrick 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 6529cde21ffSPatrick Williams // Unpack tests. 6539cde21ffSPatrick Williams // Since unpack uses read, we're mostly just testing the compilation. 6549cde21ffSPatrick Williams // Duplicate a few tests from Read using 'unpack'. 6559cde21ffSPatrick Williams 6569cde21ffSPatrick Williams TEST_F(ReadTest, UnpackSingleVector) 6579cde21ffSPatrick Williams { 6589cde21ffSPatrick Williams const std::vector<int> vi{1, 2, 3, 4}; 6599cde21ffSPatrick Williams 6609cde21ffSPatrick Williams { 6619cde21ffSPatrick Williams testing::InSequence seq; 6629cde21ffSPatrick Williams expect_enter_container(SD_BUS_TYPE_ARRAY, "i"); 6639cde21ffSPatrick Williams for (const auto& i : vi) 6649cde21ffSPatrick Williams { 6659cde21ffSPatrick Williams expect_at_end(false, 0); 6669cde21ffSPatrick Williams expect_basic<int>(SD_BUS_TYPE_INT32, i); 6679cde21ffSPatrick Williams } 6689cde21ffSPatrick Williams expect_at_end(false, 1); 6699cde21ffSPatrick Williams expect_exit_container(); 6709cde21ffSPatrick Williams } 6719cde21ffSPatrick Williams 6729cde21ffSPatrick Williams auto ret_vi = new_message().unpack<std::vector<int>>(); 6739cde21ffSPatrick Williams EXPECT_EQ(vi, ret_vi); 6749cde21ffSPatrick Williams } 6759cde21ffSPatrick Williams 6769cde21ffSPatrick Williams TEST_F(ReadTest, UnpackMultiple) 6779cde21ffSPatrick Williams { 6789cde21ffSPatrick Williams const std::tuple<int, std::string, bool> tisb{3, "hi", false}; 6799cde21ffSPatrick Williams 6809cde21ffSPatrick Williams { 6819cde21ffSPatrick Williams testing::InSequence seq; 6829cde21ffSPatrick Williams expect_basic<int>(SD_BUS_TYPE_INT32, std::get<0>(tisb)); 6839cde21ffSPatrick Williams expect_basic<const char*>(SD_BUS_TYPE_STRING, 6849cde21ffSPatrick Williams std::get<1>(tisb).c_str()); 6859cde21ffSPatrick Williams expect_basic<int>(SD_BUS_TYPE_BOOLEAN, std::get<2>(tisb)); 6869cde21ffSPatrick Williams } 6879cde21ffSPatrick Williams 6889cde21ffSPatrick Williams auto ret_tisb = new_message().unpack<int, std::string, bool>(); 6899cde21ffSPatrick Williams EXPECT_EQ(tisb, ret_tisb); 6909cde21ffSPatrick Williams } 6919cde21ffSPatrick Williams 692b4b4fa1fSWilliam A. Kennington III } // namespace 693