Imported Upstream version 0.9.2
[platform/upstream/iotivity.git] / resource / csdk / stack / test / stacktests.cpp
index 19631d7..8ee757d 100644 (file)
@@ -22,8 +22,9 @@
 extern "C"
 {
     #include "ocstack.h"
+    #include "ocstackinternal.h"
     #include "logger.h"
-    #include "ocmalloc.h"
+    #include "oic_malloc.h"
 }
 
 #include "gtest/gtest.h"
@@ -78,7 +79,8 @@ extern "C"  OCStackApplicationResult asyncDoResourcesCallback(void* ctx, OCDoHan
 //-----------------------------------------------------------------------------
 // Entity handler
 //-----------------------------------------------------------------------------
-OCEntityHandlerResult entityHandler(OCEntityHandlerFlag flag, OCEntityHandlerRequest * entityHandlerRequest)
+OCEntityHandlerResult entityHandler(OCEntityHandlerFlag flag, OCEntityHandlerRequest * entityHandlerRequest,
+                                    void* callbackParam)
 {
     OC_LOG(INFO, TAG, "Entering entityHandler");
 
@@ -217,6 +219,19 @@ TEST(StackStart, SetPlatformInfoWithNoManufacturerName)
     EXPECT_EQ(OC_STACK_OK, OCStop());
 }
 
+TEST(StackStart, SetPlatformInfoWithZeroLengthManufacturerName)
+{
+    itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
+    EXPECT_EQ(OC_STACK_OK, OCInit("127.0.0.1", 5683, OC_SERVER));
+
+    OCPlatformInfo info = {};
+    info.platformID = (char *) "platform_id";
+    info.manufacturerName = (char *) "";
+
+    EXPECT_EQ(OC_STACK_INVALID_PARAM, OCSetPlatformInfo(info));
+    EXPECT_EQ(OC_STACK_OK, OCStop());
+}
+
 TEST(StackStart, SetPlatformInfoWithTooLongManufacName)
 {
     itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
@@ -256,7 +271,7 @@ TEST(StackDiscovery, DISABLED_DoResourceDeviceDiscovery)
 
     /* Start a discovery query*/
     char szQueryUri[64] = { 0 };
-    strcpy(szQueryUri, OC_WELL_KNOWN_QUERY);
+    strcpy(szQueryUri, OC_RSRVD_WELL_KNOWN_URI);
     cbData.cb = asyncDoResourcesCallback;
     cbData.context = (void*)DEFAULT_CONTEXT_VALUE;
     cbData.cd = NULL;
@@ -265,7 +280,7 @@ TEST(StackDiscovery, DISABLED_DoResourceDeviceDiscovery)
                                         szQueryUri,
                                         0,
                                         0,
-                                        OC_IPV4,
+                                        CT_ADAPTER_IP,
                                         OC_LOW_QOS,
                                         &cbData,
                                         NULL,
@@ -276,6 +291,12 @@ TEST(StackDiscovery, DISABLED_DoResourceDeviceDiscovery)
 TEST(StackStop, StackStopWithoutInit)
 {
     itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
+    EXPECT_EQ(OC_STACK_ERROR, OCStop());
+}
+
+TEST(StackStop, StackStopRepeated)
+{
+    itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
     EXPECT_EQ(OC_STACK_OK, OCInit("127.0.0.1", 5683, OC_CLIENT));
     EXPECT_EQ(OC_STACK_OK, OCStop());
     EXPECT_EQ(OC_STACK_ERROR, OCStop());
@@ -292,7 +313,7 @@ TEST(StackResource, DISABLED_UpdateResourceNullURI)
 
     /* Start a discovery query*/
     char szQueryUri[64] = { 0 };
-    strcpy(szQueryUri, OC_WELL_KNOWN_QUERY);
+    strcpy(szQueryUri, OC_RSRVD_WELL_KNOWN_URI);
     cbData.cb = asyncDoResourcesCallback;
     cbData.context = (void*)DEFAULT_CONTEXT_VALUE;
     cbData.cd = NULL;
@@ -301,7 +322,7 @@ TEST(StackResource, DISABLED_UpdateResourceNullURI)
                                         szQueryUri,
                                         0,
                                         0,
-                                        OC_IPV4,
+                                        CT_ADAPTER_IP,
                                         OC_LOW_QOS,
                                         &cbData,
                                         NULL,
@@ -322,6 +343,7 @@ TEST(StackResource, CreateResourceBadParams)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     EXPECT_EQ(OC_STACK_INVALID_PARAM, OCCreateResource(&handle,
@@ -329,6 +351,7 @@ TEST(StackResource, CreateResourceBadParams)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     // Property bitmask out of range
@@ -337,11 +360,48 @@ TEST(StackResource, CreateResourceBadParams)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             128));// invalid bitmask for OCResourceProperty
 
     EXPECT_EQ(OC_STACK_OK, OCStop());
 }
 
+TEST(StackResource, CreateResourceBadUri)
+{
+    itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
+    OC_LOG(INFO, TAG, "Starting CreateResourceBadUri test");
+    InitStack(OC_SERVER);
+
+    const char *uri65 = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL";
+
+    OCResourceHandle handle;
+
+    EXPECT_EQ(OC_STACK_INVALID_URI, OCCreateResource(&handle,
+                                            "core.led",
+                                            "core.rw",
+                                            NULL, //"/a/led",
+                                            0,
+                                            0,
+                                            OC_DISCOVERABLE|OC_OBSERVABLE));
+
+    EXPECT_EQ(OC_STACK_INVALID_URI, OCCreateResource(&handle,
+                                            "core.led",
+                                            "core.rw",
+                                            "", //"/a/led",
+                                            0,
+                                            0,
+                                            OC_DISCOVERABLE|OC_OBSERVABLE));
+
+    EXPECT_EQ(OC_STACK_INVALID_URI, OCCreateResource(&handle,
+                                            "core.led",
+                                            "core.rw",
+                                            uri65, //"/a/led",
+                                            0,
+                                            0,
+                                            OC_DISCOVERABLE|OC_OBSERVABLE));
+
+    EXPECT_EQ(OC_STACK_OK, OCStop());
+}
 
 TEST(StackResource, CreateResourceSuccess)
 {
@@ -355,6 +415,7 @@ TEST(StackResource, CreateResourceSuccess)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     const char *url = OCGetResourceUri(handle);
     EXPECT_STREQ("/a/led", url);
@@ -362,6 +423,46 @@ TEST(StackResource, CreateResourceSuccess)
     EXPECT_EQ(OC_STACK_OK, OCStop());
 }
 
+TEST(StackResource, CreateResourceSuccessWithResourcePolicyPropNone)
+{
+    itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
+    OC_LOG(INFO, TAG, "Starting CreateResourceSuccessWithResourcePolicyPropNone test");
+    InitStack(OC_SERVER);
+
+    OCResourceHandle handle;
+    // the resource is non-discoverable & non-observable by the client.
+    EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handle,
+                                            "core.led",
+                                            "core.rw",
+                                            "/a/led",
+                                            0,
+                                            NULL,
+                                            OC_RES_PROP_NONE));// the resource is non-discoverable &
+                                                // non-observable by the client.
+    const char* url = OCGetResourceUri(handle);
+    EXPECT_STREQ("/a/led", url);
+
+    EXPECT_EQ(OC_STACK_OK, OCStop());
+}
+
+TEST(StackResource, CreateResourceWithClientStackMode)
+{
+    itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
+    OC_LOG(INFO, TAG, "Starting CreateResourceSuccess test");
+    InitStack(OC_CLIENT);
+
+    OCResourceHandle handle;
+    EXPECT_EQ(OC_STACK_INVALID_PARAM, OCCreateResource(&handle,
+                                            "core.led",
+                                            "core.rw",
+                                            "/a/led",
+                                            0,
+                                            NULL,
+                                            OC_DISCOVERABLE|OC_OBSERVABLE));
+
+    EXPECT_EQ(OC_STACK_OK, OCStop());
+}
+
 TEST(StackResource, CreateResourceFailDuplicateUri)
 {
     itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
@@ -374,6 +475,7 @@ TEST(StackResource, CreateResourceFailDuplicateUri)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     const char *url = OCGetResourceUri(handle);
     EXPECT_STREQ("/a/led", url);
@@ -383,6 +485,7 @@ TEST(StackResource, CreateResourceFailDuplicateUri)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     EXPECT_EQ(OC_STACK_OK, OCStop());
@@ -400,6 +503,7 @@ TEST(StackResource, CreateResourceMultipleResources)
                                             "core.rw",
                                             "/a/led1",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     OCResourceHandle handle2;
@@ -408,6 +512,7 @@ TEST(StackResource, CreateResourceMultipleResources)
                                             "core.rw",
                                             "/a/led2",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     OCResourceHandle handle3;
     EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handle3,
@@ -415,6 +520,7 @@ TEST(StackResource, CreateResourceMultipleResources)
                                             "core.rw",
                                             "/a/led3",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     const char *url = OCGetResourceUri(handle1);
@@ -441,6 +547,16 @@ TEST(StackResource, CreateResourceBadResoureType)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
+                                            OC_DISCOVERABLE|OC_OBSERVABLE));
+
+    OCResourceHandle handle2;
+    EXPECT_EQ(OC_STACK_INVALID_PARAM, OCCreateResource(&handle2,
+                                            "",
+                                            "core.rw",
+                                            "/a/led",
+                                            0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     EXPECT_EQ(OC_STACK_OK, OCStop());
@@ -458,6 +574,7 @@ TEST(StackResource, CreateResourceGoodResourceType)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     EXPECT_EQ(OC_STACK_OK, OCStop());
@@ -475,6 +592,7 @@ TEST(StackResource, ResourceTypeName)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     uint8_t numResourceTypes;
@@ -505,6 +623,7 @@ TEST(StackResource, ResourceTypeAttrRepresentation)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     uint8_t numResourceTypes;
@@ -526,6 +645,7 @@ TEST(StackResource, ResourceTypeInterface)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     uint8_t numResourceInterfaces;
@@ -558,6 +678,7 @@ TEST(StackResource, ResourceDefaultInterfaceAlwaysFirst)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCBindResourceInterfaceToResource(handle,
                                         OC_RSRVD_INTERFACE_DEFAULT));
@@ -588,6 +709,7 @@ TEST(StackResource, ResourceDuplicateDefaultInterfaces)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     EXPECT_EQ(OC_STACK_OK, OCBindResourceInterfaceToResource(handle,
@@ -619,6 +741,7 @@ TEST(StackResource, ResourceDuplicateNonDefaultInterfaces)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     EXPECT_EQ(OC_STACK_OK, OCBindResourceInterfaceToResource(handle,
@@ -645,6 +768,7 @@ TEST(StackResource, ResourceTypeInterfaceMethods)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     uint8_t numResourceInterfaces;
@@ -666,6 +790,7 @@ TEST(StackResource, GetResourceProperties)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     EXPECT_EQ(OC_ACTIVE|OC_DISCOVERABLE|OC_OBSERVABLE, OCGetResourceProperties(handle));
@@ -679,6 +804,8 @@ TEST(StackResource, StackTestResourceDiscoverOneResourceBad)
     itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
     OC_LOG(INFO, TAG, "Starting StackTestResourceDiscoverOneResourceBad test");
     InitStack(OC_SERVER);
+    uint8_t numResources = 0;
+    EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
 
     OCResourceHandle handle;
     EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handle,
@@ -686,16 +813,16 @@ TEST(StackResource, StackTestResourceDiscoverOneResourceBad)
                                             "core.rw",
                                             "/a1/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     const char *url = OCGetResourceUri(handle);
     EXPECT_STREQ("/a1/led", url);
 
     //EXPECT_EQ(OC_STACK_INVALID_URI, OCHandleServerRequest(&res, uri, query, req, rsp));
     EXPECT_EQ(OC_STACK_OK, OCDeleteResource(handle));
-    uint8_t numResources = 0;
-    uint8_t numExpectedResources = InitNumExpectedResources();
+    uint8_t numExpectedResources = 0;
 
-    EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
+    EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numExpectedResources));
     EXPECT_EQ(numExpectedResources, numResources);
 
     EXPECT_EQ(OC_STACK_OK, OCStop());
@@ -713,6 +840,7 @@ TEST(StackResource, StackTestResourceDiscoverOneResource)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     const char *url = OCGetResourceUri(handle);
     EXPECT_STREQ("/a/led", url);
@@ -735,6 +863,7 @@ TEST(StackResource, StackTestResourceDiscoverManyResources)
                                             "core.rw",
                                             "/a/led1",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE));
     const char *url = OCGetResourceUri(handle1);
     EXPECT_STREQ("/a/led1", url);
@@ -745,6 +874,7 @@ TEST(StackResource, StackTestResourceDiscoverManyResources)
                                             "core.rw",
                                             "/a/led2",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     url = OCGetResourceUri(handle2);
     EXPECT_STREQ("/a/led2", url);
@@ -758,6 +888,7 @@ TEST(StackResource, StackTestResourceDiscoverManyResources)
                                             "core.rw",
                                             "/a/led3",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     url = OCGetResourceUri(handle3);
     EXPECT_STREQ("/a/led3", url);
@@ -771,6 +902,7 @@ TEST(StackResource, StackTestResourceDiscoverManyResources)
                                             "core.rw",
                                             "/a/led4",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE));
     url = OCGetResourceUri(handle4);
     EXPECT_STREQ("/a/led4", url);
@@ -796,6 +928,7 @@ TEST(StackBind, BindResourceTypeNameBad)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     uint8_t numResourceTypes;
@@ -821,6 +954,7 @@ TEST(StackBind, BindResourceTypeNameGood)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     uint8_t numResourceTypes;
@@ -856,6 +990,7 @@ TEST(StackBind, BindResourceTypeAttribRepGood)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     uint8_t numResourceTypes;
@@ -886,6 +1021,7 @@ TEST(StackBind, BindResourceInterfaceNameBad)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     uint8_t numResourceInterfaces;
@@ -911,6 +1047,7 @@ TEST(StackBind, BindResourceInterfaceNameGood)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     uint8_t numResourceInterfaces;
@@ -941,6 +1078,7 @@ TEST(StackBind, BindResourceInterfaceMethodsBad)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     uint8_t numResourceInterfaces;
@@ -964,6 +1102,7 @@ TEST(StackBind, BindResourceInterfaceMethodsGood)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     uint8_t numResourceInterfaces;
@@ -990,6 +1129,7 @@ TEST(StackBind, BindContainedResourceBad)
                                             "core.rw",
                                             "/a/kitchen",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     OCResourceHandle handle0;
@@ -998,6 +1138,7 @@ TEST(StackBind, BindContainedResourceBad)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     EXPECT_EQ(OC_STACK_INVALID_PARAM, OCBindResource(containerHandle, containerHandle));
@@ -1014,10 +1155,9 @@ TEST(StackBind, BindContainedResourceGood)
     InitStack(OC_SERVER);
 
     uint8_t numResources = 0;
-    uint8_t numExpectedResources = InitNumExpectedResources();
+    uint8_t numExpectedResources = 0;
 
-    EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
-    EXPECT_EQ(numExpectedResources, numResources);
+    EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numExpectedResources));
 
     OCResourceHandle containerHandle;
     EXPECT_EQ(OC_STACK_OK, OCCreateResource(&containerHandle,
@@ -1025,6 +1165,7 @@ TEST(StackBind, BindContainedResourceGood)
                                             "core.rw",
                                             "/a/kitchen",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1035,6 +1176,7 @@ TEST(StackBind, BindContainedResourceGood)
                                             "core.rw",
                                             "/a/led0",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1045,6 +1187,7 @@ TEST(StackBind, BindContainedResourceGood)
                                             "core.rw",
                                             "/a/led1",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1055,6 +1198,7 @@ TEST(StackBind, BindContainedResourceGood)
                                             "core.rw",
                                             "/a/led2",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1065,6 +1209,7 @@ TEST(StackBind, BindContainedResourceGood)
                                             "core.rw",
                                             "/a/led3",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1075,6 +1220,7 @@ TEST(StackBind, BindContainedResourceGood)
                                             "core.rw",
                                             "/a/led4",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1085,6 +1231,7 @@ TEST(StackBind, BindContainedResourceGood)
                                             "core.rw",
                                             "/a/led5",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1121,9 +1268,10 @@ TEST(StackBind, BindEntityHandlerBad)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
-    EXPECT_EQ(OC_STACK_INVALID_PARAM, OCBindResourceHandler(NULL, NULL));
+    EXPECT_EQ(OC_STACK_INVALID_PARAM, OCBindResourceHandler(NULL, NULL, NULL));
 
     EXPECT_EQ(OC_STACK_OK, OCStop());
 }
@@ -1140,11 +1288,12 @@ TEST(StackBind, BindEntityHandlerGood)
                                             "core.rw",
                                             "/a/led",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
 
     OCEntityHandler myHandler = entityHandler;
 
-    EXPECT_EQ(OC_STACK_OK, OCBindResourceHandler(handle, myHandler));
+    EXPECT_EQ(OC_STACK_OK, OCBindResourceHandler(handle, myHandler, NULL));
 
     EXPECT_EQ(myHandler, OCGetResourceHandler(handle));
 
@@ -1158,18 +1307,18 @@ TEST(StackResourceAccess, GetResourceByIndex)
     InitStack(OC_SERVER);
 
     uint8_t numResources = 0;
-    uint8_t numExpectedResources = InitNumExpectedResources();
-    uint8_t resourceIndex = InitResourceIndex();
-
-    EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
-    EXPECT_EQ(numExpectedResources, numResources);
-
+    uint8_t numExpectedResources = 0;
+    uint8_t resourceIndex = 0;
+    uint8_t prevResources = 0;
+    EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numExpectedResources));
+    prevResources = numExpectedResources;
     OCResourceHandle containerHandle;
     EXPECT_EQ(OC_STACK_OK, OCCreateResource(&containerHandle,
                                             "core.led",
                                             "core.rw",
                                             "/a/kitchen",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1180,6 +1329,7 @@ TEST(StackResourceAccess, GetResourceByIndex)
                                             "core.rw",
                                             "/a/led0",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1190,6 +1340,7 @@ TEST(StackResourceAccess, GetResourceByIndex)
                                             "core.rw",
                                             "/a/led1",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1200,6 +1351,7 @@ TEST(StackResourceAccess, GetResourceByIndex)
                                             "core.rw",
                                             "/a/led2",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1210,6 +1362,7 @@ TEST(StackResourceAccess, GetResourceByIndex)
                                             "core.rw",
                                             "/a/led3",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1220,6 +1373,7 @@ TEST(StackResourceAccess, GetResourceByIndex)
                                             "core.rw",
                                             "/a/led4",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1230,10 +1384,11 @@ TEST(StackResourceAccess, GetResourceByIndex)
                                             "core.rw",
                                             "/a/led5",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
-
+    resourceIndex += prevResources;
     EXPECT_EQ(containerHandle, OCGetResourceHandle(resourceIndex));
     EXPECT_EQ(handle0, OCGetResourceHandle(++resourceIndex));
     EXPECT_EQ(handle1, OCGetResourceHandle(++resourceIndex));
@@ -1252,10 +1407,9 @@ TEST(StackResourceAccess, DeleteHeadResource)
     InitStack(OC_SERVER);
 
     uint8_t numResources = 0;
-    uint8_t numExpectedResources = InitNumExpectedResources();
+    uint8_t numExpectedResources = 0;
 
-    EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
-    EXPECT_EQ(numExpectedResources, numResources);
+    EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numExpectedResources));
 
     OCResourceHandle handle0;
     EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handle0,
@@ -1263,6 +1417,7 @@ TEST(StackResourceAccess, DeleteHeadResource)
                                             "core.rw",
                                             "/a/led0",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1281,18 +1436,16 @@ TEST(StackResourceAccess, DeleteHeadResource2)
     InitStack(OC_SERVER);
 
     uint8_t numResources = 0;
-    uint8_t numExpectedResources = InitNumExpectedResources();
-    uint8_t resourceIndex = InitResourceIndex();
-
-    EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
-    EXPECT_EQ(numExpectedResources, numResources);
+    uint8_t numExpectedResources = 0;
 
+    EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numExpectedResources));
     OCResourceHandle handle0;
     EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handle0,
                                             "core.led",
                                             "core.rw",
                                             "/a/led0",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1303,6 +1456,7 @@ TEST(StackResourceAccess, DeleteHeadResource2)
                                             "core.rw",
                                             "/a/led1",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1311,7 +1465,7 @@ TEST(StackResourceAccess, DeleteHeadResource2)
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(--numExpectedResources, numResources);
 
-    EXPECT_EQ(handle1, OCGetResourceHandle(resourceIndex));
+    EXPECT_EQ(handle1, OCGetResourceHandle(numResources - 1));
 
     EXPECT_EQ(OC_STACK_OK, OCStop());
 }
@@ -1324,11 +1478,9 @@ TEST(StackResourceAccess, DeleteLastResource)
     InitStack(OC_SERVER);
 
     uint8_t numResources = 0;
-    uint8_t numExpectedResources = InitNumExpectedResources();
-    uint8_t resourceIndex = InitResourceIndex();
+    uint8_t numExpectedResources = 0;
 
-    EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
-    EXPECT_EQ(numExpectedResources, numResources);
+    EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numExpectedResources));
 
     OCResourceHandle handle0;
     EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handle0,
@@ -1336,6 +1488,7 @@ TEST(StackResourceAccess, DeleteLastResource)
                                             "core.rw",
                                             "/a/led0",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1346,6 +1499,7 @@ TEST(StackResourceAccess, DeleteLastResource)
                                             "core.rw",
                                             "/a/led1",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1354,7 +1508,7 @@ TEST(StackResourceAccess, DeleteLastResource)
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(--numExpectedResources, numResources);
 
-    EXPECT_EQ(handle0, OCGetResourceHandle(resourceIndex));
+    EXPECT_EQ(handle0, OCGetResourceHandle(numResources - 1));
 
     OCResourceHandle handle2;
     EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handle2,
@@ -1362,6 +1516,7 @@ TEST(StackResourceAccess, DeleteLastResource)
                                             "core.rw",
                                             "/a/led2",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1376,18 +1531,18 @@ TEST(StackResourceAccess, DeleteMiddleResource)
     InitStack(OC_SERVER);
 
     uint8_t numResources = 0;
-    uint8_t numExpectedResources = InitNumExpectedResources();
+    uint8_t numExpectedResources = 0;
     uint8_t resourceIndex = InitResourceIndex();
 
-    EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
-    EXPECT_EQ(numExpectedResources, numResources);
-
+    EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numExpectedResources));
+    resourceIndex = numExpectedResources;
     OCResourceHandle handle0;
     EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handle0,
                                             "core.led",
                                             "core.rw",
                                             "/a/led0",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1398,6 +1553,7 @@ TEST(StackResourceAccess, DeleteMiddleResource)
                                             "core.rw",
                                             "/a/led1",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1408,6 +1564,7 @@ TEST(StackResourceAccess, DeleteMiddleResource)
                                             "core.rw",
                                             "/a/led2",
                                             0,
+                                            NULL,
                                             OC_DISCOVERABLE|OC_OBSERVABLE));
     EXPECT_EQ(OC_STACK_OK, OCGetNumberOfResources(&numResources));
     EXPECT_EQ(++numExpectedResources, numResources);
@@ -1429,75 +1586,12 @@ TEST(StackResourceAccess, DeleteMiddleResource)
     EXPECT_EQ(OC_STACK_OK, OCStop());
 }
 
-
-#ifdef __cplusplus
-extern "C" {
-#endif // __cplusplus
-    void parsePresencePayload(char* payload, uint32_t* seqNum, uint32_t* maxAge, char** resType);
-#ifdef __cplusplus
+TEST(PODTests, OCHeaderOption)
+{
+    EXPECT_TRUE(std::is_pod<OCHeaderOption>::value);
 }
-#endif // __cplusplus
 
-TEST(StackPresence, ParsePresencePayload)
+TEST(PODTests, OCCallbackData)
 {
-    itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
-    OC_LOG(INFO, TAG, "Starting ParsePresencePayload test");
-
-    char payload[100];
-    uint32_t seqNum = 0, maxAge = 0;
-    char * resType = NULL;
-
-    //Good Scenario
-    strncpy(payload, "{\"oc\":[100:99:presence]}", sizeof(payload));
-    parsePresencePayload(payload, &seqNum, &maxAge, &resType);
-    EXPECT_TRUE(100 == seqNum);
-    EXPECT_TRUE(99 == maxAge);
-    EXPECT_STREQ("presence", resType);
-    OCFree(resType);
-
-    //Bad Scenario -- should not result in Seg Fault
-    parsePresencePayload(payload, NULL, &maxAge, &resType);
-
-    //Bad Scenario
-    seqNum = 0; maxAge = 0; resType = NULL;
-    strncpy(payload, "{abracadabra}", sizeof(payload));
-    parsePresencePayload(payload, &seqNum, &maxAge, &resType);
-    EXPECT_TRUE(0 == seqNum);
-    EXPECT_TRUE(0 == maxAge);
-    EXPECT_EQ(NULL, resType);
-    OCFree(resType);
-
-    //Bad Scenario
-    seqNum = 0; maxAge = 0; resType = NULL;
-    strncpy(payload, "{\"oc\":[100]}", sizeof(payload));
-    parsePresencePayload(payload, &seqNum, &maxAge, &resType);
-    EXPECT_TRUE(100 == seqNum);
-    EXPECT_TRUE(0 == maxAge);
-    EXPECT_EQ(NULL, resType);
-    OCFree(resType);
-
-    //Bad Scenario
-    seqNum = 0; maxAge = 0; resType = NULL;
-    strncpy(payload, "{\"oc\":[]}", sizeof(payload));
-    parsePresencePayload(payload, &seqNum, &maxAge, &resType);
-    EXPECT_TRUE(0 == seqNum);
-    EXPECT_TRUE(0 == maxAge);
-    EXPECT_EQ(NULL, resType);
-    OCFree(resType);
-
-    //Bad Scenario
-    strncpy(payload, "{:]}", sizeof(payload));
-    parsePresencePayload(payload, &seqNum, &maxAge, &resType);
-    EXPECT_TRUE(0 == seqNum);
-    EXPECT_TRUE(0 == maxAge);
-    EXPECT_EQ(NULL, resType);
-    OCFree(resType);
-
-    //Bad Scenario
-    strncpy(payload, "{:[presence}", sizeof(payload));
-    parsePresencePayload(payload, &seqNum, &maxAge, &resType);
-    EXPECT_TRUE(0 == seqNum);
-    EXPECT_TRUE(0 == maxAge);
-    EXPECT_EQ(NULL, resType);
-    OCFree(resType);
+    EXPECT_TRUE(std::is_pod<OCHeaderOption>::value);
 }