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> 6*127b8abeSPatrick Williams 7*127b8abeSPatrick Williams #include <cerrno> 8*127b8abeSPatrick 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> 134274c117SWilliam A. Kennington III #include <variant> 14b4b4fa1fSWilliam A. Kennington III #include <vector> 154fe85a30SPatrick Williams 1695269dbcSPatrick Venture #include <gmock/gmock.h> 1795269dbcSPatrick Venture #include <gtest/gtest.h> 1895269dbcSPatrick Venture 19b4b4fa1fSWilliam A. Kennington III namespace 204fe85a30SPatrick Williams { 214fe85a30SPatrick Williams 22b4b4fa1fSWilliam A. Kennington III using testing::DoAll; 23b4b4fa1fSWilliam A. Kennington III using testing::Return; 24b4b4fa1fSWilliam A. Kennington III using testing::StrEq; 25b4b4fa1fSWilliam A. Kennington III 26b4b4fa1fSWilliam A. Kennington III ACTION_TEMPLATE(AssignReadVal, HAS_1_TEMPLATE_PARAMS(typename, T), 27b4b4fa1fSWilliam A. Kennington III AND_1_VALUE_PARAMS(val)) 28b4b4fa1fSWilliam A. Kennington III { 29b4b4fa1fSWilliam A. Kennington III *static_cast<T*>(arg2) = val; 304fe85a30SPatrick Williams } 314fe85a30SPatrick Williams 32b4b4fa1fSWilliam A. Kennington III class ReadTest : public testing::Test 334fe85a30SPatrick Williams { 34b4b4fa1fSWilliam A. Kennington III protected: 35b4b4fa1fSWilliam A. Kennington III testing::StrictMock<sdbusplus::SdBusMock> mock; 364fe85a30SPatrick Williams 37b4b4fa1fSWilliam A. Kennington III void SetUp() override 384fe85a30SPatrick Williams { 39b4b4fa1fSWilliam A. Kennington III EXPECT_CALL(mock, sd_bus_message_new_method_call(testing::_, testing::_, 40b4b4fa1fSWilliam A. Kennington III nullptr, nullptr, 41b4b4fa1fSWilliam A. Kennington III nullptr, nullptr)) 42b4b4fa1fSWilliam A. Kennington III .WillRepeatedly(Return(0)); 43b4b4fa1fSWilliam A. Kennington III }; 444fe85a30SPatrick Williams 45b4b4fa1fSWilliam A. Kennington III sdbusplus::message::message new_message() 464fe85a30SPatrick Williams { 47b4b4fa1fSWilliam A. Kennington III return sdbusplus::get_mocked_new(&mock).new_method_call( 48b4b4fa1fSWilliam A. Kennington III nullptr, nullptr, nullptr, nullptr); 494fe85a30SPatrick Williams } 504fe85a30SPatrick Williams 5113367e49SWilliam A. Kennington III void expect_basic_error(char type, int ret) 5213367e49SWilliam A. Kennington III { 5313367e49SWilliam A. Kennington III EXPECT_CALL(mock, sd_bus_message_read_basic(nullptr, type, testing::_)) 5413367e49SWilliam A. Kennington III .WillOnce(Return(ret)); 5513367e49SWilliam A. Kennington III } 5613367e49SWilliam A. Kennington III 572b238afbSPatrick Venture template <typename T> 582b238afbSPatrick Venture void expect_basic(char type, T val) 594fe85a30SPatrick Williams { 60b4b4fa1fSWilliam A. Kennington III EXPECT_CALL(mock, sd_bus_message_read_basic(nullptr, type, testing::_)) 61b4b4fa1fSWilliam A. Kennington III .WillOnce(DoAll(AssignReadVal<T>(val), Return(0))); 62b4b4fa1fSWilliam A. Kennington III } 634fe85a30SPatrick Williams 64b4b4fa1fSWilliam A. Kennington III void expect_verify_type(char type, const char* contents, int ret) 654fe85a30SPatrick Williams { 66b4b4fa1fSWilliam A. Kennington III EXPECT_CALL(mock, 67b4b4fa1fSWilliam A. Kennington III sd_bus_message_verify_type(nullptr, type, StrEq(contents))) 68b4b4fa1fSWilliam A. Kennington III .WillOnce(Return(ret)); 69b4b4fa1fSWilliam A. Kennington III } 704fe85a30SPatrick Williams 71b4b4fa1fSWilliam A. Kennington III void expect_at_end(bool complete, int ret) 72b4b4fa1fSWilliam A. Kennington III { 73b4b4fa1fSWilliam A. Kennington III EXPECT_CALL(mock, sd_bus_message_at_end(nullptr, complete)) 74b4b4fa1fSWilliam A. Kennington III .WillOnce(Return(ret)); 75b4b4fa1fSWilliam A. Kennington III } 76b4b4fa1fSWilliam A. Kennington III 7713367e49SWilliam A. Kennington III void expect_skip(const char* contents, int ret = 0) 7860a72835SWilliam A. Kennington III { 7960a72835SWilliam A. Kennington III EXPECT_CALL(mock, sd_bus_message_skip(nullptr, StrEq(contents))) 8013367e49SWilliam A. Kennington III .WillOnce(Return(ret)); 8160a72835SWilliam A. Kennington III } 8260a72835SWilliam A. Kennington III 8313367e49SWilliam A. Kennington III void expect_enter_container(char type, const char* contents, int ret = 0) 84b4b4fa1fSWilliam A. Kennington III { 85b4b4fa1fSWilliam A. Kennington III EXPECT_CALL(mock, sd_bus_message_enter_container(nullptr, type, 86b4b4fa1fSWilliam A. Kennington III StrEq(contents))) 8713367e49SWilliam A. Kennington III .WillOnce(Return(ret)); 88b4b4fa1fSWilliam A. Kennington III } 89b4b4fa1fSWilliam A. Kennington III 9013367e49SWilliam A. Kennington III void expect_exit_container(int ret = 0) 91b4b4fa1fSWilliam A. Kennington III { 92b4b4fa1fSWilliam A. Kennington III EXPECT_CALL(mock, sd_bus_message_exit_container(nullptr)) 9313367e49SWilliam A. Kennington III .WillOnce(Return(ret)); 94b4b4fa1fSWilliam A. Kennington III } 95b4b4fa1fSWilliam A. Kennington III }; 96b4b4fa1fSWilliam A. Kennington III 97b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Int) 98b4b4fa1fSWilliam A. Kennington III { 99b4b4fa1fSWilliam A. Kennington III const int i = 1; 100b4b4fa1fSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, i); 101b4b4fa1fSWilliam A. Kennington III int ret; 102b4b4fa1fSWilliam A. Kennington III new_message().read(ret); 103b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(i, ret); 104b4b4fa1fSWilliam A. Kennington III } 105b4b4fa1fSWilliam A. Kennington III 106b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Bool) 107b4b4fa1fSWilliam A. Kennington III { 108b4b4fa1fSWilliam A. Kennington III const bool b = true; 109b4b4fa1fSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_BOOLEAN, b); 110b4b4fa1fSWilliam A. Kennington III bool ret; 111b4b4fa1fSWilliam A. Kennington III new_message().read(ret); 112b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(b, ret); 113b4b4fa1fSWilliam A. Kennington III } 114b4b4fa1fSWilliam A. Kennington III 115b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Double) 116b4b4fa1fSWilliam A. Kennington III { 117b4b4fa1fSWilliam A. Kennington III const double d = 1.1; 118b4b4fa1fSWilliam A. Kennington III expect_basic<double>(SD_BUS_TYPE_DOUBLE, d); 119b4b4fa1fSWilliam A. Kennington III double ret; 120b4b4fa1fSWilliam A. Kennington III new_message().read(ret); 121b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(d, ret); 122b4b4fa1fSWilliam A. Kennington III } 123b4b4fa1fSWilliam A. Kennington III 124b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, CString) 125b4b4fa1fSWilliam A. Kennington III { 126b4b4fa1fSWilliam A. Kennington III const char* const s = "asdf"; 127b4b4fa1fSWilliam A. Kennington III expect_basic<const char*>(SD_BUS_TYPE_STRING, s); 128b4b4fa1fSWilliam A. Kennington III const char* ret; 129b4b4fa1fSWilliam A. Kennington III new_message().read(ret); 130b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(s, ret); 131b4b4fa1fSWilliam A. Kennington III } 132b4b4fa1fSWilliam A. Kennington III 133b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, String) 134b4b4fa1fSWilliam A. Kennington III { 135b4b4fa1fSWilliam A. Kennington III const char* const s = "fsda"; 136b4b4fa1fSWilliam A. Kennington III expect_basic<const char*>(SD_BUS_TYPE_STRING, s); 137b4b4fa1fSWilliam A. Kennington III std::string ret; 138b4b4fa1fSWilliam A. Kennington III new_message().read(ret); 139b4b4fa1fSWilliam A. Kennington III // Pointer comparison here is intentional as we don't expect a copy 140b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(s, ret); 141b4b4fa1fSWilliam A. Kennington III } 142b4b4fa1fSWilliam A. Kennington III 143b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, ObjectPath) 144b4b4fa1fSWilliam A. Kennington III { 145b4b4fa1fSWilliam A. Kennington III const char* const s = "/fsda"; 146b4b4fa1fSWilliam A. Kennington III expect_basic<const char*>(SD_BUS_TYPE_OBJECT_PATH, s); 147b4b4fa1fSWilliam A. Kennington III sdbusplus::message::object_path ret; 148b4b4fa1fSWilliam A. Kennington III new_message().read(ret); 149b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(s, ret.str); 150b4b4fa1fSWilliam A. Kennington III } 151b4b4fa1fSWilliam A. Kennington III 152b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Signature) 153b4b4fa1fSWilliam A. Kennington III { 154b4b4fa1fSWilliam A. Kennington III const char* const s = "{ii}"; 155b4b4fa1fSWilliam A. Kennington III expect_basic<const char*>(SD_BUS_TYPE_SIGNATURE, s); 156b4b4fa1fSWilliam A. Kennington III sdbusplus::message::signature ret; 157b4b4fa1fSWilliam A. Kennington III new_message().read(ret); 158b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(s, ret.str); 159b4b4fa1fSWilliam A. Kennington III } 160b4b4fa1fSWilliam A. Kennington III 161b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, CombinedBasic) 162b4b4fa1fSWilliam A. Kennington III { 163b4b4fa1fSWilliam A. Kennington III const double a = 2.2; 164b4b4fa1fSWilliam A. Kennington III const char* const b = "ijkd"; 165b4b4fa1fSWilliam A. Kennington III const bool c = false; 166b4b4fa1fSWilliam A. Kennington III const int d = 18; 167b4b4fa1fSWilliam A. Kennington III 168b4b4fa1fSWilliam A. Kennington III { 169b4b4fa1fSWilliam A. Kennington III testing::InSequence seq; 170b4b4fa1fSWilliam A. Kennington III expect_basic<double>(SD_BUS_TYPE_DOUBLE, a); 171b4b4fa1fSWilliam A. Kennington III expect_basic<const char*>(SD_BUS_TYPE_STRING, b); 172b4b4fa1fSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_BOOLEAN, c); 173b4b4fa1fSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, d); 174b4b4fa1fSWilliam A. Kennington III } 175b4b4fa1fSWilliam A. Kennington III 176b4b4fa1fSWilliam A. Kennington III double ret_a; 177b4b4fa1fSWilliam A. Kennington III const char* ret_b; 178b4b4fa1fSWilliam A. Kennington III bool ret_c; 179b4b4fa1fSWilliam A. Kennington III int ret_d; 180b4b4fa1fSWilliam A. Kennington III new_message().read(ret_a, ret_b, ret_c, ret_d); 181b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(a, ret_a); 182b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(b, ret_b); 183b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(c, ret_c); 184b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(d, ret_d); 185b4b4fa1fSWilliam A. Kennington III } 186b4b4fa1fSWilliam A. Kennington III 18713367e49SWilliam A. Kennington III TEST_F(ReadTest, BasicError) 18813367e49SWilliam A. Kennington III { 18913367e49SWilliam A. Kennington III expect_basic_error(SD_BUS_TYPE_INT32, -EINVAL); 19013367e49SWilliam A. Kennington III int ret; 19113367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 19213367e49SWilliam A. Kennington III } 19313367e49SWilliam A. Kennington III 19413367e49SWilliam A. Kennington III TEST_F(ReadTest, BasicStringError) 19513367e49SWilliam A. Kennington III { 19613367e49SWilliam A. Kennington III expect_basic_error(SD_BUS_TYPE_STRING, -EINVAL); 19713367e49SWilliam A. Kennington III std::string ret; 19813367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 19913367e49SWilliam A. Kennington III } 20013367e49SWilliam A. Kennington III 20113367e49SWilliam A. Kennington III TEST_F(ReadTest, BasicStringWrapperError) 20213367e49SWilliam A. Kennington III { 20313367e49SWilliam A. Kennington III expect_basic_error(SD_BUS_TYPE_SIGNATURE, -EINVAL); 20413367e49SWilliam A. Kennington III sdbusplus::message::signature ret; 20513367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 20613367e49SWilliam A. Kennington III } 20713367e49SWilliam A. Kennington III 20813367e49SWilliam A. Kennington III TEST_F(ReadTest, BasicBoolError) 20913367e49SWilliam A. Kennington III { 21013367e49SWilliam A. Kennington III expect_basic_error(SD_BUS_TYPE_BOOLEAN, -EINVAL); 21113367e49SWilliam A. Kennington III bool ret; 21213367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 21313367e49SWilliam A. Kennington III } 21413367e49SWilliam A. Kennington III 215b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Vector) 216b4b4fa1fSWilliam A. Kennington III { 217b4b4fa1fSWilliam A. Kennington III const std::vector<int> vi{1, 2, 3, 4}; 218b4b4fa1fSWilliam A. Kennington III 219b4b4fa1fSWilliam A. Kennington III { 220b4b4fa1fSWilliam A. Kennington III testing::InSequence seq; 221b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "i"); 222b4b4fa1fSWilliam A. Kennington III for (const auto& i : vi) 223b4b4fa1fSWilliam A. Kennington III { 224b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 0); 225b4b4fa1fSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, i); 226b4b4fa1fSWilliam A. Kennington III } 227b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 1); 228b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 229b4b4fa1fSWilliam A. Kennington III } 230b4b4fa1fSWilliam A. Kennington III 231b4b4fa1fSWilliam A. Kennington III std::vector<int> ret_vi; 232b4b4fa1fSWilliam A. Kennington III new_message().read(ret_vi); 233b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(vi, ret_vi); 234b4b4fa1fSWilliam A. Kennington III } 235b4b4fa1fSWilliam A. Kennington III 23613367e49SWilliam A. Kennington III TEST_F(ReadTest, VectorEnterError) 23713367e49SWilliam A. Kennington III { 23813367e49SWilliam A. Kennington III { 23913367e49SWilliam A. Kennington III testing::InSequence seq; 24013367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "i", -EINVAL); 24113367e49SWilliam A. Kennington III } 24213367e49SWilliam A. Kennington III 24313367e49SWilliam A. Kennington III std::vector<int> ret; 24413367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 24513367e49SWilliam A. Kennington III } 24613367e49SWilliam A. Kennington III 24713367e49SWilliam A. Kennington III TEST_F(ReadTest, VectorIterError) 24813367e49SWilliam A. Kennington III { 24913367e49SWilliam A. Kennington III { 25013367e49SWilliam A. Kennington III testing::InSequence seq; 25113367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "i"); 25213367e49SWilliam A. Kennington III expect_at_end(false, 0); 25313367e49SWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, 1); 25413367e49SWilliam A. Kennington III expect_at_end(false, -EINVAL); 25513367e49SWilliam A. Kennington III } 25613367e49SWilliam A. Kennington III 25713367e49SWilliam A. Kennington III std::vector<int> ret; 25813367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 25913367e49SWilliam A. Kennington III } 26013367e49SWilliam A. Kennington III 26113367e49SWilliam A. Kennington III TEST_F(ReadTest, VectorExitError) 26213367e49SWilliam A. Kennington III { 26313367e49SWilliam A. Kennington III { 26413367e49SWilliam A. Kennington III testing::InSequence seq; 26513367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "i"); 26613367e49SWilliam A. Kennington III expect_at_end(false, 0); 26713367e49SWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, 1); 26813367e49SWilliam A. Kennington III expect_at_end(false, 0); 26913367e49SWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, 2); 27013367e49SWilliam A. Kennington III expect_at_end(false, 1); 27113367e49SWilliam A. Kennington III expect_exit_container(-EINVAL); 27213367e49SWilliam A. Kennington III } 27313367e49SWilliam A. Kennington III 27413367e49SWilliam A. Kennington III std::vector<int> ret; 27513367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 27613367e49SWilliam A. Kennington III } 27713367e49SWilliam A. Kennington III 278b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Set) 279b4b4fa1fSWilliam A. Kennington III { 280b4b4fa1fSWilliam A. Kennington III const std::set<std::string> ss{"one", "two", "eight"}; 281b4b4fa1fSWilliam A. Kennington III 282b4b4fa1fSWilliam A. Kennington III { 283b4b4fa1fSWilliam A. Kennington III testing::InSequence seq; 284b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "s"); 285b4b4fa1fSWilliam A. Kennington III for (const auto& s : ss) 286b4b4fa1fSWilliam A. Kennington III { 287b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 0); 288b4b4fa1fSWilliam A. Kennington III expect_basic<const char*>(SD_BUS_TYPE_STRING, s.c_str()); 289b4b4fa1fSWilliam A. Kennington III } 290b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 1); 291b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 292b4b4fa1fSWilliam A. Kennington III } 293b4b4fa1fSWilliam A. Kennington III 294b4b4fa1fSWilliam A. Kennington III std::set<std::string> ret_ss; 295b4b4fa1fSWilliam A. Kennington III new_message().read(ret_ss); 296b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(ss, ret_ss); 297b4b4fa1fSWilliam A. Kennington III } 298b4b4fa1fSWilliam A. Kennington III 299b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Map) 300b4b4fa1fSWilliam A. Kennington III { 301b4b4fa1fSWilliam A. Kennington III const std::map<int, std::string> mis{ 302b4b4fa1fSWilliam A. Kennington III {1, "a"}, 303b4b4fa1fSWilliam A. Kennington III {2, "bc"}, 304b4b4fa1fSWilliam A. Kennington III {3, "def"}, 305b4b4fa1fSWilliam A. Kennington III {4, "ghij"}, 306b4b4fa1fSWilliam A. Kennington III }; 307b4b4fa1fSWilliam A. Kennington III 308b4b4fa1fSWilliam A. Kennington III { 309b4b4fa1fSWilliam A. Kennington III testing::InSequence seq; 310b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "{is}"); 311b4b4fa1fSWilliam A. Kennington III for (const auto& is : mis) 312b4b4fa1fSWilliam A. Kennington III { 313b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 0); 314b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "is"); 315b4b4fa1fSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, is.first); 316b4b4fa1fSWilliam A. Kennington III expect_basic<const char*>(SD_BUS_TYPE_STRING, is.second.c_str()); 317b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 318b4b4fa1fSWilliam A. Kennington III } 319b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 1); 320b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 321b4b4fa1fSWilliam A. Kennington III } 322b4b4fa1fSWilliam A. Kennington III 323b4b4fa1fSWilliam A. Kennington III std::map<int, std::string> ret_mis; 324b4b4fa1fSWilliam A. Kennington III new_message().read(ret_mis); 325b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(mis, ret_mis); 326b4b4fa1fSWilliam A. Kennington III } 327b4b4fa1fSWilliam A. Kennington III 32813367e49SWilliam A. Kennington III TEST_F(ReadTest, MapEnterError) 32913367e49SWilliam A. Kennington III { 33013367e49SWilliam A. Kennington III { 33113367e49SWilliam A. Kennington III testing::InSequence seq; 33213367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "{si}", -EINVAL); 33313367e49SWilliam A. Kennington III } 33413367e49SWilliam A. Kennington III 33513367e49SWilliam A. Kennington III std::map<std::string, int> ret; 33613367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 33713367e49SWilliam A. Kennington III } 33813367e49SWilliam A. Kennington III 33913367e49SWilliam A. Kennington III TEST_F(ReadTest, MapEntryEnterError) 34013367e49SWilliam A. Kennington III { 34113367e49SWilliam A. Kennington III { 34213367e49SWilliam A. Kennington III testing::InSequence seq; 34313367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "{si}"); 34413367e49SWilliam A. Kennington III expect_at_end(false, 0); 34513367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "si", -EINVAL); 34613367e49SWilliam A. Kennington III } 34713367e49SWilliam A. Kennington III 34813367e49SWilliam A. Kennington III std::map<std::string, int> ret; 34913367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 35013367e49SWilliam A. Kennington III } 35113367e49SWilliam A. Kennington III 35213367e49SWilliam A. Kennington III TEST_F(ReadTest, MapEntryExitError) 35313367e49SWilliam A. Kennington III { 35413367e49SWilliam A. Kennington III { 35513367e49SWilliam A. Kennington III testing::InSequence seq; 35613367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "{si}"); 35713367e49SWilliam A. Kennington III expect_at_end(false, 0); 35813367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "si"); 35913367e49SWilliam A. Kennington III expect_basic<const char*>(SD_BUS_TYPE_STRING, "ab"); 36013367e49SWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, 1); 36113367e49SWilliam A. Kennington III expect_exit_container(-EINVAL); 36213367e49SWilliam A. Kennington III } 36313367e49SWilliam A. Kennington III 36413367e49SWilliam A. Kennington III std::map<std::string, int> ret; 36513367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 36613367e49SWilliam A. Kennington III } 36713367e49SWilliam A. Kennington III 36813367e49SWilliam A. Kennington III TEST_F(ReadTest, MapIterError) 36913367e49SWilliam A. Kennington III { 37013367e49SWilliam A. Kennington III { 37113367e49SWilliam A. Kennington III testing::InSequence seq; 37213367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "{si}"); 37313367e49SWilliam A. Kennington III expect_at_end(false, 0); 37413367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "si"); 37513367e49SWilliam A. Kennington III expect_basic<const char*>(SD_BUS_TYPE_STRING, "ab"); 37613367e49SWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, 1); 37713367e49SWilliam A. Kennington III expect_exit_container(); 37813367e49SWilliam A. Kennington III expect_at_end(false, -EINVAL); 37913367e49SWilliam A. Kennington III } 38013367e49SWilliam A. Kennington III 38113367e49SWilliam A. Kennington III std::map<std::string, int> ret; 38213367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 38313367e49SWilliam A. Kennington III } 38413367e49SWilliam A. Kennington III 38513367e49SWilliam A. Kennington III TEST_F(ReadTest, MapExitError) 38613367e49SWilliam A. Kennington III { 38713367e49SWilliam A. Kennington III { 38813367e49SWilliam A. Kennington III testing::InSequence seq; 38913367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "{si}"); 39013367e49SWilliam A. Kennington III expect_at_end(false, 0); 39113367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "si"); 39213367e49SWilliam A. Kennington III expect_basic<const char*>(SD_BUS_TYPE_STRING, "ab"); 39313367e49SWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, 1); 39413367e49SWilliam A. Kennington III expect_exit_container(); 39513367e49SWilliam A. Kennington III expect_at_end(false, 1); 39613367e49SWilliam A. Kennington III expect_exit_container(-EINVAL); 39713367e49SWilliam A. Kennington III } 39813367e49SWilliam A. Kennington III 39913367e49SWilliam A. Kennington III std::map<std::string, int> ret; 40013367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 40113367e49SWilliam A. Kennington III } 40213367e49SWilliam A. Kennington III 403b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, UnorderedMap) 404b4b4fa1fSWilliam A. Kennington III { 405b4b4fa1fSWilliam A. Kennington III const std::unordered_map<int, std::string> mis{ 406b4b4fa1fSWilliam A. Kennington III {1, "a"}, 407b4b4fa1fSWilliam A. Kennington III {2, "bc"}, 408b4b4fa1fSWilliam A. Kennington III {3, "def"}, 409b4b4fa1fSWilliam A. Kennington III {4, "ghij"}, 410b4b4fa1fSWilliam A. Kennington III }; 411b4b4fa1fSWilliam A. Kennington III 412b4b4fa1fSWilliam A. Kennington III { 413b4b4fa1fSWilliam A. Kennington III testing::InSequence seq; 414b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "{is}"); 415b4b4fa1fSWilliam A. Kennington III for (const auto& is : mis) 416b4b4fa1fSWilliam A. Kennington III { 417b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 0); 418b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "is"); 419b4b4fa1fSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, is.first); 420b4b4fa1fSWilliam A. Kennington III expect_basic<const char*>(SD_BUS_TYPE_STRING, is.second.c_str()); 421b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 422b4b4fa1fSWilliam A. Kennington III } 423b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 1); 424b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 425b4b4fa1fSWilliam A. Kennington III } 426b4b4fa1fSWilliam A. Kennington III 427b4b4fa1fSWilliam A. Kennington III std::unordered_map<int, std::string> ret_mis; 428b4b4fa1fSWilliam A. Kennington III new_message().read(ret_mis); 429b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(mis, ret_mis); 430b4b4fa1fSWilliam A. Kennington III } 431b4b4fa1fSWilliam A. Kennington III 432b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Tuple) 433b4b4fa1fSWilliam A. Kennington III { 434b4b4fa1fSWilliam A. Kennington III const std::tuple<int, std::string, bool> tisb{3, "hi", false}; 435b4b4fa1fSWilliam A. Kennington III 436b4b4fa1fSWilliam A. Kennington III { 437b4b4fa1fSWilliam A. Kennington III testing::InSequence seq; 438b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_STRUCT, "isb"); 439b4b4fa1fSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, std::get<0>(tisb)); 440b4b4fa1fSWilliam A. Kennington III expect_basic<const char*>(SD_BUS_TYPE_STRING, 441b4b4fa1fSWilliam A. Kennington III std::get<1>(tisb).c_str()); 442b4b4fa1fSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_BOOLEAN, std::get<2>(tisb)); 443b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 444b4b4fa1fSWilliam A. Kennington III } 445b4b4fa1fSWilliam A. Kennington III 446b4b4fa1fSWilliam A. Kennington III std::tuple<int, std::string, bool> ret_tisb; 447b4b4fa1fSWilliam A. Kennington III new_message().read(ret_tisb); 448b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(tisb, ret_tisb); 449b4b4fa1fSWilliam A. Kennington III } 450b4b4fa1fSWilliam A. Kennington III 45113367e49SWilliam A. Kennington III TEST_F(ReadTest, TupleEnterError) 45213367e49SWilliam A. Kennington III { 45313367e49SWilliam A. Kennington III { 45413367e49SWilliam A. Kennington III testing::InSequence seq; 45513367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_STRUCT, "bis", -EINVAL); 45613367e49SWilliam A. Kennington III } 45713367e49SWilliam A. Kennington III 45813367e49SWilliam A. Kennington III std::tuple<bool, int, std::string> ret; 45913367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 46013367e49SWilliam A. Kennington III } 46113367e49SWilliam A. Kennington III 46213367e49SWilliam A. Kennington III TEST_F(ReadTest, TupleExitError) 46313367e49SWilliam A. Kennington III { 46413367e49SWilliam A. Kennington III { 46513367e49SWilliam A. Kennington III testing::InSequence seq; 46613367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_STRUCT, "bis"); 46713367e49SWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_BOOLEAN, false); 46813367e49SWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, 1); 46913367e49SWilliam A. Kennington III expect_basic<const char*>(SD_BUS_TYPE_STRING, "ab"); 47013367e49SWilliam A. Kennington III expect_exit_container(-EINVAL); 47113367e49SWilliam A. Kennington III } 47213367e49SWilliam A. Kennington III 47313367e49SWilliam A. Kennington III std::tuple<bool, int, std::string> ret; 47413367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 47513367e49SWilliam A. Kennington III } 47613367e49SWilliam A. Kennington III 477b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Variant) 478b4b4fa1fSWilliam A. Kennington III { 479b4b4fa1fSWilliam A. Kennington III const bool b1 = false; 480b4b4fa1fSWilliam A. Kennington III const std::string s2{"asdf"}; 4814274c117SWilliam A. Kennington III const std::variant<int, std::string, bool> v1{b1}, v2{s2}; 482b4b4fa1fSWilliam A. Kennington III 483b4b4fa1fSWilliam A. Kennington III { 484b4b4fa1fSWilliam A. Kennington III testing::InSequence seq; 485b4b4fa1fSWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "i", false); 486b4b4fa1fSWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "s", false); 487b4b4fa1fSWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "b", true); 488b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_VARIANT, "b"); 489b4b4fa1fSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_BOOLEAN, b1); 490b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 491b4b4fa1fSWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "i", false); 492b4b4fa1fSWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "s", true); 493b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_VARIANT, "s"); 494b4b4fa1fSWilliam A. Kennington III expect_basic<const char*>(SD_BUS_TYPE_STRING, s2.c_str()); 495b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 496b4b4fa1fSWilliam A. Kennington III } 497b4b4fa1fSWilliam A. Kennington III 4984274c117SWilliam A. Kennington III std::variant<int, std::string, bool> ret_v1, ret_v2; 499b4b4fa1fSWilliam A. Kennington III new_message().read(ret_v1, ret_v2); 500b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(v1, ret_v1); 501b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(v2, ret_v2); 502b4b4fa1fSWilliam A. Kennington III } 503b4b4fa1fSWilliam A. Kennington III 50413367e49SWilliam A. Kennington III TEST_F(ReadTest, VariantVerifyError) 50513367e49SWilliam A. Kennington III { 50613367e49SWilliam A. Kennington III { 50713367e49SWilliam A. Kennington III testing::InSequence seq; 50813367e49SWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "i", -EINVAL); 50913367e49SWilliam A. Kennington III } 51013367e49SWilliam A. Kennington III 5114274c117SWilliam A. Kennington III std::variant<int, bool> ret; 51213367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 51313367e49SWilliam A. Kennington III } 51413367e49SWilliam A. Kennington III 51560a72835SWilliam A. Kennington III TEST_F(ReadTest, VariantSkipUnmatched) 51660a72835SWilliam A. Kennington III { 51760a72835SWilliam A. Kennington III { 51860a72835SWilliam A. Kennington III testing::InSequence seq; 51960a72835SWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "i", false); 52060a72835SWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "b", false); 52160a72835SWilliam A. Kennington III expect_skip("v"); 52260a72835SWilliam A. Kennington III } 52313367e49SWilliam A. Kennington III 5244274c117SWilliam A. Kennington III std::variant<int, bool> ret; 52560a72835SWilliam A. Kennington III new_message().read(ret); 52660a72835SWilliam A. Kennington III } 52760a72835SWilliam A. Kennington III 52813367e49SWilliam A. Kennington III TEST_F(ReadTest, VariantSkipError) 52913367e49SWilliam A. Kennington III { 53013367e49SWilliam A. Kennington III { 53113367e49SWilliam A. Kennington III testing::InSequence seq; 53213367e49SWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "i", false); 53313367e49SWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "b", false); 53413367e49SWilliam A. Kennington III expect_skip("v", -EINVAL); 53513367e49SWilliam A. Kennington III } 53613367e49SWilliam A. Kennington III 5374274c117SWilliam A. Kennington III std::variant<int, bool> ret; 53813367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 53913367e49SWilliam A. Kennington III } 54013367e49SWilliam A. Kennington III 54113367e49SWilliam A. Kennington III TEST_F(ReadTest, VariantEnterError) 54213367e49SWilliam A. Kennington III { 54313367e49SWilliam A. Kennington III { 54413367e49SWilliam A. Kennington III testing::InSequence seq; 54513367e49SWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "i", true); 54613367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_VARIANT, "i", -EINVAL); 54713367e49SWilliam A. Kennington III } 54813367e49SWilliam A. Kennington III 5494274c117SWilliam A. Kennington III std::variant<int, bool> ret; 55013367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 55113367e49SWilliam A. Kennington III } 55213367e49SWilliam A. Kennington III 55313367e49SWilliam A. Kennington III TEST_F(ReadTest, VariantExitError) 55413367e49SWilliam A. Kennington III { 55513367e49SWilliam A. Kennington III { 55613367e49SWilliam A. Kennington III testing::InSequence seq; 55713367e49SWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "i", true); 55813367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_VARIANT, "i"); 55913367e49SWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, 10); 56013367e49SWilliam A. Kennington III expect_exit_container(-EINVAL); 56113367e49SWilliam A. Kennington III } 56213367e49SWilliam A. Kennington III 5634274c117SWilliam A. Kennington III std::variant<int, bool> ret; 56413367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 56513367e49SWilliam A. Kennington III } 56613367e49SWilliam A. Kennington III 567b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, LargeCombo) 568b4b4fa1fSWilliam A. Kennington III { 569b4b4fa1fSWilliam A. Kennington III const std::vector<std::set<std::string>> vas{ 570b4b4fa1fSWilliam A. Kennington III {"a", "b", "c"}, 571b4b4fa1fSWilliam A. Kennington III {"d", "", "e"}, 572b4b4fa1fSWilliam A. Kennington III }; 5734274c117SWilliam A. Kennington III const std::map<std::string, std::variant<int, double>> msv = { 5744274c117SWilliam A. Kennington III {"a", 3.3}, {"b", 1}, {"c", 4.4}}; 575b4b4fa1fSWilliam A. Kennington III 576b4b4fa1fSWilliam A. Kennington III { 577b4b4fa1fSWilliam A. Kennington III testing::InSequence seq; 578b4b4fa1fSWilliam A. Kennington III 579b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "as"); 580b4b4fa1fSWilliam A. Kennington III for (const auto& as : vas) 581b4b4fa1fSWilliam A. Kennington III { 582b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 0); 583b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "s"); 584b4b4fa1fSWilliam A. Kennington III for (const auto& s : as) 585b4b4fa1fSWilliam A. Kennington III { 586b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 0); 587b4b4fa1fSWilliam A. Kennington III expect_basic<const char*>(SD_BUS_TYPE_STRING, s.c_str()); 588b4b4fa1fSWilliam A. Kennington III } 589b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 1); 590b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 591b4b4fa1fSWilliam A. Kennington III } 592b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 1); 593b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 594b4b4fa1fSWilliam A. Kennington III 595b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "{sv}"); 596b4b4fa1fSWilliam A. Kennington III for (const auto& sv : msv) 597b4b4fa1fSWilliam A. Kennington III { 598b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 0); 599b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "sv"); 600b4b4fa1fSWilliam A. Kennington III expect_basic<const char*>(SD_BUS_TYPE_STRING, sv.first.c_str()); 6014274c117SWilliam A. Kennington III if (std::holds_alternative<int>(sv.second)) 602b4b4fa1fSWilliam A. Kennington III { 603b4b4fa1fSWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "i", true); 604b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_VARIANT, "i"); 6054274c117SWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, std::get<int>(sv.second)); 606b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 6074fe85a30SPatrick Williams } 6084fe85a30SPatrick Williams else 6094fe85a30SPatrick Williams { 610b4b4fa1fSWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "i", false); 611b4b4fa1fSWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "d", true); 612b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_VARIANT, "d"); 613b4b4fa1fSWilliam A. Kennington III expect_basic<double>(SD_BUS_TYPE_DOUBLE, 6144274c117SWilliam A. Kennington III std::get<double>(sv.second)); 615b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 6164fe85a30SPatrick Williams } 617b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 6184fe85a30SPatrick Williams } 619b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 1); 620b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 6214fe85a30SPatrick Williams } 622696e3159SPatrick Williams 623b4b4fa1fSWilliam A. Kennington III std::vector<std::set<std::string>> ret_vas; 6244274c117SWilliam A. Kennington III std::map<std::string, std::variant<int, double>> ret_msv; 625b4b4fa1fSWilliam A. Kennington III new_message().read(ret_vas, ret_msv); 626b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(vas, ret_vas); 627b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(msv, ret_msv); 6284fe85a30SPatrick Williams } 6294fe85a30SPatrick Williams 630b4b4fa1fSWilliam A. Kennington III } // namespace 631