From 4b2ca378a7af8409983fefa7effffe80b59d1dbb Mon Sep 17 00:00:00 2001 From: Dan Mihai Date: Thu, 29 Dec 2016 18:01:40 -0800 Subject: [PATCH] [IOT-1719] Restore empty UUID string conversion 1. Empty strings were being rejected after commit 7c494d7b1a90349f353bf8f3d0f6cd17fe31df14. 2. Add unit test to catch this kind of regression. 3. Improve error logging for this kind of json2cbor failures. Change-Id: I4608638a5ef952c2949b47ec21e7f610d50f3b82 Signed-off-by: Dan Mihai Reviewed-on: https://gerrit.iotivity.org/gerrit/16019 Tested-by: jenkins-iotivity Reviewed-by: Chul Lee Reviewed-by: Greg Zaverucha --- resource/csdk/security/src/srmutility.c | 22 +++++- resource/csdk/security/tool/json2cbor.c | 7 +- resource/csdk/security/unittest/srmutility.cpp | 94 ++++++++++++++++++++++++++ 3 files changed, 118 insertions(+), 5 deletions(-) diff --git a/resource/csdk/security/src/srmutility.c b/resource/csdk/security/src/srmutility.c index b1f7744..9a9b8c9 100644 --- a/resource/csdk/security/src/srmutility.c +++ b/resource/csdk/security/src/srmutility.c @@ -140,6 +140,24 @@ exit: OCStackResult ConvertStrToUuid(const char* strUuid, OicUuid_t* uuid) { - bool result = OCConvertStringToUuid(strUuid, uuid->id); - return (result) ? OC_STACK_OK : OC_STACK_INVALID_PARAM; + bool result = true; + size_t strUuidLen = strlen(strUuid); + + if (0 == strUuidLen) + { + OIC_LOG(INFO, TAG, "Converting empty UUID string to 00000000-0000-0000-0000-000000000000"); + memset(uuid->id, 0, sizeof(uuid->id)); + } + else + { + result = OCConvertStringToUuid(strUuid, uuid->id); + } + + if (!result) + { + OIC_LOG_V(ERROR, TAG, "%s: Invalid parameter '%s'", __func__, strUuid); + return OC_STACK_INVALID_PARAM; + } + + return OC_STACK_OK; } diff --git a/resource/csdk/security/tool/json2cbor.c b/resource/csdk/security/tool/json2cbor.c index d0d9025..762845c 100644 --- a/resource/csdk/security/tool/json2cbor.c +++ b/resource/csdk/security/tool/json2cbor.c @@ -670,7 +670,7 @@ exit: DeleteDoxmBinData(doxm); doxm = NULL; } - printf("OUT JSONToDoxmBin\n"); + printf("OUT %s: %s\n", __func__, (doxm != NULL) ? "success" : "failure"); return doxm; } @@ -740,9 +740,10 @@ exit: cJSON_Delete(jsonRoot); if (OC_STACK_OK != ret) { - OIC_LOG(ERROR, TAG, "JSONToPstatBin failed"); + DeletePstatBinData(pstat); + pstat = NULL; } - printf("OUT JSONToPstatBin\n"); + printf("OUT %s: %s\n", __func__, (pstat != NULL) ? "success" : "failure"); return pstat; } diff --git a/resource/csdk/security/unittest/srmutility.cpp b/resource/csdk/security/unittest/srmutility.cpp index 0464d5a..a5df9f7 100644 --- a/resource/csdk/security/unittest/srmutility.cpp +++ b/resource/csdk/security/unittest/srmutility.cpp @@ -21,6 +21,8 @@ #include "srmutility.h" #include "oic_string.h" +#define TEST_FILL_CHARACTER ((int)0xfb) + //ParseRestQuery Tests TEST(ParseRestQueryTest, ParseRestQueryEmpty) { @@ -64,3 +66,95 @@ TEST(ParseRestQueryTest, ParseRestMultipleQuery) } printf("\n"); } + +TEST(ConvertStrToUuidTest, LowCase) +{ + OicUuid_t uuid; + memset(&uuid, TEST_FILL_CHARACTER, sizeof(uuid)); + + const char *uuidString1 = "ca5bfba0-c0f1-4906-b995-f139d626dfbd"; + EXPECT_EQ(OC_STACK_OK, ConvertStrToUuid(uuidString1, &uuid)); + + EXPECT_EQ((uint8_t)0xca, uuid.id[0]); + EXPECT_EQ((uint8_t)0x5b, uuid.id[1]); + EXPECT_EQ((uint8_t)0xfb, uuid.id[2]); + EXPECT_EQ((uint8_t)0xa0, uuid.id[3]); + EXPECT_EQ((uint8_t)0xc0, uuid.id[4]); + EXPECT_EQ((uint8_t)0xf1, uuid.id[5]); + EXPECT_EQ((uint8_t)0x49, uuid.id[6]); + EXPECT_EQ((uint8_t)0x06, uuid.id[7]); + EXPECT_EQ((uint8_t)0xb9, uuid.id[8]); + EXPECT_EQ((uint8_t)0x95, uuid.id[9]); + EXPECT_EQ((uint8_t)0xf1, uuid.id[10]); + EXPECT_EQ((uint8_t)0x39, uuid.id[11]); + EXPECT_EQ((uint8_t)0xd6, uuid.id[12]); + EXPECT_EQ((uint8_t)0x26, uuid.id[13]); + EXPECT_EQ((uint8_t)0xdf, uuid.id[14]); + EXPECT_EQ((uint8_t)0xbd, uuid.id[15]); +} + +TEST(ConvertStrToUuidTest, UpCase) +{ + OicUuid_t uuid; + memset(&uuid, TEST_FILL_CHARACTER, sizeof(uuid)); + + const char *uuidString1 = "2320EF4B-D714-4936-93E5-846E1B5DA202"; + EXPECT_EQ(OC_STACK_OK, ConvertStrToUuid(uuidString1, &uuid)); + + EXPECT_EQ((uint8_t)0x23, uuid.id[0]); + EXPECT_EQ((uint8_t)0x20, uuid.id[1]); + EXPECT_EQ((uint8_t)0xef, uuid.id[2]); + EXPECT_EQ((uint8_t)0x4b, uuid.id[3]); + EXPECT_EQ((uint8_t)0xd7, uuid.id[4]); + EXPECT_EQ((uint8_t)0x14, uuid.id[5]); + EXPECT_EQ((uint8_t)0x49, uuid.id[6]); + EXPECT_EQ((uint8_t)0x36, uuid.id[7]); + EXPECT_EQ((uint8_t)0x93, uuid.id[8]); + EXPECT_EQ((uint8_t)0xe5, uuid.id[9]); + EXPECT_EQ((uint8_t)0x84, uuid.id[10]); + EXPECT_EQ((uint8_t)0x6e, uuid.id[11]); + EXPECT_EQ((uint8_t)0x1b, uuid.id[12]); + EXPECT_EQ((uint8_t)0x5d, uuid.id[13]); + EXPECT_EQ((uint8_t)0xa2, uuid.id[14]); + EXPECT_EQ((uint8_t)0x02, uuid.id[15]); +} + +TEST(ConvertStrToUuidTest, MixedCase) +{ + OicUuid_t uuid; + memset(&uuid, TEST_FILL_CHARACTER, sizeof(uuid)); + + const char *uuidString1 = "6905485c-9693-4CF7-9350-4eB39022af7d"; + EXPECT_EQ(OC_STACK_OK, ConvertStrToUuid(uuidString1, &uuid)); + + EXPECT_EQ((uint8_t)0x69, uuid.id[0]); + EXPECT_EQ((uint8_t)0x05, uuid.id[1]); + EXPECT_EQ((uint8_t)0x48, uuid.id[2]); + EXPECT_EQ((uint8_t)0x5c, uuid.id[3]); + EXPECT_EQ((uint8_t)0x96, uuid.id[4]); + EXPECT_EQ((uint8_t)0x93, uuid.id[5]); + EXPECT_EQ((uint8_t)0x4c, uuid.id[6]); + EXPECT_EQ((uint8_t)0xf7, uuid.id[7]); + EXPECT_EQ((uint8_t)0x93, uuid.id[8]); + EXPECT_EQ((uint8_t)0x50, uuid.id[9]); + EXPECT_EQ((uint8_t)0x4e, uuid.id[10]); + EXPECT_EQ((uint8_t)0xb3, uuid.id[11]); + EXPECT_EQ((uint8_t)0x90, uuid.id[12]); + EXPECT_EQ((uint8_t)0x22, uuid.id[13]); + EXPECT_EQ((uint8_t)0xaf, uuid.id[14]); + EXPECT_EQ((uint8_t)0x7d, uuid.id[15]); +} + +TEST(ConvertStrToUuidTest, EmptyStringConversion) +{ + OicUuid_t uuid; + memset(&uuid, TEST_FILL_CHARACTER, sizeof(uuid)); + + const char *uuidString1 = ""; + EXPECT_EQ(OC_STACK_OK, ConvertStrToUuid(uuidString1, &uuid)); + + for (size_t i = 0; i < sizeof(uuid.id); i++) + { + EXPECT_EQ((uint8_t)0, uuid.id[i]); + } +} -- 2.7.4