OCRepPayload NULL array handling
authorHabib Virji <habib.virji@samsung.com>
Mon, 7 Nov 2016 22:54:49 +0000 (22:54 +0000)
committerHabib Virji <habib.virji@samsung.com>
Tue, 8 Nov 2016 11:15:49 +0000 (11:15 +0000)
OCRepPayload was not handling empty array. This patch handles both conversion and parsing. Also added new tests.

Change-Id: If06e1f47ecaaa926e0ee720ab890ca67076bad03
Signed-off-by: Habib Virji <habib.virji@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/14109
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
resource/csdk/stack/src/ocpayloadconvert.c
resource/csdk/stack/src/ocpayloadparse.c
resource/unittests/OCRepresentationEncodingTest.cpp

index ba948df..4b3085b 100644 (file)
@@ -562,44 +562,39 @@ static int64_t OCConvertArrayItem(CborEncoder *array, const OCRepPayloadValueArr
             err = CborUnknownError;
             break;
         case OCREP_PROP_INT:
-            err |= cbor_encode_int(array, valArray->iArray[index]);
+            if (valArray->iArray != 0)
+            {
+                err |= cbor_encode_int(array, valArray->iArray[index]);
+            }
             break;
         case OCREP_PROP_DOUBLE:
-            err |= cbor_encode_double(array, valArray->dArray[index]);
+            if (valArray->dArray != 0)
+            {
+                err |= cbor_encode_double(array, valArray->dArray[index]);
+            }
             break;
         case OCREP_PROP_BOOL:
-            err |= cbor_encode_boolean(array, valArray->bArray[index]);
-            break;
-        case OCREP_PROP_STRING:
-            if (!valArray->strArray[index])
+            if (valArray->bArray != 0)
             {
-                err |= cbor_encode_null(array);
+                err |= cbor_encode_boolean(array, valArray->bArray[index]);
             }
-            else
+            break;
+        case OCREP_PROP_STRING:
+            if (valArray->strArray != 0)
             {
-                err |= cbor_encode_text_string(array, valArray->strArray[index],
-                        strlen(valArray->strArray[index]));
+                err |= (!valArray->strArray[index]) ? cbor_encode_null(array) : cbor_encode_text_string(array,
+                    valArray->strArray[index], strlen(valArray->strArray[index]));
             }
             break;
         case OCREP_PROP_BYTE_STRING:
-            if (!valArray->ocByteStrArray[index].len)
-            {
-                err |= cbor_encode_null(array);
-            }
-            else
-            {
-                err |= cbor_encode_byte_string(array, valArray->ocByteStrArray[index].bytes,
-                        valArray->ocByteStrArray[index].len);
-            }
+            err |= (!valArray->ocByteStrArray[index].len) ? cbor_encode_null(array) : cbor_encode_byte_string(array,
+                valArray->ocByteStrArray[index].bytes, valArray->ocByteStrArray[index].len);
             break;
         case OCREP_PROP_OBJECT:
-            if (!valArray->objArray[index])
-            {
-                err |= cbor_encode_null(array);
-            }
-            else
+            if (valArray->objArray != 0)
             {
-                err |= OCConvertRepMap(array, valArray->objArray[index]);
+                err |= (!valArray->objArray[index]) ? cbor_encode_null(array): OCConvertRepMap(array,
+                        valArray->objArray[index]);
             }
             break;
         case OCREP_PROP_ARRAY:
@@ -617,47 +612,55 @@ static int64_t OCConvertArray(CborEncoder *parent, const OCRepPayloadValueArray
     CborEncoder array;
     err |= cbor_encoder_create_array(parent, &array, valArray->dimensions[0]);
     VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating rep array");
-
-    for (size_t i = 0; i < valArray->dimensions[0]; ++i)
+    // empty array
+    if (valArray->dimensions[0] == 0)
+    {
+        err |= OCConvertArrayItem(&array, valArray, 0);
+        VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep array value");
+    }
+    else
     {
-        if (0 != valArray->dimensions[1])
+        for (size_t i = 0; i < valArray->dimensions[0]; ++i)
         {
-            CborEncoder array2;
-            err |= cbor_encoder_create_array(&array, &array2, valArray->dimensions[1]);
-            VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating rep array2");
-
-            for (size_t j = 0; j < valArray->dimensions[1]; ++j)
+            if (0 != valArray->dimensions[1])
             {
-                if (0 != valArray->dimensions[2])
+                CborEncoder array2;
+                err |= cbor_encoder_create_array(&array, &array2, valArray->dimensions[1]);
+                VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating rep array2");
+
+                for (size_t j = 0; j < valArray->dimensions[1]; ++j)
                 {
-                    CborEncoder array3;
-                    err |= cbor_encoder_create_array(&array2, &array3, valArray->dimensions[2]);
-                    VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating rep array3");
+                    if (0 != valArray->dimensions[2])
+                    {
+                        CborEncoder array3;
+                        err |= cbor_encoder_create_array(&array2, &array3, valArray->dimensions[2]);
+                        VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating rep array3");
 
-                    for(size_t k = 0; k < valArray->dimensions[2]; ++k)
+                        for(size_t k = 0; k < valArray->dimensions[2]; ++k)
+                        {
+                            err |= OCConvertArrayItem(&array3, valArray,
+                                j * valArray->dimensions[2] +
+                                i * valArray->dimensions[2] * valArray->dimensions[1] +
+                                k);
+                            VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep array3 value");
+                        }
+                        err |= cbor_encoder_close_container(&array2, &array3);
+                        VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing rep array3");
+                    }
+                    else
                     {
-                        err |= OCConvertArrayItem(&array3, valArray,
-                            j * valArray->dimensions[2] +
-                            i * valArray->dimensions[2] * valArray->dimensions[1] +
-                            k);
-                        VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep array3 value");
+                        err |= OCConvertArrayItem(&array2, valArray, i * valArray->dimensions[1] + j);
+                        VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep array2 value");
                     }
-                    err |= cbor_encoder_close_container(&array2, &array3);
-                    VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing rep array3");
-                }
-                else
-                {
-                    err |= OCConvertArrayItem(&array2, valArray, i * valArray->dimensions[1] + j);
-                    VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep array2 value");
                 }
+                err |= cbor_encoder_close_container(&array, &array2);
+                VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing rep array2");
+            }
+            else
+            {
+                err |= OCConvertArrayItem(&array, valArray, i);
+                VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep array value");
             }
-            err |= cbor_encoder_close_container(&array, &array2);
-            VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing rep array2");
-        }
-        else
-        {
-            err |= OCConvertArrayItem(&array, valArray, i);
-            VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep array value");
         }
     }
     err |= cbor_encoder_close_container(parent, &array);
index 6f8170e..f9969db 100644 (file)
@@ -898,8 +898,7 @@ static CborError OCParseArray(OCRepPayload *out, const char *name, CborValue *co
         res = OCRepPayloadSetNull(out, name);
         err = (CborError) !res;
         VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting value");
-        err = cbor_value_advance(container);
-        VERIFY_CBOR_SUCCESS(TAG, err, "Failed advancing container");
+        container = container + 1;
         return err;
     }
 
index 54fc760..03fc2f5 100644 (file)
@@ -301,11 +301,22 @@ namespace OCRepresentationEncodingTest
     {
         OC::OCRepresentation startRep;
         std::vector<int> iarr {};
-        startRep["iarr"] = {};
+        std::vector<double> darr {};
+        std::vector<bool> barr {};
+        std::vector<std::string> strarr {};
+        std::vector<OC::OCRepresentation> objarr {};
+        std::vector<OCByteString> bytestrarr {{NULL, 0}};
+        startRep.setValue("StringAttr", std::string(""));
+        startRep["iarr"] = iarr;
+        startRep["darr"] = darr;
+        startRep["barr"] = barr;
+        startRep["strarr"] = strarr;
+        startRep["objarr"] = objarr;
+        startRep["bytestrarr"] = bytestrarr;
+        startRep.setValue("StringAttr2", std::string("String attr"));
 
         OC::MessageContainer mc1;
         mc1.addRepresentation(startRep);
-
         OCRepPayload* cstart = mc1.getPayload();
         EXPECT_EQ(PAYLOAD_TYPE_REPRESENTATION, cstart->base.type);
 
@@ -323,9 +334,21 @@ namespace OCRepresentationEncodingTest
         EXPECT_EQ(1u, mc2.representations().size());
         const OC::OCRepresentation& r = mc2.representations()[0];
 
+        EXPECT_STREQ("", r.getValue<std::string>("StringAttr").c_str());
         std::vector<int> iarr2 = r["iarr"];
-
         EXPECT_EQ(iarr, iarr2);
+        std::vector<double> darr2 = r["darr"];
+        EXPECT_EQ(darr, darr2);
+        std::vector<bool> barr2 = r["barr"];
+        EXPECT_EQ(barr, barr2);
+        std::vector<std::string> strarr2 = r["strarr"];
+        EXPECT_EQ(strarr, strarr2);
+        std::vector<OC::OCRepresentation> objarr2 = r["objarr"];
+        EXPECT_EQ(objarr, objarr2);
+        std::vector<uint8_t> binAttr = r.getValue<std::vector<uint8_t>>("BinaryAttr");
+        EXPECT_EQ(bytestrarr[0].len, binAttr.size());
+        EXPECT_STREQ("String attr", r.getValue<std::string>("StringAttr2").c_str());
+        OIC_LOG_PAYLOAD(DEBUG, cparsed);
         OCPayloadDestroy(cparsed);
     }