takashi kadono / Mbed OS Nucleo_446

Dependencies:   ssd1331

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers flush3.cpp Source File

flush3.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 flush3.cpp Test cases to flush KVs in the CFSTORE using the drv->Flush() interface.
00019  *
00020  * Please consult the documentation under the test-case functions for
00021  * a description of the individual test case.
00022  *
00023  * CFSTORE flash-journal sync mode test for github issue Heap Corruption by Jenia Kogan:
00024  *      https://github.com/ARMmbed/configuration-store/issues/17
00025  * No evidence of heap corruption has been found but the test case put together to
00026  * investiage that problem did result in a bug being found, that being that
00027  * when the last attribute was deleted from CFSTORE, this was not properly committed to
00028  * flash, so that CFSTORE was re-initialised, the old attribute was read back from
00029  * flash into the store. This has now been fixed.
00030  */
00031 
00032 #include "mbed.h"
00033 #include "cfstore_config.h"
00034 #include "Driver_Common.h"
00035 #include "cfstore_debug.h"
00036 #include "cfstore_test.h"
00037 #include "configuration_store.h"
00038 #include "utest/utest.h"
00039 #include "unity/unity.h"
00040 #include "greentea-client/test_env.h"
00041 
00042 
00043 #include <stdio.h>
00044 #include <stdlib.h>
00045 #include <string.h>
00046 #include <inttypes.h>
00047 
00048 using namespace utest::v1;
00049 
00050 static char cfstore_flush3_utest_msg_g[CFSTORE_UTEST_MSG_BUF_SIZE];
00051 
00052 /// @cond CFSTORE_DOXYGEN_DISABLE
00053 #ifdef CFSTORE_DEBUG
00054 #define CFSTORE_FLUSH3_GREENTEA_TIMEOUT_S     1000
00055 #else
00056 #define CFSTORE_FLUSH3_GREENTEA_TIMEOUT_S     100
00057 #endif
00058 /// @endcond
00059 
00060 /* used for sync mode build only */
00061 #if defined STORAGE_DRIVER_CONFIG_HARDWARE_MTD_ASYNC_OPS && STORAGE_DRIVER_CONFIG_HARDWARE_MTD_ASYNC_OPS==0
00062 
00063 #define CFSTORE_UNUSED_PARAM(param)      (void)(param)
00064 
00065 int32_t cfstore_flush3_end(void)
00066 {
00067     int32_t cfsStatus;
00068     ARM_CFSTORE_DRIVER *cfstoreDriver = &cfstore_driver;
00069 
00070     CFSTORE_DBGLOG("%s:IN\n", __func__);
00071     cfsStatus = cfstoreDriver->Uninitialize();
00072     if(cfsStatus < ARM_DRIVER_OK){
00073         CFSTORE_DBGLOG("CFStore Finalization failed (err %ld)\n", cfsStatus);
00074         return ARM_DRIVER_ERROR;
00075     }
00076     CFSTORE_DBGLOG("%s:OUT:returning ARM_DRIVER_OK\n", __func__);
00077     return ARM_DRIVER_OK;
00078 }
00079 
00080 
00081 int32_t cfstore_flush3_delete_file(const char *fileDir, size_t maxFilePathSize, const char *fileName)
00082 {
00083     int32_t cfsStatus;
00084     int32_t status = ARM_DRIVER_OK;
00085 
00086     ARM_CFSTORE_DRIVER *cfstoreDriver = &cfstore_driver;
00087     ARM_CFSTORE_FMODE flags;
00088     ARM_CFSTORE_HANDLE_INIT(hkey);
00089 
00090     CFSTORE_DBGLOG("%s:IN. File name %s\n", __func__, fileName);
00091 
00092     CFSTORE_UNUSED_PARAM(fileDir);
00093     CFSTORE_UNUSED_PARAM(maxFilePathSize);
00094 
00095     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Uninitialize Cfstore\n", __func__);
00096     TEST_ASSERT_MESSAGE(cfstoreDriver != NULL, cfstore_flush3_utest_msg_g);
00097 
00098     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Invalid file name\n", __func__);
00099     TEST_ASSERT_MESSAGE(fileName != NULL, cfstore_flush3_utest_msg_g);
00100 
00101     memset(&flags, 0, sizeof(flags));
00102     flags.write = true;
00103     cfsStatus = cfstoreDriver->Open(fileName, flags, hkey);
00104     if (cfsStatus == ARM_CFSTORE_DRIVER_ERROR_KEY_NOT_FOUND) {
00105         /* printf added: modification to original code supplied by Jenia Kogan. */
00106         CFSTORE_DBGLOG("%s: cfsStatus == ARM_CFSTORE_DRIVER_ERROR_KEY_NOT_FOUND. returning success\n", __func__);
00107         return ARM_DRIVER_OK;
00108     }
00109     if(cfsStatus < ARM_DRIVER_OK){
00110         CFSTORE_DBGLOG("Open failed (err %ld)\n", cfsStatus);
00111         return ARM_DRIVER_ERROR;
00112     }
00113     cfsStatus = cfstoreDriver->Delete(hkey);
00114     if(cfsStatus < ARM_DRIVER_OK){
00115         CFSTORE_DBGLOG("Failed deleting (%s) failed (err %ld)\n", fileName, cfsStatus);
00116         status = ARM_DRIVER_ERROR;
00117         goto out;
00118     }
00119 out:
00120     cfsStatus = cfstoreDriver->Close(hkey);
00121     if(cfsStatus < ARM_DRIVER_OK){
00122         CFSTORE_DBGLOG("Close failed (err %ld)\n", cfsStatus);
00123         return ARM_DRIVER_ERROR;
00124     }
00125     /* Flash-to-flash only on success */
00126     if (status == ARM_DRIVER_OK) {
00127         cfsStatus = cfstoreDriver->Flush();
00128         if(cfsStatus < ARM_DRIVER_OK){
00129             CFSTORE_DBGLOG("Flush to flash failed (err %ld)\n", cfsStatus);
00130             return ARM_DRIVER_ERROR;
00131         }
00132     }
00133     CFSTORE_DBGLOG("%s:OUT: status=%d\n", __func__, (int) status);
00134     return status;
00135 }
00136 
00137 
00138 int32_t cfstore_flush3_read_file(const char *fileDir, size_t maxFilePathSize, const char *fileName, uint8_t *buff, size_t buffSize)
00139 {
00140     int32_t cfsStatus;
00141     int32_t status = ARM_DRIVER_OK;
00142 
00143     ARM_CFSTORE_DRIVER *cfstoreDriver = &cfstore_driver;
00144     ARM_CFSTORE_FMODE flags;
00145     ARM_CFSTORE_SIZE readCount = buffSize;
00146     ARM_CFSTORE_HANDLE_INIT(hkey);
00147 
00148     CFSTORE_DBGLOG("%s:IN. File name %s, buffer %p, buffsize %d\n", __func__, fileName, buff, buffSize);
00149 
00150     CFSTORE_UNUSED_PARAM(fileDir);
00151     CFSTORE_UNUSED_PARAM(maxFilePathSize);
00152 
00153     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Uninitialize Cfstore\n", __func__);
00154     TEST_ASSERT_MESSAGE(cfstoreDriver != NULL, cfstore_flush3_utest_msg_g);
00155 
00156     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Invalid file name\n", __func__);
00157     TEST_ASSERT_MESSAGE(fileName != NULL, cfstore_flush3_utest_msg_g);
00158 
00159     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Invalid buff\n", __func__);
00160     TEST_ASSERT_MESSAGE(buff != NULL, cfstore_flush3_utest_msg_g);
00161 
00162     memset(&flags, 0, sizeof(flags));
00163     flags.read = true;
00164 
00165     cfsStatus = cfstoreDriver->Open(fileName, flags, hkey);
00166     if(cfsStatus == ARM_CFSTORE_DRIVER_ERROR_KEY_NOT_FOUND){
00167         CFSTORE_DBGLOG("File (%s) not found (err %ld)\n", fileName, cfsStatus);
00168         return ARM_CFSTORE_DRIVER_ERROR_KEY_NOT_FOUND;
00169 
00170     }
00171     if(cfsStatus < ARM_DRIVER_OK){
00172         CFSTORE_DBGLOG("Open failed (err %ld)\n", cfsStatus);
00173         return ARM_DRIVER_ERROR;
00174     }
00175     cfsStatus = cfstoreDriver->Read(hkey, buff, &readCount);
00176     if(cfsStatus < ARM_DRIVER_OK){
00177         CFSTORE_DBGLOG("Read failed (err %ld)\n", cfsStatus);
00178         status = ARM_DRIVER_ERROR;
00179         goto out;
00180     }
00181     if(readCount < buffSize){
00182         CFSTORE_DBGLOG("Read failed, amount is %zu while requested %zu\n", readCount, buffSize);
00183         status = ARM_DRIVER_ERROR;
00184         goto out;
00185     }
00186 out:
00187     cfsStatus = cfstoreDriver->Close(hkey);
00188     if(cfsStatus < ARM_DRIVER_OK){
00189         CFSTORE_DBGLOG("Close failed (err %ld)\n", cfsStatus);
00190         return ARM_DRIVER_ERROR;
00191     }
00192     CFSTORE_DBGLOG("%s:OUT: status=%d\n", __func__, (int) status);
00193     return status;
00194 }
00195 
00196 int32_t cfstore_flush3_write_file(const char *fileDir, size_t maxFilePathSize, const char *fileName, const uint8_t *buff, size_t buffSize)
00197 {
00198     int32_t cfsStatus;
00199     int32_t status = ARM_DRIVER_ERROR;
00200 
00201     ARM_CFSTORE_DRIVER *cfstoreDriver = &cfstore_driver;
00202     ARM_CFSTORE_SIZE writeCount = buffSize;
00203     ARM_CFSTORE_KEYDESC keyDesc;
00204     ARM_CFSTORE_HANDLE_INIT(hkey);
00205 
00206     CFSTORE_DBGLOG("%s:IN. File name %s, buffer %p, buffsize %d\n", __func__, fileName, buff, buffSize);
00207 
00208     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Uninitialize Cfstore\n", __func__);
00209     TEST_ASSERT_MESSAGE(cfstoreDriver != NULL, cfstore_flush3_utest_msg_g);
00210 
00211     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Invalid file name\n", __func__);
00212     TEST_ASSERT_MESSAGE(fileName != NULL, cfstore_flush3_utest_msg_g);
00213 
00214     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Invalid buff\n", __func__);
00215     TEST_ASSERT_MESSAGE(buff != NULL, cfstore_flush3_utest_msg_g);
00216 
00217     /* We always deleting the old file and recreating a new one to preserve simplicity */
00218     CFSTORE_DBGLOG("Before delete%s", "\n");
00219 
00220     /* Delete the old file */
00221     status = cfstore_flush3_delete_file(fileDir, maxFilePathSize, fileName);
00222     if(status != ARM_DRIVER_OK){
00223         CFSTORE_DBGLOG("Failed deleting (%s)\n", fileName);
00224         return status;
00225     }
00226 
00227     CFSTORE_DBGLOG("After delete%s", "\n");
00228     /* Create a new file */
00229     memset(&keyDesc, 0, sizeof(keyDesc));
00230     keyDesc.drl = ARM_RETENTION_NVM;
00231     keyDesc.flags.read = true;
00232     keyDesc.flags.write = true;
00233     cfsStatus = cfstoreDriver->Create(fileName, buffSize, &keyDesc, hkey);
00234     if(cfsStatus < ARM_DRIVER_OK){
00235         CFSTORE_DBGLOG("Fail creating (%s) key-store (%ld)\n", fileName, cfsStatus);
00236         return ARM_DRIVER_ERROR;
00237     }
00238     CFSTORE_DBGLOG("After create%s", "\n");
00239     cfsStatus = cfstoreDriver->Write(hkey, (const char *)buff, &writeCount);
00240     if(cfsStatus < ARM_DRIVER_OK){
00241         CFSTORE_DBGLOG("Write failed (err %ld)\n", cfsStatus);
00242         status = ARM_DRIVER_ERROR;
00243         goto out;
00244     }
00245     if(writeCount != buffSize){
00246         CFSTORE_DBGLOG("Write failed, amount is %d while requested is %d\n", (int)writeCount, (int)buffSize);
00247         status = ARM_DRIVER_ERROR;
00248         goto out;
00249     }
00250     CFSTORE_DBGLOG("After write%s", "\n");
00251 out:
00252     cfsStatus = cfstoreDriver->Close(hkey);
00253     if(cfsStatus < ARM_DRIVER_OK){
00254         CFSTORE_DBGLOG("Close failed (err %ld)\n", cfsStatus);
00255         return ARM_DRIVER_ERROR;
00256     }
00257     CFSTORE_DBGLOG("After close%s", "\n");
00258     /* Flash-to-flash only on success */
00259     if (status == ARM_DRIVER_OK) {
00260         cfsStatus = cfstoreDriver->Flush();
00261         if(cfsStatus < ARM_DRIVER_OK){
00262             CFSTORE_DBGLOG("Flush to flash failed(err %ld)\n", cfsStatus);
00263             return ARM_DRIVER_ERROR;
00264         }
00265         CFSTORE_DBGLOG("After flush%s", "\n");
00266     }       
00267     CFSTORE_DBGLOG("%s:OUT: status=%d\n", __func__, (int) status);
00268     return status;
00269 }
00270 
00271 
00272 int32_t cfstore_flush3_start(void)
00273 {
00274     int32_t status = ARM_DRIVER_OK;
00275     int32_t cfsStatus;
00276     ARM_CFSTORE_DRIVER *cfstoreDriver = &cfstore_driver;
00277     ARM_CFSTORE_CAPABILITIES caps;
00278 
00279     CFSTORE_DBGLOG("%s:IN\n", __func__);
00280 
00281     /* Initialize configuration store */
00282     cfsStatus = cfstoreDriver->Initialize(NULL, NULL);
00283     if(cfsStatus < ARM_DRIVER_OK){
00284         CFSTORE_DBGLOG("CFStore Initialization failed (err %lu)\n", cfsStatus);
00285         return ARM_DRIVER_ERROR;
00286     }
00287     /* Get capabilities */
00288     memset(&caps, 0, sizeof(caps));
00289     caps = cfstoreDriver->GetCapabilities();
00290     if(caps.asynchronous_ops == true){
00291         CFSTORE_DBGLOG("%s:Please configure CFstore to work in synchronous mode. This can be change in config.json file.\n", __func__);
00292         status = ARM_DRIVER_ERROR;
00293         goto out;
00294     }
00295     CFSTORE_DBGLOG("%s:OUT: returning ARM_DRIVER_OK\n", __func__);
00296     return ARM_DRIVER_OK; /* init succeeded */
00297 
00298 out:
00299     /* init failed */
00300     (void) cfstore_flush3_end();
00301     CFSTORE_DBGLOG("%s:OUT: status=%d\n", __func__, (int) status);
00302     return status;
00303 }
00304 
00305 int32_t cfstore_flush3_check_data(uint8_t* data, int32_t len, uint8_t val)
00306 {
00307     int i;
00308     for(i = 0; i < len; i++) {
00309         if(data[i] != val){
00310             /* found byte which doesnt have the expected data value */
00311             return ARM_DRIVER_ERROR;
00312         }
00313     }
00314     return ARM_DRIVER_OK;
00315 }
00316 
00317 /* @brief   test case to recreate the transactions documented in the
00318  *          issue 17 trace log.
00319  *
00320  * the test case was created by recreating the entries found in the
00321  * log report grepped from the trace log attached to githug issue 17:
00322  *  20160622_1321_grep_pv_configuration_store_issue_17_heap_corruption.txt
00323  *
00324  * This is what the test is intended to do:
00325  *  - A (setup)
00326  *  - cfstore_flush3_start
00327  *  - cfstore_flush3_write_file(com.arm.mbed.spv.sst.meta, len: 2280) to create KV
00328  *  - cfstore_flush3_write_file(com.arm.mbed.spv.sst.node.0, len: 220) to create KV
00329  *  - cfstore_flush3_end
00330  *  - B (setup?)
00331  *  - cfstore_flush3_start
00332  *  - cfstore_flush3_read_file(com.arm.mbed.spv.sst.meta)
00333  *  - cfstore_flush3_read_file(com.arm.mbed.spv.sst.node.0)
00334  *  - cfstore_flush3_end
00335  *  - C (delete everything)
00336  *  - cfstore_flush3_start
00337  *  - cfstore_flush3_delete_file(com.arm.mbed.spv.sst.node.0). this will work as the KV is present
00338  *  - cfstore_flush3_delete_file(com.arm.mbed.spv.sst.node.x) where x = {1..29}
00339  *  - cfstore_flush3_delete_file(name com.arm.mbed.spv.sst.meta).
00340  *      - this should work as the KV is present
00341  *      - however, its is seen to fail in the trace log for the issue.
00342  *  - cfstore_flush3_end
00343  *  - D
00344  *  - cfstore_flush3_start
00345  *  - cfstore_flush3_read_file(com.arm.mbed.spv.sst.meta). readd 2280 bytes and check correct
00346  *      - this should fail as the kv has been deleted.
00347  *  - cfstore_flush3_write_file(com.arm.mbed.spv.sst.node.0, len: 220) to create KV
00348  *  - cfstore_flush3_write_file(com.arm.mbed.spv.sst.meta, len: 2280) to create KV
00349  *  - cfstore_flush3_end
00350  *  - E
00351  *  - run C-D again, to delete everything
00352  *  - F
00353  *  - cfstore_flush3_start
00354  *  - cfstore_flush3_read_file(com.arm.mbed.spv.sst.meta). readd 2280 bytes and check correct
00355  *      - this should fail as the kv has been deleted.
00356  *  - cfstore_flush3_write_file(com.arm.mbed.spv.sst.node.0, len: 220) to create KV
00357  *  - cfstore_flush3_write_file(com.arm.mbed.spv.sst.meta, len: 2280) to create KV
00358  *  - cfstore_flush3_write_file(com.arm.mbed.spv.sst.node.0, len: 816) to create KV
00359  *  - cfstore_flush3_write_file(com.arm.mbed.spv.sst.meta, len: 2280) to create KV
00360  *  - cfstore_flush3_write_file(com.arm.mbed.spv.sst.node.1, len: 217) to create KV
00361  *  - cfstore_flush3_write_file(com.arm.mbed.spv.sst.meta, len: 2280) to create KV
00362  *  - cfstore_flush3_write_file(com.arm.mbed.spv.sst.node.0, len: 818) to create KV
00363  *  - cfstore_flush3_write_file(com.arm.mbed.spv.sst.meta, len: 2280) to create KV
00364  *  - cfstore_flush3_end
00365  *  - G
00366  *  - cfstore_flush3_start
00367  *  - cfstore_flush3_read_file(com.arm.mbed.spv.sst.meta) 2280 bytes should be read
00368  *  - cfstore_flush3_read_file(com.arm.mbed.spv.sst.node.0) 818 bytes should be read
00369  *  - cfstore_flush3_read_file(com.arm.mbed.spv.sst.node.1) 217 bytes should be read
00370  *  - cfstore_flush3_read_file(com.arm.mbed.spv.sst.node.1) 217 bytes should be read
00371  *  - cfstore_flush3_read_file(com.arm.mbed.spv.sst.node.1) 217 bytes should be read
00372  *  - cfstore_flush3_read_file(com.arm.mbed.spv.sst.node.1) 217 bytes should be read
00373  *  - cfstore_flush3_write_file(com.arm.mbed.spv.sst.node.2, len: 235) to create KV
00374  *  - cfstore_flush3_write_file(com.arm.mbed.spv.sst.meta, len: 2280) to create KV
00375  *  - cfstore_flush3_end
00376  *
00377  *  The issue reported heap corruption. To this end, a heap buffer
00378  *  is allocated and checked as a canary against heap corruption
00379  */
00380 
00381 #define CFSTORE_FLUSH3_TEST_DATA_CHAR      'A'         /* 0b1010 bit pattern */
00382 #define CFSTORE_FLUSH3_HEAP_DATA_CHAR      'Z'
00383 #define CFSTORE_FLUSH3_TEST_DATA_BUF_LEN   3000        /* 2280 was the largest buffer used*/
00384 
00385 #ifdef TARGET_K64F
00386 #define CFSTORE_FLUSH3_TEST_HEAP_BUF_LEN   87500       /* alloc a heap buffer to use up some memory: value tuned to K64F */
00387 #else
00388 #define CFSTORE_FLUSH3_TEST_HEAP_BUF_LEN   1000        /* alloc a heap buffer to use up some memory (minimal for non-k64f targets until tuned */
00389 #endif /* TARGET_K64F */
00390 
00391 static control_t cfstore_flush3_test_01(const size_t call_count)
00392 {
00393     int32_t i;
00394     int32_t ret = ARM_DRIVER_ERROR;
00395     const char* kv_name_root = "com.arm.mbed.spv.sst";
00396     const char* kv_name_node= "node";
00397     const char* kv_name_meta= "meta";
00398     char kv_name[CFSTORE_KEY_NAME_MAX_LENGTH+1];
00399     uint8_t data[CFSTORE_FLUSH3_TEST_DATA_BUF_LEN];
00400     void* heap_buf = NULL;
00401 
00402     (void) call_count;
00403     heap_buf = malloc(CFSTORE_FLUSH3_TEST_HEAP_BUF_LEN);
00404     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  malloc() failed .\n", __func__);
00405     TEST_ASSERT_MESSAGE(heap_buf != NULL, cfstore_flush3_utest_msg_g);
00406     memset(heap_buf, CFSTORE_FLUSH3_HEAP_DATA_CHAR, CFSTORE_FLUSH3_TEST_HEAP_BUF_LEN);
00407 
00408     CFSTORE_DBGLOG("%s: - A (setup)\n", __func__);
00409     CFSTORE_DBGLOG("%s: - cfstore_flush3_start\n", __func__);
00410     ret = cfstore_flush3_start();
00411     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  A.1 cfstore_flush3_start() failed (ret=%d).\n", __func__, (int) ret);
00412     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00413 
00414     CFSTORE_DBGLOG("%s: cfstore_flush3_write_file(com.arm.mbed.spv.sst.meta, len: 2280) to create KV\n", __func__);
00415     memset(data, CFSTORE_FLUSH3_TEST_DATA_CHAR, CFSTORE_FLUSH3_TEST_DATA_BUF_LEN);
00416     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s", (char*) kv_name_root, kv_name_meta);
00417     ret = cfstore_flush3_write_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name, (const uint8_t*) data, 2280);
00418     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  A.2 cfstore_flush3_write_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00419     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00420 
00421     CFSTORE_DBGLOG("%s: cfstore_flush3_write_file(com.arm.mbed.spv.sst.node.0, len: 220) to create KV\n", __func__);
00422     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s.0", (char*) kv_name_root, (char*) kv_name_node);
00423     ret = cfstore_flush3_write_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name, (const uint8_t*) data, 220);
00424     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  A.3 cfstore_flush3_write_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00425     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00426 
00427     CFSTORE_DBGLOG("%s: - cfstore_flush3_end\n", __func__);
00428     ret = cfstore_flush3_end();
00429     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  A.4 cfstore_flush3_end() failed (ret=%d).\n", __func__, (int) ret);
00430     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00431 
00432     CFSTORE_DBGLOG("%s: check for heap corruption\n", __func__);
00433     ret = cfstore_flush3_check_data((uint8_t*) heap_buf, CFSTORE_FLUSH3_TEST_HEAP_BUF_LEN, CFSTORE_FLUSH3_HEAP_DATA_CHAR);
00434     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  A.5 cfstore_flush3_check_data() failed for heap (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00435     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00436 
00437     CFSTORE_DBGLOG("%s: - B\n", __func__);
00438     CFSTORE_DBGLOG("%s: - cfstore_flush3_start\n", __func__);
00439     ret = cfstore_flush3_start();
00440     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  B.1 cfstore_flush3_start() failed (ret=%d).\n", __func__, (int) ret);
00441     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00442 
00443     CFSTORE_DBGLOG("%s: cfstore_flush3_read_file(com.arm.mbed.spv.sst.meta). read 2280\n", __func__);
00444     memset(data, 0, CFSTORE_FLUSH3_TEST_DATA_BUF_LEN);
00445     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s", (char*) kv_name_root, (char*) kv_name_meta);
00446     ret = cfstore_flush3_read_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name, data, 2280);
00447     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  B.2 cfstore_flush3_read_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00448     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00449 
00450     ret = cfstore_flush3_check_data(data, 2280, CFSTORE_FLUSH3_TEST_DATA_CHAR);
00451     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  B.3 cfstore_flush3_check_data() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00452     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00453 
00454     CFSTORE_DBGLOG("%s: cfstore_flush3_read_file(com.arm.mbed.spv.sst.node.0). read 220\n", __func__);
00455     memset(data, 0, CFSTORE_FLUSH3_TEST_DATA_BUF_LEN);
00456     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s.0", (char*) kv_name_root, (char*) kv_name_node);
00457     ret = cfstore_flush3_read_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name, data, 220);
00458     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  B.4 cfstore_flush3_read_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00459     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00460 
00461     ret = cfstore_flush3_check_data(data, 220, CFSTORE_FLUSH3_TEST_DATA_CHAR);
00462     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  B.5 cfstore_flush3_check_data() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00463     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00464 
00465     CFSTORE_DBGLOG("%s: - cfstore_flush3_end\n", __func__);
00466     ret = cfstore_flush3_end();
00467     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  B.6 cfstore_flush3_end() failed (ret=%d).\n", __func__, (int) ret);
00468     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00469 
00470     CFSTORE_DBGLOG("%s: check for heap corruption\n", __func__);
00471     ret = cfstore_flush3_check_data((uint8_t*) heap_buf, CFSTORE_FLUSH3_TEST_HEAP_BUF_LEN, CFSTORE_FLUSH3_HEAP_DATA_CHAR);
00472     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  B.7 cfstore_flush3_check_data() failed for heap (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00473     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00474 
00475     CFSTORE_DBGLOG("%s: - C (delete everything)\n", __func__);
00476     CFSTORE_DBGLOG("%s: - cfstore_flush3_start\n", __func__);
00477     ret = cfstore_flush3_start();
00478     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  C.1 cfstore_flush3_start() failed (ret=%d).\n", __func__, (int) ret);
00479     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00480 
00481     CFSTORE_DBGLOG("%s: cfstore_flush3_delete_file(com.arm.mbed.spv.sst.node.0). this will work as the KV is present\n", __func__);
00482     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s.0", (char*) kv_name_root, (char*) kv_name_node);
00483     ret = cfstore_flush3_delete_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name);
00484     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  C.2 cfstore_flush3_delete_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00485     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00486 
00487     CFSTORE_DBGLOG("%s: cfstore_flush3_delete_file(com.arm.mbed.spv.sst.node.x) where x = {1..29}, each of which should fail\n", __func__);
00488     for(i = 1; i <= 29; i++){
00489         snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s.%d", (char*) kv_name_root, (char*) kv_name_node, (int) i);
00490         ret = cfstore_flush3_delete_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name);
00491         CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  C.%d cfstore_flush3_delete_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) i+2, (int) ret, kv_name);
00492         /* The delete operations are expected to fail as the keys dont exist
00493          * but cfstore_flush3_delete_file() returns ARM_DRIVER_OK when key isnt found, so cant test the return code.
00494          */
00495         TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00496     }
00497 
00498     CFSTORE_DBGLOG("%s: cfstore_flush3_delete_file(name com.arm.mbed.spv.sst.meta). this is expected to succeed as the KV is present\n", __func__);
00499     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s", (char*) kv_name_root, (char*) kv_name_meta);
00500     ret = cfstore_flush3_delete_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name);
00501     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  C.32 cfstore_flush3_delete_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00502     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00503 
00504 #ifdef CFSTORE_DEBUG
00505     CFSTORE_DBGLOG("%s: cfstore_test_dump: dump here contents of CFSTORE so we know whats present\n", __func__);
00506     ret = cfstore_test_dump();
00507     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  D.1.1 cfstore_test_dump failed (ret=%d).\n", __func__, (int) ret);
00508     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00509 #endif  /* CFSTORE_DEBUG */
00510 
00511     CFSTORE_DBGLOG("%s: - cfstore_flush3_end\n", __func__);
00512     ret = cfstore_flush3_end();
00513     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  C.33 cfstore_flush3_end() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00514     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00515 
00516     CFSTORE_DBGLOG("%s: check for heap corruption\n", __func__);
00517     ret = cfstore_flush3_check_data((uint8_t*) heap_buf, CFSTORE_FLUSH3_TEST_HEAP_BUF_LEN, CFSTORE_FLUSH3_HEAP_DATA_CHAR);
00518     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  C.34 cfstore_flush3_check_data() failed for heap (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00519     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00520 
00521     CFSTORE_DBGLOG("%s: - D\n", __func__);
00522     CFSTORE_DBGLOG("%s: - cfstore_flush3_start\n", __func__);
00523     ret = cfstore_flush3_start();
00524     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  D.1 cfstore_flush3_start() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00525     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00526 
00527 #ifdef CFSTORE_DEBUG
00528     CFSTORE_DBGLOG("%s: cfstore_test_dump: dump here contents of CFSTORE so we know whats present\n", __func__);
00529     ret = cfstore_test_dump();
00530     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  D.1.1 cfstore_test_dump failed (ret=%d).\n", __func__, (int) ret);
00531     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00532 #endif  /* CFSTORE_DEBUG */
00533 
00534     CFSTORE_DBGLOG("%s: cfstore_flush3_read_file(com.arm.mbed.spv.sst.meta). this should fail as the kv has been deleted.\n", __func__);
00535     memset(data, 0, CFSTORE_FLUSH3_TEST_DATA_BUF_LEN);
00536     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s", (char*) kv_name_root, (char*) kv_name_meta);
00537     ret = cfstore_flush3_read_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name, data, 2280);
00538     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  D.2 cfstore_flush3_read_file() succeeded when expected to fail (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00539     TEST_ASSERT_MESSAGE(ret < ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00540 
00541     CFSTORE_DBGLOG("%s: cfstore_flush3_write_file(com.arm.mbed.spv.sst.node.0, len: 220) to create KV.\n", __func__);
00542     memset(data, CFSTORE_FLUSH3_TEST_DATA_CHAR, CFSTORE_FLUSH3_TEST_DATA_BUF_LEN);
00543     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s.0", (char*) kv_name_root, (char*) kv_name_node);
00544     ret = cfstore_flush3_write_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name, (const uint8_t*) data, 220);
00545     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  D.3 cfstore_flush3_write_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00546     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00547 
00548     CFSTORE_DBGLOG("%s: cfstore_flush3_write_file(com.arm.mbed.spv.sst.meta, len: 2280) to create KV.\n", __func__);
00549     memset(data, CFSTORE_FLUSH3_TEST_DATA_CHAR, CFSTORE_FLUSH3_TEST_DATA_BUF_LEN);
00550     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s", (char*) kv_name_root, (char*) kv_name_meta);
00551     ret = cfstore_flush3_write_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name, (const uint8_t*) data, 2280);
00552     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  D.4 cfstore_flush3_write_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00553     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00554 
00555     CFSTORE_DBGLOG("%s: - cfstore_flush3_end\n", __func__);
00556     ret = cfstore_flush3_end();
00557     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  D.5 cfstore_flush3_end() failed (ret=%d).\n", __func__, (int) ret);
00558     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00559 
00560     CFSTORE_DBGLOG("%s: check for heap corruption\n", __func__);
00561     ret = cfstore_flush3_check_data((uint8_t*) heap_buf, CFSTORE_FLUSH3_TEST_HEAP_BUF_LEN, CFSTORE_FLUSH3_HEAP_DATA_CHAR);
00562     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  D.6 cfstore_flush3_check_data() failed for heap (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00563     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00564 
00565     CFSTORE_DBGLOG("%s: - E: run C-D again, to delete everything\n", __func__);
00566     CFSTORE_DBGLOG("%s: - cfstore_flush3_start\n", __func__);
00567     ret = cfstore_flush3_start();
00568     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  E.1 cfstore_flush3_start() failed (ret=%d).\n", __func__, (int) ret);
00569     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00570 
00571     CFSTORE_DBGLOG("%s: cfstore_flush3_delete_file(com.arm.mbed.spv.sst.node.0). this will work as the KV is present.\n", __func__);
00572     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s.0", (char*) kv_name_root, (char*) kv_name_node);
00573     ret = cfstore_flush3_delete_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name);
00574     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  E.2 cfstore_flush3_delete_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00575     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00576 
00577     CFSTORE_DBGLOG("%s: cfstore_flush3_delete_file(com.arm.mbed.spv.sst.node.x) where x = {1..29}, each of which should fail.\n", __func__);
00578     for(i = 1; i <= 29; i++){
00579         snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s.%d", (char*) kv_name_root, (char*) kv_name_node, (int) i);
00580         ret = cfstore_flush3_delete_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name);
00581         CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  E.%d cfstore_flush3_delete_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) i+2, (int) ret, kv_name);
00582         /* The delete operations are expected to fail as the keys dont exist
00583          * but cfstore_flush3_delete_file() returns ARM_DRIVER_OK when key isnt found, so cant test the return code.
00584          */
00585         TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00586     }
00587 
00588     CFSTORE_DBGLOG("%s: cfstore_flush3_delete_file(name com.arm.mbed.spv.sst.meta). this is expected to succeed as the KV is present.\n", __func__);
00589     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s", (char*) kv_name_root, (char*) kv_name_meta);
00590     ret = cfstore_flush3_delete_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name);
00591     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  E.32 cfstore_flush3_delete_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00592     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00593 
00594     CFSTORE_DBGLOG("%s: - cfstore_flush3_end\n", __func__);
00595     ret = cfstore_flush3_end();
00596     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  E.33 cfstore_flush3_end() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00597     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00598 
00599     CFSTORE_DBGLOG("%s: check for heap corruption\n", __func__);
00600     ret = cfstore_flush3_check_data((uint8_t*) heap_buf, CFSTORE_FLUSH3_TEST_HEAP_BUF_LEN, CFSTORE_FLUSH3_HEAP_DATA_CHAR);
00601     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  E.34 cfstore_flush3_check_data() failed for heap (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00602     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00603 
00604     CFSTORE_DBGLOG("%s: - F\n", __func__);
00605     CFSTORE_DBGLOG("%s: - cfstore_flush3_start\n", __func__);
00606     ret = cfstore_flush3_start();
00607     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  F.1 cfstore_flush3_start() failed (ret=%d).\n", __func__, (int) ret);
00608     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00609 
00610     CFSTORE_DBGLOG("%s: cfstore_flush3_read_file(com.arm.mbed.spv.sst.meta). this should fail as the kv has been deleted.\n", __func__);
00611     memset(data, 0, CFSTORE_FLUSH3_TEST_DATA_BUF_LEN);
00612     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s", (char*) kv_name_root, (char*) kv_name_meta);
00613     ret = cfstore_flush3_read_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name, data, 2280);
00614     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  F.2 cfstore_flush3_read_file() succeeded when expected to fail (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00615     TEST_ASSERT_MESSAGE(ret < ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00616 
00617     memset(data, CFSTORE_FLUSH3_TEST_DATA_CHAR, CFSTORE_FLUSH3_TEST_DATA_BUF_LEN);
00618     /* cfstore_flush3_write_file(com.arm.mbed.spv.sst.node.0, len: 220) to create KV */
00619     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s.0", (char*) kv_name_root, (char*) kv_name_node);
00620     ret = cfstore_flush3_write_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name, (const uint8_t*) data, 220);
00621     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  F.3 cfstore_flush3_write_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00622     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00623 
00624     CFSTORE_DBGLOG("%s: cfstore_flush3_write_file(com.arm.mbed.spv.sst.meta, len: 2280) to create KV.\n", __func__);
00625     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s", (char*) kv_name_root, (char*) kv_name_meta);
00626     ret = cfstore_flush3_write_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name, (const uint8_t*) data, 2280);
00627     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  F.4 cfstore_flush3_write_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00628     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00629 
00630     CFSTORE_DBGLOG("%s: cfstore_flush3_write_file(com.arm.mbed.spv.sst.node.0, len: 816) to create KV.\n", __func__);
00631     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s.0", (char*) kv_name_root, (char*) kv_name_node);
00632     ret = cfstore_flush3_write_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name, (const uint8_t*) data, 816);
00633     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  F.5 cfstore_flush3_write_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00634     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00635 
00636     CFSTORE_DBGLOG("%s: cfstore_flush3_write_file(com.arm.mbed.spv.sst.meta, len: 2280) to create KV.\n", __func__);
00637     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s", (char*) kv_name_root, (char*) kv_name_meta);
00638     ret = cfstore_flush3_write_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name, (const uint8_t*) data, 2280);
00639     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  F.6 cfstore_flush3_write_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00640     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00641 
00642     CFSTORE_DBGLOG("%s: cfstore_flush3_write_file(com.arm.mbed.spv.sst.node.1, len: 217) to create KV.\n", __func__);
00643     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s.1", (char*) kv_name_root, (char*) kv_name_node);
00644     ret = cfstore_flush3_write_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name, (const uint8_t*) data, 217);
00645     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  F.7 cfstore_flush3_write_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00646     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00647 
00648     CFSTORE_DBGLOG("%s: cfstore_flush3_write_file(com.arm.mbed.spv.sst.meta, len: 2280) to create KV.\n", __func__);
00649     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s", (char*) kv_name_root, (char*) kv_name_meta);
00650     ret = cfstore_flush3_write_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name, (const uint8_t*) data, 2280);
00651     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  F.8 cfstore_flush3_write_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00652     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00653 
00654     CFSTORE_DBGLOG("%s: cfstore_flush3_write_file(com.arm.mbed.spv.sst.node.0, len: 818) to create KV.\n", __func__);
00655     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s.0", (char*) kv_name_root, (char*) kv_name_node);
00656     ret = cfstore_flush3_write_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name, (const uint8_t*) data, 818);
00657     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  F.9 cfstore_flush3_write_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00658     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00659 
00660     CFSTORE_DBGLOG("%s: cfstore_flush3_write_file(com.arm.mbed.spv.sst.meta, len: 2280) to create KV.\n", __func__);
00661     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s", (char*) kv_name_root, (char*) kv_name_meta);
00662     ret = cfstore_flush3_write_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name, (const uint8_t*) data, 2280);
00663     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  F.10 cfstore_flush3_write_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00664     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00665 
00666     CFSTORE_DBGLOG("%s: - cfstore_flush3_end\n", __func__);
00667     ret = cfstore_flush3_end();
00668     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  F.11 cfstore_flush3_end() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00669     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00670 
00671     CFSTORE_DBGLOG("%s: check for heap corruption\n", __func__);
00672     ret = cfstore_flush3_check_data((uint8_t*) heap_buf, CFSTORE_FLUSH3_TEST_HEAP_BUF_LEN, CFSTORE_FLUSH3_HEAP_DATA_CHAR);
00673     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  F.12 cfstore_flush3_check_data() failed for heap (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00674     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00675 
00676     CFSTORE_DBGLOG("%s: - G\n", __func__);
00677     CFSTORE_DBGLOG("%s: - cfstore_flush3_start\n", __func__);
00678     ret = cfstore_flush3_start();
00679     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  G.1 cfstore_flush3_start() failed (ret=%d).\n", __func__, (int) ret);
00680     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00681 
00682     CFSTORE_DBGLOG("%s: cfstore_flush3_read_file(com.arm.mbed.spv.sst.meta) 2280 bytes should be read.\n", __func__);
00683     memset(data, 0, CFSTORE_FLUSH3_TEST_DATA_BUF_LEN);
00684     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s", (char*) kv_name_root, (char*) kv_name_meta);
00685     ret = cfstore_flush3_read_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name, data, 2280);
00686     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  G.2 cfstore_flush3_read_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00687     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00688 
00689     ret = cfstore_flush3_check_data(data, 2280, CFSTORE_FLUSH3_TEST_DATA_CHAR);
00690     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  G.3 cfstore_flush3_check_data() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00691     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00692 
00693     CFSTORE_DBGLOG("%s: cfstore_flush3_read_file(com.arm.mbed.spv.sst.node.0) 818 bytes should be read.\n", __func__);
00694     memset(data, 0, CFSTORE_FLUSH3_TEST_DATA_BUF_LEN);
00695     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s.0", (char*) kv_name_root, (char*) kv_name_node);
00696     ret = cfstore_flush3_read_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name, data, 818);
00697     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  G.4 cfstore_flush3_read_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00698     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00699 
00700     ret = cfstore_flush3_check_data(data, 818, CFSTORE_FLUSH3_TEST_DATA_CHAR);
00701     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  G.5 cfstore_flush3_check_data() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00702     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00703 
00704     CFSTORE_DBGLOG("%s: cfstore_flush3_read_file(com.arm.mbed.spv.sst.node.1) 217 bytes should be read. repeat 4 times.\n", __func__);
00705     for(i = 0; i < 4; i++){
00706         memset(data, 0, CFSTORE_FLUSH3_TEST_DATA_BUF_LEN);
00707         snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s.1", (char*) kv_name_root, (char*) kv_name_node);
00708         ret = cfstore_flush3_read_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name, data, 217);
00709         CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  G.%d.1 cfstore_flush3_read_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) i+6, (int) ret, kv_name);
00710         TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00711 
00712         ret = cfstore_flush3_check_data(data, 217, CFSTORE_FLUSH3_TEST_DATA_CHAR);
00713         CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  G.%d.2 cfstore_flush3_check_data() failed (ret=%d, kv_name=%s).\n", __func__, (int) i+6, (int) ret, kv_name);
00714         TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00715     }
00716 
00717     memset(data, CFSTORE_FLUSH3_TEST_DATA_CHAR, CFSTORE_FLUSH3_TEST_DATA_BUF_LEN);
00718     CFSTORE_DBGLOG("%s: cfstore_flush3_write_file(com.arm.mbed.spv.sst.node.2, len: 235) to create KV.\n", __func__);
00719     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s.0", (char*) kv_name_root, (char*) kv_name_node);
00720     ret = cfstore_flush3_write_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name, (const uint8_t*) data, 235);
00721     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  F.3 cfstore_flush3_write_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00722     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00723 
00724     CFSTORE_DBGLOG("%s: cfstore_flush3_write_file(com.arm.mbed.spv.sst.meta, len: 2280) to create KV.\n", __func__);
00725     memset(data, CFSTORE_FLUSH3_TEST_DATA_CHAR, CFSTORE_FLUSH3_TEST_DATA_BUF_LEN);
00726     snprintf(kv_name, CFSTORE_KEY_NAME_MAX_LENGTH, "%s.%s", (char*) kv_name_root, (char*) kv_name_meta);
00727     ret = cfstore_flush3_write_file(NULL, CFSTORE_KEY_NAME_MAX_LENGTH, (const char*) kv_name, (const uint8_t*) data, 2280);
00728     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  A.2 cfstore_flush3_write_file() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00729     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00730 
00731     CFSTORE_DBGLOG("%s: - cfstore_flush3_end\n", __func__);
00732     ret = cfstore_flush3_end();
00733     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  F.11 cfstore_flush3_end() failed (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00734     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00735 
00736     CFSTORE_DBGLOG("%s: check for heap corruption\n", __func__);
00737     ret = cfstore_flush3_check_data((uint8_t*) heap_buf, CFSTORE_FLUSH3_TEST_HEAP_BUF_LEN, CFSTORE_FLUSH3_HEAP_DATA_CHAR);
00738     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:  A.5 cfstore_flush3_check_data() failed for heap (ret=%d, kv_name=%s).\n", __func__, (int) ret, kv_name);
00739     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00740 
00741     if(heap_buf){
00742         free(heap_buf);
00743     }
00744 
00745     return CaseNext;
00746 }
00747 
00748 
00749 /* @brief   simple flush test */
00750 static control_t cfstore_flush3_test_02(const size_t call_count)
00751 {
00752     int32_t cfsStatus = ARM_DRIVER_ERROR;
00753     ARM_CFSTORE_KEYDESC kdesc;
00754     ARM_CFSTORE_FMODE flags;
00755     ARM_CFSTORE_SIZE len = strlen("key0");
00756     ARM_CFSTORE_HANDLE_INIT(hkey);
00757     ARM_CFSTORE_DRIVER* drv = &cfstore_driver;
00758 
00759     (void) call_count;
00760     memset(&kdesc, 0, sizeof(kdesc));
00761     memset(&flags, 0, sizeof(flags));
00762 
00763     CFSTORE_DBGLOG("%s:Initialize()\n", __func__);
00764     cfsStatus = drv->Initialize(NULL, NULL);
00765     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:%d:cfsStatus=%d", __func__, __LINE__, (int) cfsStatus);
00766     TEST_ASSERT_MESSAGE(cfsStatus >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00767 
00768     CFSTORE_DBGLOG("%s:Create()\n", __func__);
00769     cfsStatus = drv->Create("key0", len, &kdesc, hkey);
00770     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:%d:cfsStatus=%d", __func__, __LINE__, (int) cfsStatus);
00771     TEST_ASSERT_MESSAGE(cfsStatus >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00772 
00773     len = strlen("some-value");
00774     CFSTORE_DBGLOG("%s:Write()\n", __func__);
00775     cfsStatus = drv->Write(hkey, "some-value", &len);
00776     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:%d:cfsStatus=%d", __func__, __LINE__, (int) cfsStatus);
00777     TEST_ASSERT_MESSAGE(cfsStatus >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00778 
00779     CFSTORE_DBGLOG("%s:Close()\n", __func__);
00780     cfsStatus = drv->Close(hkey);
00781     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:%d:cfsStatus=%d", __func__, __LINE__, (int) cfsStatus);
00782     TEST_ASSERT_MESSAGE(cfsStatus >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00783 
00784     CFSTORE_DBGLOG("%s:Flush()\n", __func__);
00785     cfsStatus = drv->Flush();
00786     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:%d:cfsStatus=%d", __func__, __LINE__, (int) cfsStatus);
00787     TEST_ASSERT_MESSAGE(cfsStatus >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00788 
00789     CFSTORE_DBGLOG("%s:Open()\n", __func__);
00790     cfsStatus = drv->Open("key0", flags, hkey);
00791     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:%d:cfsStatus=%d", __func__, __LINE__, (int) cfsStatus);
00792     TEST_ASSERT_MESSAGE(cfsStatus >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00793 
00794     CFSTORE_DBGLOG("%s:Delete()\n", __func__);
00795     cfsStatus = drv->Delete(hkey);
00796     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:%d:cfsStatus=%d", __func__, __LINE__, (int) cfsStatus);
00797     TEST_ASSERT_MESSAGE(cfsStatus >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00798 
00799     CFSTORE_DBGLOG("%s:Close()\n", __func__);
00800     cfsStatus = drv->Close(hkey);       ///////  <--- cfsStatus = ARM_CFSTORE_DRIVER_ERROR_PREEXISTING_KEY
00801     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:%d:cfsStatus=%d", __func__, __LINE__, (int) cfsStatus);
00802     TEST_ASSERT_MESSAGE(cfsStatus >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00803 
00804     CFSTORE_DBGLOG("%s:got status = %d\n", __func__, (int) cfsStatus);
00805 
00806     CFSTORE_DBGLOG("%s:Uninitialize()\n", __func__);
00807     cfsStatus = drv->Uninitialize();
00808     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error:%d:cfsStatus=%d", __func__, __LINE__, (int) cfsStatus);
00809     TEST_ASSERT_MESSAGE(cfsStatus >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00810 
00811     return CaseNext;
00812 }
00813 
00814 #endif /* STORAGE_DRIVER_CONFIG_HARDWARE_MTD_ASYNC_OPS && STORAGE_DRIVER_CONFIG_HARDWARE_MTD_ASYNC_OPS==0 */
00815 
00816 
00817 static control_t cfstore_flush3_test_00(const size_t call_count)
00818 {
00819     int32_t ret = ARM_DRIVER_ERROR;
00820     ARM_CFSTORE_CAPABILITIES caps;;
00821     ARM_CFSTORE_DRIVER* drv = &cfstore_driver;
00822 
00823     (void) call_count;
00824 
00825     /* initialise the context */
00826     caps = drv->GetCapabilities();
00827     CFSTORE_LOG("%s:INITIALIZING: caps.asynchronous_ops=%lu\n", __func__, caps.asynchronous_ops);
00828     if(caps.asynchronous_ops == 1){
00829         /* This is a sync mode only test. If this test is not built for sync mode, then skip testing return true
00830          * This means the test will conveniently pass when run in CI as part of async mode testing */
00831         CFSTORE_LOG("*** Skipping test as binary built for flash journal async mode, and this test is sync-only%s", "\n");
00832         return CaseNext;
00833     }
00834     ret = cfstore_test_startup();
00835     CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush3_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret);
00836     TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush3_utest_msg_g);
00837     return CaseNext;
00838 }
00839 
00840 /// @cond CFSTORE_DOXYGEN_DISABLE
00841 utest::v1::status_t greentea_setup(const size_t number_of_cases)
00842 {
00843     GREENTEA_SETUP(CFSTORE_FLUSH3_GREENTEA_TIMEOUT_S, "default_auto");
00844     return greentea_test_setup_handler(number_of_cases);
00845 }
00846 
00847 Case cases[] = {
00848            /*          1         2         3         4         5         6        7  */
00849            /* 1234567890123456789012345678901234567890123456789012345678901234567890 */
00850         Case("FLUSH3_test_00", cfstore_flush3_test_00),
00851 #if defined STORAGE_DRIVER_CONFIG_HARDWARE_MTD_ASYNC_OPS && STORAGE_DRIVER_CONFIG_HARDWARE_MTD_ASYNC_OPS==0
00852         Case("FLUSH3_test_01", cfstore_flush3_test_01),
00853         Case("FLUSH3_test_02", cfstore_flush3_test_02),
00854 #endif // STORAGE_DRIVER_CONFIG_HARDWARE_MTD_ASYNC_OPS
00855 };
00856 
00857 
00858 /* Declare your test specification with a custom setup handler */
00859 Specification specification(greentea_setup, cases);
00860 
00861 /* mbedosV3++*/
00862 int main()
00863 {
00864     return !Harness::run(specification);
00865 }
00866 /// @cond
00867