Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
open.cpp
00001 /* 00002 * mbed Microcontroller Library 00003 * Copyright (c) 2006-2016 ARM Limited 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); 00006 * you may not use this file except in compliance with the License. 00007 * You may obtain a copy of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, 00013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 * See the License for the specific language governing permissions and 00015 * limitations under the License. 00016 */ 00017 00018 /** @file open.cpp Test cases to open KVs in the CFSTORE using the drv->Open() interface. 00019 * 00020 * Please consult the documentation under the test-case functions for 00021 * a description of the individual test case. 00022 */ 00023 00024 #include "mbed.h" 00025 #include "cfstore_config.h" 00026 #include "cfstore_test.h" 00027 #include "cfstore_debug.h" 00028 #include "Driver_Common.h" 00029 #include "configuration_store.h" 00030 #include "utest/utest.h" 00031 #include "unity/unity.h" 00032 #include "greentea-client/test_env.h" 00033 #include "cfstore_utest.h" 00034 #ifdef YOTTA_CFG_CFSTORE_UVISOR 00035 #include "uvisor-lib/uvisor-lib.h" 00036 #endif /* YOTTA_CFG_CFSTORE_UVISOR */ 00037 00038 #include <stdio.h> 00039 #include <string.h> 00040 #include <stdlib.h> /*rand()*/ 00041 #include <inttypes.h> 00042 00043 using namespace utest::v1; 00044 00045 static char cfstore_open_utest_msg_g[CFSTORE_UTEST_MSG_BUF_SIZE]; 00046 00047 /* Configure secure box. */ 00048 #ifdef YOTTA_CFG_CFSTORE_UVISOR 00049 UVISOR_BOX_NAMESPACE("com.arm.mbed.cfstore.test.open.box1"); 00050 UVISOR_BOX_CONFIG(cfstore_open_box1, UVISOR_BOX_STACK_SIZE); 00051 #endif /* YOTTA_CFG_CFSTORE_UVISOR */ 00052 00053 00054 /// @cond CFSTORE_DOXYGEN_DISABLE 00055 #ifdef CFSTORE_DEBUG 00056 #define CFSTORE_OPEN_GREENTEA_TIMEOUT_S 3000 00057 #else 00058 #define CFSTORE_OPEN_GREENTEA_TIMEOUT_S 1000 00059 #endif 00060 /// @endcond 00061 00062 00063 /* support functions */ 00064 00065 /* 00066 * open tests that focus on testing cfstore_open() 00067 * cfstore_handle_t cfstore_open(const char* key_name, char* data, ARM_CFSTORE_SIZE* len, cfstore_key_desc_t* kdesc) 00068 */ 00069 00070 /* KV data for test_01 */ 00071 static cfstore_kv_data_t cfstore_open_test_01_kv_data[] = { 00072 { "yotta.hello-world.animal{wobbly-dog}{foot}frontLeft", "missing"}, 00073 { NULL, NULL}, 00074 }; 00075 00076 00077 /* report whether built/configured for flash sync or async mode */ 00078 static control_t cfstore_open_test_00(const size_t call_count) 00079 { 00080 int32_t ret = ARM_DRIVER_ERROR; 00081 00082 (void) call_count; 00083 ret = cfstore_test_startup(); 00084 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret); 00085 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00086 return CaseNext; 00087 } 00088 00089 /** @brief 00090 * Basic open test which does the following: 00091 * - creates KV with default rw perms and writes some data to the value blob. 00092 * - closes the newly created KV. 00093 * - opens the KV with the default permissions (r-only) 00094 * - reads the KV data and checks its the same as the previously created data. 00095 * - closes the opened key 00096 * 00097 * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. 00098 */ 00099 control_t cfstore_open_test_01_end(const size_t call_count) 00100 { 00101 char* read_buf; 00102 int32_t ret = ARM_DRIVER_ERROR; 00103 ARM_CFSTORE_SIZE len = 0; 00104 ARM_CFSTORE_DRIVER* drv = &cfstore_driver; 00105 ARM_CFSTORE_KEYDESC kdesc; 00106 ARM_CFSTORE_HANDLE_INIT(hkey); 00107 cfstore_kv_data_t *node; 00108 ARM_CFSTORE_FMODE flags; 00109 00110 CFSTORE_DBGLOG("%s:entered\n", __func__); 00111 (void) call_count; 00112 node = cfstore_open_test_01_kv_data; 00113 memset(&kdesc, 0, sizeof(kdesc)); 00114 memset(&flags, 0, sizeof(flags)); 00115 00116 kdesc.drl = ARM_RETENTION_WHILE_DEVICE_ACTIVE; 00117 CFSTORE_DBGLOG("%s:About to create new node (key_name=\"%s\", value=\"%s\")\n", __func__, node->key_name, node->value); 00118 ret = drv->Create(node->key_name, strlen(node->value), &kdesc, hkey); 00119 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create node (key_name=\"%s\", value=\"%s\")(ret=%d)\n", __func__, node->key_name, node->value, (int) ret); 00120 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00121 00122 CFSTORE_DBGLOG("%s:length of KV=%d (key_name=\"%s\", value=\"%s\")\n", __func__, (int) len, node->key_name, node->value); 00123 len = strlen(node->value); 00124 ret = drv->Write(hkey, (char*) node->value, &len); 00125 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to write key (key_name=\"%s\", value=\"%s\")(ret=%d)\n", __func__, node->key_name, node->value, (int) ret); 00126 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00127 00128 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to write full value data (key_name=\"%s\", value=\"%s\"), len=%d, (ret=%d)\n", __func__, node->key_name, node->value, (int) len, (int) ret); 00129 TEST_ASSERT_MESSAGE(len == strlen(node->value), cfstore_open_utest_msg_g); 00130 00131 CFSTORE_DBGLOG("Created KV successfully (key_name=\"%s\", value=\"%s\")\n", node->key_name, node->value); 00132 ret = drv->Close(hkey); 00133 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to close handle (ret=%d)\n", __func__, (int) ret); 00134 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00135 00136 /* now open the newly created key */ 00137 ret = drv->Open(node->key_name, flags, hkey); 00138 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to open node (key_name=\"%s\", value=\"%s\")(ret=%d)\n", __func__, node->key_name, node->value, (int) ret); 00139 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00140 00141 len = strlen(node->value) + 1; 00142 read_buf = (char*) malloc(len); 00143 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to allocated read buffer \n", __func__); 00144 TEST_ASSERT_MESSAGE(read_buf != NULL, cfstore_open_utest_msg_g); 00145 00146 CFSTORE_DBGLOG("Opened KV successfully (key_name=\"%s\", value=\"%s\")\n", node->key_name, node->value); 00147 memset(read_buf, 0, len); 00148 ret = drv->Read(hkey, read_buf, &len); 00149 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to write key (key_name=\"%s\", value=\"%s\")\n", __func__, node->key_name, node->value); 00150 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00151 00152 /* check read data is as expected */ 00153 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: read value data (%s) != KV value data (key_name=\"%s\", value=\"%s\")\n", __func__, read_buf, node->key_name, node->value); 00154 TEST_ASSERT_MESSAGE(strncmp(read_buf, node->value, strlen(node->value)) == 0, cfstore_open_utest_msg_g); 00155 00156 if(read_buf){ 00157 free(read_buf); 00158 } 00159 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: Close() call failed.\n", __func__); 00160 TEST_ASSERT_MESSAGE(drv->Close(hkey) >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00161 00162 ret = drv->Uninitialize(); 00163 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: Uninitialize() call failed.\n", __func__); 00164 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00165 return CaseNext; 00166 } 00167 00168 static cfstore_kv_data_t cfstore_open_test_02_data[] = { 00169 CFSTORE_INIT_1_TABLE_MID_NODE, 00170 { NULL, NULL}, 00171 }; 00172 00173 /** 00174 * @brief test to open() a pre-existing key and try to write it, which should fail 00175 * as by default pre-existing keys are opened read-only 00176 * 00177 * Basic open test which does the following: 00178 * - creates KV with default rw perms and writes some data to the value blob. 00179 * - closes the newly created KV. 00180 * - opens the KV with the default permissions (read-only) 00181 * - tries to write the KV data which should fail because KV was not opened with write flag set. 00182 * - closes the opened key 00183 * 00184 * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. 00185 */ 00186 control_t cfstore_open_test_02_end(const size_t call_count) 00187 { 00188 int32_t ret = ARM_DRIVER_ERROR; 00189 ARM_CFSTORE_SIZE len = 0; 00190 ARM_CFSTORE_DRIVER* drv = &cfstore_driver; 00191 ARM_CFSTORE_KEYDESC kdesc; 00192 ARM_CFSTORE_HANDLE_INIT(hkey); 00193 ARM_CFSTORE_FMODE flags; 00194 00195 CFSTORE_FENTRYLOG("%s:entered\n", __func__); 00196 (void) call_count; 00197 memset(&kdesc, 0, sizeof(kdesc)); 00198 /* dont set any flags to get default settings */ 00199 memset(&flags, 0, sizeof(flags)); 00200 kdesc.drl = ARM_RETENTION_WHILE_DEVICE_ACTIVE; 00201 len = strlen(cfstore_open_test_02_data[0].value); 00202 ret = cfstore_test_create(cfstore_open_test_02_data[0].key_name, (char*) cfstore_open_test_02_data[0].value, &len, &kdesc); 00203 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create KV in store (ret=%d).\n", __func__, (int) ret); 00204 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00205 00206 /* by default, owner of key opens with read-only permissions*/ 00207 ret = drv->Open(cfstore_open_test_02_data[0].key_name, flags, hkey); 00208 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to open node (key_name=\"%s\")(ret=%d)\n", __func__, cfstore_open_test_02_data[0].key_name, (int) ret); 00209 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00210 00211 len = strlen(cfstore_open_test_02_data[0].value); 00212 ret = drv->Write(hkey, cfstore_open_test_02_data[0].value, &len); 00213 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: call to Write() succeeded when should have failed (key_name=\"%s\")(ret=%d).\n", __func__, cfstore_open_test_02_data[0].key_name, (int) ret); 00214 TEST_ASSERT_MESSAGE(ret == ARM_CFSTORE_DRIVER_ERROR_KEY_READ_ONLY, cfstore_open_utest_msg_g); 00215 00216 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: Close() call failed.\n", __func__); 00217 TEST_ASSERT_MESSAGE(drv->Close(hkey) >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00218 00219 ret = drv->Uninitialize(); 00220 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: Uninitialize() call failed.\n", __func__); 00221 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00222 return CaseNext; 00223 } 00224 00225 00226 /** 00227 * @brief test to open() a pre-existing key and try to write it, which should succeed 00228 * because the key was opened read-write permissions explicitly 00229 * 00230 * Basic open test which does the following: 00231 * - creates KV with default rw perms and writes some data to the value blob. 00232 * - closes the newly created KV. 00233 * - opens the KV with the rw permissions (non default) 00234 * - tries to write the KV data which should succeeds because KV was opened with write flag set. 00235 * - closes the opened key 00236 * 00237 * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. 00238 */ 00239 control_t cfstore_open_test_03_end(const size_t call_count) 00240 { 00241 int32_t ret = ARM_DRIVER_ERROR; 00242 ARM_CFSTORE_SIZE len = 0; 00243 ARM_CFSTORE_DRIVER* drv = &cfstore_driver; 00244 ARM_CFSTORE_KEYDESC kdesc; 00245 ARM_CFSTORE_HANDLE_INIT(hkey); 00246 ARM_CFSTORE_FMODE flags; 00247 00248 CFSTORE_FENTRYLOG("%s:entered\n", __func__); 00249 (void) call_count; 00250 memset(&kdesc, 0, sizeof(kdesc)); 00251 /* dont set any flags to get default settings */ 00252 memset(&flags, 0, sizeof(flags)); 00253 kdesc.drl = ARM_RETENTION_WHILE_DEVICE_ACTIVE; 00254 len = strlen(cfstore_open_test_02_data[0].value); 00255 ret = cfstore_test_create(cfstore_open_test_02_data[0].key_name, (char*) cfstore_open_test_02_data[0].value, &len, &kdesc); 00256 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create KV in store (ret=%d).\n", __func__, (int) ret); 00257 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00258 00259 /* opens with read-write permissions*/ 00260 flags.read = true; 00261 flags.write = true; 00262 ret = drv->Open(cfstore_open_test_02_data[0].key_name, flags, hkey); 00263 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to open node (key_name=\"%s\")(ret=%d)\n", __func__, cfstore_open_test_02_data[0].key_name, (int) ret); 00264 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00265 00266 len = strlen(cfstore_open_test_02_data[0].value); 00267 ret = drv->Write(hkey, cfstore_open_test_02_data[0].value, &len); 00268 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: call to Write() failed when should have succeeded (key_name=\"%s\")(ret=%d).\n", __func__, cfstore_open_test_02_data[0].key_name, (int) ret); 00269 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00270 00271 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: Close() call failed.\n", __func__); 00272 TEST_ASSERT_MESSAGE(drv->Close(hkey) >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00273 00274 ret = drv->Uninitialize(); 00275 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: Uninitialize() call failed.\n", __func__); 00276 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00277 return CaseNext; 00278 } 00279 00280 00281 00282 /** @brief test to call cfstore_open() with a key_name string that exceeds 00283 * the maximum length 00284 * 00285 * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. 00286 */ 00287 control_t cfstore_open_test_04_end(const size_t call_count) 00288 { 00289 char kv_name_good[CFSTORE_KEY_NAME_MAX_LENGTH+1]; /* extra char for terminating null */ 00290 char kv_name_bad[CFSTORE_KEY_NAME_MAX_LENGTH+2]; 00291 int32_t ret = ARM_DRIVER_ERROR; 00292 ARM_CFSTORE_SIZE len = 0; 00293 ARM_CFSTORE_DRIVER* drv = &cfstore_driver; 00294 ARM_CFSTORE_KEYDESC kdesc; 00295 ARM_CFSTORE_FMODE flags; 00296 00297 CFSTORE_FENTRYLOG("%s:entered\n", __func__); 00298 (void) call_count; 00299 memset(kv_name_good, 0, CFSTORE_KEY_NAME_MAX_LENGTH+1); 00300 memset(kv_name_bad, 0, CFSTORE_KEY_NAME_MAX_LENGTH+2); 00301 memset(&kdesc, 0, sizeof(kdesc)); 00302 /* dont set any flags to get default settings */ 00303 memset(&flags, 0, sizeof(flags)); 00304 00305 len = CFSTORE_KEY_NAME_MAX_LENGTH; 00306 ret = cfstore_test_kv_name_gen(kv_name_good, len); 00307 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: unable to generate kv_name_good.\n", __func__); 00308 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK , cfstore_open_utest_msg_g); 00309 00310 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: kv_name_good is not the correct length (len=%d, expected=%d).\n", __func__, (int) strlen(kv_name_good), (int) len); 00311 TEST_ASSERT_MESSAGE(strlen(kv_name_good) == CFSTORE_KEY_NAME_MAX_LENGTH, cfstore_open_utest_msg_g); 00312 00313 ret = cfstore_test_create(kv_name_good, kv_name_good, &len, &kdesc); 00314 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create KV in store for kv_name_good(ret=%d).\n", __func__, (int) ret); 00315 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00316 00317 len = CFSTORE_KEY_NAME_MAX_LENGTH+1; 00318 ret = cfstore_test_kv_name_gen(kv_name_bad, len); 00319 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: unable to generate kv_name_bad.\n", __func__); 00320 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK , cfstore_open_utest_msg_g); 00321 00322 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: kv_name_bad is not the correct length (len=%d, expected=%d).\n", __func__, (int) strlen(kv_name_bad), (int) len); 00323 TEST_ASSERT_MESSAGE(strlen(kv_name_bad) == CFSTORE_KEY_NAME_MAX_LENGTH+1, cfstore_open_utest_msg_g); 00324 00325 memset(&kdesc, 0, sizeof(kdesc)); 00326 ret = cfstore_test_create(kv_name_bad, kv_name_bad, &len, &kdesc); 00327 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: created KV in store for kv_name_bad when should have failed(ret=%d).\n", __func__, (int) ret); 00328 TEST_ASSERT_MESSAGE(ret < ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00329 00330 ret = drv->Uninitialize(); 00331 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: Uninitialize() call failed.\n", __func__); 00332 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00333 return CaseNext; 00334 } 00335 00336 00337 /// @cond CFSTORE_DOXYGEN_DISABLE 00338 typedef struct cfstore_open_kv_name_ascii_node { 00339 uint32_t code; 00340 uint32_t f_allowed : 1; 00341 } cfstore_open_kv_name_ascii_node; 00342 /// @endcond 00343 00344 static const uint32_t cfstore_open_kv_name_ascii_table_code_sentinel_g = 256; 00345 00346 /*@brief table recording ascii character codes permitted in kv names */ 00347 static cfstore_open_kv_name_ascii_node cfstore_open_kv_name_ascii_table[] = 00348 { 00349 {0, false}, /* codes 0-44 not allowed */ 00350 {45, true}, /* codes 45-46 == [-.] allowed */ 00351 {47, false}, /* code 47 not allowed */ 00352 {48, true}, /* codes 48-57 not allowed */ 00353 {58, false}, /* codes 46-64 not allowed */ 00354 {64, true}, /* codes 64-91 allowed [@A-Z] */ 00355 {91, false}, /* code 91-96 not allowed */ 00356 {95, true}, /* code 95 allowed '_' */ 00357 {96, false}, /* codes 96 not allowed */ 00358 {97, true}, /* codes 65-90 allowed [A-Z] and {*/ 00359 {123, false}, /* codes 123 '}' not allowed on its own*/ 00360 {124, false}, /* codes 124 not allowed */ 00361 {125, false}, /* code 125 '}' not allowed on its own*/ 00362 {126, false}, /* codes 126-255 not allowed */ 00363 {cfstore_open_kv_name_ascii_table_code_sentinel_g, false}, /* sentinel */ 00364 }; 00365 00366 /// @cond CFSTORE_DOXYGEN_DISABLE 00367 enum cfstore_open_kv_name_pos { 00368 cfstore_open_kv_name_pos_start = 0x0, 00369 cfstore_open_kv_name_pos_mid, 00370 cfstore_open_kv_name_pos_end, 00371 cfstore_open_kv_name_pos_max 00372 }; 00373 /// @endcond 00374 00375 /** @brief test to call cfstore_open() with key_name that in includes 00376 * illegal characters 00377 * - the character(s) can be at the beginning of the key_name 00378 * - the character(s) can be at the end of the key_name 00379 * - the character(s) can be somewhere within the key_name string 00380 * - a max-length string of random characters (legal and illegal) 00381 * - a max-length string of random illegal characters only 00382 * 00383 * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. 00384 */ 00385 control_t cfstore_open_test_05_end(const size_t call_count) 00386 { 00387 bool f_allowed = false; 00388 char kv_name[CFSTORE_KEY_NAME_MAX_LENGTH+1]; /* extra char for terminating null */ 00389 uint32_t j = 0; 00390 int32_t ret = ARM_DRIVER_OK; 00391 size_t name_len = CFSTORE_KEY_NAME_MAX_LENGTH; 00392 ARM_CFSTORE_KEYDESC kdesc; 00393 cfstore_open_kv_name_ascii_node* node = NULL; 00394 uint32_t pos; 00395 ARM_CFSTORE_DRIVER* drv = &cfstore_driver; 00396 00397 CFSTORE_FENTRYLOG("%s:entered\n", __func__); 00398 (void) call_count; 00399 00400 #ifdef CFSTORE_DEBUG 00401 /* symbol only used why debug is enabled */ 00402 const char* pos_str = NULL; 00403 #endif 00404 00405 /* create bad keyname strings with invalid character code at start of keyname */ 00406 node = cfstore_open_kv_name_ascii_table; 00407 while(node->code != cfstore_open_kv_name_ascii_table_code_sentinel_g) 00408 { 00409 /* loop over range */ 00410 for(j = node->code; j < (node+1)->code; j++) 00411 { 00412 /* set the start, mid, last character of the name to the test char code */ 00413 for(pos = (uint32_t) cfstore_open_kv_name_pos_start; pos < (uint32_t) cfstore_open_kv_name_pos_max; pos++) 00414 { 00415 name_len = CFSTORE_KEY_NAME_MAX_LENGTH; 00416 memset(kv_name, 0, CFSTORE_KEY_NAME_MAX_LENGTH+1); 00417 memset(&kdesc, 0, sizeof(kdesc)); 00418 kdesc.drl = ARM_RETENTION_WHILE_DEVICE_ACTIVE; 00419 00420 ret = cfstore_test_kv_name_gen(kv_name, name_len); 00421 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: unable to generate kv_name.\n", __func__); 00422 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK , cfstore_open_utest_msg_g); 00423 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: kv_name incorrect length (len=%d, expected= %d).\n", __func__, (int) strlen(kv_name), (int) name_len); 00424 TEST_ASSERT_MESSAGE(strlen(kv_name) == name_len, cfstore_open_utest_msg_g); 00425 00426 /* overwrite a char at the pos start, mid, end of the kv_name with an ascii char code (both illegal and legal)*/ 00427 switch(pos) 00428 { 00429 case cfstore_open_kv_name_pos_start: 00430 kv_name[0] = (char) j; 00431 break; 00432 case cfstore_open_kv_name_pos_mid: 00433 /* create bad keyname strings with invalid character code in the middle of keyname */ 00434 kv_name[name_len/2] = (char) j; 00435 break; 00436 case cfstore_open_kv_name_pos_end: 00437 /* create bad keyname strings with invalid character code at end of keyname */ 00438 kv_name[name_len-1] = (char) j; 00439 break; 00440 default: 00441 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: unexpected value of pos (pos=%d).\n", __func__, (int) pos); 00442 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00443 break; 00444 } 00445 00446 #ifdef CFSTORE_DEBUG 00447 /* processing only required when debug trace enabled */ 00448 switch(pos) 00449 { 00450 case cfstore_open_kv_name_pos_start: 00451 pos_str = "start"; 00452 break; 00453 case cfstore_open_kv_name_pos_mid: 00454 pos_str = "middle"; 00455 break; 00456 case cfstore_open_kv_name_pos_end: 00457 pos_str = "end"; 00458 break; 00459 default: 00460 break; 00461 } 00462 #endif 00463 ret = cfstore_test_create(kv_name, kv_name, &name_len, &kdesc); 00464 00465 /* special cases */ 00466 switch(j) 00467 { 00468 case 0 : 00469 case 46 : 00470 switch(pos) 00471 { 00472 /* for code = 0 (null terminator). permitted at mid and end of string */ 00473 /* for code = 46 ('.'). permitted at mid and end of string but not at start */ 00474 case cfstore_open_kv_name_pos_start: 00475 f_allowed = false; 00476 break; 00477 case cfstore_open_kv_name_pos_mid: 00478 case cfstore_open_kv_name_pos_end: 00479 default: 00480 f_allowed = true; 00481 break; 00482 } 00483 break; 00484 default: 00485 f_allowed = node->f_allowed; 00486 break; 00487 } 00488 if(f_allowed == true) 00489 { 00490 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create KV in store when kv_name contains valid characters (code=%d, ret=%d).\n", __func__, (int) j, (int) ret); 00491 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00492 /* revert CFSTORE_LOG for more trace */ 00493 CFSTORE_DBGLOG("Successfully created a KV with valid keyname containing ascii character code %d (%c) at the %s of the keyname.\n", (int) j, (int) j, pos_str); 00494 CFSTORE_LOG("%c", '.'); 00495 00496 ret = cfstore_test_delete(kv_name); 00497 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to delete KV previously created (code=%d, ret=%d).\n", __func__, (int) j, (int) ret); 00498 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00499 } 00500 else 00501 { /*node->f_allowed == false => not allowed to create kv name with ascii code */ 00502 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: created KV in store when kv_name contains an invalid character (code=%d, ret=%d).\n", __func__, (int) j, (int) ret); 00503 TEST_ASSERT_MESSAGE(ret < ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00504 /* revert CFSTORE_LOG for more trace */ 00505 CFSTORE_DBGLOG("Successfully failed to create a KV with an invalid keyname containing ascii character code %d at the %s of the keyname.\n", (int) j, pos_str); 00506 CFSTORE_LOG("%c", '.'); 00507 } 00508 } 00509 } 00510 node++; 00511 } 00512 00513 CFSTORE_LOG("%c", '\n'); 00514 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: Uninitialize() call failed.\n", __func__); 00515 TEST_ASSERT_MESSAGE(drv->Uninitialize() >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00516 return CaseNext; 00517 } 00518 00519 00520 static const char cfstore_open_ascii_illegal_buf_g[] = "!\"�$%&'()*+,./:;<=>?@[\\]^_`{|}~"; /* 31 chars */ 00521 00522 /** @brief test to call cfstore_open() with key_name that in includes 00523 * illegal characters 00524 * - a max-length string of random illegal characters only 00525 * 00526 * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. 00527 */ 00528 control_t cfstore_open_test_06_end(const size_t call_count) 00529 { 00530 char kv_name[CFSTORE_KEY_NAME_MAX_LENGTH+1]; /* extra char for terminating null */ 00531 size_t i = 0; 00532 uint32_t pos = 0; 00533 int32_t ret = ARM_DRIVER_OK; 00534 size_t name_len = CFSTORE_KEY_NAME_MAX_LENGTH; 00535 ARM_CFSTORE_KEYDESC kdesc; 00536 size_t buf_data_max = 0; 00537 ARM_CFSTORE_DRIVER* drv = &cfstore_driver; 00538 00539 CFSTORE_FENTRYLOG("%s:entered\n", __func__); 00540 (void) call_count; 00541 00542 /* create bad keyname strings with invalid character code at start of keyname */ 00543 buf_data_max = strlen(cfstore_open_ascii_illegal_buf_g); 00544 name_len = CFSTORE_KEY_NAME_MAX_LENGTH; 00545 memset(kv_name, 0, CFSTORE_KEY_NAME_MAX_LENGTH+1); 00546 kdesc.drl = ARM_RETENTION_WHILE_DEVICE_ACTIVE; 00547 00548 /* generate a kv name of illegal chars*/ 00549 for(i = 0; i < name_len; i++) 00550 { 00551 pos = rand() % (buf_data_max+1); 00552 kv_name[i] = cfstore_open_ascii_illegal_buf_g[pos]; 00553 } 00554 00555 ret = cfstore_test_create(kv_name, kv_name, &name_len, &kdesc); 00556 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: created KV in store when kv_name contains invalid characters (ret=%d).\n", __func__, (int) ret); 00557 TEST_ASSERT_MESSAGE(ret < ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00558 00559 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: Uninitialize() call failed.\n", __func__); 00560 TEST_ASSERT_MESSAGE(drv->Uninitialize() >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00561 return CaseNext; 00562 } 00563 00564 /** @brief test to call cfstore_open() with key_name that in includes 00565 * illegal characters 00566 * - a max-length string of random characters (legal and illegal) 00567 * 00568 * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. 00569 */ 00570 control_t cfstore_open_test_07_end(const size_t call_count) 00571 { 00572 char kv_name[CFSTORE_KEY_NAME_MAX_LENGTH+1]; /* extra char for terminating null */ 00573 size_t i = 0; 00574 int32_t ret = ARM_DRIVER_OK; 00575 size_t name_len = CFSTORE_KEY_NAME_MAX_LENGTH; 00576 ARM_CFSTORE_KEYDESC kdesc; 00577 size_t buf_data_max = 0; 00578 ARM_CFSTORE_DRIVER* drv = &cfstore_driver; 00579 00580 CFSTORE_FENTRYLOG("%s:entered\n", __func__); 00581 (void) call_count; 00582 00583 /* create bad keyname strings with invalid character code at start of keyname */ 00584 buf_data_max = strlen(cfstore_open_ascii_illegal_buf_g); 00585 name_len = CFSTORE_KEY_NAME_MAX_LENGTH; 00586 memset(kv_name, 0, CFSTORE_KEY_NAME_MAX_LENGTH+1); 00587 kdesc.drl = ARM_RETENTION_WHILE_DEVICE_ACTIVE; 00588 00589 ret = cfstore_test_kv_name_gen(kv_name, name_len); 00590 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: unable to generate kv_name.\n", __func__); 00591 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK , cfstore_open_utest_msg_g); 00592 00593 /* pepper the illegal chars across the string*/ 00594 for(i++; i < buf_data_max; i++){ 00595 kv_name[rand() % (name_len+1)] = cfstore_open_ascii_illegal_buf_g[i]; 00596 } 00597 ret = cfstore_test_create(kv_name, kv_name, &name_len, &kdesc); 00598 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: created KV in store when kv_name contains invalid characters (ret=%d).\n", __func__, (int) ret); 00599 TEST_ASSERT_MESSAGE(ret < ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00600 00601 CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: Uninitialize() call failed.\n", __func__); 00602 TEST_ASSERT_MESSAGE(drv->Uninitialize() >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); 00603 return CaseNext; 00604 } 00605 00606 /// @cond CFSTORE_DOXYGEN_DISABLE 00607 utest::v1::status_t greentea_setup(const size_t number_of_cases) 00608 { 00609 GREENTEA_SETUP(CFSTORE_OPEN_GREENTEA_TIMEOUT_S, "default_auto"); 00610 return greentea_test_setup_handler(number_of_cases); 00611 } 00612 00613 Case cases[] = { 00614 /* 1 2 3 4 5 6 7 */ 00615 /* 1234567890123456789012345678901234567890123456789012345678901234567890 */ 00616 Case("OPEN_test_00", cfstore_open_test_00), 00617 Case("OPEN_test_01_start", cfstore_utest_default_start), 00618 Case("OPEN_test_01_end", cfstore_open_test_01_end), 00619 Case("OPEN_test_02_start", cfstore_utest_default_start), 00620 Case("OPEN_test_02_end", cfstore_open_test_02_end), 00621 Case("OPEN_test_03_start", cfstore_utest_default_start), 00622 Case("OPEN_test_03_end", cfstore_open_test_03_end), 00623 Case("OPEN_test_04_start", cfstore_utest_default_start), 00624 Case("OPEN_test_04_end", cfstore_open_test_04_end), 00625 Case("OPEN_test_05_start", cfstore_utest_default_start), 00626 Case("OPEN_test_05_end", cfstore_open_test_05_end), 00627 Case("OPEN_test_06_start", cfstore_utest_default_start), 00628 Case("OPEN_test_06_end", cfstore_open_test_06_end), 00629 Case("OPEN_test_07_start", cfstore_utest_default_start), 00630 Case("OPEN_test_07_end", cfstore_open_test_07_end), 00631 }; 00632 00633 00634 /* Declare your test specification with a custom setup handler */ 00635 Specification specification(greentea_setup, cases); 00636 00637 int main() 00638 { 00639 return !Harness::run(specification); 00640 } 00641 /// @endcond
Generated on Tue Jul 12 2022 14:24:31 by
