1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #include <gtest/gtest.h>
7 #include <unordered_map>
10 #include <CommonAPI/SerializableStruct.h>
11 #include <CommonAPI/SerializableVariant.h>
12 #include <CommonAPI/types.h>
13 #include <CommonAPI/ByteBuffer.h>
15 #include <CommonAPI/DBus/DBusOutputStream.h>
17 #include "commonapi/tests/DerivedTypeCollection.h"
19 #include <type_traits>
22 struct TestStructWithVariant: public CommonAPI::SerializableStruct {
23 TestStructWithVariant(): uint16Val_(42), stringVal_("Hai!"), variantVal_(13.37) {
27 virtual ~TestStructWithVariant() {}
29 virtual void readFromInputStream(CommonAPI::InputStream& inputStream) {
32 virtual void writeToOutputStream(CommonAPI::OutputStream& outputStream) const {
35 static void writeToTypeOutputStream(CommonAPI::TypeOutputStream& typeOutputStream) {
36 CommonAPI::TypeWriter<uint16_t>::writeType(typeOutputStream);
37 CommonAPI::TypeWriter<std::string>::writeType(typeOutputStream);
38 CommonAPI::TypeWriter<CommonAPI::Variant<uint32_t, double, std::vector<std::string>>>::writeType(typeOutputStream);
43 std::string stringVal_;
44 CommonAPI::Variant<uint32_t, double, std::vector<std::string>> variantVal_;
48 typedef std::vector<commonapi::tests::DerivedTypeCollection::TestEnum> TestEnumList;
51 class TypeOutputStreamTest: public ::testing::Test {
60 CommonAPI::DBus::DBusTypeOutputStream typeStream_;
65 TEST_F(TypeOutputStreamTest, CreatesBasicTypeSignatures) {
66 CommonAPI::TypeWriter<bool>::writeType(typeStream_);
67 std::string signature = typeStream_.retrieveSignature();
68 ASSERT_TRUE(signature.compare("b") == 0);
71 TEST_F(TypeOutputStreamTest, CreatesInt8Signature) {
72 CommonAPI::TypeWriter<int8_t>::writeType(typeStream_);
73 std::string signature = typeStream_.retrieveSignature();
74 ASSERT_TRUE(signature.compare("y") == 0);
76 TEST_F(TypeOutputStreamTest, CreatesInt16Signature) {
77 CommonAPI::TypeWriter<int16_t>::writeType(typeStream_);
78 std::string signature = typeStream_.retrieveSignature();
79 ASSERT_TRUE(signature.compare("n") == 0);
81 TEST_F(TypeOutputStreamTest, CreatesInt32Signature) {
82 CommonAPI::TypeWriter<int32_t>::writeType(typeStream_);
83 std::string signature = typeStream_.retrieveSignature();
84 ASSERT_TRUE(signature.compare("i") == 0);
86 TEST_F(TypeOutputStreamTest, CreatesInt64Signature) {
87 CommonAPI::TypeWriter<int64_t>::writeType(typeStream_);
88 std::string signature = typeStream_.retrieveSignature();
89 ASSERT_TRUE(signature.compare("x") == 0);
92 TEST_F(TypeOutputStreamTest, CreatesUInt8Signature) {
93 CommonAPI::TypeWriter<uint8_t>::writeType(typeStream_);
94 std::string signature = typeStream_.retrieveSignature();
95 ASSERT_TRUE(signature.compare("y") == 0);
97 TEST_F(TypeOutputStreamTest, CreatesUInt16Signature) {
98 CommonAPI::TypeWriter<uint16_t>::writeType(typeStream_);
99 std::string signature = typeStream_.retrieveSignature();
100 ASSERT_TRUE(signature.compare("q") == 0);
102 TEST_F(TypeOutputStreamTest, CreatesUInt32Signature) {
103 CommonAPI::TypeWriter<uint32_t>::writeType(typeStream_);
104 std::string signature = typeStream_.retrieveSignature();
105 ASSERT_TRUE(signature.compare("u") == 0);
107 TEST_F(TypeOutputStreamTest, CreatesUInt64Signature) {
108 CommonAPI::TypeWriter<uint64_t>::writeType(typeStream_);
109 std::string signature = typeStream_.retrieveSignature();
110 ASSERT_TRUE(signature.compare("t") == 0);
113 TEST_F(TypeOutputStreamTest, CreatesFloatSignature) {
114 CommonAPI::TypeWriter<float>::writeType(typeStream_);
115 std::string signature = typeStream_.retrieveSignature();
116 ASSERT_TRUE(signature.compare("d") == 0);
118 TEST_F(TypeOutputStreamTest, CreatesDoubleSignature) {
119 CommonAPI::TypeWriter<double>::writeType(typeStream_);
120 std::string signature = typeStream_.retrieveSignature();
121 ASSERT_TRUE(signature.compare("d") == 0);
124 TEST_F(TypeOutputStreamTest, CreatesStringSignature) {
125 CommonAPI::TypeWriter<std::string>::writeType(typeStream_);
126 std::string signature = typeStream_.retrieveSignature();
127 ASSERT_TRUE(signature.compare("s") == 0);
130 TEST_F(TypeOutputStreamTest, CreatesByteBufferSignature) {
131 CommonAPI::TypeWriter<CommonAPI::ByteBuffer>::writeType(typeStream_);
132 std::string signature = typeStream_.retrieveSignature();
133 ASSERT_TRUE(signature.compare("ay") == 0);
136 TEST_F(TypeOutputStreamTest, CreatesVersionSignature) {
137 CommonAPI::TypeWriter<CommonAPI::Version>::writeType(typeStream_);
138 std::string signature = typeStream_.retrieveSignature();
139 ASSERT_TRUE(signature.compare("(uu)") == 0);
142 TEST_F(TypeOutputStreamTest, CreatesInt32EnumSignature) {
143 CommonAPI::TypeWriter<commonapi::tests::DerivedTypeCollection::TestEnum>::writeType(typeStream_);
144 std::string signature = typeStream_.retrieveSignature();
145 ASSERT_TRUE(signature.compare("i") == 0);
148 TEST_F(TypeOutputStreamTest, CreatesVariantWithBasicTypesSignature) {
149 CommonAPI::TypeWriter<CommonAPI::Variant<int, double, std::string>>::writeType(typeStream_);
150 std::string signature = typeStream_.retrieveSignature();
151 ASSERT_TRUE(signature.compare("(yv)") == 0);
154 TEST_F(TypeOutputStreamTest, CreatesVariantWithVariantSignature) {
155 CommonAPI::TypeWriter<CommonAPI::Variant<int, CommonAPI::Variant<int, double, std::string>, CommonAPI::Variant<int, CommonAPI::Variant<int, double, std::string>, std::string>, std::string>>::writeType(typeStream_);
156 std::string signature = typeStream_.retrieveSignature();
157 ASSERT_TRUE(signature.compare("(yv)") == 0);
160 TEST_F(TypeOutputStreamTest, CreatesVectorOfStringsSignature) {
161 CommonAPI::TypeWriter<std::vector<std::string> >::writeType(typeStream_);
162 std::string signature = typeStream_.retrieveSignature();
163 ASSERT_TRUE(signature.compare("as") == 0);
166 TEST_F(TypeOutputStreamTest, CreatesVectorOfInt32EnumsSignature) {
167 CommonAPI::TypeWriter<TestEnumList>::writeType(typeStream_);
168 std::string signature = typeStream_.retrieveSignature();
169 ASSERT_TRUE(signature.compare("ai") == 0);
172 TEST_F(TypeOutputStreamTest, CreatesVectorOfVersionsSignature) {
173 CommonAPI::TypeWriter<std::vector<CommonAPI::Version> >::writeType(typeStream_);
174 std::string signature = typeStream_.retrieveSignature();
175 ASSERT_TRUE(signature.compare("a(uu)") == 0);
178 TEST_F(TypeOutputStreamTest, CreatesVectorOfVariantsSignature) {
179 CommonAPI::TypeWriter<std::vector<CommonAPI::Variant<int, double, std::string>> >::writeType(typeStream_);
180 std::string signature = typeStream_.retrieveSignature();
181 ASSERT_TRUE(signature.compare("a(yv)") == 0);
184 TEST_F(TypeOutputStreamTest, CreatesVectorOfVectorOfStringsSignature) {
185 CommonAPI::TypeWriter<std::vector<std::vector<std::string>> >::writeType(typeStream_);
186 std::string signature = typeStream_.retrieveSignature();
187 ASSERT_TRUE(signature.compare("aas") == 0);
190 TEST_F(TypeOutputStreamTest, CreatesVectorOfVectorOfVariantsSignature) {
191 CommonAPI::TypeWriter<std::vector<std::vector<CommonAPI::Variant<int, double, std::string>>> >::writeType(typeStream_);
192 std::string signature = typeStream_.retrieveSignature();
193 ASSERT_TRUE(signature.compare("aa(yv)") == 0);
196 TEST_F(TypeOutputStreamTest, CreatesMapOfUInt16ToStringSignature) {
197 CommonAPI::TypeWriter<std::unordered_map<uint16_t, std::string>>::writeType(typeStream_);
198 std::string signature = typeStream_.retrieveSignature();
199 ASSERT_TRUE(signature.compare("a{qs}") == 0);
202 TEST_F(TypeOutputStreamTest, CreatesVectorOfMapsOfUInt16ToStringSignature) {
203 CommonAPI::TypeWriter<std::vector<std::unordered_map<uint16_t, std::string>> >::writeType(typeStream_);
204 std::string signature = typeStream_.retrieveSignature();
205 ASSERT_TRUE(signature.compare("aa{qs}") == 0);
209 TEST_F(TypeOutputStreamTest, ParsesSignatureOfTestStructCorrectly) {
210 CommonAPI::TypeWriter<TestStructWithVariant>::writeType(typeStream_);
211 std::string signature = typeStream_.retrieveSignature();
212 ASSERT_TRUE(signature.compare("(qs(yv))") == 0);
216 TEST_F(TypeOutputStreamTest, ParsesSignatureOfUInt32TypeVariantsCorrectly) {
217 uint32_t fromUInt = 42;
218 CommonAPI::Variant<uint32_t, double, uint16_t> myVariant(fromUInt);
220 myVariant.writeToTypeOutputStream(typeStream_);
222 std::string signature = typeStream_.retrieveSignature();
223 ASSERT_TRUE(signature.compare("u") == 0);
227 TEST_F(TypeOutputStreamTest, ParsesSignatureOfStringTypeVariantsCorrectly) {
228 std::string fromString = "Hai!";
229 CommonAPI::Variant<uint32_t, double, std::string> myVariant(fromString);
231 myVariant.writeToTypeOutputStream(typeStream_);
233 std::string signature = typeStream_.retrieveSignature();
234 ASSERT_TRUE(signature.compare("s") == 0);
238 TEST_F(TypeOutputStreamTest, ParsesSignatureOfVectorTypeVariantsCorrectly) {
239 std::vector<std::string> fromStringVector;
240 CommonAPI::Variant<uint32_t, double, std::vector<std::string>> myVariant(fromStringVector);
242 myVariant.writeToTypeOutputStream(typeStream_);
244 std::string signature = typeStream_.retrieveSignature();
245 ASSERT_TRUE(signature.compare("as") == 0);
249 TEST_F(TypeOutputStreamTest, ParsesSignatureOfTestStructTypeVariantsCorrectly) {
250 TestStructWithVariant fromTestStruct;
251 CommonAPI::Variant<uint32_t, double, TestStructWithVariant> myVariant(fromTestStruct);
253 myVariant.writeToTypeOutputStream(typeStream_);
255 std::string signature = typeStream_.retrieveSignature();
256 ASSERT_TRUE(signature.compare("(qs(yv))") == 0);
259 TEST_F(TypeOutputStreamTest, ParsesSignatureOfGenericUInt32TypeVariantsCorrectly) {
260 uint32_t fromUInt = 42;
261 CommonAPI::Variant<uint32_t, double, uint16_t> myVariant(fromUInt);
262 CommonAPI::SerializableVariant* genericVariant = &myVariant;
264 genericVariant->writeToTypeOutputStream(typeStream_);
266 std::string signature = typeStream_.retrieveSignature();
267 ASSERT_TRUE(signature.compare("u") == 0);
270 TEST_F(TypeOutputStreamTest, ParsesSignatureOfGenericInt32EnumTypeVariantsCorrectly) {
271 commonapi::tests::DerivedTypeCollection::TestEnum fromInt32Enum = commonapi::tests::DerivedTypeCollection::TestEnum::E_OK;
272 CommonAPI::Variant<uint32_t, double, commonapi::tests::DerivedTypeCollection::TestEnum> myVariant(fromInt32Enum);
273 CommonAPI::SerializableVariant* genericVariant = &myVariant;
275 genericVariant->writeToTypeOutputStream(typeStream_);
277 std::string signature = typeStream_.retrieveSignature();
278 ASSERT_TRUE(signature.compare("i") == 0);
281 TEST_F(TypeOutputStreamTest, ParsesSignatureOfGenericStringTypeVariantsCorrectly) {
282 std::string fromString = "Hai!";
283 CommonAPI::Variant<uint32_t, double, std::string> myVariant(fromString);
284 CommonAPI::SerializableVariant* genericVariant = &myVariant;
286 genericVariant->writeToTypeOutputStream(typeStream_);
288 std::string signature = typeStream_.retrieveSignature();
289 ASSERT_TRUE(signature.compare("s") == 0);
293 TEST_F(TypeOutputStreamTest, ParsesSignatureOfGenericVectorTypeVariantsCorrectly) {
294 std::vector<std::string> fromStringVector;
295 CommonAPI::Variant<uint32_t, double, std::vector<std::string>> myVariant(fromStringVector);
296 CommonAPI::SerializableVariant* genericVariant = &myVariant;
298 genericVariant->writeToTypeOutputStream(typeStream_);
300 std::string signature = typeStream_.retrieveSignature();
301 ASSERT_TRUE(signature.compare("as") == 0);
305 TEST_F(TypeOutputStreamTest, ParsesSignatureOfGenericVectorOfInt32EnumTypeVariantsCorrectly) {
306 TestEnumList fromEnumVector;
307 CommonAPI::Variant<uint32_t, double, TestEnumList> myVariant(fromEnumVector);
308 CommonAPI::SerializableVariant* genericVariant = &myVariant;
310 genericVariant->writeToTypeOutputStream(typeStream_);
312 std::string signature = typeStream_.retrieveSignature();
313 ASSERT_TRUE(signature.compare("ai") == 0);
317 TEST_F(TypeOutputStreamTest, ParsesSignatureOfGenericTestStructTypeVariantsCorrectly) {
318 TestStructWithVariant fromTestStruct;
319 CommonAPI::Variant<uint32_t, double, TestStructWithVariant> myVariant(fromTestStruct);
320 CommonAPI::SerializableVariant* genericVariant = &myVariant;
322 genericVariant->writeToTypeOutputStream(typeStream_);
324 std::string signature = typeStream_.retrieveSignature();
325 ASSERT_TRUE(signature.compare("(qs(yv))") == 0);
329 int main(int argc, char** argv) {
330 ::testing::InitGoogleTest(&argc, argv);
331 return RUN_ALL_TESTS();