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