Imported Upstream version 1.1.1
[platform/upstream/iotivity.git] / resource / unittests / OCRepresentationEncodingTest.cpp
index c679495..4db6ea2 100644 (file)
 #include <OCApi.h>
 #include <OCRepresentation.h>
 #include <octypes.h>
+#include <ocstack.h>
 #include <ocpayload.h>
 #include <ocpayloadcbor.h>
 #include <oic_malloc.h>
 #include <oic_string.h>
+#include "payload_logging.h"
 
 namespace OC
 {
@@ -47,32 +49,33 @@ namespace OC
 // CBOR->OCPayload and OCPayload->OCRepresentation conversions
 namespace OCRepresentationEncodingTest
 {
-
-    static const char uri1[] = "/testuri";
-    static const uint8_t sid1[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
+    static const char sid1[] = "646F6F72-4465-7669-6365-555549443030";
     static const char devicename1[] = "device name";
     static const char specver1[] = "spec version";
-    static const char dmver1[] = "data model version";
+    static const char dmver1[] = "res.1.1.0";
+    static OCStringLL *types = NULL;
     // Device Payloads
     TEST(DeviceDiscoveryEncoding, Normal)
     {
+        OCResourcePayloadAddStringLL(&types, "oic.wk.d");
+        OCResourcePayloadAddStringLL(&types, "oic.d.tv");
+
         OCDevicePayload* device = OCDevicePayloadCreate(
-                uri1,
                 sid1,
                 devicename1,
+                types,
                 specver1,
                 dmver1);
-
-        EXPECT_STREQ(uri1, device->uri);
+        EXPECT_TRUE(device);
+        EXPECT_STREQ(sid1, device->sid);
         EXPECT_STREQ(devicename1, device->deviceName);
         EXPECT_STREQ(specver1, device->specVersion);
-        EXPECT_STREQ(dmver1, device->dataModelVersion);
-        EXPECT_EQ(PAYLOAD_TYPE_DEVICE, ((OCPayload*)device)->type);
-
-        for (uint8_t i = 1; i <= sizeof(sid1); ++i)
-        {
-            EXPECT_EQ(i, sid1[i - 1]);
-        }
+        EXPECT_TRUE(device->dataModelVersions);
+        EXPECT_STREQ("res.1.1.0", device->dataModelVersions->value);
+        EXPECT_FALSE(device->dataModelVersions->next);
+        EXPECT_EQ(PAYLOAD_TYPE_DEVICE, ((OCPayload *)device)->type);
+        EXPECT_STREQ("oic.wk.d", device->types->value);
+        EXPECT_STREQ("oic.d.tv", device->types->next->value);
 
         uint8_t* cborData;
         size_t cborSize;
@@ -82,27 +85,59 @@ namespace OCRepresentationEncodingTest
                     cborData, cborSize));
         OICFree(cborData);
 
-        EXPECT_STREQ(device->uri, ((OCDevicePayload*)parsedDevice)->uri);
+        EXPECT_STREQ(device->sid, ((OCDevicePayload*)parsedDevice)->sid);
         EXPECT_STREQ(device->deviceName, ((OCDevicePayload*)parsedDevice)->deviceName);
         EXPECT_STREQ(device->specVersion, ((OCDevicePayload*)parsedDevice)->specVersion);
-        EXPECT_STREQ(device->dataModelVersion, ((OCDevicePayload*)parsedDevice)->dataModelVersion);
+        EXPECT_STREQ(device->dataModelVersions->value, ((OCDevicePayload*)parsedDevice)->dataModelVersions->value);
+        EXPECT_STREQ("oic.wk.d", ((OCDevicePayload*)parsedDevice)->types->value);
+        EXPECT_STREQ("oic.d.tv", ((OCDevicePayload*)parsedDevice)->types->next->value);
         EXPECT_EQ(device->base.type, ((OCDevicePayload*)parsedDevice)->base.type);
 
         OCPayloadDestroy((OCPayload*)device);
 
-        OC::MessageContainer mc;
-        mc.setPayload(parsedDevice);
-        EXPECT_EQ(1u, mc.representations().size());
-        const OC::OCRepresentation& r = mc.representations()[0];
-        EXPECT_STREQ(uri1, r.getUri().c_str());
-        EXPECT_STREQ(devicename1, r.getValue<std::string>(OC_RSRVD_DEVICE_NAME).c_str());
-        EXPECT_STREQ(specver1, r.getValue<std::string>(OC_RSRVD_SPEC_VERSION).c_str());
-        EXPECT_STREQ(dmver1, r.getValue<std::string>(OC_RSRVD_DATA_MODEL_VERSION).c_str());
+        OC::MessageContainer mc1;
+        mc1.setPayload(parsedDevice);
+        EXPECT_EQ(1u, mc1.representations().size());
+        const OC::OCRepresentation &r1 = mc1.representations()[0];
+        EXPECT_STREQ(sid1, r1.getValue<std::string>(OC_RSRVD_DEVICE_ID).c_str());
+        EXPECT_STREQ(devicename1, r1.getValue<std::string>(OC_RSRVD_DEVICE_NAME).c_str());
+        EXPECT_STREQ(specver1, r1.getValue<std::string>(OC_RSRVD_SPEC_VERSION).c_str());
+        EXPECT_STREQ("res.1.1.0", r1.getDataModelVersions()[0].c_str());
 
+        OCPayloadDestroy(parsedDevice);
+
+        static const char dmver2[] = "res.1.1.0,sh.1.1.0";
+        device = OCDevicePayloadCreate(
+                     sid1,
+                     devicename1,
+                     types,
+                     specver1,
+                     dmver2);
+
+        EXPECT_STREQ("res.1.1.0", device->dataModelVersions->value);
+        EXPECT_TRUE(device->dataModelVersions->next);
+        EXPECT_STREQ("sh.1.1.0", device->dataModelVersions->next->value);
+        EXPECT_FALSE(device->dataModelVersions->next->next);
+        EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload *)device, &cborData, &cborSize));
+        EXPECT_EQ(OC_STACK_OK, OCParsePayload(&parsedDevice, PAYLOAD_TYPE_DEVICE,
+                                              cborData, cborSize));
+        OICFree(cborData);
+        EXPECT_STREQ(device->dataModelVersions->value,
+                     ((OCDevicePayload *)parsedDevice)->dataModelVersions->value);
+        EXPECT_STREQ(device->dataModelVersions->next->value,
+                     ((OCDevicePayload *)parsedDevice)->dataModelVersions->next->value);
+        OCPayloadDestroy((OCPayload *)device);
+        OC::MessageContainer mc2;
+        mc2.setPayload(parsedDevice);
+        EXPECT_EQ(1u, mc2.representations().size());
+        const OC::OCRepresentation r2 = mc2.representations()[0];
+        EXPECT_STREQ("res.1.1.0", r2.getDataModelVersions()[0].c_str());
+        EXPECT_STREQ("sh.1.1.0", r2.getDataModelVersions()[1].c_str());
 
         OCPayloadDestroy(parsedDevice);
     }
 
+    static const char uri1[] = "/testuri";
     static char pfid1[] = "pfid";
     static char mfgnm1[] = "mfgnm";
     static char mfgurl1[] = "mfgurl";
@@ -120,9 +155,8 @@ namespace OCRepresentationEncodingTest
     {
         OCPlatformInfo info {pfid1, mfgnm1, mfgurl1, modelnum1, dom1, pfver1, osver1, hwver1,
             fwver1, url1, time1};
-        OCPlatformPayload* platform = OCPlatformPayloadCreate(uri1, &info);
+        OCPlatformPayload* platform = OCPlatformPayloadCreate(&info);
         EXPECT_EQ(PAYLOAD_TYPE_PLATFORM, ((OCPayload*)platform)->type);
-        EXPECT_STREQ(uri1, platform->uri);
         EXPECT_STREQ(pfid1, platform->info.platformID);
         EXPECT_STREQ(mfgnm1, platform->info.manufacturerName);
         EXPECT_STREQ(mfgurl1, platform->info.manufacturerUrl);
@@ -134,6 +168,9 @@ namespace OCRepresentationEncodingTest
         EXPECT_STREQ(fwver1, platform->info.firmwareVersion);
         EXPECT_STREQ(url1, platform->info.supportUrl);
         EXPECT_STREQ(time1, platform->info.systemTime);
+        EXPECT_STREQ(OC_RSRVD_INTERFACE_DEFAULT, platform->interfaces->value);
+        EXPECT_STREQ(OC_RSRVD_INTERFACE_READ, platform->interfaces->next->value);
+        EXPECT_STREQ(OC_RSRVD_RESOURCE_TYPE_PLATFORM, platform->rt->value);
 
         uint8_t* cborData;
         size_t cborSize;
@@ -145,7 +182,6 @@ namespace OCRepresentationEncodingTest
 
         EXPECT_EQ(platform->base.type, ((OCPlatformPayload*)parsedPlatform)->base.type);
         OCPlatformPayload* platform2 = (OCPlatformPayload*)parsedPlatform;
-        EXPECT_STREQ(platform->uri, platform2->uri);
         EXPECT_STREQ(platform->info.platformID, platform2->info.platformID);
         EXPECT_STREQ(platform->info.manufacturerName, platform->info.manufacturerName);
         EXPECT_STREQ(platform->info.manufacturerUrl, platform->info.manufacturerUrl);
@@ -157,6 +193,8 @@ namespace OCRepresentationEncodingTest
         EXPECT_STREQ(platform->info.firmwareVersion, platform->info.firmwareVersion);
         EXPECT_STREQ(platform->info.supportUrl, platform->info.supportUrl);
         EXPECT_STREQ(platform->info.systemTime, platform2->info.systemTime);
+        EXPECT_STREQ(platform->interfaces->value, platform2->interfaces->value);
+        EXPECT_STREQ(platform->rt->value, platform2->rt->value);
 
         OCPayloadDestroy((OCPayload*)platform);
 
@@ -164,7 +202,6 @@ namespace OCRepresentationEncodingTest
         mc.setPayload(parsedPlatform);
         EXPECT_EQ(1u, mc.representations().size());
         const OC::OCRepresentation& r = mc.representations()[0];
-        EXPECT_STREQ(uri1, r.getUri().c_str());
         EXPECT_STREQ(pfid1, r.getValue<std::string>(OC_RSRVD_PLATFORM_ID).c_str());
         EXPECT_STREQ(mfgnm1, r.getValue<std::string>(OC_RSRVD_MFG_NAME).c_str());
         EXPECT_STREQ(mfgurl1, r.getValue<std::string>(OC_RSRVD_MFG_URL).c_str());
@@ -179,7 +216,30 @@ namespace OCRepresentationEncodingTest
 
         OCPayloadDestroy(parsedPlatform);
     }
+    TEST(PresencePayload, Normal)
+    {
+        uint32_t maxAge = 0;
+        uint32_t sequenceNumber = 0;
+        OCPresenceTrigger trigger = OC_PRESENCE_TRIGGER_CREATE;
+        OCPresencePayload *presence = OCPresencePayloadCreate(sequenceNumber, maxAge, trigger, uri1);
+
+        uint8_t* cborData;
+        size_t cborSize;
+        OCPayload* cparsed;
+        EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)presence, &cborData, &cborSize));
+        EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_PRESENCE,
+                    cborData, cborSize));
+        OCPayloadDestroy((OCPayload*)presence);
+        OICFree(cborData);
 
+        OCPresencePayload* parsed = ((OCPresencePayload*)cparsed);
+        EXPECT_EQ(sequenceNumber, parsed->sequenceNumber);
+        EXPECT_EQ(maxAge, parsed->maxAge);
+        EXPECT_EQ(trigger, parsed->trigger);
+        EXPECT_STREQ(uri1, parsed->resourceType);
+
+        OCPayloadDestroy(cparsed);
+    }
     // Representation Payloads
     TEST(RepresentationEncoding, BaseAttributeTypes)
     {
@@ -218,6 +278,38 @@ namespace OCRepresentationEncodingTest
         OCPayloadDestroy(cparsed);
     }
 
+    TEST(RepresentationEncoding, RepAttributeEmpty)
+    {
+        OC::OCRepresentation startRep;
+        std::vector<int> iarr {};
+        startRep["iarr"] = {};
+
+        OC::MessageContainer mc1;
+        mc1.addRepresentation(startRep);
+
+        OCRepPayload* cstart = mc1.getPayload();
+        EXPECT_EQ(PAYLOAD_TYPE_REPRESENTATION, cstart->base.type);
+
+        uint8_t *cborData = NULL;
+        size_t cborSize = 0;
+        OCPayload *cparsed = NULL;
+        EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)cstart, &cborData, &cborSize));
+        EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_REPRESENTATION,
+                    cborData, cborSize));
+        OCPayloadDestroy((OCPayload*)cstart);
+        OICFree(cborData);
+
+        OC::MessageContainer mc2;
+        mc2.setPayload(cparsed);
+        EXPECT_EQ(1u, mc2.representations().size());
+        const OC::OCRepresentation& r = mc2.representations()[0];
+
+        std::vector<int> iarr2 = r["iarr"];
+
+        EXPECT_EQ(iarr, iarr2);
+        OCPayloadDestroy(cparsed);
+    }
+
     TEST(RepresentationEncoding, RepAttribute)
     {
         OC::OCRepresentation startRep;
@@ -633,12 +725,13 @@ namespace OCRepresentationEncodingTest
     {
         OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
         OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
+        payload->sid = OICStrdup(sid1);
         payload->resources = resource;
 
-        OCResourcePayloadAddResourceType(resource, "rt.singleitem");
-        OCResourcePayloadAddInterface(resource, "if.singleitem");
+        EXPECT_TRUE(OCResourcePayloadAddStringLL(&resource->types, "rt.singleitem"));
+        EXPECT_TRUE(OCResourcePayloadAddStringLL(&resource->interfaces, "if.singleitem"));
+
         resource->uri = OICStrdup("/uri/thing");
-        resource->sid = (uint8_t*)OICMalloc(16);
 
         uint8_t* cborData;
         size_t cborSize;
@@ -651,10 +744,10 @@ namespace OCRepresentationEncodingTest
         EXPECT_EQ(1u, OCDiscoveryPayloadGetResourceCount((OCDiscoveryPayload*)cparsed));
         OCResourcePayload* parsedResource = ((OCDiscoveryPayload*)cparsed)->resources;
 
+        EXPECT_STREQ(sid1, ((OCDiscoveryPayload*)cparsed)->sid);
         EXPECT_EQ(NULL, parsedResource->next);
-
-        EXPECT_EQ(NULL, parsedResource->types->next);
         EXPECT_STREQ("rt.singleitem", parsedResource->types->value);
+        EXPECT_EQ(NULL, parsedResource->types->next);
         EXPECT_EQ(NULL, parsedResource->interfaces->next);
         EXPECT_STREQ("if.singleitem", parsedResource->interfaces->value);
 
@@ -666,13 +759,13 @@ namespace OCRepresentationEncodingTest
     TEST(DiscoveryRTandIF, SingleItemFrontTrim)
     {
         OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
+        payload->sid = OICStrdup(sid1);
         OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
         payload->resources = resource;
 
-        OCResourcePayloadAddResourceType(resource, "    rt.singleitem");
-        OCResourcePayloadAddInterface(resource, "    if.singleitem");
+        EXPECT_TRUE(OCResourcePayloadAddStringLL(&resource->types, "    rt.singleitem"));
+        EXPECT_TRUE(OCResourcePayloadAddStringLL(&resource->interfaces, "    if.singleitem"));
         resource->uri = OICStrdup("/uri/thing");
-        resource->sid = (uint8_t*)OICMalloc(16);
 
         uint8_t* cborData;
         size_t cborSize;
@@ -686,7 +779,7 @@ namespace OCRepresentationEncodingTest
         OCResourcePayload* parsedResource = ((OCDiscoveryPayload*)cparsed)->resources;
 
         EXPECT_EQ(NULL, parsedResource->next);
-
+        EXPECT_STREQ(sid1, ((OCDiscoveryPayload*)cparsed)->sid);
         EXPECT_EQ(NULL, parsedResource->types->next);
         EXPECT_STREQ("rt.singleitem", parsedResource->types->value);
         EXPECT_EQ(NULL, parsedResource->interfaces->next);
@@ -696,16 +789,17 @@ namespace OCRepresentationEncodingTest
         OCPayloadDestroy(cparsed);
         OCDiscoveryPayloadDestroy(payload);
     }
+
     TEST(DiscoveryRTandIF, SingleItemBackTrim)
     {
         OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
+        payload->sid = OICStrdup(sid1);
         OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
         payload->resources = resource;
 
-        OCResourcePayloadAddResourceType(resource, "rt.singleitem    ");
-        OCResourcePayloadAddInterface(resource, "if.singleitem    ");
+        OCResourcePayloadAddStringLL(&resource->types, "rt.singleitem    ");
+        OCResourcePayloadAddStringLL(&resource->interfaces, "if.singleitem    ");
         resource->uri = OICStrdup("/uri/thing");
-        resource->sid = (uint8_t*)OICMalloc(16);
 
         uint8_t* cborData;
         size_t cborSize;
@@ -719,7 +813,7 @@ namespace OCRepresentationEncodingTest
         OCResourcePayload* parsedResource = ((OCDiscoveryPayload*)cparsed)->resources;
 
         EXPECT_EQ(NULL, parsedResource->next);
-
+        EXPECT_STREQ(sid1, ((OCDiscoveryPayload*)cparsed)->sid);
         EXPECT_EQ(NULL, parsedResource->types->next);
         EXPECT_STREQ("rt.singleitem", parsedResource->types->value);
         EXPECT_EQ(NULL, parsedResource->interfaces->next);
@@ -732,13 +826,13 @@ namespace OCRepresentationEncodingTest
     TEST(DiscoveryRTandIF, SingleItemBothTrim)
     {
         OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
+        payload->sid = OICStrdup(sid1);
         OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
         payload->resources = resource;
 
-        OCResourcePayloadAddResourceType(resource, "    rt.singleitem    ");
-        OCResourcePayloadAddInterface(resource, "    if.singleitem     ");
+        OCResourcePayloadAddStringLL(&resource->types, "    rt.singleitem    ");
+        OCResourcePayloadAddStringLL(&resource->interfaces, "    if.singleitem     ");
         resource->uri = OICStrdup("/uri/thing");
-        resource->sid = (uint8_t*)OICMalloc(16);
 
         uint8_t* cborData;
         size_t cborSize;
@@ -752,7 +846,7 @@ namespace OCRepresentationEncodingTest
         OCResourcePayload* parsedResource = ((OCDiscoveryPayload*)cparsed)->resources;
 
         EXPECT_EQ(NULL, parsedResource->next);
-
+        EXPECT_STREQ(sid1, ((OCDiscoveryPayload*)cparsed)->sid);
         EXPECT_EQ(NULL, parsedResource->types->next);
         EXPECT_STREQ("rt.singleitem", parsedResource->types->value);
         EXPECT_EQ(NULL, parsedResource->interfaces->next);
@@ -765,15 +859,15 @@ namespace OCRepresentationEncodingTest
     TEST(DiscoveryRTandIF, MultiItemsNormal)
     {
         OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
+        payload->sid = OICStrdup(sid1);
         OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
         payload->resources = resource;
 
-        OCResourcePayloadAddResourceType(resource, "rt.firstitem");
-        OCResourcePayloadAddResourceType(resource, "rt.seconditem");
-        OCResourcePayloadAddInterface(resource, "if.firstitem");
-        OCResourcePayloadAddInterface(resource, "if.seconditem");
+        OCResourcePayloadAddStringLL(&resource->types, "rt.firstitem");
+        OCResourcePayloadAddStringLL(&resource->types, "rt.seconditem");
+        OCResourcePayloadAddStringLL(&resource->interfaces, "if.firstitem");
+        OCResourcePayloadAddStringLL(&resource->interfaces, "if.seconditem");
         resource->uri = OICStrdup("/uri/thing");
-        resource->sid = (uint8_t*)OICMalloc(16);
 
         uint8_t* cborData;
         size_t cborSize;
@@ -787,7 +881,7 @@ namespace OCRepresentationEncodingTest
         OCResourcePayload* parsedResource = ((OCDiscoveryPayload*)cparsed)->resources;
 
         EXPECT_EQ(NULL, parsedResource->next);
-
+        EXPECT_STREQ(sid1, ((OCDiscoveryPayload*)cparsed)->sid);
         EXPECT_EQ(NULL, parsedResource->types->next->next);
         EXPECT_STREQ("rt.firstitem", parsedResource->types->value);
         EXPECT_STREQ("rt.seconditem", parsedResource->types->next->value);
@@ -802,15 +896,15 @@ namespace OCRepresentationEncodingTest
     TEST(DiscoveryRTandIF, MultiItemExtraLeadSpaces)
     {
         OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
+        payload->sid = OICStrdup(sid1);
         OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
         payload->resources = resource;
 
-        OCResourcePayloadAddResourceType(resource, "  rt.firstitem");
-        OCResourcePayloadAddResourceType(resource, "  rt.seconditem");
-        OCResourcePayloadAddInterface(resource, "  if.firstitem");
-        OCResourcePayloadAddInterface(resource, "  if.seconditem");
+        OCResourcePayloadAddStringLL(&resource->types, "  rt.firstitem");
+        OCResourcePayloadAddStringLL(&resource->types, "  rt.seconditem");
+        OCResourcePayloadAddStringLL(&resource->interfaces, "  if.firstitem");
+        OCResourcePayloadAddStringLL(&resource->interfaces, "  if.seconditem");
         resource->uri = OICStrdup("/uri/thing");
-        resource->sid = (uint8_t*)OICMalloc(16);
 
         uint8_t* cborData;
         size_t cborSize;
@@ -824,7 +918,7 @@ namespace OCRepresentationEncodingTest
         OCResourcePayload* parsedResource = ((OCDiscoveryPayload*)cparsed)->resources;
 
         EXPECT_EQ(NULL, parsedResource->next);
-
+        EXPECT_STREQ(sid1, ((OCDiscoveryPayload*)cparsed)->sid);
         EXPECT_EQ(NULL, parsedResource->types->next->next);
         EXPECT_STREQ("rt.firstitem", parsedResource->types->value);
         EXPECT_STREQ("rt.seconditem", parsedResource->types->next->value);
@@ -839,15 +933,15 @@ namespace OCRepresentationEncodingTest
     TEST(DiscoveryRTandIF, MultiItemExtraTrailSpaces)
     {
         OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
+        payload->sid = OICStrdup(sid1);
         OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
         payload->resources = resource;
 
-        OCResourcePayloadAddResourceType(resource, "rt.firstitem  ");
-        OCResourcePayloadAddResourceType(resource, "rt.seconditem  ");
-        OCResourcePayloadAddInterface(resource, "if.firstitem  ");
-        OCResourcePayloadAddInterface(resource, "if.seconditem  ");
+        OCResourcePayloadAddStringLL(&resource->types, "rt.firstitem  ");
+        OCResourcePayloadAddStringLL(&resource->types, "rt.seconditem  ");
+        OCResourcePayloadAddStringLL(&resource->interfaces, "if.firstitem  ");
+        OCResourcePayloadAddStringLL(&resource->interfaces, "if.seconditem  ");
         resource->uri = OICStrdup("/uri/thing");
-        resource->sid = (uint8_t*)OICMalloc(16);
 
         uint8_t* cborData;
         size_t cborSize;
@@ -861,7 +955,7 @@ namespace OCRepresentationEncodingTest
         OCResourcePayload* parsedResource = ((OCDiscoveryPayload*)cparsed)->resources;
 
         EXPECT_EQ(NULL, parsedResource->next);
-
+        EXPECT_STREQ(sid1, ((OCDiscoveryPayload*)cparsed)->sid);
         EXPECT_EQ(NULL, parsedResource->types->next->next);
         EXPECT_STREQ("rt.firstitem", parsedResource->types->value);
         EXPECT_STREQ("rt.seconditem", parsedResource->types->next->value);
@@ -876,15 +970,15 @@ namespace OCRepresentationEncodingTest
     TEST(DiscoveryRTandIF, MultiItemBothSpaces)
     {
         OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
+        payload->sid = OICStrdup(sid1);
         OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
         payload->resources = resource;
 
-        OCResourcePayloadAddResourceType(resource, "  rt.firstitem  ");
-        OCResourcePayloadAddResourceType(resource, "  rt.seconditem  ");
-        OCResourcePayloadAddInterface(resource, "  if.firstitem  ");
-        OCResourcePayloadAddInterface(resource, "  if.seconditem  ");
+        OCResourcePayloadAddStringLL(&resource->types, "  rt.firstitem  ");
+        OCResourcePayloadAddStringLL(&resource->types, "  rt.seconditem  ");
+        OCResourcePayloadAddStringLL(&resource->interfaces, "  if.firstitem  ");
+        OCResourcePayloadAddStringLL(&resource->interfaces, "  if.seconditem  ");
         resource->uri = OICStrdup("/uri/thing");
-        resource->sid = (uint8_t*)OICMalloc(16);
 
         uint8_t* cborData;
         size_t cborSize;
@@ -898,7 +992,7 @@ namespace OCRepresentationEncodingTest
         OCResourcePayload* parsedResource = ((OCDiscoveryPayload*)cparsed)->resources;
 
         EXPECT_EQ(NULL, parsedResource->next);
-
+        EXPECT_STREQ(sid1, ((OCDiscoveryPayload*)cparsed)->sid);
         EXPECT_EQ(NULL, parsedResource->types->next->next);
         EXPECT_STREQ("rt.firstitem", parsedResource->types->value);
         EXPECT_STREQ("rt.seconditem", parsedResource->types->next->value);
@@ -913,7 +1007,6 @@ namespace OCRepresentationEncodingTest
     TEST(RepresentationEncodingRTandIF, SingleItemNormal)
     {
         OCRepPayload* payload = OCRepPayloadCreate();
-        OCRepPayloadSetUri(payload, "/this/uri");
         OCRepPayloadAddResourceType(payload, "rt.firstitem");
         OCRepPayloadAddInterface(payload, "if.firstitem");
 
@@ -932,7 +1025,6 @@ namespace OCRepresentationEncodingTest
         EXPECT_STREQ("if.firstitem", parsedPayload->interfaces->value);
         EXPECT_EQ(NULL, parsedPayload->interfaces->next);
 
-
         OICFree(cborData);
         OCRepPayloadDestroy(payload);
         OCPayloadDestroy(cparsed);
@@ -940,7 +1032,6 @@ namespace OCRepresentationEncodingTest
     TEST(RepresentationEncodingRTandIF, SingleItemFrontTrim)
     {
         OCRepPayload* payload = OCRepPayloadCreate();
-        OCRepPayloadSetUri(payload, "/this/uri");
         OCRepPayloadAddResourceType(payload, "  rt.firstitem");
         OCRepPayloadAddInterface(payload, "  if.firstitem");
 
@@ -967,7 +1058,6 @@ namespace OCRepresentationEncodingTest
     TEST(RepresentationEncodingRTandIF, SingleItemBackTrim)
     {
         OCRepPayload* payload = OCRepPayloadCreate();
-        OCRepPayloadSetUri(payload, "/this/uri");
         OCRepPayloadAddResourceType(payload, "rt.firstitem  ");
         OCRepPayloadAddInterface(payload, "if.firstitem  ");
 
@@ -994,7 +1084,6 @@ namespace OCRepresentationEncodingTest
     TEST(RepresentationEncodingRTandIF, SingleItemBothTrim)
     {
         OCRepPayload* payload = OCRepPayloadCreate();
-        OCRepPayloadSetUri(payload, "/this/uri");
         OCRepPayloadAddResourceType(payload, "  rt.firstitem  ");
         OCRepPayloadAddInterface(payload, "  if.firstitem  ");
 
@@ -1021,7 +1110,6 @@ namespace OCRepresentationEncodingTest
     TEST(RepresentationEncodingRTandIF, MultiItemsNormal)
     {
         OCRepPayload* payload = OCRepPayloadCreate();
-        OCRepPayloadSetUri(payload, "/this/uri");
         OCRepPayloadAddResourceType(payload, "rt.firstitem");
         OCRepPayloadAddResourceType(payload, "rt.seconditem");
         OCRepPayloadAddInterface(payload, "if.firstitem");
@@ -1052,7 +1140,6 @@ namespace OCRepresentationEncodingTest
     TEST(RepresentationEncodingRTandIF, MultiItemExtraLeadSpaces)
     {
         OCRepPayload* payload = OCRepPayloadCreate();
-        OCRepPayloadSetUri(payload, "/this/uri");
         OCRepPayloadAddResourceType(payload, "  rt.firstitem");
         OCRepPayloadAddResourceType(payload, "  rt.seconditem");
         OCRepPayloadAddInterface(payload, "  if.firstitem");
@@ -1083,7 +1170,6 @@ namespace OCRepresentationEncodingTest
     TEST(RepresentationEncodingRTandIF, MultiItemExtraTrailSpaces)
     {
         OCRepPayload* payload = OCRepPayloadCreate();
-        OCRepPayloadSetUri(payload, "/this/uri");
         OCRepPayloadAddResourceType(payload, "rt.firstitem  ");
         OCRepPayloadAddResourceType(payload, "rt.seconditem  ");
         OCRepPayloadAddInterface(payload, "if.firstitem  ");
@@ -1114,7 +1200,6 @@ namespace OCRepresentationEncodingTest
     TEST(RepresentationEncodingRTandIF, MultiItemExtraMiddleSpaces)
     {
         OCRepPayload* payload = OCRepPayloadCreate();
-        OCRepPayloadSetUri(payload, "/this/uri");
         OCRepPayloadAddResourceType(payload, "  rt.firstitem  ");
         OCRepPayloadAddResourceType(payload, "  rt.seconditem  ");
         OCRepPayloadAddInterface(payload, "  if.firstitem  ");
@@ -1142,4 +1227,71 @@ namespace OCRepresentationEncodingTest
         OCRepPayloadDestroy(payload);
         OCPayloadDestroy(cparsed);
     }
+    TEST(RepresentationEncodingRTandIF, TestPayloadContents)
+    {
+        OC::OCRepresentation subRep1;
+        std::vector<std::string> types;
+        types.push_back("rt.firstitem");
+        std::vector<std::string> interfaces;
+        interfaces.push_back("if.firstitem");
+        subRep1.setResourceTypes(types);
+        subRep1.setResourceInterfaces(interfaces);
+        subRep1.setNULL("NullAttr");
+        subRep1.setValue("IntAttr", 77);
+        subRep1.setValue("DoubleAttr", 3.333);
+        subRep1.setValue("BoolAttr", true);
+        subRep1.setValue("StringAttr", std::string("String attr"));
+
+        OC::MessageContainer mc1;
+        mc1.addRepresentation(subRep1);
+
+        OCRepPayload *repPayload = mc1.getPayload();
+        EXPECT_EQ(PAYLOAD_TYPE_REPRESENTATION, repPayload->base.type);
+
+        uint8_t *cborData = NULL;
+        size_t cborSize = 0;
+        OCPayload *cparsed = NULL;
+
+        EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)repPayload, &cborData, &cborSize));
+        EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_REPRESENTATION,
+                    cborData, cborSize));
+
+        OCRepPayload *parsedPayload = (OCRepPayload *)cparsed;
+        EXPECT_EQ(NULL, parsedPayload->uri);
+        EXPECT_STREQ("rt.firstitem", parsedPayload->types->value);
+        EXPECT_EQ(NULL, parsedPayload->types->next);
+        EXPECT_STREQ("if.firstitem", parsedPayload->interfaces->value);
+        EXPECT_EQ(NULL, parsedPayload->interfaces->next);
+
+        // To make sure rt and if are not duplicated.
+        EXPECT_STREQ("BoolAttr", parsedPayload->values->name);
+        EXPECT_EQ(true, parsedPayload->values->b);
+        EXPECT_EQ(OCREP_PROP_BOOL, parsedPayload->values->type);
+        parsedPayload->values = parsedPayload->values->next;
+
+        EXPECT_STREQ("DoubleAttr", parsedPayload->values->name);
+        EXPECT_EQ(OCREP_PROP_DOUBLE, parsedPayload->values->type);
+        EXPECT_EQ(3.3330000000000002, parsedPayload->values->d);
+        parsedPayload->values = parsedPayload->values->next;
+
+        EXPECT_STREQ("IntAttr", parsedPayload->values->name);
+        EXPECT_EQ(77, parsedPayload->values->i);
+        EXPECT_EQ(OCREP_PROP_INT, parsedPayload->values->type);
+        parsedPayload->values = parsedPayload->values->next;
+
+        EXPECT_STREQ("NullAttr", parsedPayload->values->name);
+        EXPECT_EQ(OCREP_PROP_NULL, parsedPayload->values->type);
+        parsedPayload->values = parsedPayload->values->next;
+
+        EXPECT_STREQ("StringAttr", parsedPayload->values->name);
+        EXPECT_STREQ("String attr", parsedPayload->values->str);
+        EXPECT_EQ(OCREP_PROP_STRING, parsedPayload->values->type);
+        parsedPayload->values = parsedPayload->values->next;
+
+        EXPECT_EQ(NULL, parsedPayload->values);
+
+        OICFree(cborData);
+        OCRepPayloadDestroy(repPayload);
+        OCPayloadDestroy(cparsed);
+    }
 }