Marco Zecchini
/
Example_RTOS
Rtos API example
Embed:
(wiki syntax)
Show/hide line numbers
open.cpp
Go to the documentation of this file.
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 Sun Jul 17 2022 08:25:29 by 1.7.2