195269dbcSPatrick Venture #include <systemd/sd-bus-protocol.h> 295269dbcSPatrick Venture 3a1e9e2aeSWilliam A. Kennington III #include <array> 4a1e9e2aeSWilliam A. Kennington III #include <map> 57802c074SPatrick Williams #include <sdbusplus/message.hpp> 6a1e9e2aeSWilliam A. Kennington III #include <sdbusplus/test/sdbus_mock.hpp> 728dc36d5SEd Tanous #include <set> 8a1e9e2aeSWilliam A. Kennington III #include <string> 9a1e9e2aeSWilliam A. Kennington III #include <tuple> 10a1e9e2aeSWilliam A. Kennington III #include <unordered_map> 11a1e9e2aeSWilliam A. Kennington III #include <vector> 121807fa47SPatrick Williams 1395269dbcSPatrick Venture #include <gmock/gmock.h> 1495269dbcSPatrick Venture #include <gtest/gtest.h> 1595269dbcSPatrick Venture 16a1e9e2aeSWilliam A. Kennington III namespace 171807fa47SPatrick Williams { 185b485794SPatrick Williams 19a1e9e2aeSWilliam A. Kennington III using testing::Eq; 20a1e9e2aeSWilliam A. Kennington III using testing::MatcherCast; 21a1e9e2aeSWilliam A. Kennington III using testing::Pointee; 22a1e9e2aeSWilliam A. Kennington III using testing::Return; 23a1e9e2aeSWilliam A. Kennington III using testing::SafeMatcherCast; 24a1e9e2aeSWilliam A. Kennington III using testing::StrEq; 25a1e9e2aeSWilliam A. Kennington III 26a1e9e2aeSWilliam A. Kennington III class AppendTest : public testing::Test 27a1e9e2aeSWilliam A. Kennington III { 28a1e9e2aeSWilliam A. Kennington III protected: 29a1e9e2aeSWilliam A. Kennington III testing::StrictMock<sdbusplus::SdBusMock> mock; 30a1e9e2aeSWilliam A. Kennington III 31a1e9e2aeSWilliam A. Kennington III void SetUp() override 32a1e9e2aeSWilliam A. Kennington III { 33a1e9e2aeSWilliam A. Kennington III EXPECT_CALL(mock, sd_bus_message_new_method_call(testing::_, testing::_, 34a1e9e2aeSWilliam A. Kennington III nullptr, nullptr, 35a1e9e2aeSWilliam A. Kennington III nullptr, nullptr)) 36a1e9e2aeSWilliam A. Kennington III .WillRepeatedly(Return(0)); 37a1e9e2aeSWilliam A. Kennington III }; 38a1e9e2aeSWilliam A. Kennington III 39a1e9e2aeSWilliam A. Kennington III sdbusplus::message::message new_message() 40a1e9e2aeSWilliam A. Kennington III { 41a1e9e2aeSWilliam A. Kennington III return sdbusplus::get_mocked_new(&mock).new_method_call( 42a1e9e2aeSWilliam A. Kennington III nullptr, nullptr, nullptr, nullptr); 431807fa47SPatrick Williams } 441807fa47SPatrick Williams 45*2b238afbSPatrick Venture template <typename T> 46*2b238afbSPatrick Venture void expect_basic(char type, T val) 471807fa47SPatrick Williams { 48a1e9e2aeSWilliam A. Kennington III EXPECT_CALL(mock, 49a1e9e2aeSWilliam A. Kennington III sd_bus_message_append_basic( 50a1e9e2aeSWilliam A. Kennington III nullptr, type, 51a1e9e2aeSWilliam A. Kennington III MatcherCast<const void *>( 52a1e9e2aeSWilliam A. Kennington III SafeMatcherCast<const T *>(Pointee(Eq(val)))))) 53a1e9e2aeSWilliam A. Kennington III .WillOnce(Return(0)); 541807fa47SPatrick Williams } 551807fa47SPatrick Williams 56a1e9e2aeSWilliam A. Kennington III void expect_basic_string(char type, const char *str) 571807fa47SPatrick Williams { 58a1e9e2aeSWilliam A. Kennington III EXPECT_CALL(mock, sd_bus_message_append_basic( 59a1e9e2aeSWilliam A. Kennington III nullptr, type, 60a1e9e2aeSWilliam A. Kennington III MatcherCast<const void *>( 61a1e9e2aeSWilliam A. Kennington III SafeMatcherCast<const char *>(StrEq(str))))) 62a1e9e2aeSWilliam A. Kennington III .WillOnce(Return(0)); 63a1e9e2aeSWilliam A. Kennington III } 64a1e9e2aeSWilliam A. Kennington III 65a1e9e2aeSWilliam A. Kennington III void expect_open_container(char type, const char *contents) 6607e1d6f3SPatrick Williams { 67a1e9e2aeSWilliam A. Kennington III EXPECT_CALL( 68a1e9e2aeSWilliam A. Kennington III mock, sd_bus_message_open_container(nullptr, type, StrEq(contents))) 69a1e9e2aeSWilliam A. Kennington III .WillOnce(Return(0)); 70a1e9e2aeSWilliam A. Kennington III } 71a1e9e2aeSWilliam A. Kennington III 72a1e9e2aeSWilliam A. Kennington III void expect_close_container() 73a1e9e2aeSWilliam A. Kennington III { 74a1e9e2aeSWilliam A. Kennington III EXPECT_CALL(mock, sd_bus_message_close_container(nullptr)) 75a1e9e2aeSWilliam A. Kennington III .WillOnce(Return(0)); 76a1e9e2aeSWilliam A. Kennington III } 77a1e9e2aeSWilliam A. Kennington III }; 78a1e9e2aeSWilliam A. Kennington III 79a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, RValueInt) 80a1e9e2aeSWilliam A. Kennington III { 81a1e9e2aeSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, 1); 82a1e9e2aeSWilliam A. Kennington III new_message().append(1); 83a1e9e2aeSWilliam A. Kennington III } 84a1e9e2aeSWilliam A. Kennington III 85a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, LValueInt) 86a1e9e2aeSWilliam A. Kennington III { 87a1e9e2aeSWilliam A. Kennington III const int a = 1; 88a1e9e2aeSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, a); 89a1e9e2aeSWilliam A. Kennington III new_message().append(a); 90a1e9e2aeSWilliam A. Kennington III } 91a1e9e2aeSWilliam A. Kennington III 92a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, XValueInt) 93a1e9e2aeSWilliam A. Kennington III { 94a1e9e2aeSWilliam A. Kennington III int a = 1; 95a1e9e2aeSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, a); 96a1e9e2aeSWilliam A. Kennington III new_message().append(std::move(a)); 97a1e9e2aeSWilliam A. Kennington III } 98a1e9e2aeSWilliam A. Kennington III 99a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, RValueBool) 100a1e9e2aeSWilliam A. Kennington III { 101a1e9e2aeSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_BOOLEAN, true); 102a1e9e2aeSWilliam A. Kennington III new_message().append(true); 103a1e9e2aeSWilliam A. Kennington III } 104a1e9e2aeSWilliam A. Kennington III 105a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, LValueBool) 106a1e9e2aeSWilliam A. Kennington III { 107a1e9e2aeSWilliam A. Kennington III const bool a = false; 108a1e9e2aeSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_BOOLEAN, false); 109a1e9e2aeSWilliam A. Kennington III new_message().append(a); 110a1e9e2aeSWilliam A. Kennington III } 111a1e9e2aeSWilliam A. Kennington III 112a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, XValueBool) 113a1e9e2aeSWilliam A. Kennington III { 114a1e9e2aeSWilliam A. Kennington III bool a = false; 115a1e9e2aeSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_BOOLEAN, false); 116a1e9e2aeSWilliam A. Kennington III new_message().append(std::move(a)); 117a1e9e2aeSWilliam A. Kennington III } 118a1e9e2aeSWilliam A. Kennington III 119a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, RValueDouble) 120a1e9e2aeSWilliam A. Kennington III { 121a1e9e2aeSWilliam A. Kennington III expect_basic<double>(SD_BUS_TYPE_DOUBLE, 1.1); 122a1e9e2aeSWilliam A. Kennington III new_message().append(1.1); 123a1e9e2aeSWilliam A. Kennington III } 124a1e9e2aeSWilliam A. Kennington III 125a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, LValueDouble) 126a1e9e2aeSWilliam A. Kennington III { 127a1e9e2aeSWilliam A. Kennington III const double a = 1.1; 128a1e9e2aeSWilliam A. Kennington III expect_basic<double>(SD_BUS_TYPE_DOUBLE, a); 129a1e9e2aeSWilliam A. Kennington III new_message().append(a); 130a1e9e2aeSWilliam A. Kennington III } 131a1e9e2aeSWilliam A. Kennington III 132a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, XValueDouble) 133a1e9e2aeSWilliam A. Kennington III { 134a1e9e2aeSWilliam A. Kennington III double a = 1.1; 135a1e9e2aeSWilliam A. Kennington III expect_basic<double>(SD_BUS_TYPE_DOUBLE, a); 136a1e9e2aeSWilliam A. Kennington III new_message().append(std::move(a)); 137a1e9e2aeSWilliam A. Kennington III } 138a1e9e2aeSWilliam A. Kennington III 139a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, RValueCString) 140a1e9e2aeSWilliam A. Kennington III { 141a1e9e2aeSWilliam A. Kennington III expect_basic_string(SD_BUS_TYPE_STRING, "asdf"); 142a1e9e2aeSWilliam A. Kennington III new_message().append("asdf"); 143a1e9e2aeSWilliam A. Kennington III } 144a1e9e2aeSWilliam A. Kennington III 145a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, LValueCString) 146a1e9e2aeSWilliam A. Kennington III { 147a1e9e2aeSWilliam A. Kennington III const char *const s = "asdf"; 148a1e9e2aeSWilliam A. Kennington III expect_basic_string(SD_BUS_TYPE_STRING, s); 149a1e9e2aeSWilliam A. Kennington III new_message().append(s); 150a1e9e2aeSWilliam A. Kennington III } 151a1e9e2aeSWilliam A. Kennington III 152a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, XValueCString) 153a1e9e2aeSWilliam A. Kennington III { 154a1e9e2aeSWilliam A. Kennington III const char *s = "asdf"; 155a1e9e2aeSWilliam A. Kennington III expect_basic_string(SD_BUS_TYPE_STRING, s); 156a1e9e2aeSWilliam A. Kennington III new_message().append(std::move(s)); 157a1e9e2aeSWilliam A. Kennington III } 158a1e9e2aeSWilliam A. Kennington III 159a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, RValueString) 160a1e9e2aeSWilliam A. Kennington III { 161a1e9e2aeSWilliam A. Kennington III expect_basic_string(SD_BUS_TYPE_STRING, "asdf"); 162a1e9e2aeSWilliam A. Kennington III new_message().append(std::string{"asdf"}); 163a1e9e2aeSWilliam A. Kennington III } 164a1e9e2aeSWilliam A. Kennington III 165a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, LValueString) 166a1e9e2aeSWilliam A. Kennington III { 167a1e9e2aeSWilliam A. Kennington III std::string s{"asdf"}; 168a1e9e2aeSWilliam A. Kennington III expect_basic_string(SD_BUS_TYPE_STRING, s.c_str()); 169a1e9e2aeSWilliam A. Kennington III new_message().append(s); 170a1e9e2aeSWilliam A. Kennington III } 171a1e9e2aeSWilliam A. Kennington III 172a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, XValueString) 173a1e9e2aeSWilliam A. Kennington III { 174a1e9e2aeSWilliam A. Kennington III std::string s{"asdf"}; 175a1e9e2aeSWilliam A. Kennington III expect_basic_string(SD_BUS_TYPE_STRING, s.c_str()); 176a1e9e2aeSWilliam A. Kennington III new_message().append(std::move(s)); 177a1e9e2aeSWilliam A. Kennington III } 178a1e9e2aeSWilliam A. Kennington III 179a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, ObjectPath) 180a1e9e2aeSWilliam A. Kennington III { 181a1e9e2aeSWilliam A. Kennington III sdbusplus::message::object_path o{"/asdf"}; 182a1e9e2aeSWilliam A. Kennington III expect_basic_string(SD_BUS_TYPE_OBJECT_PATH, o.str.c_str()); 183a1e9e2aeSWilliam A. Kennington III new_message().append(o); 184a1e9e2aeSWilliam A. Kennington III } 185a1e9e2aeSWilliam A. Kennington III 186a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, Signature) 187a1e9e2aeSWilliam A. Kennington III { 188a1e9e2aeSWilliam A. Kennington III sdbusplus::message::signature g{"ii"}; 189a1e9e2aeSWilliam A. Kennington III expect_basic_string(SD_BUS_TYPE_SIGNATURE, g.str.c_str()); 190a1e9e2aeSWilliam A. Kennington III new_message().append(g); 191a1e9e2aeSWilliam A. Kennington III } 192a1e9e2aeSWilliam A. Kennington III 193a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, CombinedBasic) 194a1e9e2aeSWilliam A. Kennington III { 195a1e9e2aeSWilliam A. Kennington III const int c = 3; 196a1e9e2aeSWilliam A. Kennington III const std::string s1{"fdsa"}; 197a1e9e2aeSWilliam A. Kennington III const char *const s2 = "asdf"; 198a1e9e2aeSWilliam A. Kennington III 199a1e9e2aeSWilliam A. Kennington III { 200a1e9e2aeSWilliam A. Kennington III testing::InSequence seq; 201a1e9e2aeSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, 1); 202a1e9e2aeSWilliam A. Kennington III expect_basic<double>(SD_BUS_TYPE_DOUBLE, 2.2); 203a1e9e2aeSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, c); 204a1e9e2aeSWilliam A. Kennington III expect_basic_string(SD_BUS_TYPE_STRING, s1.c_str()); 205a1e9e2aeSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_BOOLEAN, false); 206a1e9e2aeSWilliam A. Kennington III expect_basic_string(SD_BUS_TYPE_STRING, s2); 207a1e9e2aeSWilliam A. Kennington III } 208a1e9e2aeSWilliam A. Kennington III new_message().append(1, 2.2, c, s1, false, s2); 209a1e9e2aeSWilliam A. Kennington III } 210a1e9e2aeSWilliam A. Kennington III 211a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, Array) 212a1e9e2aeSWilliam A. Kennington III { 213a1e9e2aeSWilliam A. Kennington III const std::array<double, 4> a{1.1, 2.2, 3.3, 4.4}; 214a1e9e2aeSWilliam A. Kennington III 215a1e9e2aeSWilliam A. Kennington III { 216a1e9e2aeSWilliam A. Kennington III testing::InSequence seq; 217a1e9e2aeSWilliam A. Kennington III expect_open_container(SD_BUS_TYPE_ARRAY, "d"); 218a1e9e2aeSWilliam A. Kennington III for (const auto &i : a) 219a1e9e2aeSWilliam A. Kennington III { 220a1e9e2aeSWilliam A. Kennington III expect_basic<double>(SD_BUS_TYPE_DOUBLE, i); 221a1e9e2aeSWilliam A. Kennington III } 222a1e9e2aeSWilliam A. Kennington III expect_close_container(); 223a1e9e2aeSWilliam A. Kennington III } 224a1e9e2aeSWilliam A. Kennington III new_message().append(a); 225a1e9e2aeSWilliam A. Kennington III } 226a1e9e2aeSWilliam A. Kennington III 227a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, Vector) 228a1e9e2aeSWilliam A. Kennington III { 229a1e9e2aeSWilliam A. Kennington III const std::vector<int> v{1, 2, 3, 4}; 230a1e9e2aeSWilliam A. Kennington III 231a1e9e2aeSWilliam A. Kennington III { 232a1e9e2aeSWilliam A. Kennington III testing::InSequence seq; 233a1e9e2aeSWilliam A. Kennington III expect_open_container(SD_BUS_TYPE_ARRAY, "i"); 234a1e9e2aeSWilliam A. Kennington III for (const auto &i : v) 235a1e9e2aeSWilliam A. Kennington III { 236a1e9e2aeSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, i); 237a1e9e2aeSWilliam A. Kennington III } 238a1e9e2aeSWilliam A. Kennington III expect_close_container(); 239a1e9e2aeSWilliam A. Kennington III } 240a1e9e2aeSWilliam A. Kennington III new_message().append(v); 241a1e9e2aeSWilliam A. Kennington III } 242a1e9e2aeSWilliam A. Kennington III 243a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, Set) 244a1e9e2aeSWilliam A. Kennington III { 245a1e9e2aeSWilliam A. Kennington III const std::set<std::string> s{"one", "two", "eight"}; 246a1e9e2aeSWilliam A. Kennington III 247a1e9e2aeSWilliam A. Kennington III { 248a1e9e2aeSWilliam A. Kennington III testing::InSequence seq; 249a1e9e2aeSWilliam A. Kennington III expect_open_container(SD_BUS_TYPE_ARRAY, "s"); 250a1e9e2aeSWilliam A. Kennington III for (const auto &i : s) 251a1e9e2aeSWilliam A. Kennington III { 252a1e9e2aeSWilliam A. Kennington III expect_basic_string(SD_BUS_TYPE_STRING, i.c_str()); 253a1e9e2aeSWilliam A. Kennington III } 254a1e9e2aeSWilliam A. Kennington III expect_close_container(); 255a1e9e2aeSWilliam A. Kennington III } 256a1e9e2aeSWilliam A. Kennington III new_message().append(s); 257a1e9e2aeSWilliam A. Kennington III } 258a1e9e2aeSWilliam A. Kennington III 259a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, Map) 260a1e9e2aeSWilliam A. Kennington III { 261a1e9e2aeSWilliam A. Kennington III const std::map<int, std::string> m{ 262a1e9e2aeSWilliam A. Kennington III {1, "a"}, 263a1e9e2aeSWilliam A. Kennington III {2, "bc"}, 264a1e9e2aeSWilliam A. Kennington III {3, "def"}, 265a1e9e2aeSWilliam A. Kennington III {4, "ghij"}, 266a1e9e2aeSWilliam A. Kennington III }; 267a1e9e2aeSWilliam A. Kennington III 268a1e9e2aeSWilliam A. Kennington III { 269a1e9e2aeSWilliam A. Kennington III testing::InSequence seq; 270a1e9e2aeSWilliam A. Kennington III expect_open_container(SD_BUS_TYPE_ARRAY, "{is}"); 271a1e9e2aeSWilliam A. Kennington III for (const auto &i : m) 272a1e9e2aeSWilliam A. Kennington III { 273a1e9e2aeSWilliam A. Kennington III expect_open_container(SD_BUS_TYPE_DICT_ENTRY, "is"); 274a1e9e2aeSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, i.first); 275a1e9e2aeSWilliam A. Kennington III expect_basic_string(SD_BUS_TYPE_STRING, i.second.c_str()); 276a1e9e2aeSWilliam A. Kennington III expect_close_container(); 277a1e9e2aeSWilliam A. Kennington III } 278a1e9e2aeSWilliam A. Kennington III expect_close_container(); 279a1e9e2aeSWilliam A. Kennington III } 280a1e9e2aeSWilliam A. Kennington III new_message().append(m); 281a1e9e2aeSWilliam A. Kennington III } 282a1e9e2aeSWilliam A. Kennington III 283a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, UnorderedMap) 284a1e9e2aeSWilliam A. Kennington III { 285a1e9e2aeSWilliam A. Kennington III const std::unordered_map<int, bool> m{ 286a1e9e2aeSWilliam A. Kennington III {1, false}, 287a1e9e2aeSWilliam A. Kennington III {2, true}, 288a1e9e2aeSWilliam A. Kennington III {3, true}, 289a1e9e2aeSWilliam A. Kennington III {4, false}, 290a1e9e2aeSWilliam A. Kennington III }; 291a1e9e2aeSWilliam A. Kennington III 292a1e9e2aeSWilliam A. Kennington III { 293a1e9e2aeSWilliam A. Kennington III testing::InSequence seq; 294a1e9e2aeSWilliam A. Kennington III expect_open_container(SD_BUS_TYPE_ARRAY, "{ib}"); 295a1e9e2aeSWilliam A. Kennington III for (const auto &i : m) 296a1e9e2aeSWilliam A. Kennington III { 297a1e9e2aeSWilliam A. Kennington III expect_open_container(SD_BUS_TYPE_DICT_ENTRY, "ib"); 298a1e9e2aeSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, i.first); 299a1e9e2aeSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_BOOLEAN, i.second); 300a1e9e2aeSWilliam A. Kennington III expect_close_container(); 301a1e9e2aeSWilliam A. Kennington III } 302a1e9e2aeSWilliam A. Kennington III expect_close_container(); 303a1e9e2aeSWilliam A. Kennington III } 304a1e9e2aeSWilliam A. Kennington III new_message().append(m); 305a1e9e2aeSWilliam A. Kennington III } 306a1e9e2aeSWilliam A. Kennington III 307a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, Tuple) 308a1e9e2aeSWilliam A. Kennington III { 309a1e9e2aeSWilliam A. Kennington III const std::tuple<int, std::string, bool> t{5, "asdf", false}; 310a1e9e2aeSWilliam A. Kennington III 311a1e9e2aeSWilliam A. Kennington III { 312a1e9e2aeSWilliam A. Kennington III testing::InSequence seq; 313a1e9e2aeSWilliam A. Kennington III expect_open_container(SD_BUS_TYPE_STRUCT, "isb"); 314a1e9e2aeSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, std::get<0>(t)); 315a1e9e2aeSWilliam A. Kennington III expect_basic_string(SD_BUS_TYPE_STRING, std::get<1>(t).c_str()); 316a1e9e2aeSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_BOOLEAN, std::get<2>(t)); 317a1e9e2aeSWilliam A. Kennington III expect_close_container(); 318a1e9e2aeSWilliam A. Kennington III } 319a1e9e2aeSWilliam A. Kennington III new_message().append(t); 320a1e9e2aeSWilliam A. Kennington III } 321a1e9e2aeSWilliam A. Kennington III 322a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, Variant) 323a1e9e2aeSWilliam A. Kennington III { 324a1e9e2aeSWilliam A. Kennington III const bool b1 = false; 325a1e9e2aeSWilliam A. Kennington III const std::string s2{"asdf"}; 326a1e9e2aeSWilliam A. Kennington III const sdbusplus::message::variant<int, std::string, bool> v1{b1}, v2{s2}; 327a1e9e2aeSWilliam A. Kennington III 328a1e9e2aeSWilliam A. Kennington III { 329a1e9e2aeSWilliam A. Kennington III testing::InSequence seq; 330a1e9e2aeSWilliam A. Kennington III expect_open_container(SD_BUS_TYPE_VARIANT, "b"); 331a1e9e2aeSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_BOOLEAN, b1); 332a1e9e2aeSWilliam A. Kennington III expect_close_container(); 333a1e9e2aeSWilliam A. Kennington III expect_open_container(SD_BUS_TYPE_VARIANT, "s"); 334a1e9e2aeSWilliam A. Kennington III expect_basic_string(SD_BUS_TYPE_STRING, s2.c_str()); 335a1e9e2aeSWilliam A. Kennington III expect_close_container(); 336a1e9e2aeSWilliam A. Kennington III } 337a1e9e2aeSWilliam A. Kennington III new_message().append(v1, v2); 338a1e9e2aeSWilliam A. Kennington III } 339a1e9e2aeSWilliam A. Kennington III 340a1e9e2aeSWilliam A. Kennington III TEST_F(AppendTest, LargeCombo) 341a1e9e2aeSWilliam A. Kennington III { 342a1e9e2aeSWilliam A. Kennington III std::vector<std::array<std::string, 3>> vas{{"a", "b", "c"}, 343a1e9e2aeSWilliam A. Kennington III {"d", "", "e"}}; 344a1e9e2aeSWilliam A. Kennington III std::map<std::string, sdbusplus::message::variant<int, double>> msv = { 345a1e9e2aeSWilliam A. Kennington III {"a", 3.3}, {"b", 1}, {"c", 4.4}}; 346a1e9e2aeSWilliam A. Kennington III 347a1e9e2aeSWilliam A. Kennington III { 348a1e9e2aeSWilliam A. Kennington III testing::InSequence seq; 349a1e9e2aeSWilliam A. Kennington III 350a1e9e2aeSWilliam A. Kennington III expect_open_container(SD_BUS_TYPE_ARRAY, "as"); 351a1e9e2aeSWilliam A. Kennington III for (const auto &as : vas) 352a1e9e2aeSWilliam A. Kennington III { 353a1e9e2aeSWilliam A. Kennington III expect_open_container(SD_BUS_TYPE_ARRAY, "s"); 354a1e9e2aeSWilliam A. Kennington III for (const auto &s : as) 355a1e9e2aeSWilliam A. Kennington III { 356a1e9e2aeSWilliam A. Kennington III expect_basic_string(SD_BUS_TYPE_STRING, s.c_str()); 357a1e9e2aeSWilliam A. Kennington III } 358a1e9e2aeSWilliam A. Kennington III expect_close_container(); 359a1e9e2aeSWilliam A. Kennington III } 360a1e9e2aeSWilliam A. Kennington III expect_close_container(); 361a1e9e2aeSWilliam A. Kennington III 362a1e9e2aeSWilliam A. Kennington III expect_open_container(SD_BUS_TYPE_ARRAY, "{sv}"); 363a1e9e2aeSWilliam A. Kennington III for (const auto &sv : msv) 364a1e9e2aeSWilliam A. Kennington III { 365a1e9e2aeSWilliam A. Kennington III expect_open_container(SD_BUS_TYPE_DICT_ENTRY, "sv"); 366a1e9e2aeSWilliam A. Kennington III expect_basic_string(SD_BUS_TYPE_STRING, sv.first.c_str()); 367a1e9e2aeSWilliam A. Kennington III if (sv.second.is<int>()) 368a1e9e2aeSWilliam A. Kennington III { 369a1e9e2aeSWilliam A. Kennington III expect_open_container(SD_BUS_TYPE_VARIANT, "i"); 370a1e9e2aeSWilliam A. Kennington III expect_basic<int>(SD_BUS_TYPE_INT32, sv.second.get<int>()); 371a1e9e2aeSWilliam A. Kennington III expect_close_container(); 37207e1d6f3SPatrick Williams } 37307e1d6f3SPatrick Williams else 37407e1d6f3SPatrick Williams { 375a1e9e2aeSWilliam A. Kennington III expect_open_container(SD_BUS_TYPE_VARIANT, "d"); 376a1e9e2aeSWilliam A. Kennington III expect_basic<double>(SD_BUS_TYPE_DOUBLE, 377a1e9e2aeSWilliam A. Kennington III sv.second.get<double>()); 378a1e9e2aeSWilliam A. Kennington III expect_close_container(); 37907e1d6f3SPatrick Williams } 380a1e9e2aeSWilliam A. Kennington III expect_close_container(); 3811807fa47SPatrick Williams } 382a1e9e2aeSWilliam A. Kennington III expect_close_container(); 383a1e9e2aeSWilliam A. Kennington III } 384a1e9e2aeSWilliam A. Kennington III new_message().append(vas, msv); 3851807fa47SPatrick Williams } 386b5645509SWilliam A. Kennington III 387a1e9e2aeSWilliam A. Kennington III } // namespace 388