1 /* Copyright (C) 2013 BMW Group
2 * Author: Manfred Bathelt (manfred.bathelt@bmw.de)
3 * Author: Juergen Gehring (juergen.gehring@bmw.de)
4 * This Source Code Form is subject to the terms of the Mozilla Public
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
8 #include <gtest/gtest.h>
10 #include <CommonAPI/DBus/DBusMessage.h>
11 #include <CommonAPI/DBus/DBusOutputStream.h>
12 #include <CommonAPI/DBus/DBusInputStream.h>
13 #include <CommonAPI/SerializableStruct.h>
14 #include <CommonAPI/SerializableVariant.h>
16 #include "commonapi/tests/DerivedTypeCollection.h"
19 class OutputStreamTest: public ::testing::Test {
22 CommonAPI::DBus::DBusMessage message;
24 const char* objectPath;
25 const char* interfaceName;
26 const char* methodName;
30 busName = "no.bus.here";
31 objectPath = "/no/object/here";
32 interfaceName = "no.interface.here";
33 methodName = "noMethodHere";
40 TEST_F(OutputStreamTest, CanBeConstructed) {
41 CommonAPI::DBus::DBusOutputStream outStream(message);
44 TEST_F(OutputStreamTest, WritesBytes) {
45 const char* signature = "yyyyyyyyyy";
46 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
47 CommonAPI::DBus::DBusOutputStream outStream(message);
49 outStream.reserveMemory(numOfElements);
52 for (unsigned int i = 0; i < numOfElements; i += 2) {
58 EXPECT_EQ(numOfElements, message.getBodyLength());
60 CommonAPI::DBus::DBusInputStream inStream(message);
64 for (unsigned int i = 0; i < numOfElements; i += 2) {
65 inStream >> verifyVal1;
66 EXPECT_EQ(val1, verifyVal1);
68 inStream >> verifyVal2;
69 EXPECT_EQ(val2, verifyVal2);
73 TEST_F(OutputStreamTest, WritesBools) {
74 const char* signature = "bbbbbbbbbb";
75 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
76 CommonAPI::DBus::DBusOutputStream outStream(message);
78 outStream.reserveMemory(numOfElements * 4);
81 for (unsigned int i = 0; i < numOfElements; i += 2) {
87 EXPECT_EQ(numOfElements*4, message.getBodyLength());
89 CommonAPI::DBus::DBusInputStream inStream(message);
93 for (unsigned int i = 0; i < numOfElements; i += 2) {
94 inStream >> verifyVal1;
95 EXPECT_EQ(val1, verifyVal1);
97 inStream >> verifyVal2;
98 EXPECT_EQ(val2, verifyVal2);
102 TEST_F(OutputStreamTest, WritesUInt16) {
103 const char* signature = "qqqqqqqqqq";
104 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
105 CommonAPI::DBus::DBusOutputStream outStream(message);
107 outStream.reserveMemory(numOfElements * 2);
108 uint16_t val1 = 0x0000;
109 uint16_t val2 = 0xffff;
110 for (unsigned int i = 0; i < numOfElements; i += 2) {
116 EXPECT_EQ(numOfElements*2, message.getBodyLength());
118 CommonAPI::DBus::DBusInputStream inStream(message);
122 for (unsigned int i = 0; i < numOfElements; i += 2) {
123 inStream >> verifyVal1;
124 EXPECT_EQ(val1, verifyVal1);
126 inStream >> verifyVal2;
127 EXPECT_EQ(val2, verifyVal2);
131 TEST_F(OutputStreamTest, WritesInt16) {
132 const char* signature = "nnnnnnnnnn";
133 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
134 CommonAPI::DBus::DBusOutputStream outStream(message);
136 outStream.reserveMemory(numOfElements * 2);
137 int16_t val1 = 0x7fff;
138 int16_t val2 = 0xffff;
139 for (unsigned int i = 0; i < numOfElements; i += 2) {
145 EXPECT_EQ(numOfElements*2, message.getBodyLength());
147 CommonAPI::DBus::DBusInputStream inStream(message);
151 for (unsigned int i = 0; i < numOfElements; i += 2) {
152 inStream >> verifyVal1;
153 EXPECT_EQ(val1, verifyVal1);
155 inStream >> verifyVal2;
156 EXPECT_EQ(val2, verifyVal2);
160 TEST_F(OutputStreamTest, WritesUInt32) {
161 const char* signature = "uuuuuuuuuu";
162 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
163 CommonAPI::DBus::DBusOutputStream outStream(message);
165 outStream.reserveMemory(numOfElements * 4);
166 uint32_t val1 = 0x00000000;
167 uint32_t val2 = 0xffffffff;
168 for (unsigned int i = 0; i < numOfElements; i += 2) {
174 EXPECT_EQ(numOfElements*4, message.getBodyLength());
176 CommonAPI::DBus::DBusInputStream inStream(message);
180 for (unsigned int i = 0; i < numOfElements; i += 2) {
181 inStream >> verifyVal1;
182 EXPECT_EQ(val1, verifyVal1);
184 inStream >> verifyVal2;
185 EXPECT_EQ(val2, verifyVal2);
189 TEST_F(OutputStreamTest, WritesInt32) {
190 const char* signature = "iiiiiiiiii";
191 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
192 CommonAPI::DBus::DBusOutputStream outStream(message);
194 outStream.reserveMemory(numOfElements * 4);
195 int32_t val1 = 0x7fffffff;
196 int32_t val2 = 0xffffffff;
197 for (unsigned int i = 0; i < numOfElements; i += 2) {
203 EXPECT_EQ(numOfElements*4, message.getBodyLength());
205 CommonAPI::DBus::DBusInputStream inStream(message);
209 for (unsigned int i = 0; i < numOfElements; i += 2) {
210 inStream >> verifyVal1;
211 EXPECT_EQ(val1, verifyVal1);
213 inStream >> verifyVal2;
214 EXPECT_EQ(val2, verifyVal2);
218 TEST_F(OutputStreamTest, WritesUInt64) {
219 const char* signature = "tttttttttt";
220 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
221 CommonAPI::DBus::DBusOutputStream outStream(message);
223 outStream.reserveMemory(numOfElements * 8);
224 uint64_t val1 = 0x0000000000000000;
225 uint64_t val2 = 0xffffffffffffffff;
226 for (unsigned int i = 0; i < numOfElements; i += 2) {
232 EXPECT_EQ(numOfElements*8, message.getBodyLength());
234 CommonAPI::DBus::DBusInputStream inStream(message);
238 for (unsigned int i = 0; i < numOfElements; i += 2) {
239 inStream >> verifyVal1;
240 EXPECT_EQ(val1, verifyVal1);
242 inStream >> verifyVal2;
243 EXPECT_EQ(val2, verifyVal2);
247 TEST_F(OutputStreamTest, WritesInt64) {
248 const char* signature = "xxxxxxxxxx";
249 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
250 CommonAPI::DBus::DBusOutputStream outStream(message);
252 outStream.reserveMemory(numOfElements * 8);
253 int64_t val1 = 0x7fffffffffffffff;
254 int64_t val2 = 0xffffffffffffffff;
255 for (unsigned int i = 0; i < numOfElements; i += 2) {
261 EXPECT_EQ(numOfElements*8, message.getBodyLength());
263 CommonAPI::DBus::DBusInputStream inStream(message);
267 for (unsigned int i = 0; i < numOfElements; i += 2) {
268 inStream >> verifyVal1;
269 EXPECT_EQ(val1, verifyVal1);
271 inStream >> verifyVal2;
272 EXPECT_EQ(val2, verifyVal2);
276 TEST_F(OutputStreamTest, WritesDouble) {
277 const char* signature = "dddddddddd";
278 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
279 CommonAPI::DBus::DBusOutputStream outStream(message);
281 outStream.reserveMemory(numOfElements * 8);
284 for (unsigned int i = 0; i < numOfElements; i += 2) {
290 EXPECT_EQ(numOfElements*8, message.getBodyLength());
292 CommonAPI::DBus::DBusInputStream inStream(message);
296 std::string verifySignature;
297 for (unsigned int i = 0; i < numOfElements; i += 2) {
298 inStream >> verifyVal1;
299 EXPECT_EQ(val1, verifyVal1);
301 inStream >> verifyVal2;
302 EXPECT_EQ(val2, verifyVal2);
306 TEST_F(OutputStreamTest, WritesStrings) {
307 const char* signature = "sss";
308 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
309 CommonAPI::DBus::DBusOutputStream outStream(message);
311 std::string val1 = "hai";
312 std::string val2 = "ciao";
313 std::string val3 = "salut";
315 //sizes of the strings + terminating null-bytes (each 1 byte) + length-fields (each 4 bytes)
316 outStream.reserveMemory(val1.size() + val2.size() + val3.size() + 3 + 3 * 4);
317 outStream << val1 << val2 << val3;
320 //Length fields + actual strings + terminating '\0's + 3(padding)
321 EXPECT_EQ(3*4 + 3 + 4 + 5 + 3 + 3, message.getBodyLength());
323 CommonAPI::DBus::DBusInputStream inStream(message);
325 std::string verifyVal1;
326 std::string verifyVal2;
327 std::string verifyVal3;
328 std::string verifySignature;
330 inStream >> verifyVal1;
331 inStream >> verifyVal2;
332 inStream >> verifyVal3;
334 EXPECT_EQ(val1, verifyVal1);
335 EXPECT_EQ(val2, verifyVal2);
336 EXPECT_EQ(val3, verifyVal3);
342 struct myStruct: CommonAPI::SerializableStruct {
351 virtual void readFromInputStream(CommonAPI::InputStream& inputMessageStream);
352 virtual void writeToOutputStream(CommonAPI::OutputStream& outputMessageStream) const;
355 myStruct::~myStruct() {
358 void myStruct::readFromInputStream(CommonAPI::InputStream& inputMessageStream) {
359 inputMessageStream >> a >> b >> c >> d >> e;
362 void myStruct::writeToOutputStream(CommonAPI::OutputStream& outputMessageStream) const {
363 outputMessageStream << a << b << c << d << e;
369 TEST_F(OutputStreamTest, WritesStructs) {
370 const char* signature = "(unbsd)";
371 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
372 CommonAPI::DBus::DBusOutputStream outStream(message);
374 bmw::test::myStruct testStruct;
377 testStruct.c = FALSE;
378 testStruct.d = "Hello all";
379 testStruct.e = 3.414;
381 // 40(byte length of struct) = 4(uint32_t) + 2(int16_t) + 2(padding) + 4(bool) + 4(strlength)
382 // + 9(string) + 1(terminating '\0' of string) + 6(padding) + 8 (double)
383 outStream.reserveMemory(40);
384 outStream << testStruct;
387 EXPECT_EQ(40, message.getBodyLength());
389 CommonAPI::DBus::DBusInputStream inStream(message);
390 bmw::test::myStruct verifyStruct;
391 inStream >> verifyStruct;
393 EXPECT_EQ(testStruct.a, verifyStruct.a);
394 EXPECT_EQ(testStruct.b, verifyStruct.b);
395 EXPECT_EQ(testStruct.c, verifyStruct.c);
396 EXPECT_EQ(testStruct.d, verifyStruct.d);
397 EXPECT_EQ(testStruct.e, verifyStruct.e);
400 TEST_F(OutputStreamTest, WritesArrays) {
401 const char* signature = "ai";
402 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
403 CommonAPI::DBus::DBusOutputStream outStream(message);
405 std::vector<int32_t> testVector;
406 int32_t val1 = 0xffffffff;
407 int32_t val2 = 0x7fffffff;
408 for (unsigned int i = 0; i < numOfElements; i += 2) {
409 testVector.push_back(val1);
410 testVector.push_back(val2);
413 outStream.reserveMemory(numOfElements * 4 + 4);
414 outStream << testVector;
417 EXPECT_EQ(numOfElements*4 + 4, message.getBodyLength());
419 CommonAPI::DBus::DBusInputStream inStream(message);
420 std::vector<int32_t> verifyVector;
421 inStream >> verifyVector;
425 for (unsigned int i = 0; i < numOfElements; i += 2) {
426 res1 = verifyVector[i];
427 EXPECT_EQ(val1, res1);
428 res2 = verifyVector[i + 1];
429 EXPECT_EQ(val2, res2);
433 TEST_F(OutputStreamTest, WritesArraysOfStrings) {
434 const char* signature = "as";
435 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
436 CommonAPI::DBus::DBusOutputStream outStream(message);
438 std::vector<std::string> testVector;
439 std::string val1 = "Hai";
440 std::string val2 = "Ciao";
441 for (unsigned int i = 0; i < numOfElements; i += 2) {
442 testVector.push_back(val1);
443 testVector.push_back(val2);
446 // 101 = 4(lengthFieldOfArray) +
447 // 4*(4(lengthField1) + 4(string1 mit \0-byte) + 4(lengthField2) + 5(string2 mit \0-byte) + 3(paddingTo4)) +
448 // (4(lengthField1) + 4(string1 mit \0-byte) + 4(lengthField2) + 5(string2 mit \0-byte))
449 size_t vectorLength = 101;
450 outStream.reserveMemory(vectorLength);
451 outStream << testVector;
454 EXPECT_EQ(vectorLength, message.getBodyLength());
456 CommonAPI::DBus::DBusInputStream inStream(message);
457 std::vector<std::string> verifyVector;
458 inStream >> verifyVector;
462 for (unsigned int i = 0; i < numOfElements; i += 2) {
463 res1 = verifyVector[i];
464 EXPECT_EQ(val1, res1);
465 res2 = verifyVector[i + 1];
466 EXPECT_EQ(val2, res2);
470 TEST_F(OutputStreamTest, WritesArraysInArrays) {
471 const char* signature = "aai";
472 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
473 CommonAPI::DBus::DBusOutputStream outStream(message);
475 std::vector<std::vector<int32_t>> testVector;
476 int32_t val1 = 0xffffffff;
477 int32_t val2 = 0x7fffffff;
478 for (unsigned int i = 0; i < numOfElements; i++) {
479 std::vector<int32_t> inner;
480 for (unsigned int j = 0; j < numOfElements; j += 2) {
481 inner.push_back(val1);
482 inner.push_back(val2);
484 testVector.push_back(inner);
487 outStream.reserveMemory(numOfElements * numOfElements * 4 + numOfElements * 4 + 4);
488 outStream << testVector;
491 EXPECT_EQ(numOfElements*numOfElements*4 + numOfElements*4 + 4, message.getBodyLength());
493 CommonAPI::DBus::DBusInputStream inStream(message);
494 std::vector<std::vector<int32_t>> verifyVector;
495 inStream >> verifyVector;
499 for (unsigned int i = 0; i < numOfElements; i++) {
500 std::vector<int32_t> innerVerify = verifyVector[i];
501 for (unsigned int j = 0; j < numOfElements; j += 2) {
502 res1 = innerVerify[j];
503 EXPECT_EQ(val1, res1);
504 res2 = innerVerify[j + 1];
505 EXPECT_EQ(val2, res2);
510 typedef CommonAPI::Variant<int8_t, uint32_t, double, std::string> BasicTypeVariant;
512 TEST_F(OutputStreamTest, WritesBasicTypeVariants) {
514 const char* signature = "(yv)(yv)(yv)(yv)";
515 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
516 CommonAPI::DBus::DBusOutputStream outStream(message);
518 int8_t fromInt8Value = 7;
519 uint32_t fromUInt32Value = 42;
520 double fromDoubleValue = 13.37;
521 std::string fromStringValue = "Hai :)";
522 BasicTypeVariant int8Variant(fromInt8Value);
523 BasicTypeVariant uint32Variant(fromUInt32Value);
524 BasicTypeVariant doubleVariant(fromDoubleValue);
525 BasicTypeVariant stringVariant(fromStringValue);
528 testVector.push_back(inner);
530 //4 * (1(byte) + 2(signature length + content)) + 1(int8_t) + 4(uint32_t) + 8(double) +
531 outStream.reserveMemory(numOfElements * numOfElements * 4 + numOfElements * 4 + 4);
532 outStream << testVector;
535 EXPECT_EQ(numOfElements*numOfElements*4 + numOfElements*4 + 4, message.getBodyLength());
537 CommonAPI::DBus::DBusInputStream inStream(message);
538 std::vector<std::vector<int32_t>> verifyVector;
539 inStream >> verifyVector;
543 for (int i = 0; i < numOfElements; i++) {
544 std::vector<int32_t> innerVerify = verifyVector[i];
545 for (int j = 0; j < numOfElements; j += 2) {
546 res1 = innerVerify[j];
547 EXPECT_EQ(val1, res1);
548 res2 = innerVerify[j + 1];
549 EXPECT_EQ(val2, res2);
559 struct TestStruct: CommonAPI::SerializableStruct {
561 TestStruct(int32_t v1, double v2, double v3, std::string v4);
569 virtual void readFromInputStream(CommonAPI::InputStream& inputMessageStream);
570 virtual void writeToOutputStream(CommonAPI::OutputStream& outputMessageStream) const;
573 typedef std::vector<TestStruct> TestStructList;
575 TestStruct::TestStruct() :
576 val1(0), val2(0), val3(0), val4("") {
579 TestStruct::TestStruct(int32_t v1, double v2, double v3, std::string v4) :
580 val1(v1), val2(v2), val3(v3), val4(v4) {
583 TestStruct::~TestStruct() {
586 void TestStruct::readFromInputStream(CommonAPI::InputStream& inputMessageStream) {
587 inputMessageStream >> val1 >> val2 >> val3 >> val4;
590 void TestStruct::writeToOutputStream(CommonAPI::OutputStream& outputMessageStream) const {
591 outputMessageStream << val1 << val2 << val3 << val4;
599 TEST_F(OutputStreamTest, WritesTestStructs) {
600 const char* signature = "(idds)";
601 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
602 CommonAPI::DBus::DBusOutputStream outStream(message);
604 com::bmw::test::TestStruct testStruct(1, 12.6, 1e40, "XXXXXXXXXXXXXXXXXXXX");
606 //4(int32_t) + 4(padding) + 8(double) + 8(double) + 4(str_length) + 20(string) + 1(null-termination)
607 uint32_t expectedSize = 49;
608 outStream.reserveMemory(expectedSize);
609 outStream << testStruct;
612 EXPECT_EQ(expectedSize, message.getBodyLength());
614 CommonAPI::DBus::DBusInputStream inStream(message);
615 com::bmw::test::TestStruct verifyStruct;
616 inStream >> verifyStruct;
618 EXPECT_EQ(testStruct.val1, verifyStruct.val1);
619 EXPECT_EQ(testStruct.val2, verifyStruct.val2);
620 EXPECT_EQ(testStruct.val3, verifyStruct.val3);
621 EXPECT_EQ(testStruct.val4, verifyStruct.val4);
624 TEST_F(OutputStreamTest, WritesTestStructLists) {
625 const char* signature = "a(idds)";
626 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
627 CommonAPI::DBus::DBusOutputStream outStream(message);
629 com::bmw::test::TestStructList testList;
630 for (unsigned int i = 0; i < numOfElements; i++) {
631 testList.emplace_back(1, 12.6, 1e40, "XXXXXXXXXXXXXXXXXXXX");
634 //struct size: 49 = 4(int32_t) + 4(padding) + 8(double) + 8(double) + 4(str_length) + 20(string) + 1(null-termination)
635 //array size: 4(array_length) + 4(struct_padding) + (numElements-1)*(49(struct) + 7(struct_padding)) + 49(struct)
636 uint32_t expectedSize = 8 + (numOfElements - 1) * (49 + 7) + 49;
637 outStream.reserveMemory(expectedSize);
638 outStream << testList;
641 EXPECT_EQ(expectedSize, message.getBodyLength());
643 CommonAPI::DBus::DBusInputStream inStream(message);
644 com::bmw::test::TestStructList verifyList;
645 inStream >> verifyList;
647 EXPECT_EQ(numOfElements, verifyList.size());
656 struct ArrayStruct: CommonAPI::SerializableStruct {
658 ArrayStruct(std::vector<int64_t> v1, std::vector<std::string> v2, std::vector<double> v3, std::vector<std::string> v4, std::vector<uint16_t> v5);
661 std::vector<int64_t> val1;
662 std::vector<std::string> val2;
663 std::vector<double> val3;
664 std::vector<std::string> val4;
665 std::vector<uint16_t> val5;
667 virtual void readFromInputStream(CommonAPI::InputStream& inputMessageStream);
668 virtual void writeToOutputStream(CommonAPI::OutputStream& outputMessageStream) const;
671 typedef std::vector<TestStruct> TestStructList;
673 ArrayStruct::ArrayStruct() {
676 ArrayStruct::ArrayStruct(std::vector<int64_t> v1, std::vector<std::string> v2, std::vector<double> v3, std::vector<std::string> v4, std::vector<uint16_t> v5) :
677 val1(v1), val2(v2), val3(v3), val4(v4), val5(v5) {
680 ArrayStruct::~ArrayStruct() {
683 void ArrayStruct::readFromInputStream(CommonAPI::InputStream& inputMessageStream) {
684 inputMessageStream >> val1 >> val2 >> val3 >> val4 >> val5;
687 void ArrayStruct::writeToOutputStream(CommonAPI::OutputStream& outputMessageStream) const {
688 outputMessageStream << val1 << val2 << val3 << val4 << val5;
696 TEST_F(OutputStreamTest, WritesStructsOfArraysWithSthBefore) {
697 const char* signature = "(axasadasaq)";
698 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
699 CommonAPI::DBus::DBusOutputStream outStream(message);
701 com::bmw::test::ArrayStruct arrayStruct;
702 for (unsigned int i = 0; i < numOfElements; i++) {
703 arrayStruct.val1.push_back(i*50);
704 arrayStruct.val2.push_back("Hai");
705 arrayStruct.val3.push_back(3.414);
706 arrayStruct.val4.push_back("Ciao");
707 arrayStruct.val5.push_back(i*5);
709 uint16_t frontValue = 0;
711 // 2(uint16) + 6(padding) --> 8
712 // 4(LengthField) + 4(padding) + 10 * 8(int64) --> 88 --> 96
713 // 4(LengthField) + 10 * (4(LengthField) + 4("Hai\0")) --> 84 --> 180
714 // 4(LengthField) + 10 * 8(double) --> 84 --> 264
715 // 4(LengthField) + 10 * (4(LengthField) + 5("Ciao\0") + 3(padding)) --> 124 --> 388
716 // 4(LengthField) + 10 * 2(uint16) --> 24 --> 412
717 size_t structLength = 412;
718 outStream.reserveMemory(structLength);
719 outStream << frontValue << arrayStruct;
722 EXPECT_EQ(structLength, message.getBodyLength());
724 CommonAPI::DBus::DBusInputStream inStream(message);
725 com::bmw::test::ArrayStruct verifyStruct;
727 uint16_t frontVerification;
728 inStream >> frontVerification >> verifyStruct;
730 EXPECT_EQ(frontValue, frontVerification);
738 for (unsigned int i = 0; i < numOfElements; i++) {
739 res1 = verifyStruct.val1[i];
740 res2 = verifyStruct.val2[i];
741 res3 = verifyStruct.val3[i];
742 res4 = verifyStruct.val4[i];
743 res5 = verifyStruct.val5[i];
745 EXPECT_EQ(i*50, res1);
746 EXPECT_EQ(std::string("Hai"), res2);
747 EXPECT_EQ(3.414, res3);
748 EXPECT_EQ(std::string("Ciao"), res4);
749 EXPECT_EQ(i*5, res5);
755 TEST_F(OutputStreamTest, WritesEnumKeyedMaps) {
756 commonapi::tests::DerivedTypeCollection::TestEnumMap testEnumMap;
758 commonapi::tests::DerivedTypeCollection::TestEnum key1 = commonapi::tests::DerivedTypeCollection::TestEnum::E_NOT_USED;
759 commonapi::tests::DerivedTypeCollection::TestEnum key2 = commonapi::tests::DerivedTypeCollection::TestEnum::E_OK;
760 commonapi::tests::DerivedTypeCollection::TestEnum key3 = commonapi::tests::DerivedTypeCollection::TestEnum::E_OUT_OF_RANGE;
761 commonapi::tests::DerivedTypeCollection::TestEnum key4 = commonapi::tests::DerivedTypeCollection::TestEnum::E_UNKNOWN;
762 std::string val = "Hai";
764 testEnumMap.insert( {key1, val} );
765 testEnumMap.insert( {key2, val} );
766 testEnumMap.insert( {key3, val} );
767 testEnumMap.insert( {key4, val} );
769 const char* signature = "a{is}";
770 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
771 CommonAPI::DBus::DBusOutputStream outStream(message);
773 //array length (4) + struct-padding (4) +
774 // 3 * (sizeof(int) + sizeof(string) + struct-padding) + (sizeof(int) + sizeof(string))
775 size_t sizeOfBody = 4 + 4 + 3 * (4 + 8 + 4) + (4 + 8);
776 outStream.reserveMemory(sizeOfBody);
777 outStream << testEnumMap;
780 EXPECT_EQ(sizeOfBody, message.getBodyLength());
782 CommonAPI::DBus::DBusInputStream inStream(message);
784 commonapi::tests::DerivedTypeCollection::TestEnumMap verificationMap;
785 inStream >> verificationMap;
787 for(auto it = verificationMap.begin(); it != verificationMap.end(); ++it) {
788 ASSERT_EQ(it->second, testEnumMap[it->first]);
792 int main(int argc, char** argv) {
793 ::testing::InitGoogleTest(&argc, argv);
794 return RUN_ALL_TESTS();