195269dbcSPatrick Venture #include <systemd/sd-bus-protocol.h> 295269dbcSPatrick Venture 313367e49SWilliam A. Kennington III #include <cerrno> 4b4b4fa1fSWilliam A. Kennington III #include <map> 513367e49SWilliam A. Kennington III #include <sdbusplus/exception.hpp> 64fe85a30SPatrick Williams #include <sdbusplus/message.hpp> 7b4b4fa1fSWilliam A. Kennington III #include <sdbusplus/test/sdbus_mock.hpp> 828dc36d5SEd Tanous #include <set> 9b4b4fa1fSWilliam A. Kennington III #include <string> 10b4b4fa1fSWilliam A. Kennington III #include <tuple> 11b4b4fa1fSWilliam A. Kennington III #include <unordered_map> 12b4b4fa1fSWilliam A. Kennington III #include <vector> 134fe85a30SPatrick Williams 1495269dbcSPatrick Venture #include <gmock/gmock.h> 1595269dbcSPatrick Venture #include <gtest/gtest.h> 1695269dbcSPatrick Venture 17b4b4fa1fSWilliam A. Kennington III namespace 184fe85a30SPatrick Williams { 194fe85a30SPatrick Williams 20b4b4fa1fSWilliam A. Kennington III using testing::DoAll; 21b4b4fa1fSWilliam A. Kennington III using testing::Return; 22b4b4fa1fSWilliam A. Kennington III using testing::StrEq; 23b4b4fa1fSWilliam A. Kennington III 24b4b4fa1fSWilliam A. Kennington III ACTION_TEMPLATE(AssignReadVal, HAS_1_TEMPLATE_PARAMS(typename, T), 25b4b4fa1fSWilliam A. Kennington III AND_1_VALUE_PARAMS(val)) 26b4b4fa1fSWilliam A. Kennington III { 27b4b4fa1fSWilliam A. Kennington III *static_cast<T *>(arg2) = val; 284fe85a30SPatrick Williams } 294fe85a30SPatrick Williams 30b4b4fa1fSWilliam A. Kennington III class ReadTest : public testing::Test 314fe85a30SPatrick Williams { 32b4b4fa1fSWilliam A. Kennington III protected: 33b4b4fa1fSWilliam A. Kennington III testing::StrictMock<sdbusplus::SdBusMock> mock; 344fe85a30SPatrick Williams 35b4b4fa1fSWilliam A. Kennington III void SetUp() override 364fe85a30SPatrick Williams { 37b4b4fa1fSWilliam A. Kennington III EXPECT_CALL(mock, sd_bus_message_new_method_call(testing::_, testing::_, 38b4b4fa1fSWilliam A. Kennington III nullptr, nullptr, 39b4b4fa1fSWilliam A. Kennington III nullptr, nullptr)) 40b4b4fa1fSWilliam A. Kennington III .WillRepeatedly(Return(0)); 41b4b4fa1fSWilliam A. Kennington III }; 424fe85a30SPatrick Williams 43b4b4fa1fSWilliam A. Kennington III sdbusplus::message::message new_message() 444fe85a30SPatrick Williams { 45b4b4fa1fSWilliam A. Kennington III return sdbusplus::get_mocked_new(&mock).new_method_call( 46b4b4fa1fSWilliam A. Kennington III nullptr, nullptr, nullptr, nullptr); 474fe85a30SPatrick Williams } 484fe85a30SPatrick Williams 4913367e49SWilliam A. Kennington III void expect_basic_error(char type, int ret) 5013367e49SWilliam A. Kennington III { 5113367e49SWilliam A. Kennington III EXPECT_CALL(mock, sd_bus_message_read_basic(nullptr, type, testing::_)) 5213367e49SWilliam A. Kennington III .WillOnce(Return(ret)); 5313367e49SWilliam A. Kennington III } 5413367e49SWilliam A. Kennington III 55*2b238afbSPatrick Venture template <typename T> 56*2b238afbSPatrick Venture void expect_basic(char type, T val) 574fe85a30SPatrick Williams { 58b4b4fa1fSWilliam A. Kennington III EXPECT_CALL(mock, sd_bus_message_read_basic(nullptr, type, testing::_)) 59b4b4fa1fSWilliam A. Kennington III .WillOnce(DoAll(AssignReadVal<T>(val), Return(0))); 60b4b4fa1fSWilliam A. Kennington III } 614fe85a30SPatrick Williams 62b4b4fa1fSWilliam A. Kennington III void expect_verify_type(char type, const char *contents, int ret) 634fe85a30SPatrick Williams { 64b4b4fa1fSWilliam A. Kennington III EXPECT_CALL(mock, 65b4b4fa1fSWilliam A. Kennington III sd_bus_message_verify_type(nullptr, type, StrEq(contents))) 66b4b4fa1fSWilliam A. Kennington III .WillOnce(Return(ret)); 67b4b4fa1fSWilliam A. Kennington III } 684fe85a30SPatrick Williams 69b4b4fa1fSWilliam A. Kennington III void expect_at_end(bool complete, int ret) 70b4b4fa1fSWilliam A. Kennington III { 71b4b4fa1fSWilliam A. Kennington III EXPECT_CALL(mock, sd_bus_message_at_end(nullptr, complete)) 72b4b4fa1fSWilliam A. Kennington III .WillOnce(Return(ret)); 73b4b4fa1fSWilliam A. Kennington III } 74b4b4fa1fSWilliam A. Kennington III 7513367e49SWilliam A. Kennington III void expect_skip(const char *contents, int ret = 0) 7660a72835SWilliam A. Kennington III { 7760a72835SWilliam A. Kennington III EXPECT_CALL(mock, sd_bus_message_skip(nullptr, StrEq(contents))) 7813367e49SWilliam A. Kennington III .WillOnce(Return(ret)); 7960a72835SWilliam A. Kennington III } 8060a72835SWilliam A. Kennington III 8113367e49SWilliam A. Kennington III void expect_enter_container(char type, const char *contents, int ret = 0) 82b4b4fa1fSWilliam A. Kennington III { 83b4b4fa1fSWilliam A. Kennington III EXPECT_CALL(mock, sd_bus_message_enter_container(nullptr, type, 84b4b4fa1fSWilliam A. Kennington III StrEq(contents))) 8513367e49SWilliam A. Kennington III .WillOnce(Return(ret)); 86b4b4fa1fSWilliam A. Kennington III } 87b4b4fa1fSWilliam A. Kennington III 8813367e49SWilliam A. Kennington III void expect_exit_container(int ret = 0) 89b4b4fa1fSWilliam A. Kennington III { 90b4b4fa1fSWilliam A. Kennington III EXPECT_CALL(mock, sd_bus_message_exit_container(nullptr)) 9113367e49SWilliam A. Kennington III .WillOnce(Return(ret)); 92b4b4fa1fSWilliam A. Kennington III } 93b4b4fa1fSWilliam A. Kennington III }; 94b4b4fa1fSWilliam A. Kennington III 95b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Int) 96b4b4fa1fSWilliam A. Kennington III { 97b4b4fa1fSWilliam A. Kennington III const int i = 1; 98b4b4fa1fSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, i); 99b4b4fa1fSWilliam A. Kennington III int ret; 100b4b4fa1fSWilliam A. Kennington III new_message().read(ret); 101b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(i, ret); 102b4b4fa1fSWilliam A. Kennington III } 103b4b4fa1fSWilliam A. Kennington III 104b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Bool) 105b4b4fa1fSWilliam A. Kennington III { 106b4b4fa1fSWilliam A. Kennington III const bool b = true; 107b4b4fa1fSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_BOOLEAN, b); 108b4b4fa1fSWilliam A. Kennington III bool ret; 109b4b4fa1fSWilliam A. Kennington III new_message().read(ret); 110b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(b, ret); 111b4b4fa1fSWilliam A. Kennington III } 112b4b4fa1fSWilliam A. Kennington III 113b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Double) 114b4b4fa1fSWilliam A. Kennington III { 115b4b4fa1fSWilliam A. Kennington III const double d = 1.1; 116b4b4fa1fSWilliam A. Kennington III expect_basic<double>(SD_BUS_TYPE_DOUBLE, d); 117b4b4fa1fSWilliam A. Kennington III double ret; 118b4b4fa1fSWilliam A. Kennington III new_message().read(ret); 119b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(d, ret); 120b4b4fa1fSWilliam A. Kennington III } 121b4b4fa1fSWilliam A. Kennington III 122b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, CString) 123b4b4fa1fSWilliam A. Kennington III { 124b4b4fa1fSWilliam A. Kennington III const char *const s = "asdf"; 125b4b4fa1fSWilliam A. Kennington III expect_basic<const char *>(SD_BUS_TYPE_STRING, s); 126b4b4fa1fSWilliam A. Kennington III const char *ret; 127b4b4fa1fSWilliam A. Kennington III new_message().read(ret); 128b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(s, ret); 129b4b4fa1fSWilliam A. Kennington III } 130b4b4fa1fSWilliam A. Kennington III 131b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, String) 132b4b4fa1fSWilliam A. Kennington III { 133b4b4fa1fSWilliam A. Kennington III const char *const s = "fsda"; 134b4b4fa1fSWilliam A. Kennington III expect_basic<const char *>(SD_BUS_TYPE_STRING, s); 135b4b4fa1fSWilliam A. Kennington III std::string ret; 136b4b4fa1fSWilliam A. Kennington III new_message().read(ret); 137b4b4fa1fSWilliam A. Kennington III // Pointer comparison here is intentional as we don't expect a copy 138b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(s, ret); 139b4b4fa1fSWilliam A. Kennington III } 140b4b4fa1fSWilliam A. Kennington III 141b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, ObjectPath) 142b4b4fa1fSWilliam A. Kennington III { 143b4b4fa1fSWilliam A. Kennington III const char *const s = "/fsda"; 144b4b4fa1fSWilliam A. Kennington III expect_basic<const char *>(SD_BUS_TYPE_OBJECT_PATH, s); 145b4b4fa1fSWilliam A. Kennington III sdbusplus::message::object_path ret; 146b4b4fa1fSWilliam A. Kennington III new_message().read(ret); 147b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(s, ret.str); 148b4b4fa1fSWilliam A. Kennington III } 149b4b4fa1fSWilliam A. Kennington III 150b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Signature) 151b4b4fa1fSWilliam A. Kennington III { 152b4b4fa1fSWilliam A. Kennington III const char *const s = "{ii}"; 153b4b4fa1fSWilliam A. Kennington III expect_basic<const char *>(SD_BUS_TYPE_SIGNATURE, s); 154b4b4fa1fSWilliam A. Kennington III sdbusplus::message::signature ret; 155b4b4fa1fSWilliam A. Kennington III new_message().read(ret); 156b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(s, ret.str); 157b4b4fa1fSWilliam A. Kennington III } 158b4b4fa1fSWilliam A. Kennington III 159b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, CombinedBasic) 160b4b4fa1fSWilliam A. Kennington III { 161b4b4fa1fSWilliam A. Kennington III const double a = 2.2; 162b4b4fa1fSWilliam A. Kennington III const char *const b = "ijkd"; 163b4b4fa1fSWilliam A. Kennington III const bool c = false; 164b4b4fa1fSWilliam A. Kennington III const int d = 18; 165b4b4fa1fSWilliam A. Kennington III 166b4b4fa1fSWilliam A. Kennington III { 167b4b4fa1fSWilliam A. Kennington III testing::InSequence seq; 168b4b4fa1fSWilliam A. Kennington III expect_basic<double>(SD_BUS_TYPE_DOUBLE, a); 169b4b4fa1fSWilliam A. Kennington III expect_basic<const char *>(SD_BUS_TYPE_STRING, b); 170b4b4fa1fSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_BOOLEAN, c); 171b4b4fa1fSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, d); 172b4b4fa1fSWilliam A. Kennington III } 173b4b4fa1fSWilliam A. Kennington III 174b4b4fa1fSWilliam A. Kennington III double ret_a; 175b4b4fa1fSWilliam A. Kennington III const char *ret_b; 176b4b4fa1fSWilliam A. Kennington III bool ret_c; 177b4b4fa1fSWilliam A. Kennington III int ret_d; 178b4b4fa1fSWilliam A. Kennington III new_message().read(ret_a, ret_b, ret_c, ret_d); 179b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(a, ret_a); 180b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(b, ret_b); 181b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(c, ret_c); 182b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(d, ret_d); 183b4b4fa1fSWilliam A. Kennington III } 184b4b4fa1fSWilliam A. Kennington III 18513367e49SWilliam A. Kennington III TEST_F(ReadTest, BasicError) 18613367e49SWilliam A. Kennington III { 18713367e49SWilliam A. Kennington III expect_basic_error(SD_BUS_TYPE_INT32, -EINVAL); 18813367e49SWilliam A. Kennington III int ret; 18913367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 19013367e49SWilliam A. Kennington III } 19113367e49SWilliam A. Kennington III 19213367e49SWilliam A. Kennington III TEST_F(ReadTest, BasicStringError) 19313367e49SWilliam A. Kennington III { 19413367e49SWilliam A. Kennington III expect_basic_error(SD_BUS_TYPE_STRING, -EINVAL); 19513367e49SWilliam A. Kennington III std::string ret; 19613367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 19713367e49SWilliam A. Kennington III } 19813367e49SWilliam A. Kennington III 19913367e49SWilliam A. Kennington III TEST_F(ReadTest, BasicStringWrapperError) 20013367e49SWilliam A. Kennington III { 20113367e49SWilliam A. Kennington III expect_basic_error(SD_BUS_TYPE_SIGNATURE, -EINVAL); 20213367e49SWilliam A. Kennington III sdbusplus::message::signature ret; 20313367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 20413367e49SWilliam A. Kennington III } 20513367e49SWilliam A. Kennington III 20613367e49SWilliam A. Kennington III TEST_F(ReadTest, BasicBoolError) 20713367e49SWilliam A. Kennington III { 20813367e49SWilliam A. Kennington III expect_basic_error(SD_BUS_TYPE_BOOLEAN, -EINVAL); 20913367e49SWilliam A. Kennington III bool ret; 21013367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 21113367e49SWilliam A. Kennington III } 21213367e49SWilliam A. Kennington III 213b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Vector) 214b4b4fa1fSWilliam A. Kennington III { 215b4b4fa1fSWilliam A. Kennington III const std::vector<int> vi{1, 2, 3, 4}; 216b4b4fa1fSWilliam A. Kennington III 217b4b4fa1fSWilliam A. Kennington III { 218b4b4fa1fSWilliam A. Kennington III testing::InSequence seq; 219b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "i"); 220b4b4fa1fSWilliam A. Kennington III for (const auto &i : vi) 221b4b4fa1fSWilliam A. Kennington III { 222b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 0); 223b4b4fa1fSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, i); 224b4b4fa1fSWilliam A. Kennington III } 225b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 1); 226b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 227b4b4fa1fSWilliam A. Kennington III } 228b4b4fa1fSWilliam A. Kennington III 229b4b4fa1fSWilliam A. Kennington III std::vector<int> ret_vi; 230b4b4fa1fSWilliam A. Kennington III new_message().read(ret_vi); 231b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(vi, ret_vi); 232b4b4fa1fSWilliam A. Kennington III } 233b4b4fa1fSWilliam A. Kennington III 23413367e49SWilliam A. Kennington III TEST_F(ReadTest, VectorEnterError) 23513367e49SWilliam A. Kennington III { 23613367e49SWilliam A. Kennington III { 23713367e49SWilliam A. Kennington III testing::InSequence seq; 23813367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "i", -EINVAL); 23913367e49SWilliam A. Kennington III } 24013367e49SWilliam A. Kennington III 24113367e49SWilliam A. Kennington III std::vector<int> ret; 24213367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 24313367e49SWilliam A. Kennington III } 24413367e49SWilliam A. Kennington III 24513367e49SWilliam A. Kennington III TEST_F(ReadTest, VectorIterError) 24613367e49SWilliam A. Kennington III { 24713367e49SWilliam A. Kennington III { 24813367e49SWilliam A. Kennington III testing::InSequence seq; 24913367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "i"); 25013367e49SWilliam A. Kennington III expect_at_end(false, 0); 25113367e49SWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, 1); 25213367e49SWilliam A. Kennington III expect_at_end(false, -EINVAL); 25313367e49SWilliam A. Kennington III } 25413367e49SWilliam A. Kennington III 25513367e49SWilliam A. Kennington III std::vector<int> ret; 25613367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 25713367e49SWilliam A. Kennington III } 25813367e49SWilliam A. Kennington III 25913367e49SWilliam A. Kennington III TEST_F(ReadTest, VectorExitError) 26013367e49SWilliam A. Kennington III { 26113367e49SWilliam A. Kennington III { 26213367e49SWilliam A. Kennington III testing::InSequence seq; 26313367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "i"); 26413367e49SWilliam A. Kennington III expect_at_end(false, 0); 26513367e49SWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, 1); 26613367e49SWilliam A. Kennington III expect_at_end(false, 0); 26713367e49SWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, 2); 26813367e49SWilliam A. Kennington III expect_at_end(false, 1); 26913367e49SWilliam A. Kennington III expect_exit_container(-EINVAL); 27013367e49SWilliam A. Kennington III } 27113367e49SWilliam A. Kennington III 27213367e49SWilliam A. Kennington III std::vector<int> ret; 27313367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 27413367e49SWilliam A. Kennington III } 27513367e49SWilliam A. Kennington III 276b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Set) 277b4b4fa1fSWilliam A. Kennington III { 278b4b4fa1fSWilliam A. Kennington III const std::set<std::string> ss{"one", "two", "eight"}; 279b4b4fa1fSWilliam A. Kennington III 280b4b4fa1fSWilliam A. Kennington III { 281b4b4fa1fSWilliam A. Kennington III testing::InSequence seq; 282b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "s"); 283b4b4fa1fSWilliam A. Kennington III for (const auto &s : ss) 284b4b4fa1fSWilliam A. Kennington III { 285b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 0); 286b4b4fa1fSWilliam A. Kennington III expect_basic<const char *>(SD_BUS_TYPE_STRING, s.c_str()); 287b4b4fa1fSWilliam A. Kennington III } 288b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 1); 289b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 290b4b4fa1fSWilliam A. Kennington III } 291b4b4fa1fSWilliam A. Kennington III 292b4b4fa1fSWilliam A. Kennington III std::set<std::string> ret_ss; 293b4b4fa1fSWilliam A. Kennington III new_message().read(ret_ss); 294b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(ss, ret_ss); 295b4b4fa1fSWilliam A. Kennington III } 296b4b4fa1fSWilliam A. Kennington III 297b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Map) 298b4b4fa1fSWilliam A. Kennington III { 299b4b4fa1fSWilliam A. Kennington III const std::map<int, std::string> mis{ 300b4b4fa1fSWilliam A. Kennington III {1, "a"}, 301b4b4fa1fSWilliam A. Kennington III {2, "bc"}, 302b4b4fa1fSWilliam A. Kennington III {3, "def"}, 303b4b4fa1fSWilliam A. Kennington III {4, "ghij"}, 304b4b4fa1fSWilliam A. Kennington III }; 305b4b4fa1fSWilliam A. Kennington III 306b4b4fa1fSWilliam A. Kennington III { 307b4b4fa1fSWilliam A. Kennington III testing::InSequence seq; 308b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "{is}"); 309b4b4fa1fSWilliam A. Kennington III for (const auto &is : mis) 310b4b4fa1fSWilliam A. Kennington III { 311b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 0); 312b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "is"); 313b4b4fa1fSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, is.first); 314b4b4fa1fSWilliam A. Kennington III expect_basic<const char *>(SD_BUS_TYPE_STRING, is.second.c_str()); 315b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 316b4b4fa1fSWilliam A. Kennington III } 317b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 1); 318b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 319b4b4fa1fSWilliam A. Kennington III } 320b4b4fa1fSWilliam A. Kennington III 321b4b4fa1fSWilliam A. Kennington III std::map<int, std::string> ret_mis; 322b4b4fa1fSWilliam A. Kennington III new_message().read(ret_mis); 323b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(mis, ret_mis); 324b4b4fa1fSWilliam A. Kennington III } 325b4b4fa1fSWilliam A. Kennington III 32613367e49SWilliam A. Kennington III TEST_F(ReadTest, MapEnterError) 32713367e49SWilliam A. Kennington III { 32813367e49SWilliam A. Kennington III { 32913367e49SWilliam A. Kennington III testing::InSequence seq; 33013367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "{si}", -EINVAL); 33113367e49SWilliam A. Kennington III } 33213367e49SWilliam A. Kennington III 33313367e49SWilliam A. Kennington III std::map<std::string, int> ret; 33413367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 33513367e49SWilliam A. Kennington III } 33613367e49SWilliam A. Kennington III 33713367e49SWilliam A. Kennington III TEST_F(ReadTest, MapEntryEnterError) 33813367e49SWilliam A. Kennington III { 33913367e49SWilliam A. Kennington III { 34013367e49SWilliam A. Kennington III testing::InSequence seq; 34113367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "{si}"); 34213367e49SWilliam A. Kennington III expect_at_end(false, 0); 34313367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "si", -EINVAL); 34413367e49SWilliam A. Kennington III } 34513367e49SWilliam A. Kennington III 34613367e49SWilliam A. Kennington III std::map<std::string, int> ret; 34713367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 34813367e49SWilliam A. Kennington III } 34913367e49SWilliam A. Kennington III 35013367e49SWilliam A. Kennington III TEST_F(ReadTest, MapEntryExitError) 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}"); 35513367e49SWilliam A. Kennington III expect_at_end(false, 0); 35613367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "si"); 35713367e49SWilliam A. Kennington III expect_basic<const char *>(SD_BUS_TYPE_STRING, "ab"); 35813367e49SWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, 1); 35913367e49SWilliam A. Kennington III expect_exit_container(-EINVAL); 36013367e49SWilliam A. Kennington III } 36113367e49SWilliam A. Kennington III 36213367e49SWilliam A. Kennington III std::map<std::string, int> ret; 36313367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 36413367e49SWilliam A. Kennington III } 36513367e49SWilliam A. Kennington III 36613367e49SWilliam A. Kennington III TEST_F(ReadTest, MapIterError) 36713367e49SWilliam A. Kennington III { 36813367e49SWilliam A. Kennington III { 36913367e49SWilliam A. Kennington III testing::InSequence seq; 37013367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "{si}"); 37113367e49SWilliam A. Kennington III expect_at_end(false, 0); 37213367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "si"); 37313367e49SWilliam A. Kennington III expect_basic<const char *>(SD_BUS_TYPE_STRING, "ab"); 37413367e49SWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, 1); 37513367e49SWilliam A. Kennington III expect_exit_container(); 37613367e49SWilliam A. Kennington III expect_at_end(false, -EINVAL); 37713367e49SWilliam A. Kennington III } 37813367e49SWilliam A. Kennington III 37913367e49SWilliam A. Kennington III std::map<std::string, int> ret; 38013367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 38113367e49SWilliam A. Kennington III } 38213367e49SWilliam A. Kennington III 38313367e49SWilliam A. Kennington III TEST_F(ReadTest, MapExitError) 38413367e49SWilliam A. Kennington III { 38513367e49SWilliam A. Kennington III { 38613367e49SWilliam A. Kennington III testing::InSequence seq; 38713367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "{si}"); 38813367e49SWilliam A. Kennington III expect_at_end(false, 0); 38913367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "si"); 39013367e49SWilliam A. Kennington III expect_basic<const char *>(SD_BUS_TYPE_STRING, "ab"); 39113367e49SWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, 1); 39213367e49SWilliam A. Kennington III expect_exit_container(); 39313367e49SWilliam A. Kennington III expect_at_end(false, 1); 39413367e49SWilliam A. Kennington III expect_exit_container(-EINVAL); 39513367e49SWilliam A. Kennington III } 39613367e49SWilliam A. Kennington III 39713367e49SWilliam A. Kennington III std::map<std::string, int> ret; 39813367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 39913367e49SWilliam A. Kennington III } 40013367e49SWilliam A. Kennington III 401b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, UnorderedMap) 402b4b4fa1fSWilliam A. Kennington III { 403b4b4fa1fSWilliam A. Kennington III const std::unordered_map<int, std::string> mis{ 404b4b4fa1fSWilliam A. Kennington III {1, "a"}, 405b4b4fa1fSWilliam A. Kennington III {2, "bc"}, 406b4b4fa1fSWilliam A. Kennington III {3, "def"}, 407b4b4fa1fSWilliam A. Kennington III {4, "ghij"}, 408b4b4fa1fSWilliam A. Kennington III }; 409b4b4fa1fSWilliam A. Kennington III 410b4b4fa1fSWilliam A. Kennington III { 411b4b4fa1fSWilliam A. Kennington III testing::InSequence seq; 412b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "{is}"); 413b4b4fa1fSWilliam A. Kennington III for (const auto &is : mis) 414b4b4fa1fSWilliam A. Kennington III { 415b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 0); 416b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "is"); 417b4b4fa1fSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, is.first); 418b4b4fa1fSWilliam A. Kennington III expect_basic<const char *>(SD_BUS_TYPE_STRING, is.second.c_str()); 419b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 420b4b4fa1fSWilliam A. Kennington III } 421b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 1); 422b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 423b4b4fa1fSWilliam A. Kennington III } 424b4b4fa1fSWilliam A. Kennington III 425b4b4fa1fSWilliam A. Kennington III std::unordered_map<int, std::string> ret_mis; 426b4b4fa1fSWilliam A. Kennington III new_message().read(ret_mis); 427b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(mis, ret_mis); 428b4b4fa1fSWilliam A. Kennington III } 429b4b4fa1fSWilliam A. Kennington III 430b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Tuple) 431b4b4fa1fSWilliam A. Kennington III { 432b4b4fa1fSWilliam A. Kennington III const std::tuple<int, std::string, bool> tisb{3, "hi", false}; 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_STRUCT, "isb"); 437b4b4fa1fSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, std::get<0>(tisb)); 438b4b4fa1fSWilliam A. Kennington III expect_basic<const char *>(SD_BUS_TYPE_STRING, 439b4b4fa1fSWilliam A. Kennington III std::get<1>(tisb).c_str()); 440b4b4fa1fSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_BOOLEAN, std::get<2>(tisb)); 441b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 442b4b4fa1fSWilliam A. Kennington III } 443b4b4fa1fSWilliam A. Kennington III 444b4b4fa1fSWilliam A. Kennington III std::tuple<int, std::string, bool> ret_tisb; 445b4b4fa1fSWilliam A. Kennington III new_message().read(ret_tisb); 446b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(tisb, ret_tisb); 447b4b4fa1fSWilliam A. Kennington III } 448b4b4fa1fSWilliam A. Kennington III 44913367e49SWilliam A. Kennington III TEST_F(ReadTest, TupleEnterError) 45013367e49SWilliam A. Kennington III { 45113367e49SWilliam A. Kennington III { 45213367e49SWilliam A. Kennington III testing::InSequence seq; 45313367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_STRUCT, "bis", -EINVAL); 45413367e49SWilliam A. Kennington III } 45513367e49SWilliam A. Kennington III 45613367e49SWilliam A. Kennington III std::tuple<bool, int, std::string> ret; 45713367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 45813367e49SWilliam A. Kennington III } 45913367e49SWilliam A. Kennington III 46013367e49SWilliam A. Kennington III TEST_F(ReadTest, TupleExitError) 46113367e49SWilliam A. Kennington III { 46213367e49SWilliam A. Kennington III { 46313367e49SWilliam A. Kennington III testing::InSequence seq; 46413367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_STRUCT, "bis"); 46513367e49SWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_BOOLEAN, false); 46613367e49SWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, 1); 46713367e49SWilliam A. Kennington III expect_basic<const char *>(SD_BUS_TYPE_STRING, "ab"); 46813367e49SWilliam A. Kennington III expect_exit_container(-EINVAL); 46913367e49SWilliam A. Kennington III } 47013367e49SWilliam A. Kennington III 47113367e49SWilliam A. Kennington III std::tuple<bool, int, std::string> ret; 47213367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 47313367e49SWilliam A. Kennington III } 47413367e49SWilliam A. Kennington III 475b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, Variant) 476b4b4fa1fSWilliam A. Kennington III { 477b4b4fa1fSWilliam A. Kennington III const bool b1 = false; 478b4b4fa1fSWilliam A. Kennington III const std::string s2{"asdf"}; 479b4b4fa1fSWilliam A. Kennington III const sdbusplus::message::variant<int, std::string, bool> v1{b1}, v2{s2}; 480b4b4fa1fSWilliam A. Kennington III 481b4b4fa1fSWilliam A. Kennington III { 482b4b4fa1fSWilliam A. Kennington III testing::InSequence seq; 483b4b4fa1fSWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "i", false); 484b4b4fa1fSWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "s", false); 485b4b4fa1fSWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "b", true); 486b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_VARIANT, "b"); 487b4b4fa1fSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_BOOLEAN, b1); 488b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 489b4b4fa1fSWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "i", false); 490b4b4fa1fSWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "s", true); 491b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_VARIANT, "s"); 492b4b4fa1fSWilliam A. Kennington III expect_basic<const char *>(SD_BUS_TYPE_STRING, s2.c_str()); 493b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 494b4b4fa1fSWilliam A. Kennington III } 495b4b4fa1fSWilliam A. Kennington III 496b4b4fa1fSWilliam A. Kennington III sdbusplus::message::variant<int, std::string, bool> ret_v1, ret_v2; 497b4b4fa1fSWilliam A. Kennington III new_message().read(ret_v1, ret_v2); 498b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(v1, ret_v1); 499b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(v2, ret_v2); 500b4b4fa1fSWilliam A. Kennington III } 501b4b4fa1fSWilliam A. Kennington III 50213367e49SWilliam A. Kennington III TEST_F(ReadTest, VariantVerifyError) 50313367e49SWilliam A. Kennington III { 50413367e49SWilliam A. Kennington III { 50513367e49SWilliam A. Kennington III testing::InSequence seq; 50613367e49SWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "i", -EINVAL); 50713367e49SWilliam A. Kennington III } 50813367e49SWilliam A. Kennington III 50913367e49SWilliam A. Kennington III sdbusplus::message::variant<int, bool> ret; 51013367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 51113367e49SWilliam A. Kennington III } 51213367e49SWilliam A. Kennington III 51360a72835SWilliam A. Kennington III TEST_F(ReadTest, VariantSkipUnmatched) 51460a72835SWilliam A. Kennington III { 51560a72835SWilliam A. Kennington III { 51660a72835SWilliam A. Kennington III testing::InSequence seq; 51760a72835SWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "i", false); 51860a72835SWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "b", false); 51960a72835SWilliam A. Kennington III expect_skip("v"); 52060a72835SWilliam A. Kennington III } 52113367e49SWilliam A. Kennington III 52260a72835SWilliam A. Kennington III sdbusplus::message::variant<int, bool> ret; 52360a72835SWilliam A. Kennington III new_message().read(ret); 52460a72835SWilliam A. Kennington III } 52560a72835SWilliam A. Kennington III 52613367e49SWilliam A. Kennington III TEST_F(ReadTest, VariantSkipError) 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", false); 53113367e49SWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "b", false); 53213367e49SWilliam A. Kennington III expect_skip("v", -EINVAL); 53313367e49SWilliam A. Kennington III } 53413367e49SWilliam A. Kennington III 53513367e49SWilliam A. Kennington III sdbusplus::message::variant<int, bool> ret; 53613367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 53713367e49SWilliam A. Kennington III } 53813367e49SWilliam A. Kennington III 53913367e49SWilliam A. Kennington III TEST_F(ReadTest, VariantEnterError) 54013367e49SWilliam A. Kennington III { 54113367e49SWilliam A. Kennington III { 54213367e49SWilliam A. Kennington III testing::InSequence seq; 54313367e49SWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "i", true); 54413367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_VARIANT, "i", -EINVAL); 54513367e49SWilliam A. Kennington III } 54613367e49SWilliam A. Kennington III 54713367e49SWilliam A. Kennington III sdbusplus::message::variant<int, bool> ret; 54813367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 54913367e49SWilliam A. Kennington III } 55013367e49SWilliam A. Kennington III 55113367e49SWilliam A. Kennington III TEST_F(ReadTest, VariantExitError) 55213367e49SWilliam A. Kennington III { 55313367e49SWilliam A. Kennington III { 55413367e49SWilliam A. Kennington III testing::InSequence seq; 55513367e49SWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "i", true); 55613367e49SWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_VARIANT, "i"); 55713367e49SWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, 10); 55813367e49SWilliam A. Kennington III expect_exit_container(-EINVAL); 55913367e49SWilliam A. Kennington III } 56013367e49SWilliam A. Kennington III 56113367e49SWilliam A. Kennington III sdbusplus::message::variant<int, bool> ret; 56213367e49SWilliam A. Kennington III EXPECT_THROW(new_message().read(ret), sdbusplus::exception::SdBusError); 56313367e49SWilliam A. Kennington III } 56413367e49SWilliam A. Kennington III 565b4b4fa1fSWilliam A. Kennington III TEST_F(ReadTest, LargeCombo) 566b4b4fa1fSWilliam A. Kennington III { 567b4b4fa1fSWilliam A. Kennington III const std::vector<std::set<std::string>> vas{ 568b4b4fa1fSWilliam A. Kennington III {"a", "b", "c"}, 569b4b4fa1fSWilliam A. Kennington III {"d", "", "e"}, 570b4b4fa1fSWilliam A. Kennington III }; 571b4b4fa1fSWilliam A. Kennington III const std::map<std::string, sdbusplus::message::variant<int, double>> msv = 572b4b4fa1fSWilliam A. Kennington III {{"a", 3.3}, {"b", 1}, {"c", 4.4}}; 573b4b4fa1fSWilliam A. Kennington III 574b4b4fa1fSWilliam A. Kennington III { 575b4b4fa1fSWilliam A. Kennington III testing::InSequence seq; 576b4b4fa1fSWilliam A. Kennington III 577b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "as"); 578b4b4fa1fSWilliam A. Kennington III for (const auto &as : vas) 579b4b4fa1fSWilliam A. Kennington III { 580b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 0); 581b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "s"); 582b4b4fa1fSWilliam A. Kennington III for (const auto &s : as) 583b4b4fa1fSWilliam A. Kennington III { 584b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 0); 585b4b4fa1fSWilliam A. Kennington III expect_basic<const char *>(SD_BUS_TYPE_STRING, s.c_str()); 586b4b4fa1fSWilliam A. Kennington III } 587b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 1); 588b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 589b4b4fa1fSWilliam A. Kennington III } 590b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 1); 591b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 592b4b4fa1fSWilliam A. Kennington III 593b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_ARRAY, "{sv}"); 594b4b4fa1fSWilliam A. Kennington III for (const auto &sv : msv) 595b4b4fa1fSWilliam A. Kennington III { 596b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 0); 597b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_DICT_ENTRY, "sv"); 598b4b4fa1fSWilliam A. Kennington III expect_basic<const char *>(SD_BUS_TYPE_STRING, sv.first.c_str()); 599b4b4fa1fSWilliam A. Kennington III if (sv.second.is<int>()) 600b4b4fa1fSWilliam A. Kennington III { 601b4b4fa1fSWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "i", true); 602b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_VARIANT, "i"); 603b4b4fa1fSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, sv.second.get<int>()); 604b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 6054fe85a30SPatrick Williams } 6064fe85a30SPatrick Williams else 6074fe85a30SPatrick Williams { 608b4b4fa1fSWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "i", false); 609b4b4fa1fSWilliam A. Kennington III expect_verify_type(SD_BUS_TYPE_VARIANT, "d", true); 610b4b4fa1fSWilliam A. Kennington III expect_enter_container(SD_BUS_TYPE_VARIANT, "d"); 611b4b4fa1fSWilliam A. Kennington III expect_basic<double>(SD_BUS_TYPE_DOUBLE, 612b4b4fa1fSWilliam A. Kennington III sv.second.get<double>()); 613b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 6144fe85a30SPatrick Williams } 615b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 6164fe85a30SPatrick Williams } 617b4b4fa1fSWilliam A. Kennington III expect_at_end(false, 1); 618b4b4fa1fSWilliam A. Kennington III expect_exit_container(); 6194fe85a30SPatrick Williams } 620696e3159SPatrick Williams 621b4b4fa1fSWilliam A. Kennington III std::vector<std::set<std::string>> ret_vas; 622b4b4fa1fSWilliam A. Kennington III std::map<std::string, sdbusplus::message::variant<int, double>> ret_msv; 623b4b4fa1fSWilliam A. Kennington III new_message().read(ret_vas, ret_msv); 624b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(vas, ret_vas); 625b4b4fa1fSWilliam A. Kennington III EXPECT_EQ(msv, ret_msv); 6264fe85a30SPatrick Williams } 6274fe85a30SPatrick Williams 628b4b4fa1fSWilliam A. Kennington III } // namespace 629