Rtos API example

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