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