Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
example5.cpp
00001 /* 00002 * mbed Microcontroller Library 00003 * Copyright (c) 2006-2016 ARM Limited 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); 00006 * you may not use this file except in compliance with the License. 00007 * You may obtain a copy of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, 00013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 * See the License for the specific language governing permissions and 00015 * limitations under the License. 00016 * 00017 * Test cases to add and delete KVs in the CFSTORE. 00018 */ 00019 00020 00021 /** @file example5.cpp 00022 * 00023 * Test case to demonstrate each API function works correctly. 00024 * 00025 * \par Example 5 Notes 00026 * 00027 * This flash-journal synchronous mode example test does the following CFSTORE operations: 00028 * - initialises 00029 * - creates a key-value pair (KV). 00030 * - writes the data for the KV 00031 * - closes KV. 00032 * - flushes the KV to flash 00033 * - flushes the KV to flash again 00034 * - uninitialises 00035 * - initialises 00036 * - opens KV for reading. 00037 * - deletes KV 00038 * - closes KV. 00039 * - flushes the updated state to flash to store the removal of the deleted KV. 00040 * - uninitialises 00041 * - stops 00042 * 00043 * This test is coded so as to work only in flash journal sync mode 00044 * i.e. with caps.asynchronous_ops == false 00045 * 00046 * The test leaves the flash in the same state as at the beginning of the test so 00047 * it can be run a second time on the device without flashing, and the test should 00048 * still work. 00049 * 00050 * \par How to Build Example5 as a Stand-alone Application 00051 * 00052 * This example can be build as a stand-alone application as follows: 00053 * - Create a new mbed application using the `mbed new .` command. 00054 * - Copy this file example5.cpp from the to the top level application directory and rename the file to main.cpp. 00055 * - Build the application with `mbed compile -v -m <target> -t <toolchain> -DCFSTORE_EXAMPLE5_APP` e.g. `mbed compile -v -m K64F -t GCC_ARM -DCFSTORE_EXAMPLE5_APP`. 00056 */ 00057 00058 #include "mbed.h" 00059 #include "Driver_Common.h" 00060 00061 #ifndef CFSTORE_EXAMPLE5_APP 00062 /* when built as Configuration-Store example, include greentea support otherwise omit */ 00063 #include "utest/utest.h" 00064 #include "unity/unity.h" 00065 #include "greentea-client/test_env.h" 00066 #else // CFSTORE_EXAMPLE5_APP 00067 /* map utest types for building as stand alone example */ 00068 #define control_t void 00069 #define CaseNext 00070 #endif // CFSTORE_EXAMPLE5_APP 00071 00072 #include "cfstore_config.h" 00073 #include "configuration_store.h" 00074 00075 #ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED 00076 #include "flash_journal_strategy_sequential.h" 00077 #include "flash_journal.h" 00078 #include "Driver_Common.h" 00079 #endif /* CFSTORE_CONFIG_BACKEND_FLASH_ENABLED */ 00080 00081 #include <stdio.h> 00082 #include <stdlib.h> 00083 #include <string.h> 00084 00085 00086 #ifndef CFSTORE_EXAMPLE5_APP 00087 using namespace utest::v1; 00088 #endif 00089 00090 00091 /// @cond CFSTORE_DOXYGEN_DISABLE 00092 #define CFSTORE_EX5_TEST_ASSERT(Expr) if (!(Expr)) { printf("%s:%u: assertion failure\r\n", __FUNCTION__, __LINE__); while (1) ;} 00093 #define CFSTORE_EX5_TEST_ASSERT_EQUAL(expected, actual) if ((expected) != (actual)) {printf("%s:%u: assertion failure\r\n", __FUNCTION__, __LINE__); while (1) ;} 00094 #define CFSTORE_EX5_TEST_ASSERT_NOT_EQUAL(expected, actual) if ((expected) == (actual)) {printf("%s:%u: assertion failure\r\n", __FUNCTION__, __LINE__); while (1) ;} 00095 00096 #define CFSTORE_EX5_TEST_ASSERT_MSG(Expr, _fmt, ...) \ 00097 do \ 00098 { \ 00099 if (!(Expr)) \ 00100 { \ 00101 printf(_fmt, __VA_ARGS__); \ 00102 while (1) ; \ 00103 } \ 00104 }while(0); 00105 00106 #define CFSTORE_EX5_LOG(_fmt, ...) \ 00107 do \ 00108 { \ 00109 printf(_fmt, __VA_ARGS__); \ 00110 }while(0); 00111 00112 00113 const char* cfstore_ex5_opcode_str[] = 00114 { 00115 "UNDEFINED", 00116 "CFSTORE_OPCODE_CLOSE", 00117 "CFSTORE_OPCODE_CREATE", 00118 "CFSTORE_OPCODE_DELETE", 00119 "CFSTORE_OPCODE_FIND", 00120 "CFSTORE_OPCODE_FLUSH", 00121 "CFSTORE_OPCODE_GET_KEY_NAME", 00122 "CFSTORE_OPCODE_GET_STATUS", 00123 "CFSTORE_OPCODE_GET_VALUE_LEN", 00124 "CFSTORE_OPCODE_INITIALIZE", 00125 "CFSTORE_OPCODE_OPEN", 00126 "CFSTORE_OPCODE_POWER_CONTROL", 00127 "CFSTORE_OPCODE_READ", 00128 "CFSTORE_OPCODE_RSEEK", 00129 "CFSTORE_OPCODE_UNINITIALIZE", 00130 "CFSTORE_OPCODE_WRITE", 00131 "CFSTORE_OPCODE_MAX" 00132 }; 00133 00134 const char* cfstore_ex5_kv_name = "basement.medicine.pavement.government.trenchcoat.off.cough.off.kid.did.when.again.alleyway.friend.cap.pen.dollarbills.ten.foot.soot.put.but.anyway.say.May.DA.kid.did.toes.bows.those.hose.nose.clothes.man.blows.well.well"; 00135 const char* cfstore_ex5_kv_value = "TheRollingStone"; 00136 #define CFSTORE_EX5_RSEEK_OFFSET 10 /* offset to S of Stone */ 00137 00138 /// @cond CFSTORE_DOXYGEN_DISABLE 00139 typedef struct cfstore_EXAMPLE5_ctx_t 00140 { 00141 ARM_CFSTORE_CAPABILITIES caps; 00142 uint8_t hkey[CFSTORE_HANDLE_BUFSIZE]; 00143 uint8_t hkey_next_buf[CFSTORE_HANDLE_BUFSIZE]; 00144 uint8_t hkey_prev_buf[CFSTORE_HANDLE_BUFSIZE]; 00145 ARM_CFSTORE_HANDLE hkey_next; 00146 ARM_CFSTORE_HANDLE hkey_prev; 00147 ARM_CFSTORE_SIZE len; 00148 ARM_CFSTORE_KEYDESC kdesc; 00149 ARM_CFSTORE_FMODE flags; 00150 char value[CFSTORE_KEY_NAME_MAX_LENGTH+1]; 00151 } cfstore_EXAMPLE5_ctx_t; 00152 00153 static cfstore_EXAMPLE5_ctx_t cfstore_EXAMPLE5_ctx_g; 00154 00155 extern ARM_CFSTORE_DRIVER cfstore_driver; 00156 ARM_CFSTORE_DRIVER *cfstore_drv = &cfstore_driver; 00157 /// @endcond 00158 00159 00160 /* @brief test startup code to reset flash 00161 */ 00162 int32_t cfstore_test_startup(void) 00163 { 00164 ARM_CFSTORE_CAPABILITIES caps = cfstore_driver.GetCapabilities(); 00165 CFSTORE_EX5_LOG("INITIALIZING: caps.asynchronous_ops=%d\n", (int) caps.asynchronous_ops); 00166 00167 #ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED 00168 int32_t ret = ARM_DRIVER_ERROR; 00169 static FlashJournal_t jrnl; 00170 extern ARM_DRIVER_STORAGE ARM_Driver_Storage_MTD_K64F; 00171 const ARM_DRIVER_STORAGE *drv = &ARM_Driver_Storage_MTD_K64F; 00172 00173 ret = FlashJournal_initialize(&jrnl, drv, &FLASH_JOURNAL_STRATEGY_SEQUENTIAL, NULL); 00174 CFSTORE_EX5_TEST_ASSERT_MSG(ret >= JOURNAL_STATUS_OK, "%s:Error: FlashJournal_initialize() failed (ret=%d)\r\n", __func__, (int) ret); 00175 00176 ret = FlashJournal_reset(&jrnl); 00177 CFSTORE_EX5_TEST_ASSERT_MSG(ret >= JOURNAL_STATUS_OK, "%s:Error: FlashJournal_reset() failed (ret=%d)\r\n", __func__, (int) ret); 00178 #endif /* CFSTORE_CONFIG_BACKEND_FLASH_ENABLED */ 00179 00180 return ARM_DRIVER_OK; 00181 } 00182 00183 00184 static void cfstore_ex5_test_01(cfstore_EXAMPLE5_ctx_t* ctx) 00185 { 00186 int32_t ret; 00187 00188 CFSTORE_EX5_LOG("INITIALIZING1%s", "\r\n"); 00189 ret = cfstore_drv->Initialize(NULL, NULL); 00190 CFSTORE_EX5_TEST_ASSERT_MSG(ret >= ARM_DRIVER_OK, "%s:Error: Initialize() should return ret >= 0 for async/synch modes(ret=%ld)\r\n", __func__, ret); 00191 00192 CFSTORE_EX5_LOG("CREATING%s", "\r\n"); 00193 memset(&ctx->kdesc, 0, sizeof(ARM_CFSTORE_KEYDESC)); 00194 ctx->kdesc.drl = ARM_RETENTION_NVM; 00195 ctx->len = strlen(cfstore_ex5_kv_value); 00196 ret = cfstore_drv->Create(cfstore_ex5_kv_name, ctx->len, &ctx->kdesc, ctx->hkey); 00197 CFSTORE_EX5_TEST_ASSERT_MSG(ret >= ARM_DRIVER_OK, "%s:Error: Create() failed (ret=%ld)\r\n", __func__, ret); 00198 00199 CFSTORE_EX5_LOG("WRITING%s", "\r\n"); 00200 ctx->len = strlen(cfstore_ex5_kv_value); 00201 ret = cfstore_drv->Write(ctx->hkey, cfstore_ex5_kv_value, &ctx->len); 00202 CFSTORE_EX5_TEST_ASSERT_MSG(ret >= ARM_DRIVER_OK, "%s:Error: Write() failed (ret=%ld)\r\n", __func__, ret); 00203 00204 CFSTORE_EX5_TEST_ASSERT_MSG(ret == (int32_t) strlen(cfstore_ex5_kv_value), "%s:Error: Write() number of octets written (i.e. completion status (%ld)) != strlen(ctx->value)(%ld)\r\n", __func__, ret, (int32_t) strlen(cfstore_ex5_kv_value)); 00205 CFSTORE_EX5_TEST_ASSERT_MSG(ret == (int32_t) ctx->len, "%s:Error: Write() number of octets written (i.e. completion status (%ld)) != updated value of len parameter (%ld)\r\n", __func__, ret, (int32_t) ctx->len); 00206 00207 CFSTORE_EX5_LOG("CLOSING1%s", "\r\n"); 00208 ret = cfstore_drv->Close(ctx->hkey); 00209 CFSTORE_EX5_TEST_ASSERT_MSG(ret >= ARM_DRIVER_OK, "%s:Error: Close() failed (ret=%ld)\r\n", __func__, ret); 00210 00211 CFSTORE_EX5_LOG("FLUSHING1%s", "\r\n"); 00212 ret = cfstore_drv->Flush(); 00213 CFSTORE_EX5_TEST_ASSERT_MSG(ret >= ARM_DRIVER_OK, "%s:Error: Flush() failed (ret=%ld)\r\n", __func__, ret); 00214 00215 #ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED 00216 /* CFSTORE_CONFIG_BACKEND_FLASH_ENABLED => flash storage support present. 00217 * if this was not the case (i.e. cfstore running SRAM in memory mode) then 00218 * we dont compile in the Uninitialize()/Initialize() as the 00219 * Uninitialize() clears the sram */ 00220 CFSTORE_EX5_LOG("UNINITIALIZING1%s", "\r\n"); 00221 ret = cfstore_drv->Uninitialize(); 00222 CFSTORE_EX5_TEST_ASSERT_MSG(ret >= ARM_DRIVER_OK, "%s:Error: Uninitialize() should return ret >= 0 for synch mode(ret=%ld)\r\n", __func__, ret); 00223 00224 CFSTORE_EX5_LOG("INITIALIZING2%s", "\r\n"); 00225 ret = cfstore_drv->Initialize(NULL, NULL); 00226 CFSTORE_EX5_TEST_ASSERT_MSG(ret >= ARM_DRIVER_OK, "%s:Error: Initialize() should return ret >= 0 for async/synch modes(ret=%ld)\r\n", __func__, ret); 00227 #endif 00228 00229 CFSTORE_EX5_LOG("OPENING%s", "\r\n"); 00230 memset(&ctx->flags, 0, sizeof(ctx->flags)); 00231 memset(&ctx->hkey, 0, CFSTORE_HANDLE_BUFSIZE); 00232 ret = cfstore_drv->Open(cfstore_ex5_kv_name, ctx->flags, ctx->hkey); 00233 CFSTORE_EX5_TEST_ASSERT_MSG(ret >= ARM_DRIVER_OK, "%s:Error: Open() failed (ret=%ld)\r\n", __func__, ret); 00234 00235 CFSTORE_EX5_LOG("DELETE1%s", "\r\n"); 00236 ctx->len = CFSTORE_KEY_NAME_MAX_LENGTH; 00237 memset(ctx->value, 0, CFSTORE_KEY_NAME_MAX_LENGTH + 1); 00238 ret = cfstore_drv->Delete(ctx->hkey); 00239 CFSTORE_EX5_TEST_ASSERT_MSG(ret >= ARM_DRIVER_OK, "%s:Error: Delete() failed (ret=%ld)\r\n", __func__, ret); 00240 00241 CFSTORE_EX5_LOG("CLOSING2%s", "\r\n"); 00242 ret = cfstore_drv->Close(ctx->hkey); 00243 CFSTORE_EX5_TEST_ASSERT_MSG(ret >= ARM_DRIVER_OK, "%s:Error: Close() failed (ret=%ld)\r\n", __func__, ret); 00244 00245 CFSTORE_EX5_LOG("FLUSHING3%s", "\r\n"); 00246 ret = cfstore_drv->Flush(); 00247 CFSTORE_EX5_TEST_ASSERT_MSG(ret >= ARM_DRIVER_OK, "%s:Error: Flush() failed (ret=%ld)\r\n", __func__, ret); 00248 00249 CFSTORE_EX5_LOG("OPEN2 %s", "\r\n"); 00250 memset(&ctx->flags, 0, sizeof(ctx->flags)); 00251 memset(&ctx->hkey, 0, CFSTORE_HANDLE_BUFSIZE); 00252 ret = cfstore_drv->Open(cfstore_ex5_kv_name, ctx->flags, ctx->hkey); 00253 CFSTORE_EX5_TEST_ASSERT_MSG(ret == ARM_CFSTORE_DRIVER_ERROR_KEY_NOT_FOUND, "%s:Error: Find() failed to return expected value of ARM_CFSTORE_DRIVER_ERROR_KEY_NOT_FOUND (ret=%ld)\r\n", __func__, ret); 00254 00255 CFSTORE_EX5_LOG("FLUSHING2%s", "\r\n"); 00256 ret = cfstore_drv->Flush(); 00257 CFSTORE_EX5_TEST_ASSERT_MSG(ret >= ARM_DRIVER_OK, "%s:Error:2: Flush() failed (ret=%ld)\r\n", __func__, ret); 00258 00259 CFSTORE_EX5_LOG("UNINITIALIZING3%s", "\r\n"); 00260 ret = cfstore_drv->Uninitialize(); 00261 CFSTORE_EX5_TEST_ASSERT_MSG(ret >= ARM_DRIVER_OK, "%s:Error: Uninitialize() should return ret >= 0 for synch mode(ret=%ld)\r\n", __func__, ret); 00262 CFSTORE_EX5_LOG("***************%s", "\r\n"); 00263 CFSTORE_EX5_LOG("*** SUCCESS ***%s", "\r\n"); 00264 CFSTORE_EX5_LOG("***************%s", "\r\n"); 00265 return; 00266 } 00267 00268 static control_t cfstore_EXAMPLE5_app_start(const size_t call_count) 00269 { 00270 int32_t ret = ARM_DRIVER_ERROR; 00271 cfstore_EXAMPLE5_ctx_t* ctx = &cfstore_EXAMPLE5_ctx_g; 00272 00273 (void) call_count; 00274 00275 /* initialise the context */ 00276 memset(ctx, 0, sizeof(cfstore_EXAMPLE5_ctx_t)); 00277 ctx->hkey_next = ctx->hkey_next_buf; 00278 ctx->hkey_prev = ctx->hkey_prev_buf; 00279 ctx->caps = cfstore_drv->GetCapabilities(); 00280 CFSTORE_EX5_LOG("%s:INITIALIZING: caps.asynchronous_ops=%lu\n", __func__, ctx->caps.asynchronous_ops); 00281 if(ctx->caps.asynchronous_ops){ 00282 /* This is a sync mode only test. If this test is not built for sync mode, then skip testing return true 00283 * This means the test will conveniently pass when run in CI as part of async mode testing */ 00284 CFSTORE_EX5_LOG("*** Skipping test as binary built for flash journal async mode, and this test is sync-only%s", "\n"); 00285 return CaseNext; 00286 } 00287 ret = cfstore_test_startup(); 00288 CFSTORE_EX5_TEST_ASSERT_MSG(ret >= ARM_DRIVER_OK, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret); 00289 cfstore_ex5_test_01(ctx); 00290 return CaseNext; 00291 } 00292 00293 #ifndef CFSTORE_EXAMPLE5_APP 00294 /* when built as Configuration-Store example, include greentea support otherwise omit */ 00295 00296 /// @cond CFSTORE_DOXYGEN_DISABLE 00297 utest::v1::status_t greentea_setup(const size_t number_of_cases) 00298 { 00299 GREENTEA_SETUP(100, "default_auto"); 00300 return greentea_test_setup_handler(number_of_cases); 00301 } 00302 00303 Case cases[] = { 00304 /* 1 2 3 4 5 6 7 */ 00305 /* 1234567890123456789012345678901234567890123456789012345678901234567890 */ 00306 Case("EXAMPLE5_test_01_start", cfstore_EXAMPLE5_app_start), 00307 }; 00308 00309 00310 /* Declare your test specification with a custom setup handler */ 00311 Specification specification(greentea_setup, cases); 00312 00313 00314 int main() 00315 { 00316 return !Harness::run(specification); 00317 } 00318 /// @endcond 00319 00320 00321 #else // CFSTORE_EXAMPLE5_APP 00322 00323 // stand alone Configuration-Store-Example 00324 void app_start(int argc __unused, char** argv __unused) 00325 { 00326 cfstore_EXAMPLE5_app_start(0); 00327 } 00328 00329 00330 #endif // CFSTORE_EXAMPLE5_APP
Generated on Tue Jul 12 2022 13:30:00 by
