Added api in PDM to set device as stale
authorRandeep Singh <randeep.s@samsung.com>
Fri, 2 Oct 2015 11:24:30 +0000 (20:24 +0900)
committerSachin Agrawal <sachin.agrawal@intel.com>
Fri, 11 Dec 2015 04:57:15 +0000 (04:57 +0000)
Remove Device API deletes the device from the PDM. but if value is deleted from
DB then we loose that device's reference which is required by other functions of
same API.

To overcome this issue we have added device stale API which instead of removing
device row, sets stale status of device as true.

Due to this chnage APIs like PDMLinkDevices and PDMGetOwnedDevices are also changed.
these apis now ignore data corresponding to stale entries.

Change-Id: I9ee2180296163e289724c7c71f70c4271b9f1c4f
Signed-off-by: Randeep Singh <randeep.s@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/3415
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: dongik Lee <dongik.lee@samsung.com>
Reviewed-by: Sachin Agrawal <sachin.agrawal@intel.com>
resource/csdk/security/provisioning/include/internal/provisioningdatabasemanager.h
resource/csdk/security/provisioning/src/provisioningdatabasemanager.c
resource/csdk/security/provisioning/unittest/provisioningdatabasemanager.cpp
resource/csdk/security/provisioning/unittest/secureresourceprovider.cpp

index 6a31a91..d37c48e 100644 (file)
@@ -120,6 +120,15 @@ OCStackResult PDMGetLinkedDevices(const OicUuid_t* uuidOfDevice, OCUuidList_t**
 OCStackResult PDMSetLinkStale(const OicUuid_t* uuidOfDevice1, const OicUuid_t* uuidOfDevice2);
 
 /**
+ * This method is used by provisioning manager to update device status as stale.
+ *
+ * @param[in] uuidOfDevice id of stale device.
+ *
+ * @return OC_STACK_OK in case of success and other value otherwise.
+ */
+OCStackResult PDMSetDeviceStale(const OicUuid_t* uuidOfDevice);
+
+/**
  * This method is used by provisioning manager to get stale devices.
  *
  * @note in case of sqllite, the caller should set NULL for parameters.
@@ -164,7 +173,8 @@ void PDMDestoryStaleLinkList(OCPairList_t* ptr);
  * @return OC_STACK_OK in case of success and other value otherwise.
  */
 OCStackResult PDMIsLinkExists(const OicUuid_t* uuidOfDevice1, const OicUuid_t* uuidOfDevice2,
-                                bool *result );
+                                bool *result);
+
 
 #ifdef __cplusplus
 }
index e50b5f8..7adf7eb 100644 (file)
@@ -47,7 +47,7 @@
 #define PDM_BIND_INDEX_THIRD 3
 
 #define PDM_CREATE_T_DEVICE_LIST "create table T_DEVICE_LIST(ID INTEGER PRIMARY KEY AUTOINCREMENT,\
-                                  UUID BLOB NOT NULL UNIQUE);"
+                                  UUID BLOB NOT NULL UNIQUE, STATE INT NOT NULL);"
 
 #define PDM_CREATE_T_DEVICE_LINK  "create table T_DEVICE_LINK_STATE(ID INT NOT NULL, ID2 INT NOT \
                                    NULL,STATE INT NOT NULL, PRIMARY KEY (ID, ID2));"
 #define PDM_SQLITE_TRANSACTION_COMMIT "COMMIT;"
 #define PDM_SQLITE_TRANSACTION_ROLLBACK "ROLLBACK;"
 #define PDM_SQLITE_GET_STALE_INFO "SELECT ID,ID2 FROM T_DEVICE_LINK_STATE WHERE STATE = ?"
-#define PDM_SQLITE_INSERT_T_DEVICE_LIST "INSERT INTO T_DEVICE_LIST VALUES(?,?)"
+#define PDM_SQLITE_INSERT_T_DEVICE_LIST "INSERT INTO T_DEVICE_LIST VALUES(?,?,?)"
 #define PDM_SQLITE_GET_ID "SELECT ID FROM T_DEVICE_LIST WHERE UUID like ?"
 #define PDM_SQLITE_INSERT_LINK_DATA "INSERT INTO T_DEVICE_LINK_STATE VALUES(?,?,?)"
 #define PDM_SQLITE_DELETE_LINK "DELETE FROM T_DEVICE_LINK_STATE WHERE ID = ? and ID2 = ?"
 #define PDM_SQLITE_DELETE_DEVICE_LINK "DELETE FROM T_DEVICE_LINK_STATE WHERE ID = ? or ID2 = ?"
 #define PDM_SQLITE_DELETE_DEVICE "DELETE FROM T_DEVICE_LIST  WHERE ID = ?"
 #define PDM_SQLITE_UPDATE_LINK "UPDATE T_DEVICE_LINK_STATE SET STATE = ?  WHERE ID = ? and ID2 = ?"
-#define PDM_SQLITE_LIST_ALL_UUID "SELECT UUID FROM T_DEVICE_LIST"
-#define PDM_SQLITE_GET_UUID "SELECT UUID FROM T_DEVICE_LIST WHERE ID = ?"
-#define PDM_SQLITE_GET_LINKED_DEVICES "SELECT ID,ID2 FROM T_DEVICE_LINK_STATE WHERE ID = ? or ID2 = ?"
-#define PDM_SQLITE_GET_DEVICE_LINKS "SELECT ID,ID2 FROM T_DEVICE_LINK_STATE WHERE ID = ? and ID2 = ?"
+#define PDM_SQLITE_LIST_ALL_UUID "SELECT UUID FROM T_DEVICE_LIST WHERE STATE = 0"
+#define PDM_SQLITE_GET_UUID "SELECT UUID,STATE FROM T_DEVICE_LIST WHERE ID = ?"
+#define PDM_SQLITE_GET_LINKED_DEVICES "SELECT ID,ID2 FROM T_DEVICE_LINK_STATE WHERE \
+                                           (ID = ? or ID2 = ?) and state = 0"
+#define PDM_SQLITE_GET_DEVICE_LINKS "SELECT ID,ID2 FROM T_DEVICE_LINK_STATE WHERE \
+                                          ID = ? and ID2 = ? and state = 0"
+#define PDM_SQLITE_UPDATE_DEVICE "UPDATE T_DEVICE_LIST SET STATE = ?  WHERE UUID like ?"
+#define PDM_SQLITE_GET_DEVICE_STATUS "SELECT STATE FROM T_DEVICE_LIST WHERE UUID like ?"
+#define PDM_SQLITE_UPDATE_LINK_STALE_FOR_STALE_DEVICE "UPDATE T_DEVICE_LINK_STATE SET STATE = 1\
+                                                          WHERE ID = ? or ID2 = ?"
 
 #define ASCENDING_ORDER(id1, id2) do{if( (id1) > (id2) )\
   { int temp; temp = id1; id1 = id2; id2 = temp; }}while(0)
@@ -197,6 +203,9 @@ OCStackResult PDMAddDevice(const OicUuid_t *UUID)
     res = sqlite3_bind_blob(stmt, PDM_BIND_INDEX_SECOND, UUID, UUID_LENGTH, SQLITE_STATIC);
     PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
 
+    res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_THIRD, PDM_ACTIVE_STATE);
+    PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
     res = sqlite3_step(stmt);
     if (SQLITE_DONE != res)
     {
@@ -216,6 +225,42 @@ OCStackResult PDMAddDevice(const OicUuid_t *UUID)
 }
 
 /**
+ * Function to check whether device is stale or not
+ */
+static OCStackResult isDeviceStale(const OicUuid_t *uuid, bool *result)
+{
+    if (NULL == uuid || NULL == result)
+    {
+        OC_LOG(ERROR, TAG, "UUID or result is NULL");
+        return OC_STACK_INVALID_PARAM;
+    }
+
+    sqlite3_stmt *stmt = 0;
+    int res = 0;
+    res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_DEVICE_STATUS, strlen(PDM_SQLITE_GET_DEVICE_STATUS) + 1,
+                              &stmt, NULL);
+    PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+    res = sqlite3_bind_blob(stmt, PDM_BIND_INDEX_FIRST, uuid, UUID_LENGTH, SQLITE_STATIC);
+    PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+    bool retValue = false;
+    while(SQLITE_ROW == sqlite3_step(stmt))
+    {
+        int tempStaleStateFromDb = sqlite3_column_int(stmt, PDM_FIRST_INDEX);
+        OC_LOG_V(DEBUG, TAG, "Stale state is %d", tempStaleStateFromDb);
+        if (PDM_STALE_STATE == tempStaleStateFromDb)
+        {
+            OC_LOG(INFO, TAG, "Device is stale");
+            retValue = true;
+        }
+    }
+    *result = retValue;
+    sqlite3_finalize(stmt);
+    return OC_STACK_OK;
+}
+
+/**
  *function to get Id for given UUID
  */
 static OCStackResult getIdForUUID(const OicUuid_t *UUID , int *id)
@@ -312,6 +357,30 @@ OCStackResult PDMLinkDevices(const OicUuid_t *UUID1, const OicUuid_t *UUID2)
         OC_LOG(ERROR, TAG, "Invalid PARAM");
         return  OC_STACK_INVALID_PARAM;
     }
+
+    bool result = false;
+    if (OC_STACK_OK != isDeviceStale(UUID1, &result))
+    {
+        OC_LOG(ERROR, TAG, "Internal error occured");
+        return OC_STACK_ERROR;
+    }
+    if (result)
+    {
+        OC_LOG(ERROR, TAG, "UUID1:Stale device");
+        return OC_STACK_INVALID_PARAM;
+    }
+    result = false;
+    if (OC_STACK_OK != isDeviceStale(UUID2, &result))
+    {
+        OC_LOG(ERROR, TAG, "Internal error occured");
+        return OC_STACK_ERROR;
+    }
+    if (result)
+    {
+        OC_LOG(ERROR, TAG, "UUID2:Stale device");
+        return OC_STACK_INVALID_PARAM;
+    }
+
     int id1 = 0;
     if (OC_STACK_OK != getIdForUUID(UUID1, &id1))
     {
@@ -324,6 +393,7 @@ OCStackResult PDMLinkDevices(const OicUuid_t *UUID1, const OicUuid_t *UUID2)
         OC_LOG(ERROR, TAG, "Requested value not found");
         return OC_STACK_INVALID_PARAM;
     }
+
     ASCENDING_ORDER(id1, id2);
     return addlink(id1, id2);
 }
@@ -497,7 +567,6 @@ OCStackResult PDMGetOwnedDevices(OCUuidList_t **uuidList, size_t *numOfDevices)
     int counter  = 0;
     while (SQLITE_ROW == sqlite3_step(stmt))
     {
-
         const void *ptr = sqlite3_column_blob(stmt, PDM_FIRST_INDEX);
         OicUuid_t *uid = (OicUuid_t *)ptr;
         OCUuidList_t *temp = (OCUuidList_t *) OICCalloc(1,sizeof(OCUuidList_t));
@@ -516,7 +585,7 @@ OCStackResult PDMGetOwnedDevices(OCUuidList_t **uuidList, size_t *numOfDevices)
     return OC_STACK_OK;
 }
 
-static OCStackResult getUUIDforId(int id, OicUuid_t *uid)
+static OCStackResult getUUIDforId(int id, OicUuid_t *uid, bool *result)
 {
     sqlite3_stmt *stmt = 0;
     int res = 0;
@@ -531,9 +600,27 @@ static OCStackResult getUUIDforId(int id, OicUuid_t *uid)
     {
         const void *ptr = sqlite3_column_blob(stmt, PDM_FIRST_INDEX);
         memcpy(uid, ptr, sizeof(OicUuid_t));
+
+        int temp = sqlite3_column_int(stmt, PDM_SECOND_INDEX);
+        if(PDM_STALE_STATE == temp)
+        {
+            if(result)
+            {
+                *result = true;
+            }
+        }
+        else
+        {
+            if(result)
+            {
+                *result = false;
+            }
+        }
+        sqlite3_finalize(stmt);
+        return OC_STACK_OK;
     }
     sqlite3_finalize(stmt);
-    return OC_STACK_OK;
+    return OC_STACK_INVALID_PARAM;
 }
 
 OCStackResult PDMGetLinkedDevices(const OicUuid_t *UUID, OCUuidList_t **UUIDLIST, size_t *numOfDevices)
@@ -548,6 +635,18 @@ OCStackResult PDMGetLinkedDevices(const OicUuid_t *UUID, OCUuidList_t **UUIDLIST
     {
         return OC_STACK_INVALID_PARAM;
     }
+    bool result = false;
+    OCStackResult ret = isDeviceStale(UUID, &result);
+    if (OC_STACK_OK != ret)
+    {
+        OC_LOG(ERROR, TAG, "Internal error occured");
+        return OC_STACK_ERROR;
+    }
+    if (result)
+    {
+        OC_LOG(ERROR, TAG, "Device is stale");
+        return OC_STACK_INVALID_PARAM;
+    }
     int id = 0;
     if (OC_STACK_OK != getIdForUUID(UUID, &id))
     {
@@ -555,6 +654,7 @@ OCStackResult PDMGetLinkedDevices(const OicUuid_t *UUID, OCUuidList_t **UUIDLIST
         return OC_STACK_INVALID_PARAM;
     }
 
+
     sqlite3_stmt *stmt = 0;
     int res = 0;
     res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_LINKED_DEVICES,
@@ -576,11 +676,11 @@ OCStackResult PDMGetLinkedDevices(const OicUuid_t *UUID, OCUuidList_t **UUIDLIST
         OicUuid_t temp = {{0,}};
         if (i1 != id)
         {
-            getUUIDforId(i1, &temp);
+            getUUIDforId(i1, &temp, NULL);
         }
         if (i2 != id)
         {
-            getUUIDforId(i2, &temp);
+            getUUIDforId(i2, &temp, NULL);
         }
 
         OCUuidList_t *tempNode = (OCUuidList_t *) OICCalloc(1,sizeof(OCUuidList_t));
@@ -624,8 +724,8 @@ OCStackResult PDMGetToBeUnlinkedDevices(OCPairList_t **staleDevList, size_t *num
         int i2 = sqlite3_column_int(stmt, PDM_SECOND_INDEX);
         OicUuid_t temp1 = {{0,}};
         OicUuid_t temp2 = {{0,}};;
-        getUUIDforId(i1, &temp1);
-        getUUIDforId(i2, &temp2);
+        getUUIDforId(i1, &temp1, NULL);
+        getUUIDforId(i2, &temp2, NULL);
 
         OCPairList_t *tempNode = (OCPairList_t *) OICCalloc(1, sizeof(OCPairList_t));
         if (NULL == tempNode)
@@ -701,6 +801,30 @@ OCStackResult PDMIsLinkExists(const OicUuid_t* uuidOfDevice1, const OicUuid_t* u
         return OC_STACK_INVALID_PARAM;
     }
 
+    bool isStale = false;
+    if (OC_STACK_OK != isDeviceStale(uuidOfDevice1, &isStale))
+    {
+        OC_LOG(ERROR, TAG, "uuidOfDevice1:Internal error occured");
+        return OC_STACK_ERROR;
+    }
+    if (isStale)
+    {
+        OC_LOG(ERROR, TAG, "uuidOfDevice1:Device is stale");
+        return OC_STACK_INVALID_PARAM;
+    }
+
+    isStale = false;
+    if (OC_STACK_OK != isDeviceStale(uuidOfDevice2, &isStale))
+    {
+        OC_LOG(ERROR, TAG, "uuidOfDevice2:Internal error occured");
+        return OC_STACK_ERROR;
+    }
+    if (isStale)
+    {
+        OC_LOG(ERROR, TAG, "uuidOfDevice2:Device is stale");
+        return OC_STACK_INVALID_PARAM;
+    }
+
     ASCENDING_ORDER(id1, id2);
 
     sqlite3_stmt *stmt = 0;
@@ -725,3 +849,87 @@ OCStackResult PDMIsLinkExists(const OicUuid_t* uuidOfDevice1, const OicUuid_t* u
     *result = ret;
     return OC_STACK_OK;
 }
+
+static OCStackResult updateDeviceState(const OicUuid_t *uuid, int state)
+{
+    sqlite3_stmt *stmt = 0;
+    int res = 0 ;
+    res = sqlite3_prepare_v2(g_db, PDM_SQLITE_UPDATE_DEVICE,
+                              strlen(PDM_SQLITE_UPDATE_DEVICE) + 1, &stmt, NULL);
+    PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+    res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, state);
+    PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+    res = sqlite3_bind_blob(stmt, PDM_BIND_INDEX_SECOND, uuid, UUID_LENGTH, SQLITE_STATIC);
+    PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+    if (SQLITE_DONE != sqlite3_step(stmt))
+    {
+        OC_LOG_V(ERROR, TAG, "Error message: %s", sqlite3_errmsg(g_db));
+        sqlite3_finalize(stmt);
+        return OC_STACK_ERROR;
+    }
+    sqlite3_finalize(stmt);
+    return OC_STACK_OK;
+}
+
+static OCStackResult updateLinkForStaleDevice(const OicUuid_t *devUuid)
+{
+    sqlite3_stmt *stmt = 0;
+    int res = 0 ;
+
+    int id = 0;
+    if (OC_STACK_OK != getIdForUUID(devUuid, &id))
+    {
+        OC_LOG(ERROR, TAG, "Requested value not found");
+        return OC_STACK_INVALID_PARAM;
+    }
+
+    res = sqlite3_prepare_v2(g_db, PDM_SQLITE_UPDATE_LINK_STALE_FOR_STALE_DEVICE,
+                              strlen(PDM_SQLITE_UPDATE_LINK_STALE_FOR_STALE_DEVICE) + 1,
+                               &stmt, NULL);
+    PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+    res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, id);
+    PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+    res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_SECOND, id);
+    PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+    if (SQLITE_DONE != sqlite3_step(stmt))
+    {
+        OC_LOG_V(ERROR, TAG, "Error message: %s", sqlite3_errmsg(g_db));
+        sqlite3_finalize(stmt);
+        return OC_STACK_ERROR;
+    }
+    sqlite3_finalize(stmt);
+    return OC_STACK_OK;
+}
+
+OCStackResult PDMSetDeviceStale(const OicUuid_t* uuidOfDevice)
+{
+    CHECK_PDM_INIT(TAG);
+    if (NULL == uuidOfDevice)
+    {
+        OC_LOG(ERROR, TAG, "Invalid PARAM");
+        return  OC_STACK_INVALID_PARAM;
+    }
+    begin();
+    OCStackResult res = updateLinkForStaleDevice(uuidOfDevice);
+    if (OC_STACK_OK != res)
+    {
+        rollback();
+        OC_LOG(ERROR, TAG, "unable to update links");
+        return res;
+    }
+    res = updateDeviceState(uuidOfDevice, PDM_STALE_STATE);
+    if (OC_STACK_OK != res)
+    {
+        rollback();
+        OC_LOG(ERROR, TAG, "unable to update device state");
+        return res;
+    }
+    commit();
+    return OC_STACK_OK;
+}
index 0a53e1f..139b0ed 100644 (file)
 #include "gtest/gtest.h"
 #include "provisioningdatabasemanager.h"
 
-const char ID_1[] = "1111111111111111";
-const char ID_2[] = "2111111111111111";
-const char ID_3[] = "3111111111111111";
-const char ID_4[] = "4111111111111111";
-const char ID_5[] = "5111111111111111";
-const char ID_6[] = "6111111111111111";
-const char ID_7[] = "7777777777777777";
-const char ID_8[] = "8777777777777777";
+const char ID_1 [] = "1111111111111111";
+const char ID_2 [] = "2111111111111111";
+const char ID_3 [] = "3111111111111111";
+const char ID_4 [] = "4111111111111111";
+const char ID_5 [] = "5111111111111111";
+const char ID_6 [] = "6111111111111111";
+const char ID_7 [] = "7111111111111111";
+const char ID_8 [] = "8111111111111111";
+const char ID_9 [] = "9111111111111111";
+const char ID_10[] = "1222222222222222";
+const char ID_11[] = "2222222222222222";
+const char ID_12[] = "3222222222222222";
+const char ID_13[] = "4222222222222222";
+
 
 TEST(CallPDMAPIbeforeInit, BeforeInit)
 {
@@ -264,3 +270,97 @@ TEST(PDMIsLinkExistsTest, DuplicateID)
     EXPECT_EQ(OC_STACK_OK, res);
     EXPECT_FALSE(linkExisits);
 }
+
+TEST(PDMSetDeviceStaleTest, NULLUUID)
+{
+    EXPECT_EQ(OC_STACK_OK, PDMInit(NULL));
+    EXPECT_EQ(OC_STACK_INVALID_PARAM, PDMSetDeviceStale(NULL));
+}
+
+TEST(PDMSetDeviceStaleTest, VALIDUUID)
+{
+    EXPECT_EQ(OC_STACK_OK, PDMInit(NULL));
+    OicUuid_t uid1 = {{0,}};
+    memcpy(&uid1.id, ID_9, sizeof(uid1.id));
+    EXPECT_EQ(OC_STACK_OK, PDMAddDevice(&uid1));
+    EXPECT_EQ(OC_STACK_OK,PDMSetDeviceStale(&uid1));
+}
+
+TEST(PDMSetDeviceStaleTest, StaleDeviceNotinDeviceList)
+{
+    EXPECT_EQ(OC_STACK_OK, PDMInit(NULL));
+    OicUuid_t uid1 = {{0,}};
+    memcpy(&uid1.id, ID_10, sizeof(uid1.id));
+    EXPECT_EQ(OC_STACK_OK, PDMAddDevice(&uid1));
+    EXPECT_EQ(OC_STACK_OK,PDMSetDeviceStale(&uid1));
+
+    OCUuidList_t *list = NULL;
+    size_t noOfDevcies = 0;
+    EXPECT_EQ(OC_STACK_OK, PDMGetOwnedDevices(&list, &noOfDevcies));
+
+    while (list)
+    {
+        EXPECT_FALSE(0 == memcmp(list->dev.id, uid1.id,sizeof(uid1.id)));
+        list = list->next;
+    }
+}
+
+TEST(PDMSetDeviceStaleTest, StaleDeviceNotinLinkedDevice)
+{
+    EXPECT_EQ(OC_STACK_OK, PDMInit(NULL));
+    OicUuid_t uid1 = {{0,}};
+    memcpy(&uid1.id, ID_11, sizeof(uid1.id));
+
+    OicUuid_t uid2 = {{0,}};
+    memcpy(&uid2.id, ID_12, sizeof(uid2.id));
+
+    OicUuid_t uid3 = {{0,}};
+    memcpy(&uid3.id, ID_13, sizeof(uid3.id));
+
+    EXPECT_EQ(OC_STACK_OK, PDMAddDevice(&uid1));
+    EXPECT_EQ(OC_STACK_OK, PDMAddDevice(&uid2));
+    EXPECT_EQ(OC_STACK_OK, PDMAddDevice(&uid3));
+
+    EXPECT_EQ(OC_STACK_OK, PDMLinkDevices(&uid1, &uid2));
+    EXPECT_EQ(OC_STACK_OK, PDMLinkDevices(&uid2, &uid3));
+    EXPECT_EQ(OC_STACK_OK, PDMLinkDevices(&uid1, &uid3));
+
+    EXPECT_EQ(OC_STACK_OK,PDMSetDeviceStale(&uid1));
+
+    OCUuidList_t *list1 = NULL;
+    size_t noOfDevices1 = 0;
+    EXPECT_EQ(OC_STACK_INVALID_PARAM, PDMGetLinkedDevices(&uid1, &list1, &noOfDevices1));
+
+    OCUuidList_t *list2 = NULL;
+    size_t noOfDevices2 = 0;
+    EXPECT_EQ(OC_STACK_OK, PDMGetLinkedDevices(&uid2, &list2, &noOfDevices2));
+    OCUuidList_t *ptr = list2;
+    while(ptr)
+    {
+        EXPECT_FALSE(0 == memcmp(ptr->dev.id, uid1.id,sizeof(uid1.id)));
+        ptr = ptr->next;
+    }
+    ptr = list2;
+    while(ptr)
+    {
+        EXPECT_TRUE(0 == memcmp(ptr->dev.id, uid3.id,sizeof(uid3.id)));
+        ptr = ptr->next;
+    }
+
+    OCUuidList_t *list3 = NULL;
+    size_t noOfDevices3 = 0;
+    EXPECT_EQ(OC_STACK_OK, PDMGetLinkedDevices(&uid3, &list3, &noOfDevices3));
+    ptr = list3;
+    while(ptr)
+    {
+        EXPECT_FALSE(0 == memcmp(ptr->dev.id, uid1.id,sizeof(uid1.id)));
+        ptr = ptr->next;
+    }
+
+    ptr = list3;
+    while(ptr)
+    {
+        EXPECT_TRUE(0 == memcmp(ptr->dev.id, uid2.id,sizeof(uid2.id)));
+        ptr = ptr->next;
+    }
+}
\ No newline at end of file
index 25d2226..2bbe117 100644 (file)
 #include "gtest/gtest.h"
 #include "secureresourceprovider.h"
 
-
 static OicSecAcl_t acl;
 static OCProvisionDev_t pDev1;
 static OCProvisionDev_t pDev2;
-static OicSecCredType_t credType;
+static OicSecCredType_t credType = SYMMETRIC_PAIR_WISE_KEY;
 
 static void provisioningCB (void* UNUSED1, int UNUSED2, OCProvisionResult_t *UNUSED3, bool UNUSED4)
 {