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.
find.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 */ 00019 00020 /** @file find.cpp Test cases to find KVs in the CFSTORE using the drv->Find() interface. 00021 * 00022 * Please consult the documentation under the test-case functions for 00023 * a description of the individual test case. 00024 */ 00025 00026 #include "mbed.h" 00027 #include "cfstore_config.h" 00028 #include "cfstore_test.h" 00029 #include "cfstore_debug.h" 00030 #include "Driver_Common.h" 00031 #include "configuration_store.h" 00032 #include "utest/utest.h" 00033 #include "unity/unity.h" 00034 #include "greentea-client/test_env.h" 00035 #include "cfstore_utest.h" 00036 00037 #include <stdio.h> 00038 #include <stdlib.h> 00039 #include <string.h> 00040 #include <assert.h> 00041 #include <inttypes.h> 00042 00043 using namespace utest::v1; 00044 00045 static char cfstore_find_utest_msg_g[CFSTORE_UTEST_MSG_BUF_SIZE]; 00046 00047 00048 00049 /* report whether built/configured for flash sync or async mode */ 00050 static control_t cfstore_find_test_00(const size_t call_count) 00051 { 00052 int32_t ret = ARM_DRIVER_ERROR; 00053 00054 (void) call_count; 00055 ret = cfstore_test_startup(); 00056 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret); 00057 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_find_utest_msg_g); 00058 return CaseNext; 00059 } 00060 00061 /** @brief test to call cfstore_find() with a key_name string that exceeds 00062 * the maximum length 00063 * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. 00064 */ 00065 control_t cfstore_find_test_01(const size_t call_count) 00066 { 00067 (void) call_count; 00068 /*todo: implement test */ 00069 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Warn: Not implemented\n", __func__); 00070 CFSTORE_DBGLOG("%s: WARN: requires implementation\n", __func__); 00071 TEST_ASSERT_MESSAGE(true, cfstore_find_utest_msg_g); 00072 return CaseNext; 00073 } 00074 00075 00076 /** @brief test to call cfstore_find() with key_name that in includes 00077 * illegal characters 00078 * - the character can be at the beginning of the key_name 00079 * - the character can be at the end of the key_name 00080 * - the character can be somewhere within the key_name string 00081 * 00082 * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. 00083 */ 00084 control_t cfstore_find_test_02(const size_t call_count) 00085 { 00086 /*todo: implement test 00087 * 00088 * specify the allowable characters in a set. 00089 * e.g. "0123456789ABCDEFGHIJKLMNOPQRSTUVQXYZabcdefghijklmnopqrstuvwxyz.[]*" 00090 * and use this set as the sell of allowable character codes. 00091 * All other 0-255 values for character codes should not be found in the key_name string 00092 * but the function should be tested for what happens in that case. 00093 * 00094 * Some code may be common here with other functions requiring a key_name e.g. cfstore_find( 00095 */ 00096 (void) call_count; 00097 /*todo: implement test */ 00098 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Warn: Not implemented\n", __func__); 00099 CFSTORE_DBGLOG("%s: WARN: requires implementation\n", __func__); 00100 TEST_ASSERT_MESSAGE(true, cfstore_find_utest_msg_g); 00101 return CaseNext; 00102 } 00103 00104 00105 /** @brief test to call cfstore_find() with key_name that in includes 00106 * illegal characters 00107 * - the character can be at the beginning of the key_name 00108 * - the character can be at the end of the key_name 00109 * - the character can be somewhere within the key_name string 00110 * 00111 * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. 00112 */ 00113 control_t cfstore_find_test_03_end(const size_t call_count) 00114 { 00115 char* read_buf = NULL; 00116 const uint8_t key_name_max_len = CFSTORE_KEY_NAME_MAX_LENGTH+1; 00117 char key_name_buf[key_name_max_len]; 00118 int32_t ret = ARM_DRIVER_ERROR; 00119 ARM_CFSTORE_SIZE len = 0; 00120 ARM_CFSTORE_SIZE max_len = 0; 00121 cfstore_kv_data_t* node; 00122 cfstore_kv_data_t* client_node = cfstore_test_init_1_data; 00123 ARM_CFSTORE_DRIVER* drv = &cfstore_driver; 00124 ARM_CFSTORE_KEYDESC kdesc; 00125 ARM_CFSTORE_HANDLE_INIT(prev); 00126 ARM_CFSTORE_HANDLE_INIT(next); 00127 00128 CFSTORE_DBGLOG("%s:entered\r\n", __func__); 00129 (void) call_count; 00130 memset(&kdesc, 0, sizeof(kdesc)); 00131 memset(key_name_buf, 0, CFSTORE_KEY_NAME_MAX_LENGTH+1); 00132 00133 /*scan for max length of value blob*/ 00134 node = client_node; 00135 while(node->key_name != NULL) 00136 { 00137 len = strlen(node->value); 00138 if(len > max_len){ 00139 max_len = len; 00140 } 00141 node++; 00142 } 00143 max_len++; /* space for a terminating null, if required */ 00144 read_buf = (char*) malloc(max_len); 00145 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Failed to allocated read buffer \r\n", __func__); 00146 TEST_ASSERT_MESSAGE(read_buf != NULL, cfstore_find_utest_msg_g); 00147 00148 ret = cfstore_test_init_1(); 00149 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to initialise cfstore area with entries\r\n", __func__); 00150 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_find_utest_msg_g); 00151 00152 /* now find and read back the key values */ 00153 ret = ARM_DRIVER_ERROR; 00154 node = client_node; 00155 while(node->key_name != NULL) 00156 { 00157 CFSTORE_DBGLOG("%s:About to find node (key_name=\"%s\", value=\"%s\")\r\n", __func__, node->key_name, node->value); 00158 ret = drv->Find(node->key_name, prev, next); 00159 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Failed to find node (key_name=\"%s\", value=\"%s\")\r\n", __func__, node->key_name, node->value); 00160 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_find_utest_msg_g); 00161 00162 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Find failed to return valid key handle\r\n", __func__); 00163 TEST_ASSERT_MESSAGE(next != NULL, cfstore_find_utest_msg_g); 00164 00165 ret = drv->GetValueLen(next, &len); 00166 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to write key (key_name=\"%s\", value=\"%s\")\r\n", __func__, node->key_name, node->value); 00167 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_find_utest_msg_g); 00168 00169 if(len > 0) { 00170 ret = drv->Read(next, read_buf, &len); 00171 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to read value (key_name=\"%s\", value=\"%s\")\r\n", __func__, node->key_name, node->value); 00172 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_find_utest_msg_g); 00173 00174 /* check read data is as expected */ 00175 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: Read value data (%s) != KV value data (key_name=\"%s\", value=\"%s\")\r\n", __func__, read_buf, node->key_name, node->value); 00176 TEST_ASSERT_MESSAGE(strncmp(read_buf, node->value, strlen(node->value)) == 0, cfstore_find_utest_msg_g); 00177 00178 } 00179 read_buf[len] = '\0'; 00180 /* revert to CFSTORE_LOG if more trace required */ 00181 CFSTORE_DBGLOG("Successfully found KV and read value data (key_name=\"%s\", value=\"%s\")\r\n", node->key_name, read_buf); 00182 memset(read_buf, 0, len); 00183 drv->Close(next); 00184 node++; 00185 } 00186 00187 ret = drv->Uninitialize(); 00188 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: Uninitialize() call failed.\n", __func__); 00189 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_find_utest_msg_g); 00190 return CaseNext; 00191 } 00192 00193 00194 /** @brief TODO: write test that uses cfstore_find_test_04_kv_data to grow {key, value} 00195 * from 1 char to 221 chars long. 00196 * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. 00197 */ 00198 /* 00199 * use this data: 00200 * static cfstore_kv_data_t cfstore_find_test_04_kv_data[] = { 00201 * { "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", "abcdefghjklmnopqrstuvwxyzabcdefghjklmnopqrstuvwxyzabcdefghjklmnopqrstuvwxyzabcdefghjklmnopqrstuvwxyzabcdefghjklmnopqrstuvwxyzabcdefghjklmnopqrstuvwxyzabcdefghjklmnopqrstuvwxyzabcdefghjklmnopqrstuvwxyzabcdefghjklmnopqrstuvwxyz"}, 00202 * { NULL, NULL}, 00203 * }; 00204 * 00205 */ 00206 control_t cfstore_find_test_04(const size_t call_count) 00207 { 00208 /*todo: implement test 00209 * 00210 * */ 00211 (void) call_count; 00212 /*todo: implement test */ 00213 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Warn: Not implemented\n", __func__); 00214 CFSTORE_DBGLOG("%s: WARN: requires implementation\n", __func__); 00215 TEST_ASSERT_MESSAGE(true, cfstore_find_utest_msg_g); 00216 return CaseNext; 00217 } 00218 00219 00220 /** 00221 * @brief function to test whether a key name is valid, can be added to the 00222 * cfstore and found by a wildcard string 00223 * 00224 * @param key_name 00225 * name of the key to create in the store 00226 * @param match 00227 * string to use to try and find key_name in the cfstore 00228 * @param should_find 00229 * if true, then 'match' should find 'key_name' in the store 00230 * if false, then 'match' should not find 'key_name' in the store 00231 * 00232 * @return status code 00233 * ARM_DRIVER_OK, the test passed successfully 00234 * ret < ARM_DRIVER_OK, the test failed with the return code 00235 * supplying more details 00236 */ 00237 static bool cfstore_find_key_name_validate(const char *key_name, const char *match, bool should_find) 00238 { 00239 bool bret = true; 00240 bool btest_status = false; 00241 char* test_data = (char*) "test_data"; 00242 int32_t ret = ARM_DRIVER_ERROR; 00243 ARM_CFSTORE_SIZE len = 0; 00244 ARM_CFSTORE_KEYDESC kdesc; 00245 00246 CFSTORE_FENTRYLOG("%s:entered\r\n", __func__); 00247 memset(&kdesc, 0, sizeof(kdesc)); 00248 00249 /* create */ 00250 kdesc.drl = ARM_RETENTION_WHILE_DEVICE_ACTIVE; 00251 len = strlen(test_data); 00252 ret = cfstore_test_create((const char*) key_name, test_data, &len, &kdesc); 00253 if(ret < ARM_DRIVER_OK){ 00254 CFSTORE_ERRLOG("%s:Error: failed to create kv (key_name=%s.\r\n", "cfstore_find_test_05_ex", key_name); 00255 return ret; 00256 } 00257 ret = cfstore_test_kv_is_found(match, &bret); 00258 if(ret < ARM_DRIVER_OK && ret != ARM_CFSTORE_DRIVER_ERROR_KEY_NOT_FOUND){ 00259 CFSTORE_ERRLOG("%s:Error: cfstore_test_kv_is_found() failed.\r\n", "cfstore_find_test_05_ex"); 00260 return ret; 00261 } 00262 /* dont not use any functions that require finding the created item as they may not work, 00263 * depending on the construction of the test key_name & match strings */ 00264 if(should_find == bret) 00265 { 00266 CFSTORE_DBGLOG("%s:Success: Find() behaved as expected.\r\n", "cfstore_find_test_05_ex"); 00267 btest_status = true; 00268 } 00269 else 00270 { 00271 CFSTORE_ERRLOG("cfstore_find_test_05_ex: Failed match on %s vs. %s\n", key_name, match); 00272 } 00273 /*delete using the actual name */ 00274 ret = cfstore_test_delete((const char*) key_name); 00275 if(ret < ARM_DRIVER_OK){ 00276 CFSTORE_ERRLOG("%s:Error: failed to delete kv (key_name=%s)(ret=%d).\r\n", "cfstore_find_test_05_ex", key_name, (int)ret); 00277 } 00278 return btest_status; 00279 } 00280 00281 00282 /// @cond CFSTORE_DOXYGEN_DISABLE 00283 typedef struct cfstore_find_key_name_validate_t { 00284 const char* key_name; 00285 const char* match; 00286 uint32_t f_allowed : 1; 00287 } cfstore_find_key_name_validate_t; 00288 00289 cfstore_find_key_name_validate_t cfstore_find_test_05_data[] = { 00290 { "yotta.hello-world.animal{wobbly-dog}{foot}backLeft", "yotta.hello-world.animal{*}{foot}backLeft", true}, 00291 { "yotta.hello-world.animal{wobbly-dog}{foot}backLeft", "yotta.hello-world.animal{wobbly-dog}{*}backLeft", true}, 00292 { "yotta.hello-world.animal{wobbly-dog}{foot}backLeft", "yotta.hello-world.animal{wobbly-dog}{*}*", true}, 00293 { "yotta.hello-world.animal{1}{foot}backLeft", "yotta.hello-world.animal{?}{foot}backLeft", false}, 00294 { "xyz", "xyz", true}, 00295 { "xyzijkXYZ", "XYZ", false}, 00296 { "xyzijkXYZ", "*XYZ", true}, 00297 { "xyzijkXYZ", "xyz*XYZ", true}, 00298 { "xyzijkXYZ", "*yz*XYZ", true}, 00299 { "xyzijkXYZ", "*ijk*", true}, 00300 { NULL, NULL, false}, 00301 }; 00302 /// @endcond 00303 00304 00305 /** @brief test whether a key name in the above table are valid, can be added to the 00306 * cfstore and found by a wildcard string 00307 * 00308 * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. 00309 */ 00310 control_t cfstore_find_test_05_end(const size_t call_count) 00311 { 00312 bool ret = false; 00313 int32_t ret32 = ARM_DRIVER_ERROR; 00314 ARM_CFSTORE_DRIVER* drv = &cfstore_driver; 00315 cfstore_find_key_name_validate_t* node = cfstore_find_test_05_data; 00316 00317 (void) call_count; 00318 00319 while(node->key_name != NULL) 00320 { 00321 ret = cfstore_find_key_name_validate(node->key_name, node->match, node->f_allowed); 00322 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: test failed (ret=%d)\n", __func__, (int) ret); 00323 TEST_ASSERT_MESSAGE(ret == true, cfstore_find_utest_msg_g); 00324 node++; 00325 } 00326 00327 ret32 = drv->Uninitialize(); 00328 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: Uninitialize() call failed.\n", __func__); 00329 TEST_ASSERT_MESSAGE(ret32 >= ARM_DRIVER_OK, cfstore_find_utest_msg_g); 00330 return CaseNext; 00331 } 00332 00333 00334 /// @cond CFSTORE_DOXYGEN_DISABLE 00335 #define CFSTORE_FIND_TEST_06_ENTRY_MATCH_03 { "0123456789abcdef0123456.yxxx.3", "abcdefghijklmnopqrstuvwxyz"} 00336 #define CFSTORE_FIND_TEST_06_ENTRY_MATCH_05 { "0123456789abcdef0123456.yxxx.5", "abcdefghijklmnopqrstuvwxyz"} 00337 #define CFSTORE_FIND_TEST_06_ENTRY_MATCH_07 { "0123456789abcdef0123456.yxxx.7", "abcdefghijklmnopqrstuvwxyz"} 00338 #define CFSTORE_FIND_TEST_06_ENTRY_MATCH_09 { "0123456789abcdef0123456.yxxx.9", "abcdefghijklmnopqrstuvwxyz"} 00339 00340 #define CFSTORE_FIND_TEST_06_ENTRY_NOMATCH_01 { "0123456789abcdef0123456.xxxx.1", "abcdefghijklmnopqrstuvwxyz"} 00341 #define CFSTORE_FIND_TEST_06_ENTRY_NOMATCH_02 { "0123456789abcdef0123456.xxxx.2", "abcdefghijklmnopqrstuvwxyz"} 00342 #define CFSTORE_FIND_TEST_06_ENTRY_NOMATCH_04 { "0123456789abcdef0123456.xxxx.4", "abcdefghijklmnopqrstuvwxyz"} 00343 #define CFSTORE_FIND_TEST_06_ENTRY_NOMATCH_06 { "0123456789abcdef0123456.xxxx.6", "abcdefghijklmnopqrstuvwxyz"} 00344 #define CFSTORE_FIND_TEST_06_ENTRY_NOMATCH_08 { "0123456789abcdef0123456.xxxx.8", "abcdefghijklmnopqrstuvwxyz"} 00345 #define CFSTORE_FIND_TEST_06_ENTRY_NOMATCH_10 { "0123456789abcdef0123456.xxxx.10", "abcdefghijklmnopqrstuvwxyz"} 00346 #define CFSTORE_FIND_TEST_06_ENTRY_NOMATCH_11 { "0123456789abcdef0123456.xxxx.11", "abcdefghijklmnopqrstuvwxyz"} 00347 00348 /* table 1: to initialise cfstore with CFSTORE_CREATE_TEST_01_TABLE_MID_ENTRY_01 */ 00349 static cfstore_kv_data_t cfstore_find_test_06_data[] = { 00350 CFSTORE_FIND_TEST_06_ENTRY_NOMATCH_01, 00351 CFSTORE_FIND_TEST_06_ENTRY_NOMATCH_02, 00352 CFSTORE_FIND_TEST_06_ENTRY_MATCH_03, 00353 CFSTORE_FIND_TEST_06_ENTRY_NOMATCH_04, 00354 CFSTORE_FIND_TEST_06_ENTRY_MATCH_05, 00355 CFSTORE_FIND_TEST_06_ENTRY_NOMATCH_06, 00356 CFSTORE_FIND_TEST_06_ENTRY_MATCH_07, 00357 CFSTORE_FIND_TEST_06_ENTRY_NOMATCH_08, 00358 CFSTORE_FIND_TEST_06_ENTRY_MATCH_09, 00359 CFSTORE_FIND_TEST_06_ENTRY_NOMATCH_10, 00360 CFSTORE_FIND_TEST_06_ENTRY_NOMATCH_11, 00361 { NULL, NULL}, 00362 }; 00363 00364 static cfstore_kv_data_t cfstore_find_test_06_data_match_results[] = { 00365 CFSTORE_FIND_TEST_06_ENTRY_MATCH_03, 00366 CFSTORE_FIND_TEST_06_ENTRY_MATCH_05, 00367 CFSTORE_FIND_TEST_06_ENTRY_MATCH_07, 00368 CFSTORE_FIND_TEST_06_ENTRY_MATCH_09, 00369 { NULL, NULL}, 00370 }; 00371 /// @endcond 00372 00373 00374 /** 00375 * @brief test to use find to find at least 2 entries in the cfstore, 00376 * but the query string doesnt match the last 2 entries in the 00377 * store. 00378 * 00379 * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. 00380 */ 00381 control_t cfstore_find_test_06_end(const size_t call_count) 00382 { 00383 const char* key_name_query = "0123456789abcdef0123456.y*"; 00384 char key_name[CFSTORE_KEY_NAME_MAX_LENGTH+1]; 00385 uint8_t len = CFSTORE_KEY_NAME_MAX_LENGTH+1; 00386 int32_t ret = ARM_DRIVER_ERROR; 00387 int32_t find_count = 0; 00388 ARM_CFSTORE_DRIVER* drv = &cfstore_driver; 00389 ARM_CFSTORE_HANDLE_INIT(next); 00390 ARM_CFSTORE_HANDLE_INIT(prev); 00391 cfstore_kv_data_t* node = NULL; 00392 00393 ret = cfstore_test_create_table(cfstore_find_test_06_data); 00394 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Failed to add cfstore_find_test_06_data table data (ret=%d).\n", __func__, (int) ret); 00395 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_find_utest_msg_g); 00396 00397 while((ret = drv->Find(key_name_query, prev, next)) == ARM_DRIVER_OK) 00398 { 00399 len = CFSTORE_KEY_NAME_MAX_LENGTH+1; 00400 ret = drv->GetKeyName(next, key_name, &len); 00401 if(ret < ARM_DRIVER_OK){ 00402 CFSTORE_ERRLOG("Error: failed to get key name%s", "\n"); 00403 break; 00404 } 00405 CFSTORE_LOG("%s:Found entry key_name=%s\n", __func__, key_name); 00406 node = cfstore_find_test_06_data_match_results; 00407 while(node->key_name != NULL){ 00408 if(strncmp(node->key_name, key_name, CFSTORE_KEY_NAME_MAX_LENGTH) == 0){ 00409 find_count++; 00410 break; 00411 } 00412 node++; 00413 } 00414 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: unable to find match in match table for %s.\n", __func__, key_name); 00415 TEST_ASSERT_MESSAGE(node->key_name != NULL, cfstore_find_utest_msg_g); 00416 00417 CFSTORE_HANDLE_SWAP(prev, next); 00418 } 00419 00420 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: find_count=%d doesnt match the number of entries in match table = %d.\n", __func__, (int) find_count, (int) (sizeof(cfstore_find_test_06_data_match_results)/sizeof(cfstore_kv_data_t))-1); 00421 TEST_ASSERT_MESSAGE(find_count == (sizeof(cfstore_find_test_06_data_match_results)/sizeof(cfstore_kv_data_t))-1, cfstore_find_utest_msg_g); 00422 00423 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: expected ret == ARM_CFSTORE_DRIVER_ERROR_KEY_NOT_FOUND, but ret = %d.\n", __func__, (int) ret); 00424 TEST_ASSERT_MESSAGE(ret == ARM_CFSTORE_DRIVER_ERROR_KEY_NOT_FOUND, cfstore_find_utest_msg_g); 00425 00426 ret = drv->Uninitialize(); 00427 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: Uninitialize() call failed.\n", __func__); 00428 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_find_utest_msg_g); 00429 return CaseNext; 00430 } 00431 00432 /** 00433 * @brief test case to check Find() with previous NULL pointer works 00434 * 00435 * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. 00436 */ 00437 control_t cfstore_find_test_07_end(const size_t call_count) 00438 { 00439 const char* key_name_query = "0123456789abcdef0123456.y*"; 00440 char key_name[CFSTORE_KEY_NAME_MAX_LENGTH+1]; 00441 uint8_t len = CFSTORE_KEY_NAME_MAX_LENGTH+1; 00442 int32_t ret = ARM_DRIVER_ERROR; 00443 int32_t find_count = 0; 00444 ARM_CFSTORE_DRIVER* drv = &cfstore_driver; 00445 ARM_CFSTORE_HANDLE_INIT(next); 00446 cfstore_kv_data_t* node = NULL; 00447 00448 ret = cfstore_test_create_table(cfstore_find_test_06_data); 00449 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Failed to add cfstore_find_test_06_data table data (ret=%d).\n", __func__, (int) ret); 00450 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_find_utest_msg_g); 00451 00452 while(true) 00453 { 00454 00455 ret = drv->Find(key_name_query, NULL, next); 00456 if(ret == ARM_CFSTORE_DRIVER_ERROR_KEY_NOT_FOUND) { 00457 /* no more attributes found matching search criteria.*/ 00458 break; 00459 } 00460 00461 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: Find() failed(ret=%d).\n", __func__, (int) ret); 00462 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_find_utest_msg_g); 00463 00464 len = CFSTORE_KEY_NAME_MAX_LENGTH+1; 00465 ret = drv->GetKeyName(next, key_name, &len); 00466 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to get key name for next (ret=%d).\n", __func__, (int) ret); 00467 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_find_utest_msg_g); 00468 00469 CFSTORE_LOG("%s:Found entry key_name=%s\n", __func__, key_name); 00470 node = cfstore_find_test_06_data_match_results; 00471 while(node->key_name != NULL){ 00472 if(strncmp(node->key_name, key_name, CFSTORE_KEY_NAME_MAX_LENGTH) == 0){ 00473 find_count++; 00474 break; 00475 } 00476 node++; 00477 } 00478 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: unable to find match in match table for %s.\n", __func__, key_name); 00479 TEST_ASSERT_MESSAGE(node->key_name != NULL, cfstore_find_utest_msg_g); 00480 00481 /* delete the KV so it wont be found when queried is repeated*/ 00482 ret = drv->Delete(next); 00483 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: Delete() on next handled failed(ret=%d).\n", __func__, (int) ret); 00484 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_find_utest_msg_g); 00485 00486 ret = drv->Close(next); 00487 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: Close() on next handled failed(ret=%d).\n", __func__, (int) ret); 00488 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_find_utest_msg_g); 00489 } 00490 00491 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: find_count=%d doesnt match the number of entries in match table = %d.\n", __func__, (int) find_count, (int) (sizeof(cfstore_find_test_06_data_match_results)/sizeof(cfstore_kv_data_t))-1); 00492 TEST_ASSERT_MESSAGE(find_count == (sizeof(cfstore_find_test_06_data_match_results)/sizeof(cfstore_kv_data_t))-1, cfstore_find_utest_msg_g); 00493 00494 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: expected ret == ret == ARM_CFSTORE_DRIVER_ERROR_KEY_NOT_FOUND, but ret = %d.\n", __func__, (int) ret); 00495 TEST_ASSERT_MESSAGE(ret == ARM_CFSTORE_DRIVER_ERROR_KEY_NOT_FOUND, cfstore_find_utest_msg_g); 00496 00497 ret = drv->Uninitialize(); 00498 CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: Uninitialize() call failed.\n", __func__); 00499 TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_find_utest_msg_g); 00500 return CaseNext; 00501 } 00502 00503 00504 /// @cond CFSTORE_DOXYGEN_DISABLE 00505 utest::v1::status_t greentea_setup(const size_t number_of_cases) 00506 { 00507 GREENTEA_SETUP(400, "default_auto"); 00508 return greentea_test_setup_handler(number_of_cases); 00509 } 00510 00511 Case cases[] = { 00512 /* 1 2 3 4 5 6 7 */ 00513 /* 1234567890123456789012345678901234567890123456789012345678901234567890 */ 00514 Case("FIND_test_00", cfstore_find_test_00), 00515 Case("FIND_test_01", cfstore_find_test_01), 00516 Case("FIND_test_02", cfstore_find_test_02), 00517 Case("FIND_test_03_start", cfstore_utest_default_start), 00518 Case("FIND_test_03_end", cfstore_find_test_03_end), 00519 Case("FIND_test_04", cfstore_find_test_04), 00520 Case("FIND_test_05_start", cfstore_utest_default_start), 00521 Case("FIND_test_05_end", cfstore_find_test_05_end), 00522 Case("FIND_test_06_start", cfstore_utest_default_start), 00523 Case("FIND_test_06_end", cfstore_find_test_06_end), 00524 Case("FIND_test_07_start", cfstore_utest_default_start), 00525 Case("FIND_test_07_end", cfstore_find_test_07_end), 00526 }; 00527 00528 00529 /* Declare your test specification with a custom setup handler */ 00530 Specification specification(greentea_setup, cases); 00531 00532 int main() 00533 { 00534 return !Harness::run(specification); 00535 } 00536 /// @endcond 00537
Generated on Tue Aug 9 2022 00:37:07 by
1.7.2