1 //******************************************************************
3 // Copyright 2015 Intel Mobile Communications GmbH All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
11 // http://www.apache.org/licenses/LICENSE-2.0
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21 #include <gtest/gtest.h>
23 #include <OCRepresentation.h>
26 #include <ocpayload.h>
27 #include <ocpayloadcbor.h>
28 #include <oic_malloc.h>
29 #include <oic_string.h>
30 #include "payload_logging.h"
34 bool operator==(const OC::NullType&, const OC::NullType&)
39 bool operator==(const OC::OCRepresentation& lhs, const OC::OCRepresentation& rhs)
41 return lhs.getUri() == rhs.getUri() &&
42 lhs.getChildren() == rhs.getChildren() &&
43 lhs.getResourceInterfaces() == rhs.getResourceInterfaces() &&
44 lhs.getResourceTypes() == rhs.getResourceTypes() &&
45 lhs.m_values == rhs.m_values;
48 // these tests validate the OCRepresentation->OCPayload, OCPayload->CBOR,
49 // CBOR->OCPayload and OCPayload->OCRepresentation conversions
50 namespace OCRepresentationEncodingTest
52 static const char sid1[] = "646F6F72-4465-7669-6365-555549443030";
53 static const char devicename1[] = "device name";
54 static const char specver1[] = "spec version";
55 static const char dmver1[] = "data model version";
56 static OCStringLL *types = NULL;
58 TEST(DeviceDiscoveryEncoding, Normal)
60 OCResourcePayloadAddStringLL(&types, "oic.wk.d");
61 OCResourcePayloadAddStringLL(&types, "oic.d.tv");
63 OCDevicePayload* device = OCDevicePayloadCreate(
69 EXPECT_STREQ(sid1, device->sid);
70 EXPECT_STREQ(devicename1, device->deviceName);
71 EXPECT_STREQ(specver1, device->specVersion);
72 EXPECT_STREQ(dmver1, device->dataModelVersion);
73 EXPECT_EQ(PAYLOAD_TYPE_DEVICE, ((OCPayload*)device)->type);
74 EXPECT_STREQ("oic.wk.d", device->types->value);
75 EXPECT_STREQ("oic.d.tv", device->types->next->value);
79 OCPayload* parsedDevice;
80 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)device, &cborData, &cborSize));
81 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&parsedDevice, PAYLOAD_TYPE_DEVICE,
85 EXPECT_STREQ(device->sid, ((OCDevicePayload*)parsedDevice)->sid);
86 EXPECT_STREQ(device->deviceName, ((OCDevicePayload*)parsedDevice)->deviceName);
87 EXPECT_STREQ(device->specVersion, ((OCDevicePayload*)parsedDevice)->specVersion);
88 EXPECT_STREQ(device->dataModelVersion, ((OCDevicePayload*)parsedDevice)->dataModelVersion);
89 EXPECT_STREQ("oic.wk.d", ((OCDevicePayload*)parsedDevice)->types->value);
90 EXPECT_STREQ("oic.d.tv", ((OCDevicePayload*)parsedDevice)->types->next->value);
91 EXPECT_EQ(device->base.type, ((OCDevicePayload*)parsedDevice)->base.type);
93 OCPayloadDestroy((OCPayload*)device);
95 OC::MessageContainer mc;
96 mc.setPayload(parsedDevice);
97 EXPECT_EQ(1u, mc.representations().size());
98 const OC::OCRepresentation& r = mc.representations()[0];
99 EXPECT_STREQ(sid1, r.getValue<std::string>(OC_RSRVD_DEVICE_ID).c_str());
100 EXPECT_STREQ(devicename1, r.getValue<std::string>(OC_RSRVD_DEVICE_NAME).c_str());
101 EXPECT_STREQ(specver1, r.getValue<std::string>(OC_RSRVD_SPEC_VERSION).c_str());
102 EXPECT_STREQ(dmver1, r.getValue<std::string>(OC_RSRVD_DATA_MODEL_VERSION).c_str());
104 OCPayloadDestroy(parsedDevice);
107 static const char uri1[] = "/testuri";
108 static char pfid1[] = "pfid";
109 static char mfgnm1[] = "mfgnm";
110 static char mfgurl1[] = "mfgurl";
111 static char modelnum1[] = "modelnum";
112 static char dom1[] = "dom";
113 static char pfver1[] = "pfver";
114 static char osver1[] = "osver";
115 static char hwver1[] = "hwver";
116 static char fwver1[] = "fwver";
117 static char url1[] = "url";
118 static char time1[] = "time";
121 TEST(PlatformDiscoveryEncoding, Normal)
123 OCPlatformInfo info {pfid1, mfgnm1, mfgurl1, modelnum1, dom1, pfver1, osver1, hwver1,
124 fwver1, url1, time1};
125 OCPlatformPayload* platform = OCPlatformPayloadCreate(&info);
126 EXPECT_EQ(PAYLOAD_TYPE_PLATFORM, ((OCPayload*)platform)->type);
127 EXPECT_STREQ(pfid1, platform->info.platformID);
128 EXPECT_STREQ(mfgnm1, platform->info.manufacturerName);
129 EXPECT_STREQ(mfgurl1, platform->info.manufacturerUrl);
130 EXPECT_STREQ(modelnum1, platform->info.modelNumber);
131 EXPECT_STREQ(dom1, platform->info.dateOfManufacture);
132 EXPECT_STREQ(pfver1, platform->info.platformVersion);
133 EXPECT_STREQ(osver1, platform->info.operatingSystemVersion);
134 EXPECT_STREQ(hwver1, platform->info.hardwareVersion);
135 EXPECT_STREQ(fwver1, platform->info.firmwareVersion);
136 EXPECT_STREQ(url1, platform->info.supportUrl);
137 EXPECT_STREQ(time1, platform->info.systemTime);
141 OCPayload* parsedPlatform;
142 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)platform, &cborData, &cborSize));
143 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&parsedPlatform, PAYLOAD_TYPE_PLATFORM,
144 cborData, cborSize));
147 EXPECT_EQ(platform->base.type, ((OCPlatformPayload*)parsedPlatform)->base.type);
148 OCPlatformPayload* platform2 = (OCPlatformPayload*)parsedPlatform;
149 EXPECT_STREQ(platform->info.platformID, platform2->info.platformID);
150 EXPECT_STREQ(platform->info.manufacturerName, platform->info.manufacturerName);
151 EXPECT_STREQ(platform->info.manufacturerUrl, platform->info.manufacturerUrl);
152 EXPECT_STREQ(platform->info.modelNumber, platform->info.modelNumber);
153 EXPECT_STREQ(platform->info.dateOfManufacture, platform->info.dateOfManufacture);
154 EXPECT_STREQ(platform->info.platformVersion, platform->info.platformVersion);
155 EXPECT_STREQ(platform->info.operatingSystemVersion, platform->info.operatingSystemVersion);
156 EXPECT_STREQ(platform->info.hardwareVersion, platform->info.hardwareVersion);
157 EXPECT_STREQ(platform->info.firmwareVersion, platform->info.firmwareVersion);
158 EXPECT_STREQ(platform->info.supportUrl, platform->info.supportUrl);
159 EXPECT_STREQ(platform->info.systemTime, platform2->info.systemTime);
161 OCPayloadDestroy((OCPayload*)platform);
163 OC::MessageContainer mc;
164 mc.setPayload(parsedPlatform);
165 EXPECT_EQ(1u, mc.representations().size());
166 const OC::OCRepresentation& r = mc.representations()[0];
167 EXPECT_STREQ(pfid1, r.getValue<std::string>(OC_RSRVD_PLATFORM_ID).c_str());
168 EXPECT_STREQ(mfgnm1, r.getValue<std::string>(OC_RSRVD_MFG_NAME).c_str());
169 EXPECT_STREQ(mfgurl1, r.getValue<std::string>(OC_RSRVD_MFG_URL).c_str());
170 EXPECT_STREQ(modelnum1, r.getValue<std::string>(OC_RSRVD_MODEL_NUM).c_str());
171 EXPECT_STREQ(dom1, r.getValue<std::string>(OC_RSRVD_MFG_DATE).c_str());
172 EXPECT_STREQ(pfver1, r.getValue<std::string>(OC_RSRVD_PLATFORM_VERSION).c_str());
173 EXPECT_STREQ(osver1, r.getValue<std::string>(OC_RSRVD_OS_VERSION).c_str());
174 EXPECT_STREQ(hwver1, r.getValue<std::string>(OC_RSRVD_HARDWARE_VERSION).c_str());
175 EXPECT_STREQ(fwver1, r.getValue<std::string>(OC_RSRVD_FIRMWARE_VERSION).c_str());
176 EXPECT_STREQ(url1, r.getValue<std::string>(OC_RSRVD_SUPPORT_URL).c_str());
177 EXPECT_STREQ(time1, r.getValue<std::string>(OC_RSRVD_SYSTEM_TIME).c_str());
179 OCPayloadDestroy(parsedPlatform);
181 TEST(PresencePayload, Normal)
184 uint32_t sequenceNumber = 0;
185 OCPresenceTrigger trigger = OC_PRESENCE_TRIGGER_CREATE;
186 OCPresencePayload *presence = OCPresencePayloadCreate(sequenceNumber, maxAge, trigger, uri1);
191 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)presence, &cborData, &cborSize));
192 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_PRESENCE,
193 cborData, cborSize));
194 OCPayloadDestroy((OCPayload*)presence);
197 OCPresencePayload* parsed = ((OCPresencePayload*)cparsed);
198 EXPECT_EQ(sequenceNumber, parsed->sequenceNumber);
199 EXPECT_EQ(maxAge, parsed->maxAge);
200 EXPECT_EQ(trigger, parsed->trigger);
201 EXPECT_STREQ(uri1, parsed->resourceType);
203 OCPayloadDestroy(cparsed);
205 // Representation Payloads
206 TEST(RepresentationEncoding, BaseAttributeTypes)
208 OC::OCRepresentation startRep;
209 startRep.setNULL("NullAttr");
210 startRep.setValue("IntAttr", 77);
211 startRep.setValue("DoubleAttr", 3.333);
212 startRep.setValue("BoolAttr", true);
213 startRep.setValue("StringAttr", std::string("String attr"));
214 OC::MessageContainer mc1;
215 mc1.addRepresentation(startRep);
217 OCRepPayload* cstart = mc1.getPayload();
218 EXPECT_EQ(PAYLOAD_TYPE_REPRESENTATION, cstart->base.type);
223 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)cstart, &cborData, &cborSize));
224 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_REPRESENTATION,
225 cborData, cborSize));
226 OCPayloadDestroy((OCPayload*)cstart);
229 OC::MessageContainer mc2;
230 mc2.setPayload(cparsed);
231 EXPECT_EQ(1u, mc2.representations().size());
232 const OC::OCRepresentation& r = mc2.representations()[0];
234 EXPECT_TRUE(r.isNULL("NullAttr"));
235 EXPECT_EQ(77, r.getValue<int>("IntAttr"));
236 EXPECT_EQ(3.333, r.getValue<double>("DoubleAttr"));
237 EXPECT_EQ(true, r.getValue<bool>("BoolAttr"));
238 EXPECT_STREQ("String attr", r.getValue<std::string>("StringAttr").c_str());
240 OCPayloadDestroy(cparsed);
243 TEST(RepresentationEncoding, RepAttributeEmpty)
245 OC::OCRepresentation startRep;
246 std::vector<int> iarr {};
247 startRep["iarr"] = {};
249 OC::MessageContainer mc1;
250 mc1.addRepresentation(startRep);
252 OCRepPayload* cstart = mc1.getPayload();
253 EXPECT_EQ(PAYLOAD_TYPE_REPRESENTATION, cstart->base.type);
255 uint8_t *cborData = NULL;
257 OCPayload *cparsed = NULL;
258 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)cstart, &cborData, &cborSize));
259 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_REPRESENTATION,
260 cborData, cborSize));
261 OCPayloadDestroy((OCPayload*)cstart);
264 OC::MessageContainer mc2;
265 mc2.setPayload(cparsed);
266 EXPECT_EQ(1u, mc2.representations().size());
267 const OC::OCRepresentation& r = mc2.representations()[0];
269 std::vector<int> iarr2 = r["iarr"];
271 EXPECT_EQ(iarr, iarr2);
272 OCPayloadDestroy(cparsed);
275 TEST(RepresentationEncoding, RepAttribute)
277 OC::OCRepresentation startRep;
278 OC::OCRepresentation subRep;
279 subRep.setNULL("NullAttr");
280 subRep.setValue("IntAttr", 77);
281 subRep.setValue("DoubleAttr", 3.333);
282 subRep.setValue("BoolAttr", true);
283 subRep.setValue("StringAttr", std::string("String attr"));
284 startRep.setValue("Sub", subRep);
286 OC::MessageContainer mc1;
287 mc1.addRepresentation(startRep);
289 OCRepPayload* cstart = mc1.getPayload();
290 EXPECT_EQ(PAYLOAD_TYPE_REPRESENTATION, cstart->base.type);
295 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)cstart, &cborData, &cborSize));
296 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_REPRESENTATION,
297 cborData, cborSize));
298 OCPayloadDestroy((OCPayload*)cstart);
301 OC::MessageContainer mc2;
302 mc2.setPayload(cparsed);
303 EXPECT_EQ(1u, mc2.representations().size());
304 const OC::OCRepresentation& r = mc2.representations()[0];
306 OC::OCRepresentation newSubRep = r["Sub"];
308 EXPECT_TRUE(newSubRep.isNULL("NullAttr"));
309 EXPECT_EQ(77, newSubRep.getValue<int>("IntAttr"));
310 EXPECT_EQ(3.333, newSubRep.getValue<double>("DoubleAttr"));
311 EXPECT_EQ(true, newSubRep.getValue<bool>("BoolAttr"));
312 EXPECT_STREQ("String attr", newSubRep.getValue<std::string>("StringAttr").c_str());
313 OCPayloadDestroy(cparsed);
316 TEST(RepresentationEncoding, OneDVectors)
319 OC::OCRepresentation startRep;
321 OC::OCRepresentation subRep1;
322 OC::OCRepresentation subRep2;
323 OC::OCRepresentation subRep3;
324 subRep1.setNULL("NullAttr");
325 subRep1.setValue("IntAttr", 77);
326 subRep2.setValue("DoubleAttr", 3.333);
327 subRep2.setValue("BoolAttr", true);
328 subRep3.setValue("StringAttr", std::string("String attr"));
330 std::vector<int> iarr {1,2,3,4,5,6,7,8,9};
331 std::vector<double> darr {1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9};
332 std::vector<bool> barr {false, true, false, false, true, true};
333 std::vector<std::string> strarr {"item1", "item2", "item3", "item4"};
334 std::vector<OC::OCRepresentation> objarr {subRep1, subRep2, subRep3};
336 startRep["iarr"] = iarr;
337 startRep["darr"] = darr;
338 startRep["barr"] = barr;
339 startRep["strarr"] = strarr;
340 startRep["objarr"] = objarr;
343 OC::MessageContainer mc1;
344 mc1.addRepresentation(startRep);
346 OCRepPayload* cstart = mc1.getPayload();
347 EXPECT_EQ(PAYLOAD_TYPE_REPRESENTATION, cstart->base.type);
352 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)cstart, &cborData, &cborSize));
353 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_REPRESENTATION,
354 cborData, cborSize));
355 OCPayloadDestroy((OCPayload*)cstart);
358 OC::MessageContainer mc2;
359 mc2.setPayload(cparsed);
360 EXPECT_EQ(1u, mc2.representations().size());
361 const OC::OCRepresentation& r = mc2.representations()[0];
364 std::vector<int> iarr2 = r["iarr"];
365 std::vector<double> darr2 = r["darr"];
366 std::vector<bool> barr2 = r["barr"];
367 std::vector<std::string> strarr2 = r["strarr"];
368 std::vector<OC::OCRepresentation> objarr2 = r["objarr"];
370 EXPECT_EQ(iarr, iarr2);
371 EXPECT_EQ(darr, darr2);
372 EXPECT_EQ(barr, barr2);
373 EXPECT_EQ(strarr, strarr2);
374 EXPECT_EQ(objarr, objarr2);
375 OCPayloadDestroy(cparsed);
378 TEST(RepresentationEncoding, TwoDVectors)
381 OC::OCRepresentation startRep;
383 OC::OCRepresentation subRep1;
384 OC::OCRepresentation subRep2;
385 OC::OCRepresentation subRep3;
386 subRep1.setNULL("NullAttr");
387 subRep1.setValue("IntAttr", 77);
388 subRep2.setValue("DoubleAttr", 3.333);
389 subRep2.setValue("BoolAttr", true);
390 subRep3.setValue("StringAttr", std::string("String attr"));
392 std::vector<std::vector<int>> iarr {{1,2,3},{4,5,6},{7,8,9}};
393 std::vector<std::vector<double>> darr {{1.1,2.2,3.3},{4.4,5.5,6.6},{7.7,8.8,9.9}};
394 std::vector<std::vector<bool>> barr {{false, true}, {false, false}, {true, true}};
395 std::vector<std::vector<std::string>> strarr {{"item1", "item2"}, {"item3", "item4"}};
396 std::vector<std::vector<OC::OCRepresentation>> objarr
397 {{subRep1, subRep2, subRep3}, {subRep3, subRep2, subRep1}};
399 startRep["iarr"] = iarr;
400 startRep["darr"] = darr;
401 startRep["barr"] = barr;
402 startRep["strarr"] = strarr;
403 startRep["objarr"] = objarr;
406 OC::MessageContainer mc1;
407 mc1.addRepresentation(startRep);
409 OCRepPayload* cstart = mc1.getPayload();
410 EXPECT_EQ(PAYLOAD_TYPE_REPRESENTATION, cstart->base.type);
415 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)cstart, &cborData, &cborSize));
416 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_REPRESENTATION,
417 cborData, cborSize));
418 OCPayloadDestroy((OCPayload*)cstart);
421 OC::MessageContainer mc2;
422 mc2.setPayload(cparsed);
423 EXPECT_EQ(1u, mc2.representations().size());
424 const OC::OCRepresentation& r = mc2.representations()[0];
427 std::vector<std::vector<int>> iarr2 = r["iarr"];
428 std::vector<std::vector<double>> darr2 = r["darr"];
429 std::vector<std::vector<bool>> barr2 = r["barr"];
430 std::vector<std::vector<std::string>> strarr2 = r["strarr"];
431 std::vector<std::vector<OC::OCRepresentation>> objarr2 = r["objarr"];
433 EXPECT_EQ(iarr, iarr2);
434 EXPECT_EQ(darr, darr2);
435 EXPECT_EQ(barr, barr2);
436 EXPECT_EQ(strarr, strarr2);
437 EXPECT_EQ(objarr, objarr2);
438 OCPayloadDestroy(cparsed);
441 TEST(RepresentationEncoding, TwoDVectorsJagged)
444 OC::OCRepresentation startRep;
446 OC::OCRepresentation subRep1;
447 OC::OCRepresentation subRep2;
448 OC::OCRepresentation subRep3;
449 subRep1.setNULL("NullAttr");
450 subRep1.setValue("IntAttr", 77);
451 subRep2.setValue("DoubleAttr", 3.333);
452 subRep2.setValue("BoolAttr", true);
453 subRep3.setValue("StringAttr", std::string("String attr"));
455 std::vector<std::vector<int>> iarr {{1,2,3},{4,6},{7,8,9}};
456 std::vector<std::vector<double>> darr {{1.1,2.2,3.3},{4.4,5.5,6.6},{8.8,9.9}};
457 std::vector<std::vector<bool>> barr {{false, true}, {false}, {true, true}};
458 std::vector<std::vector<std::string>> strarr {{"item1"}, {"item3", "item4"}};
459 std::vector<std::vector<OC::OCRepresentation>> objarr
460 {{subRep1, subRep3}, {subRep3, subRep2, subRep1}};
462 startRep["iarr"] = iarr;
463 startRep["darr"] = darr;
464 startRep["barr"] = barr;
465 startRep["strarr"] = strarr;
466 startRep["objarr"] = objarr;
469 OC::MessageContainer mc1;
470 mc1.addRepresentation(startRep);
472 OCRepPayload* cstart = mc1.getPayload();
473 EXPECT_EQ(PAYLOAD_TYPE_REPRESENTATION, cstart->base.type);
478 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)cstart, &cborData, &cborSize));
479 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_REPRESENTATION,
480 cborData, cborSize));
481 OCPayloadDestroy((OCPayload*)cstart);
484 OC::MessageContainer mc2;
485 mc2.setPayload(cparsed);
486 EXPECT_EQ(1u, mc2.representations().size());
487 const OC::OCRepresentation& r = mc2.representations()[0];
490 std::vector<std::vector<int>> iarr2 = r["iarr"];
491 std::vector<std::vector<double>> darr2 = r["darr"];
492 std::vector<std::vector<bool>> barr2 = r["barr"];
493 std::vector<std::vector<std::string>> strarr2 = r["strarr"];
494 std::vector<std::vector<OC::OCRepresentation>> objarr2 = r["objarr"];
496 // Note: due to the way that the CSDK works, all 2d arrays need to be rectangular.
497 // Since std::vector doesn't require this, items received on the other side end up
498 // being backfilled. This section removes the backfilling
502 strarr2[0].pop_back();
503 objarr2[0].pop_back();
505 EXPECT_EQ(iarr, iarr2);
506 EXPECT_EQ(darr, darr2);
507 EXPECT_EQ(barr, barr2);
508 EXPECT_EQ(strarr, strarr2);
509 EXPECT_EQ(objarr, objarr2);
510 OCPayloadDestroy(cparsed);
513 TEST(RepresentationEncoding, ThreeDVectors)
516 OC::OCRepresentation startRep;
518 OC::OCRepresentation subRep1;
519 OC::OCRepresentation subRep2;
520 OC::OCRepresentation subRep3;
521 subRep1.setNULL("NullAttr");
522 subRep1.setValue("IntAttr", 77);
523 subRep2.setValue("DoubleAttr", 3.333);
524 subRep2.setValue("BoolAttr", true);
525 subRep3.setValue("StringAttr", std::string("String attr"));
527 std::vector<std::vector<std::vector<int>>> iarr
528 {{{1,2,3},{4,5,6}},{{7,8,9},{10,11,12}},{{13,14,15},{16,17,18}}};
529 std::vector<std::vector<std::vector<double>>> darr
530 {{{1.1,2.2,3.3},{4.4,5.5,6.6}},
531 {{7.7,8.7,9.7},{10.7,11.7,12.7}},
532 {{13.7,14.7,15.7},{16.7,17.7,18.7}}};
533 std::vector<std::vector<std::vector<bool>>> barr
534 {{{false, true},{true, false}},{{false, true},{true, false}}};
535 std::vector<std::vector<std::vector<std::string>>> strarr
537 {{"item1", "item2"},{"item3", "item4"}},
538 {{"item5", "item6"},{"item7", "item8"}},
539 {{"item9", "item10"},{"item11", ""}}
541 std::vector<std::vector<std::vector<OC::OCRepresentation>>> objarr
543 {{subRep1, subRep2},{subRep3, subRep1}},
544 {{subRep2, subRep3},{subRep2, subRep1}},
545 {{subRep3, subRep2},{subRep1, subRep2}}
548 startRep["iarr"] = iarr;
549 startRep["darr"] = darr;
550 startRep["barr"] = barr;
551 startRep["strarr"] = strarr;
552 startRep["objarr"] = objarr;
555 OC::MessageContainer mc1;
556 mc1.addRepresentation(startRep);
558 OCRepPayload* cstart = mc1.getPayload();
559 EXPECT_EQ(PAYLOAD_TYPE_REPRESENTATION, cstart->base.type);
564 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)cstart, &cborData, &cborSize));
565 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_REPRESENTATION,
566 cborData, cborSize));
567 OCPayloadDestroy((OCPayload*)cstart);
570 OC::MessageContainer mc2;
571 mc2.setPayload(cparsed);
572 EXPECT_EQ(1u, mc2.representations().size());
573 const OC::OCRepresentation& r = mc2.representations()[0];
576 std::vector<std::vector<std::vector<int>>> iarr2 = r["iarr"];
577 std::vector<std::vector<std::vector<double>>> darr2 = r["darr"];
578 std::vector<std::vector<std::vector<bool>>> barr2 = r["barr"];
579 std::vector<std::vector<std::vector<std::string>>> strarr2 = r["strarr"];
580 std::vector<std::vector<std::vector<OC::OCRepresentation>>> objarr2 = r["objarr"];
582 EXPECT_EQ(iarr, iarr2);
583 EXPECT_EQ(darr, darr2);
584 EXPECT_EQ(barr, barr2);
585 EXPECT_EQ(strarr, strarr2);
586 EXPECT_EQ(objarr, objarr2);
587 OCPayloadDestroy(cparsed);
590 TEST(RepresentationEncoding, ThreeDVectorsJagged)
593 OC::OCRepresentation startRep;
595 OC::OCRepresentation subRep1;
596 OC::OCRepresentation subRep2;
597 OC::OCRepresentation subRep3;
598 subRep1.setNULL("NullAttr");
599 subRep1.setValue("IntAttr", 77);
600 subRep2.setValue("DoubleAttr", 3.333);
601 subRep2.setValue("BoolAttr", true);
602 subRep3.setValue("StringAttr", std::string("String attr"));
604 std::vector<std::vector<std::vector<int>>> iarr
608 {{13,14,15},{16,17,18}}
610 std::vector<std::vector<std::vector<double>>> darr
612 {{1.1,2.2,3.3},{4.4,5.5,6.6}},
613 {{7.7,8.7,9.7},{10.7,12.7}},
614 {{13.7,14.7,15.7},{16.7,17.7,18.7}}
616 std::vector<std::vector<std::vector<bool>>> barr
618 {{false, true},{true}},
619 {{false, true},{true, false}}
621 std::vector<std::vector<std::vector<std::string>>> strarr
623 {{"item1", "item2"},{"item3", "item4"}},
624 {{"item5", "item6"},{"item8"}},
625 {{"item9", "item10"},{"item11", ""}}
627 std::vector<std::vector<std::vector<OC::OCRepresentation>>> objarr
629 {{subRep1, subRep2},{subRep3, subRep1}},
630 {{subRep2, subRep3},{subRep2}},
634 startRep["iarr"] = iarr;
635 startRep["darr"] = darr;
636 startRep["barr"] = barr;
637 startRep["strarr"] = strarr;
638 startRep["objarr"] = objarr;
641 OC::MessageContainer mc1;
642 mc1.addRepresentation(startRep);
644 OCRepPayload* cstart = mc1.getPayload();
645 EXPECT_EQ(PAYLOAD_TYPE_REPRESENTATION, cstart->base.type);
650 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)cstart, &cborData, &cborSize));
651 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_REPRESENTATION,
652 cborData, cborSize));
653 OCPayloadDestroy((OCPayload*)cstart);
656 OC::MessageContainer mc2;
657 mc2.setPayload(cparsed);
658 EXPECT_EQ(1u, mc2.representations().size());
659 const OC::OCRepresentation& r = mc2.representations()[0];
662 std::vector<std::vector<std::vector<int>>> iarr2 = r["iarr"];
663 std::vector<std::vector<std::vector<double>>> darr2 = r["darr"];
664 std::vector<std::vector<std::vector<bool>>> barr2 = r["barr"];
665 std::vector<std::vector<std::vector<std::string>>> strarr2 = r["strarr"];
666 std::vector<std::vector<std::vector<OC::OCRepresentation>>> objarr2 = r["objarr"];
668 // Note: due to the way that the CSDK works, all 3d arrays need to be cuboidal.
669 // Since std::vector doesn't require this, items received on the other side end up
670 // being backfilled. This section removes the backfilling
671 iarr2[1][1].pop_back();
672 darr2[1][1].pop_back();
673 barr2[0][1].pop_back();
674 strarr2[1][1].pop_back();
675 objarr2[1][1].pop_back();
676 objarr2[2].pop_back();
678 EXPECT_EQ(iarr, iarr2);
679 EXPECT_EQ(darr, darr2);
680 EXPECT_EQ(barr, barr2);
681 EXPECT_EQ(strarr, strarr2);
682 EXPECT_EQ(objarr, objarr2);
683 OCPayloadDestroy(cparsed);
686 TEST(DiscoveryRTandIF, SingleItemNormal)
688 OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
689 OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
690 payload->sid = OICStrdup(sid1);
691 payload->resources = resource;
693 EXPECT_TRUE(OCResourcePayloadAddStringLL(&resource->types, "rt.singleitem"));
694 EXPECT_TRUE(OCResourcePayloadAddStringLL(&resource->interfaces, "if.singleitem"));
696 resource->uri = OICStrdup("/uri/thing");
702 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)payload, &cborData, &cborSize));
703 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_DISCOVERY,
704 cborData, cborSize));
706 EXPECT_EQ(1u, OCDiscoveryPayloadGetResourceCount((OCDiscoveryPayload*)cparsed));
707 OCResourcePayload* parsedResource = ((OCDiscoveryPayload*)cparsed)->resources;
709 EXPECT_STREQ(sid1, ((OCDiscoveryPayload*)cparsed)->sid);
710 EXPECT_EQ(NULL, parsedResource->next);
711 EXPECT_STREQ("rt.singleitem", parsedResource->types->value);
712 EXPECT_EQ(NULL, parsedResource->types->next);
713 EXPECT_EQ(NULL, parsedResource->interfaces->next);
714 EXPECT_STREQ("if.singleitem", parsedResource->interfaces->value);
717 OCPayloadDestroy(cparsed);
718 OCDiscoveryPayloadDestroy(payload);
721 TEST(DiscoveryRTandIF, SingleItemFrontTrim)
723 OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
724 payload->sid = OICStrdup(sid1);
725 OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
726 payload->resources = resource;
728 EXPECT_TRUE(OCResourcePayloadAddStringLL(&resource->types, " rt.singleitem"));
729 EXPECT_TRUE(OCResourcePayloadAddStringLL(&resource->interfaces, " if.singleitem"));
730 resource->uri = OICStrdup("/uri/thing");
736 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)payload, &cborData, &cborSize));
737 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_DISCOVERY,
738 cborData, cborSize));
740 EXPECT_EQ(1u, OCDiscoveryPayloadGetResourceCount((OCDiscoveryPayload*)cparsed));
741 OCResourcePayload* parsedResource = ((OCDiscoveryPayload*)cparsed)->resources;
743 EXPECT_EQ(NULL, parsedResource->next);
744 EXPECT_STREQ(sid1, ((OCDiscoveryPayload*)cparsed)->sid);
745 EXPECT_EQ(NULL, parsedResource->types->next);
746 EXPECT_STREQ("rt.singleitem", parsedResource->types->value);
747 EXPECT_EQ(NULL, parsedResource->interfaces->next);
748 EXPECT_STREQ("if.singleitem", parsedResource->interfaces->value);
751 OCPayloadDestroy(cparsed);
752 OCDiscoveryPayloadDestroy(payload);
755 TEST(DiscoveryRTandIF, SingleItemBackTrim)
757 OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
758 payload->sid = OICStrdup(sid1);
759 OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
760 payload->resources = resource;
762 OCResourcePayloadAddStringLL(&resource->types, "rt.singleitem ");
763 OCResourcePayloadAddStringLL(&resource->interfaces, "if.singleitem ");
764 resource->uri = OICStrdup("/uri/thing");
770 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)payload, &cborData, &cborSize));
771 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_DISCOVERY,
772 cborData, cborSize));
774 EXPECT_EQ(1u, OCDiscoveryPayloadGetResourceCount((OCDiscoveryPayload*)cparsed));
775 OCResourcePayload* parsedResource = ((OCDiscoveryPayload*)cparsed)->resources;
777 EXPECT_EQ(NULL, parsedResource->next);
778 EXPECT_STREQ(sid1, ((OCDiscoveryPayload*)cparsed)->sid);
779 EXPECT_EQ(NULL, parsedResource->types->next);
780 EXPECT_STREQ("rt.singleitem", parsedResource->types->value);
781 EXPECT_EQ(NULL, parsedResource->interfaces->next);
782 EXPECT_STREQ("if.singleitem", parsedResource->interfaces->value);
785 OCPayloadDestroy(cparsed);
786 OCDiscoveryPayloadDestroy(payload);
788 TEST(DiscoveryRTandIF, SingleItemBothTrim)
790 OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
791 payload->sid = OICStrdup(sid1);
792 OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
793 payload->resources = resource;
795 OCResourcePayloadAddStringLL(&resource->types, " rt.singleitem ");
796 OCResourcePayloadAddStringLL(&resource->interfaces, " if.singleitem ");
797 resource->uri = OICStrdup("/uri/thing");
803 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)payload, &cborData, &cborSize));
804 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_DISCOVERY,
805 cborData, cborSize));
807 EXPECT_EQ(1u, OCDiscoveryPayloadGetResourceCount((OCDiscoveryPayload*)cparsed));
808 OCResourcePayload* parsedResource = ((OCDiscoveryPayload*)cparsed)->resources;
810 EXPECT_EQ(NULL, parsedResource->next);
811 EXPECT_STREQ(sid1, ((OCDiscoveryPayload*)cparsed)->sid);
812 EXPECT_EQ(NULL, parsedResource->types->next);
813 EXPECT_STREQ("rt.singleitem", parsedResource->types->value);
814 EXPECT_EQ(NULL, parsedResource->interfaces->next);
815 EXPECT_STREQ("if.singleitem", parsedResource->interfaces->value);
818 OCPayloadDestroy(cparsed);
819 OCDiscoveryPayloadDestroy(payload);
821 TEST(DiscoveryRTandIF, MultiItemsNormal)
823 OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
824 payload->sid = OICStrdup(sid1);
825 OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
826 payload->resources = resource;
828 OCResourcePayloadAddStringLL(&resource->types, "rt.firstitem");
829 OCResourcePayloadAddStringLL(&resource->types, "rt.seconditem");
830 OCResourcePayloadAddStringLL(&resource->interfaces, "if.firstitem");
831 OCResourcePayloadAddStringLL(&resource->interfaces, "if.seconditem");
832 resource->uri = OICStrdup("/uri/thing");
838 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)payload, &cborData, &cborSize));
839 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_DISCOVERY,
840 cborData, cborSize));
842 EXPECT_EQ(1u, OCDiscoveryPayloadGetResourceCount((OCDiscoveryPayload*)cparsed));
843 OCResourcePayload* parsedResource = ((OCDiscoveryPayload*)cparsed)->resources;
845 EXPECT_EQ(NULL, parsedResource->next);
846 EXPECT_STREQ(sid1, ((OCDiscoveryPayload*)cparsed)->sid);
847 EXPECT_EQ(NULL, parsedResource->types->next->next);
848 EXPECT_STREQ("rt.firstitem", parsedResource->types->value);
849 EXPECT_STREQ("rt.seconditem", parsedResource->types->next->value);
850 EXPECT_EQ(NULL, parsedResource->interfaces->next->next);
851 EXPECT_STREQ("if.firstitem", parsedResource->interfaces->value);
852 EXPECT_STREQ("if.seconditem", parsedResource->interfaces->next->value);
855 OCPayloadDestroy(cparsed);
856 OCDiscoveryPayloadDestroy(payload);
858 TEST(DiscoveryRTandIF, MultiItemExtraLeadSpaces)
860 OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
861 payload->sid = OICStrdup(sid1);
862 OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
863 payload->resources = resource;
865 OCResourcePayloadAddStringLL(&resource->types, " rt.firstitem");
866 OCResourcePayloadAddStringLL(&resource->types, " rt.seconditem");
867 OCResourcePayloadAddStringLL(&resource->interfaces, " if.firstitem");
868 OCResourcePayloadAddStringLL(&resource->interfaces, " if.seconditem");
869 resource->uri = OICStrdup("/uri/thing");
875 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)payload, &cborData, &cborSize));
876 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_DISCOVERY,
877 cborData, cborSize));
879 EXPECT_EQ(1u, OCDiscoveryPayloadGetResourceCount((OCDiscoveryPayload*)cparsed));
880 OCResourcePayload* parsedResource = ((OCDiscoveryPayload*)cparsed)->resources;
882 EXPECT_EQ(NULL, parsedResource->next);
883 EXPECT_STREQ(sid1, ((OCDiscoveryPayload*)cparsed)->sid);
884 EXPECT_EQ(NULL, parsedResource->types->next->next);
885 EXPECT_STREQ("rt.firstitem", parsedResource->types->value);
886 EXPECT_STREQ("rt.seconditem", parsedResource->types->next->value);
887 EXPECT_EQ(NULL, parsedResource->interfaces->next->next);
888 EXPECT_STREQ("if.firstitem", parsedResource->interfaces->value);
889 EXPECT_STREQ("if.seconditem", parsedResource->interfaces->next->value);
892 OCPayloadDestroy(cparsed);
893 OCDiscoveryPayloadDestroy(payload);
895 TEST(DiscoveryRTandIF, MultiItemExtraTrailSpaces)
897 OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
898 payload->sid = OICStrdup(sid1);
899 OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
900 payload->resources = resource;
902 OCResourcePayloadAddStringLL(&resource->types, "rt.firstitem ");
903 OCResourcePayloadAddStringLL(&resource->types, "rt.seconditem ");
904 OCResourcePayloadAddStringLL(&resource->interfaces, "if.firstitem ");
905 OCResourcePayloadAddStringLL(&resource->interfaces, "if.seconditem ");
906 resource->uri = OICStrdup("/uri/thing");
912 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)payload, &cborData, &cborSize));
913 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_DISCOVERY,
914 cborData, cborSize));
916 EXPECT_EQ(1u, OCDiscoveryPayloadGetResourceCount((OCDiscoveryPayload*)cparsed));
917 OCResourcePayload* parsedResource = ((OCDiscoveryPayload*)cparsed)->resources;
919 EXPECT_EQ(NULL, parsedResource->next);
920 EXPECT_STREQ(sid1, ((OCDiscoveryPayload*)cparsed)->sid);
921 EXPECT_EQ(NULL, parsedResource->types->next->next);
922 EXPECT_STREQ("rt.firstitem", parsedResource->types->value);
923 EXPECT_STREQ("rt.seconditem", parsedResource->types->next->value);
924 EXPECT_EQ(NULL, parsedResource->interfaces->next->next);
925 EXPECT_STREQ("if.firstitem", parsedResource->interfaces->value);
926 EXPECT_STREQ("if.seconditem", parsedResource->interfaces->next->value);
929 OCPayloadDestroy(cparsed);
930 OCDiscoveryPayloadDestroy(payload);
932 TEST(DiscoveryRTandIF, MultiItemBothSpaces)
934 OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
935 payload->sid = OICStrdup(sid1);
936 OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
937 payload->resources = resource;
939 OCResourcePayloadAddStringLL(&resource->types, " rt.firstitem ");
940 OCResourcePayloadAddStringLL(&resource->types, " rt.seconditem ");
941 OCResourcePayloadAddStringLL(&resource->interfaces, " if.firstitem ");
942 OCResourcePayloadAddStringLL(&resource->interfaces, " if.seconditem ");
943 resource->uri = OICStrdup("/uri/thing");
949 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)payload, &cborData, &cborSize));
950 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_DISCOVERY,
951 cborData, cborSize));
953 EXPECT_EQ(1u, OCDiscoveryPayloadGetResourceCount((OCDiscoveryPayload*)cparsed));
954 OCResourcePayload* parsedResource = ((OCDiscoveryPayload*)cparsed)->resources;
956 EXPECT_EQ(NULL, parsedResource->next);
957 EXPECT_STREQ(sid1, ((OCDiscoveryPayload*)cparsed)->sid);
958 EXPECT_EQ(NULL, parsedResource->types->next->next);
959 EXPECT_STREQ("rt.firstitem", parsedResource->types->value);
960 EXPECT_STREQ("rt.seconditem", parsedResource->types->next->value);
961 EXPECT_EQ(NULL, parsedResource->interfaces->next->next);
962 EXPECT_STREQ("if.firstitem", parsedResource->interfaces->value);
963 EXPECT_STREQ("if.seconditem", parsedResource->interfaces->next->value);
966 OCPayloadDestroy(cparsed);
967 OCDiscoveryPayloadDestroy(payload);
969 TEST(RepresentationEncodingRTandIF, SingleItemNormal)
971 OCRepPayload* payload = OCRepPayloadCreate();
972 OCRepPayloadAddResourceType(payload, "rt.firstitem");
973 OCRepPayloadAddInterface(payload, "if.firstitem");
979 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)payload, &cborData, &cborSize));
980 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_REPRESENTATION,
981 cborData, cborSize));
983 OCRepPayload* parsedPayload = (OCRepPayload*)cparsed;
985 EXPECT_STREQ("rt.firstitem", parsedPayload->types->value);
986 EXPECT_EQ(NULL, parsedPayload->types->next);
987 EXPECT_STREQ("if.firstitem", parsedPayload->interfaces->value);
988 EXPECT_EQ(NULL, parsedPayload->interfaces->next);
991 OCRepPayloadDestroy(payload);
992 OCPayloadDestroy(cparsed);
994 TEST(RepresentationEncodingRTandIF, SingleItemFrontTrim)
996 OCRepPayload* payload = OCRepPayloadCreate();
997 OCRepPayloadAddResourceType(payload, " rt.firstitem");
998 OCRepPayloadAddInterface(payload, " if.firstitem");
1004 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)payload, &cborData, &cborSize));
1005 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_REPRESENTATION,
1006 cborData, cborSize));
1008 OCRepPayload* parsedPayload = (OCRepPayload*)cparsed;
1010 EXPECT_STREQ("rt.firstitem", parsedPayload->types->value);
1011 EXPECT_EQ(NULL, parsedPayload->types->next);
1012 EXPECT_STREQ("if.firstitem", parsedPayload->interfaces->value);
1013 EXPECT_EQ(NULL, parsedPayload->interfaces->next);
1017 OCRepPayloadDestroy(payload);
1018 OCPayloadDestroy(cparsed);
1020 TEST(RepresentationEncodingRTandIF, SingleItemBackTrim)
1022 OCRepPayload* payload = OCRepPayloadCreate();
1023 OCRepPayloadAddResourceType(payload, "rt.firstitem ");
1024 OCRepPayloadAddInterface(payload, "if.firstitem ");
1030 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)payload, &cborData, &cborSize));
1031 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_REPRESENTATION,
1032 cborData, cborSize));
1034 OCRepPayload* parsedPayload = (OCRepPayload*)cparsed;
1036 EXPECT_STREQ("rt.firstitem", parsedPayload->types->value);
1037 EXPECT_EQ(NULL, parsedPayload->types->next);
1038 EXPECT_STREQ("if.firstitem", parsedPayload->interfaces->value);
1039 EXPECT_EQ(NULL, parsedPayload->interfaces->next);
1043 OCRepPayloadDestroy(payload);
1044 OCPayloadDestroy(cparsed);
1046 TEST(RepresentationEncodingRTandIF, SingleItemBothTrim)
1048 OCRepPayload* payload = OCRepPayloadCreate();
1049 OCRepPayloadAddResourceType(payload, " rt.firstitem ");
1050 OCRepPayloadAddInterface(payload, " if.firstitem ");
1056 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)payload, &cborData, &cborSize));
1057 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_REPRESENTATION,
1058 cborData, cborSize));
1060 OCRepPayload* parsedPayload = (OCRepPayload*)cparsed;
1062 EXPECT_STREQ("rt.firstitem", parsedPayload->types->value);
1063 EXPECT_EQ(NULL, parsedPayload->types->next);
1064 EXPECT_STREQ("if.firstitem", parsedPayload->interfaces->value);
1065 EXPECT_EQ(NULL, parsedPayload->interfaces->next);
1069 OCRepPayloadDestroy(payload);
1070 OCPayloadDestroy(cparsed);
1072 TEST(RepresentationEncodingRTandIF, MultiItemsNormal)
1074 OCRepPayload* payload = OCRepPayloadCreate();
1075 OCRepPayloadAddResourceType(payload, "rt.firstitem");
1076 OCRepPayloadAddResourceType(payload, "rt.seconditem");
1077 OCRepPayloadAddInterface(payload, "if.firstitem");
1078 OCRepPayloadAddInterface(payload, "if.seconditem");
1084 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)payload, &cborData, &cborSize));
1085 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_REPRESENTATION,
1086 cborData, cborSize));
1088 OCRepPayload* parsedPayload = (OCRepPayload*)cparsed;
1090 EXPECT_STREQ("rt.firstitem", parsedPayload->types->value);
1091 EXPECT_STREQ("rt.seconditem", parsedPayload->types->next->value);
1092 EXPECT_EQ(NULL, parsedPayload->types->next->next);
1093 EXPECT_STREQ("if.firstitem", parsedPayload->interfaces->value);
1094 EXPECT_STREQ("if.seconditem", parsedPayload->interfaces->next->value);
1095 EXPECT_EQ(NULL, parsedPayload->interfaces->next->next);
1099 OCRepPayloadDestroy(payload);
1100 OCPayloadDestroy(cparsed);
1102 TEST(RepresentationEncodingRTandIF, MultiItemExtraLeadSpaces)
1104 OCRepPayload* payload = OCRepPayloadCreate();
1105 OCRepPayloadAddResourceType(payload, " rt.firstitem");
1106 OCRepPayloadAddResourceType(payload, " rt.seconditem");
1107 OCRepPayloadAddInterface(payload, " if.firstitem");
1108 OCRepPayloadAddInterface(payload, " if.seconditem");
1114 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)payload, &cborData, &cborSize));
1115 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_REPRESENTATION,
1116 cborData, cborSize));
1118 OCRepPayload* parsedPayload = (OCRepPayload*)cparsed;
1120 EXPECT_STREQ("rt.firstitem", parsedPayload->types->value);
1121 EXPECT_STREQ("rt.seconditem", parsedPayload->types->next->value);
1122 EXPECT_EQ(NULL, parsedPayload->types->next->next);
1123 EXPECT_STREQ("if.firstitem", parsedPayload->interfaces->value);
1124 EXPECT_STREQ("if.seconditem", parsedPayload->interfaces->next->value);
1125 EXPECT_EQ(NULL, parsedPayload->interfaces->next->next);
1129 OCRepPayloadDestroy(payload);
1130 OCPayloadDestroy(cparsed);
1132 TEST(RepresentationEncodingRTandIF, MultiItemExtraTrailSpaces)
1134 OCRepPayload* payload = OCRepPayloadCreate();
1135 OCRepPayloadAddResourceType(payload, "rt.firstitem ");
1136 OCRepPayloadAddResourceType(payload, "rt.seconditem ");
1137 OCRepPayloadAddInterface(payload, "if.firstitem ");
1138 OCRepPayloadAddInterface(payload, "if.seconditem ");
1144 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)payload, &cborData, &cborSize));
1145 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_REPRESENTATION,
1146 cborData, cborSize));
1148 OCRepPayload* parsedPayload = (OCRepPayload*)cparsed;
1150 EXPECT_STREQ("rt.firstitem", parsedPayload->types->value);
1151 EXPECT_STREQ("rt.seconditem", parsedPayload->types->next->value);
1152 EXPECT_EQ(NULL, parsedPayload->types->next->next);
1153 EXPECT_STREQ("if.firstitem", parsedPayload->interfaces->value);
1154 EXPECT_STREQ("if.seconditem", parsedPayload->interfaces->next->value);
1155 EXPECT_EQ(NULL, parsedPayload->interfaces->next->next);
1159 OCRepPayloadDestroy(payload);
1160 OCPayloadDestroy(cparsed);
1162 TEST(RepresentationEncodingRTandIF, MultiItemExtraMiddleSpaces)
1164 OCRepPayload* payload = OCRepPayloadCreate();
1165 OCRepPayloadAddResourceType(payload, " rt.firstitem ");
1166 OCRepPayloadAddResourceType(payload, " rt.seconditem ");
1167 OCRepPayloadAddInterface(payload, " if.firstitem ");
1168 OCRepPayloadAddInterface(payload, " if.seconditem ");
1174 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)payload, &cborData, &cborSize));
1175 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_REPRESENTATION,
1176 cborData, cborSize));
1178 OCRepPayload* parsedPayload = (OCRepPayload*)cparsed;
1180 EXPECT_STREQ("rt.firstitem", parsedPayload->types->value);
1181 EXPECT_STREQ("rt.seconditem", parsedPayload->types->next->value);
1182 EXPECT_EQ(NULL, parsedPayload->types->next->next);
1183 EXPECT_STREQ("if.firstitem", parsedPayload->interfaces->value);
1184 EXPECT_STREQ("if.seconditem", parsedPayload->interfaces->next->value);
1185 EXPECT_EQ(NULL, parsedPayload->interfaces->next->next);
1189 OCRepPayloadDestroy(payload);
1190 OCPayloadDestroy(cparsed);
1192 TEST(RepresentationEncodingRTandIF, TestPayloadContents)
1194 OC::OCRepresentation subRep1;
1195 std::vector<std::string> types;
1196 types.push_back("rt.firstitem");
1197 std::vector<std::string> interfaces;
1198 interfaces.push_back("if.firstitem");
1199 subRep1.setResourceTypes(types);
1200 subRep1.setResourceInterfaces(interfaces);
1201 subRep1.setNULL("NullAttr");
1202 subRep1.setValue("IntAttr", 77);
1203 subRep1.setValue("DoubleAttr", 3.333);
1204 subRep1.setValue("BoolAttr", true);
1205 subRep1.setValue("StringAttr", std::string("String attr"));
1207 OC::MessageContainer mc1;
1208 mc1.addRepresentation(subRep1);
1210 OCRepPayload *repPayload = mc1.getPayload();
1211 EXPECT_EQ(PAYLOAD_TYPE_REPRESENTATION, repPayload->base.type);
1213 uint8_t *cborData = NULL;
1214 size_t cborSize = 0;
1215 OCPayload *cparsed = NULL;
1217 EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)repPayload, &cborData, &cborSize));
1218 EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_REPRESENTATION,
1219 cborData, cborSize));
1221 OCRepPayload *parsedPayload = (OCRepPayload *)cparsed;
1222 EXPECT_EQ(NULL, parsedPayload->uri);
1223 EXPECT_STREQ("rt.firstitem", parsedPayload->types->value);
1224 EXPECT_EQ(NULL, parsedPayload->types->next);
1225 EXPECT_STREQ("if.firstitem", parsedPayload->interfaces->value);
1226 EXPECT_EQ(NULL, parsedPayload->interfaces->next);
1228 // To make sure rt and if are not duplicated.
1229 EXPECT_STREQ("BoolAttr", parsedPayload->values->name);
1230 EXPECT_EQ(true, parsedPayload->values->b);
1231 EXPECT_EQ(OCREP_PROP_BOOL, parsedPayload->values->type);
1232 parsedPayload->values = parsedPayload->values->next;
1234 EXPECT_STREQ("DoubleAttr", parsedPayload->values->name);
1235 EXPECT_EQ(OCREP_PROP_DOUBLE, parsedPayload->values->type);
1236 EXPECT_EQ(3.3330000000000002, parsedPayload->values->d);
1237 parsedPayload->values = parsedPayload->values->next;
1239 EXPECT_STREQ("IntAttr", parsedPayload->values->name);
1240 EXPECT_EQ(77, parsedPayload->values->i);
1241 EXPECT_EQ(OCREP_PROP_INT, parsedPayload->values->type);
1242 parsedPayload->values = parsedPayload->values->next;
1244 EXPECT_STREQ("NullAttr", parsedPayload->values->name);
1245 EXPECT_EQ(OCREP_PROP_NULL, parsedPayload->values->type);
1246 parsedPayload->values = parsedPayload->values->next;
1248 EXPECT_STREQ("StringAttr", parsedPayload->values->name);
1249 EXPECT_STREQ("String attr", parsedPayload->values->str);
1250 EXPECT_EQ(OCREP_PROP_STRING, parsedPayload->values->type);
1251 parsedPayload->values = parsedPayload->values->next;
1253 EXPECT_EQ(NULL, parsedPayload->values);
1256 OCRepPayloadDestroy(repPayload);
1257 OCPayloadDestroy(cparsed);