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