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>
9 #include <CommonAPI/DBus/DBusOutputStream.h>
10 #include <CommonAPI/DBus/DBusInputStream.h>
11 #include <CommonAPI/SerializableVariant.h>
13 using namespace CommonAPI;
15 class VariantOutputStreamTest: public ::testing::Test {
18 CommonAPI::DBus::DBusMessage message;
20 const char* objectPath;
21 const char* interfaceName;
22 const char* methodName;
23 const char* signature;
27 busName = "no.bus.here";
28 objectPath = "/no/object/here";
29 interfaceName = "no.interface.here";
30 methodName = "noMethodHere";
31 signature = "yyyyyyyyyy";
39 typedef Variant<int,bool> InnerVar;
41 struct MyStruct: CommonAPI::SerializableStruct {
50 virtual void readFromInputStream(CommonAPI::InputStream& inputMessageStream);
51 virtual void writeToOutputStream(CommonAPI::OutputStream& outputMessageStream) const;
52 static inline void writeToTypeOutputStream(CommonAPI::TypeOutputStream& typeOutputStream) {
53 typeOutputStream.writeUInt32Type();
54 typeOutputStream.writeVariantType();
55 typeOutputStream.writeBoolType();
56 typeOutputStream.writeStringType();
57 typeOutputStream.writeDoubleType();
61 MyStruct::~MyStruct() {
64 void MyStruct::readFromInputStream(CommonAPI::InputStream& inputMessageStream) {
65 inputMessageStream >> a >> b >> c >> d >> e;
68 void MyStruct::writeToOutputStream(CommonAPI::OutputStream& outputMessageStream) const {
69 outputMessageStream << a << b << c << d << e;
72 bool operator==(const MyStruct& lhs, const MyStruct& rhs) {
85 TEST_F(VariantOutputStreamTest, CanBeCalled) {
86 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
87 DBus::DBusOutputStream outputStream(message);
90 TEST_F(VariantOutputStreamTest, CanWriteVariant) {
91 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
92 DBus::DBusOutputStream outputStream(message);
95 Variant<int, bool> inVariant(fromInt);
96 Variant<int, bool> outVariant;
98 outputStream << inVariant;
101 DBus::DBusInputStream inputStream(message);
103 inputStream >> outVariant;
105 EXPECT_TRUE(outVariant.isType<int>());
106 EXPECT_EQ(inVariant.get<int>(), outVariant.get<int>());
107 EXPECT_TRUE(inVariant == outVariant);
110 TEST_F(VariantOutputStreamTest, CanWriteVariantInVariant) {
111 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
112 DBus::DBusOutputStream outputStream(message);
115 Variant<int, bool> nestedVariant(fromInt);
117 Variant<InnerVar, std::string, float> inVariant(nestedVariant);
119 Variant<InnerVar, std::string, float> outVariant;
121 outputStream << inVariant;
122 outputStream.flush();
124 DBus::DBusInputStream inputStream(message);
126 inputStream >> outVariant;
128 EXPECT_TRUE(outVariant.isType<InnerVar>());
129 EXPECT_EQ(inVariant.get<InnerVar>(), outVariant.get<InnerVar>());
130 EXPECT_TRUE(inVariant == outVariant);
133 TEST_F(VariantOutputStreamTest, CanWriteVariantInStruct) {
134 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
135 DBus::DBusOutputStream outputStream(message);
138 Variant<int, bool> nestedVariant(fromInt);
141 inStruct.b = nestedVariant;
145 outputStream << inStruct;
146 outputStream.flush();
148 DBus::DBusInputStream inputStream(message);
150 inputStream >> outStruct;
152 EXPECT_TRUE(outStruct.b.isType<int>());
153 EXPECT_EQ(outStruct.b.get<int>(), inStruct.b.get<int>());
154 EXPECT_TRUE(inStruct.b == outStruct.b);
157 TEST_F(VariantOutputStreamTest, CanWriteVariantInArray) {
158 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
159 DBus::DBusOutputStream outputStream(message);
162 std::vector<InnerVar> inVector;
163 std::vector<InnerVar> outVector;
165 for (int i = 0; i < numOfElements; i++) {
166 inVector.push_back(InnerVar(fromInt));
169 outputStream << inVector;
170 outputStream.flush();
172 DBus::DBusInputStream inputStream(message);
174 inputStream >> outVector;
176 EXPECT_TRUE(outVector[0].isType<int>());
177 EXPECT_EQ(inVector[0].get<int>(), outVector[0].get<int>());
178 EXPECT_EQ(numOfElements, outVector.size());
179 EXPECT_TRUE(inVector[0] == outVector[0]);
182 TEST_F(VariantOutputStreamTest, CanWriteArrayInVariant) {
183 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
184 DBus::DBusOutputStream outputStream(message);
186 typedef std::vector<int> IntVector;
187 typedef Variant<IntVector, std::string> VectorVariant;
189 std::vector<int> inVector;
191 for (int i = 0; i < numOfElements; i++) {
192 inVector.push_back(fromInt);
196 VectorVariant inVariant(inVector);
197 VectorVariant outVariant;
199 outputStream << inVariant;
200 outputStream.flush();
202 DBus::DBusInputStream inputStream(message);
204 inputStream >> outVariant;
206 EXPECT_TRUE(outVariant.isType<IntVector>());
207 EXPECT_EQ(inVariant.get<IntVector>(), outVariant.get<IntVector>());
208 EXPECT_TRUE(inVariant == outVariant);
211 TEST_F(VariantOutputStreamTest, CanWriteStructInVariant) {
212 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
213 DBus::DBusOutputStream outputStream(message);
215 typedef Variant<MyStruct, std::string> StructVariant;
221 StructVariant inVariant(str);
222 StructVariant outVariant;
224 outputStream << inVariant;
225 outputStream.flush();
227 DBus::DBusInputStream inputStream(message);
229 inputStream >> outVariant;
231 EXPECT_TRUE(outVariant.isType<MyStruct>());
232 EXPECT_EQ(inVariant.get<MyStruct>(), outVariant.get<MyStruct>());
233 EXPECT_TRUE(inVariant == outVariant);
236 TEST_F(VariantOutputStreamTest, CanWriteVariantInStructInVariant) {
237 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
238 DBus::DBusOutputStream outputStream(message);
240 typedef Variant<MyStruct, std::string> StructVariant;
244 str.b = InnerVar(fromInt);
246 StructVariant inVariant(str);
247 StructVariant outVariant;
249 outputStream << inVariant;
250 outputStream.flush();
252 DBus::DBusInputStream inputStream(message);
254 inputStream >> outVariant;
256 EXPECT_TRUE(outVariant.isType<MyStruct>());
257 EXPECT_EQ(inVariant.get<MyStruct>(), outVariant.get<MyStruct>());
258 EXPECT_TRUE(inVariant.get<MyStruct>().b == outVariant.get<MyStruct>().b);
259 EXPECT_TRUE(inVariant.get<MyStruct>().b.get<int>() == outVariant.get<MyStruct>().b.get<int>());
260 EXPECT_TRUE(inVariant == outVariant);
263 TEST_F(VariantOutputStreamTest, CanWriteVariantInArrayInVariant) {
264 message = CommonAPI::DBus::DBusMessage::createMethodCall(busName, objectPath, interfaceName, methodName, signature);
265 DBus::DBusOutputStream outputStream(message);
267 typedef std::vector<InnerVar> VarVector;
268 typedef Variant<VarVector, std::string> ArrayVariant;
272 for (int i = 0; i < numOfElements; i++) {
273 inVector.push_back(InnerVar(fromInt));
276 ArrayVariant inVariant(inVector);
277 ArrayVariant outVariant;
279 outputStream << inVariant;
280 outputStream.flush();
282 DBus::DBusInputStream inputStream(message);
284 inputStream >> outVariant;
286 EXPECT_TRUE(outVariant.isType<VarVector>());
287 EXPECT_EQ(inVariant.get<VarVector>(), outVariant.get<VarVector>());
288 EXPECT_TRUE(inVariant.get<VarVector>()[0] == outVariant.get<VarVector>()[0]);
289 EXPECT_TRUE(inVariant.get<VarVector>()[0].get<int>() == outVariant.get<VarVector>()[0].get<int>());
290 EXPECT_TRUE(inVariant == outVariant);
293 int main(int argc, char** argv) {
294 ::testing::InitGoogleTest(&argc, argv);
295 return RUN_ALL_TESTS();