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.
Fork of CW_copy by
sd-driver/TESTS/filesystem/fopen/fopen.cpp@1:dc648c5624b9, 2018-01-10 (annotated)
- Committer:
- joseph_adamu
- Date:
- Wed Jan 10 09:50:29 2018 +0000
- Revision:
- 1:dc648c5624b9
version for export
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| joseph_adamu | 1:dc648c5624b9 | 1 | /* |
| joseph_adamu | 1:dc648c5624b9 | 2 | * mbed Microcontroller Library |
| joseph_adamu | 1:dc648c5624b9 | 3 | * Copyright (c) 2006-2016 ARM Limited |
| joseph_adamu | 1:dc648c5624b9 | 4 | * |
| joseph_adamu | 1:dc648c5624b9 | 5 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| joseph_adamu | 1:dc648c5624b9 | 6 | * you may not use this file except in compliance with the License. |
| joseph_adamu | 1:dc648c5624b9 | 7 | * You may obtain a copy of the License at |
| joseph_adamu | 1:dc648c5624b9 | 8 | * |
| joseph_adamu | 1:dc648c5624b9 | 9 | * http://www.apache.org/licenses/LICENSE-2.0 |
| joseph_adamu | 1:dc648c5624b9 | 10 | * |
| joseph_adamu | 1:dc648c5624b9 | 11 | * Unless required by applicable law or agreed to in writing, software |
| joseph_adamu | 1:dc648c5624b9 | 12 | * distributed under the License is distributed on an "AS IS" BASIS, |
| joseph_adamu | 1:dc648c5624b9 | 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| joseph_adamu | 1:dc648c5624b9 | 14 | * See the License for the specific language governing permissions and |
| joseph_adamu | 1:dc648c5624b9 | 15 | * limitations under the License. |
| joseph_adamu | 1:dc648c5624b9 | 16 | */ |
| joseph_adamu | 1:dc648c5624b9 | 17 | |
| joseph_adamu | 1:dc648c5624b9 | 18 | /** @file fopen.cpp Test cases to POSIX file fopen() interface. |
| joseph_adamu | 1:dc648c5624b9 | 19 | * |
| joseph_adamu | 1:dc648c5624b9 | 20 | * Please consult the documentation under the test-case functions for |
| joseph_adamu | 1:dc648c5624b9 | 21 | * a description of the individual test case. |
| joseph_adamu | 1:dc648c5624b9 | 22 | */ |
| joseph_adamu | 1:dc648c5624b9 | 23 | |
| joseph_adamu | 1:dc648c5624b9 | 24 | #include "mbed.h" |
| joseph_adamu | 1:dc648c5624b9 | 25 | #include "mbed_config.h" |
| joseph_adamu | 1:dc648c5624b9 | 26 | #include "SDBlockDevice.h" |
| joseph_adamu | 1:dc648c5624b9 | 27 | #include "FATFileSystem.h" |
| joseph_adamu | 1:dc648c5624b9 | 28 | #include "fsfat_debug.h" |
| joseph_adamu | 1:dc648c5624b9 | 29 | #include "fsfat_test.h" |
| joseph_adamu | 1:dc648c5624b9 | 30 | #include "utest/utest.h" |
| joseph_adamu | 1:dc648c5624b9 | 31 | #include "unity/unity.h" |
| joseph_adamu | 1:dc648c5624b9 | 32 | #include "greentea-client/test_env.h" |
| joseph_adamu | 1:dc648c5624b9 | 33 | |
| joseph_adamu | 1:dc648c5624b9 | 34 | #include <stdio.h> |
| joseph_adamu | 1:dc648c5624b9 | 35 | #include <string.h> |
| joseph_adamu | 1:dc648c5624b9 | 36 | #include <stdlib.h> /*rand()*/ |
| joseph_adamu | 1:dc648c5624b9 | 37 | #include <inttypes.h> |
| joseph_adamu | 1:dc648c5624b9 | 38 | #include <errno.h> |
| joseph_adamu | 1:dc648c5624b9 | 39 | /* mbed_retarget.h is included after errno.h so symbols are mapped to |
| joseph_adamu | 1:dc648c5624b9 | 40 | * consistent values for all toolchains */ |
| joseph_adamu | 1:dc648c5624b9 | 41 | #include "platform/mbed_retarget.h" |
| joseph_adamu | 1:dc648c5624b9 | 42 | |
| joseph_adamu | 1:dc648c5624b9 | 43 | /* This is needed for stat() test, but is not available on ARMCC. |
| joseph_adamu | 1:dc648c5624b9 | 44 | * The following checks whether GCC_ARM compiler is being used because: |
| joseph_adamu | 1:dc648c5624b9 | 45 | * - both the ARMCC compiler and the GCC_ARM compile define __GNUC__. |
| joseph_adamu | 1:dc648c5624b9 | 46 | * - only the ARMCC compiler defines __ARMCC_VERSION. |
| joseph_adamu | 1:dc648c5624b9 | 47 | * - hence if __ARMCC_VERSION is not defined and __GNUC__ is defined, it must be GCC_ARM. */ |
| joseph_adamu | 1:dc648c5624b9 | 48 | #if ! defined(__ARMCC_VERSION) && defined(__GNUC__) |
| joseph_adamu | 1:dc648c5624b9 | 49 | #include <sys/stat.h> |
| joseph_adamu | 1:dc648c5624b9 | 50 | #endif |
| joseph_adamu | 1:dc648c5624b9 | 51 | using namespace utest::v1; |
| joseph_adamu | 1:dc648c5624b9 | 52 | |
| joseph_adamu | 1:dc648c5624b9 | 53 | /// @cond FSFAT_DOXYGEN_DISABLE |
| joseph_adamu | 1:dc648c5624b9 | 54 | #ifdef FSFAT_DEBUG |
| joseph_adamu | 1:dc648c5624b9 | 55 | #define FSFAT_FOPEN_GREENTEA_TIMEOUT_S 3000 |
| joseph_adamu | 1:dc648c5624b9 | 56 | #else |
| joseph_adamu | 1:dc648c5624b9 | 57 | #define FSFAT_FOPEN_GREENTEA_TIMEOUT_S 1000 |
| joseph_adamu | 1:dc648c5624b9 | 58 | #endif |
| joseph_adamu | 1:dc648c5624b9 | 59 | /// @endcond |
| joseph_adamu | 1:dc648c5624b9 | 60 | |
| joseph_adamu | 1:dc648c5624b9 | 61 | |
| joseph_adamu | 1:dc648c5624b9 | 62 | /* DEVICE_SPI |
| joseph_adamu | 1:dc648c5624b9 | 63 | * This symbol is defined in targets.json if the target has a SPI interface, which is required for SDCard support. |
| joseph_adamu | 1:dc648c5624b9 | 64 | * |
| joseph_adamu | 1:dc648c5624b9 | 65 | * MBED_CONF_APP_FSFAT_SDCARD_INSTALLED |
| joseph_adamu | 1:dc648c5624b9 | 66 | * For testing purposes, an SDCard must be installed on the target for the test cases in this file to succeed. |
| joseph_adamu | 1:dc648c5624b9 | 67 | * If the target has an SD card installed then the MBED_CONF_APP_FSFAT_SDCARD_INSTALLED will be generated |
| joseph_adamu | 1:dc648c5624b9 | 68 | * from the mbed_app.json, which includes the line |
| joseph_adamu | 1:dc648c5624b9 | 69 | * { |
| joseph_adamu | 1:dc648c5624b9 | 70 | * "config": { |
| joseph_adamu | 1:dc648c5624b9 | 71 | * "UART_RX": "D0", |
| joseph_adamu | 1:dc648c5624b9 | 72 | * <<< lines removed >>> |
| joseph_adamu | 1:dc648c5624b9 | 73 | * "DEVICE_SPI": 1, |
| joseph_adamu | 1:dc648c5624b9 | 74 | * "FSFAT_SDCARD_INSTALLED": 1 |
| joseph_adamu | 1:dc648c5624b9 | 75 | * }, |
| joseph_adamu | 1:dc648c5624b9 | 76 | * <<< lines removed >>> |
| joseph_adamu | 1:dc648c5624b9 | 77 | */ |
| joseph_adamu | 1:dc648c5624b9 | 78 | #if defined(DEVICE_SPI) && defined(MBED_CONF_APP_FSFAT_SDCARD_INSTALLED) |
| joseph_adamu | 1:dc648c5624b9 | 79 | |
| joseph_adamu | 1:dc648c5624b9 | 80 | static char fsfat_fopen_utest_msg_g[FSFAT_UTEST_MSG_BUF_SIZE]; |
| joseph_adamu | 1:dc648c5624b9 | 81 | #define FSFAT_FOPEN_TEST_MOUNT_PT_NAME "sd" |
| joseph_adamu | 1:dc648c5624b9 | 82 | #define FSFAT_FOPEN_TEST_MOUNT_PT_PATH "/"FSFAT_FOPEN_TEST_MOUNT_PT_NAME |
| joseph_adamu | 1:dc648c5624b9 | 83 | #define FSFAT_FOPEN_TEST_WORK_BUF_SIZE_1 64 |
| joseph_adamu | 1:dc648c5624b9 | 84 | #define FSFAT_FOPEN_TEST_FILEPATH_MAX_DEPTH 20 |
| joseph_adamu | 1:dc648c5624b9 | 85 | static const char *sd_badfile_path = "/sd/badfile.txt"; |
| joseph_adamu | 1:dc648c5624b9 | 86 | static const char *sd_testfile_path = "/sd/test.txt"; |
| joseph_adamu | 1:dc648c5624b9 | 87 | |
| joseph_adamu | 1:dc648c5624b9 | 88 | SDBlockDevice sd(MBED_CONF_SD_SPI_MOSI, MBED_CONF_SD_SPI_MISO, MBED_CONF_SD_SPI_CLK, MBED_CONF_SD_SPI_CS); |
| joseph_adamu | 1:dc648c5624b9 | 89 | FATFileSystem fs("sd", &sd); |
| joseph_adamu | 1:dc648c5624b9 | 90 | |
| joseph_adamu | 1:dc648c5624b9 | 91 | #define FSFAT_FOPEN_TEST_01 fsfat_fopen_test_01 |
| joseph_adamu | 1:dc648c5624b9 | 92 | #define FSFAT_FOPEN_TEST_02 fsfat_fopen_test_02 |
| joseph_adamu | 1:dc648c5624b9 | 93 | #define FSFAT_FOPEN_TEST_03 fsfat_fopen_test_03 |
| joseph_adamu | 1:dc648c5624b9 | 94 | #define FSFAT_FOPEN_TEST_04 fsfat_fopen_test_04 |
| joseph_adamu | 1:dc648c5624b9 | 95 | #define FSFAT_FOPEN_TEST_05 fsfat_fopen_test_05 |
| joseph_adamu | 1:dc648c5624b9 | 96 | #define FSFAT_FOPEN_TEST_06 fsfat_fopen_test_06 |
| joseph_adamu | 1:dc648c5624b9 | 97 | #define FSFAT_FOPEN_TEST_07 fsfat_fopen_test_07 |
| joseph_adamu | 1:dc648c5624b9 | 98 | #define FSFAT_FOPEN_TEST_08 fsfat_fopen_test_08 |
| joseph_adamu | 1:dc648c5624b9 | 99 | #define FSFAT_FOPEN_TEST_09 fsfat_fopen_test_09 |
| joseph_adamu | 1:dc648c5624b9 | 100 | #define FSFAT_FOPEN_TEST_10 fsfat_fopen_test_10 |
| joseph_adamu | 1:dc648c5624b9 | 101 | #define FSFAT_FOPEN_TEST_11 fsfat_fopen_test_11 |
| joseph_adamu | 1:dc648c5624b9 | 102 | #define FSFAT_FOPEN_TEST_12 fsfat_fopen_test_12 |
| joseph_adamu | 1:dc648c5624b9 | 103 | #define FSFAT_FOPEN_TEST_13 fsfat_fopen_test_13 |
| joseph_adamu | 1:dc648c5624b9 | 104 | #define FSFAT_FOPEN_TEST_14 fsfat_fopen_test_14 |
| joseph_adamu | 1:dc648c5624b9 | 105 | #define FSFAT_FOPEN_TEST_15 fsfat_fopen_test_15 |
| joseph_adamu | 1:dc648c5624b9 | 106 | #define FSFAT_FOPEN_TEST_16 fsfat_fopen_test_16 |
| joseph_adamu | 1:dc648c5624b9 | 107 | #define FSFAT_FOPEN_TEST_17 fsfat_fopen_test_17 |
| joseph_adamu | 1:dc648c5624b9 | 108 | #define FSFAT_FOPEN_TEST_18 fsfat_fopen_test_18 |
| joseph_adamu | 1:dc648c5624b9 | 109 | #define FSFAT_FOPEN_TEST_19 fsfat_fopen_test_19 |
| joseph_adamu | 1:dc648c5624b9 | 110 | #define FSFAT_FOPEN_TEST_20 fsfat_fopen_test_20 |
| joseph_adamu | 1:dc648c5624b9 | 111 | #define FSFAT_FOPEN_TEST_21 fsfat_fopen_test_21 |
| joseph_adamu | 1:dc648c5624b9 | 112 | #define FSFAT_FOPEN_TEST_22 fsfat_fopen_test_22 |
| joseph_adamu | 1:dc648c5624b9 | 113 | #define FSFAT_FOPEN_TEST_23 fsfat_fopen_test_23 |
| joseph_adamu | 1:dc648c5624b9 | 114 | #define FSFAT_FOPEN_TEST_24 fsfat_fopen_test_24 |
| joseph_adamu | 1:dc648c5624b9 | 115 | #define FSFAT_FOPEN_TEST_25 fsfat_fopen_test_25 |
| joseph_adamu | 1:dc648c5624b9 | 116 | #define FSFAT_FOPEN_TEST_26 fsfat_fopen_test_26 |
| joseph_adamu | 1:dc648c5624b9 | 117 | #define FSFAT_FOPEN_TEST_27 fsfat_fopen_test_27 |
| joseph_adamu | 1:dc648c5624b9 | 118 | #define FSFAT_FOPEN_TEST_28 fsfat_fopen_test_28 |
| joseph_adamu | 1:dc648c5624b9 | 119 | #define FSFAT_FOPEN_TEST_29 fsfat_fopen_test_29 |
| joseph_adamu | 1:dc648c5624b9 | 120 | #define FSFAT_FOPEN_TEST_30 fsfat_fopen_test_30 |
| joseph_adamu | 1:dc648c5624b9 | 121 | |
| joseph_adamu | 1:dc648c5624b9 | 122 | |
| joseph_adamu | 1:dc648c5624b9 | 123 | /* support functions */ |
| joseph_adamu | 1:dc648c5624b9 | 124 | |
| joseph_adamu | 1:dc648c5624b9 | 125 | /* |
| joseph_adamu | 1:dc648c5624b9 | 126 | * open tests that focus on testing fopen() |
| joseph_adamu | 1:dc648c5624b9 | 127 | * fsfat_handle_t fopen(const char* filename, char* data, size_t* len, fsfat_key_desc_t* kdesc) |
| joseph_adamu | 1:dc648c5624b9 | 128 | */ |
| joseph_adamu | 1:dc648c5624b9 | 129 | |
| joseph_adamu | 1:dc648c5624b9 | 130 | /* file data for test_01 */ |
| joseph_adamu | 1:dc648c5624b9 | 131 | static fsfat_kv_data_t fsfat_fopen_test_01_kv_data[] = { |
| joseph_adamu | 1:dc648c5624b9 | 132 | { "/sd/fopentst/hello/world/animal/wobbly/dog/foot/frontlft.txt", "missing"}, |
| joseph_adamu | 1:dc648c5624b9 | 133 | { NULL, NULL}, |
| joseph_adamu | 1:dc648c5624b9 | 134 | }; |
| joseph_adamu | 1:dc648c5624b9 | 135 | |
| joseph_adamu | 1:dc648c5624b9 | 136 | |
| joseph_adamu | 1:dc648c5624b9 | 137 | /** @brief |
| joseph_adamu | 1:dc648c5624b9 | 138 | * Split a file path into its component parts, setting '/' characters to '\0', and returning |
| joseph_adamu | 1:dc648c5624b9 | 139 | * pointers to the file path components in the parts array. For example, if |
| joseph_adamu | 1:dc648c5624b9 | 140 | * filepath = "/sd/fopentst/hello/world/animal/wobbly/dog/foot/frontlft.txt" then |
| joseph_adamu | 1:dc648c5624b9 | 141 | * *parts[0] = "sd" |
| joseph_adamu | 1:dc648c5624b9 | 142 | * *parts[1] = "fopentst" |
| joseph_adamu | 1:dc648c5624b9 | 143 | * *parts[2] = "hello" |
| joseph_adamu | 1:dc648c5624b9 | 144 | * *parts[3] = "world" |
| joseph_adamu | 1:dc648c5624b9 | 145 | * *parts[4] = "animal" |
| joseph_adamu | 1:dc648c5624b9 | 146 | * *parts[5] = "wobbly" |
| joseph_adamu | 1:dc648c5624b9 | 147 | * *parts[6] = "dog" |
| joseph_adamu | 1:dc648c5624b9 | 148 | * *parts[7] = "foot" |
| joseph_adamu | 1:dc648c5624b9 | 149 | * *parts[8] = "frontlft.txt" |
| joseph_adamu | 1:dc648c5624b9 | 150 | * parts[9] = NULL |
| joseph_adamu | 1:dc648c5624b9 | 151 | * |
| joseph_adamu | 1:dc648c5624b9 | 152 | * ARGUMENTS |
| joseph_adamu | 1:dc648c5624b9 | 153 | * @param filepath IN file path string to split into component parts. Expected to start with '/' |
| joseph_adamu | 1:dc648c5624b9 | 154 | * @param parts IN OUT array to hold pointers to parts |
| joseph_adamu | 1:dc648c5624b9 | 155 | * @param num IN number of components available in parts |
| joseph_adamu | 1:dc648c5624b9 | 156 | * |
| joseph_adamu | 1:dc648c5624b9 | 157 | * @return On success, this returns the number of components in the filepath Returns number of compoee |
| joseph_adamu | 1:dc648c5624b9 | 158 | */ |
| joseph_adamu | 1:dc648c5624b9 | 159 | static int32_t fsfat_filepath_split(char* filepath, char* parts[], uint32_t num) |
| joseph_adamu | 1:dc648c5624b9 | 160 | { |
| joseph_adamu | 1:dc648c5624b9 | 161 | uint32_t i = 0; |
| joseph_adamu | 1:dc648c5624b9 | 162 | int32_t ret = -1; |
| joseph_adamu | 1:dc648c5624b9 | 163 | char* z = filepath; |
| joseph_adamu | 1:dc648c5624b9 | 164 | |
| joseph_adamu | 1:dc648c5624b9 | 165 | while (i < num && *z != '\0') { |
| joseph_adamu | 1:dc648c5624b9 | 166 | if (*z == '/' ) { |
| joseph_adamu | 1:dc648c5624b9 | 167 | *z = '\0'; |
| joseph_adamu | 1:dc648c5624b9 | 168 | parts[i] = ++z; |
| joseph_adamu | 1:dc648c5624b9 | 169 | i++; |
| joseph_adamu | 1:dc648c5624b9 | 170 | } else { |
| joseph_adamu | 1:dc648c5624b9 | 171 | z++; |
| joseph_adamu | 1:dc648c5624b9 | 172 | } |
| joseph_adamu | 1:dc648c5624b9 | 173 | } |
| joseph_adamu | 1:dc648c5624b9 | 174 | if (*z == '\0' && i > 0) { |
| joseph_adamu | 1:dc648c5624b9 | 175 | ret = (int32_t) i; |
| joseph_adamu | 1:dc648c5624b9 | 176 | } |
| joseph_adamu | 1:dc648c5624b9 | 177 | return ret; |
| joseph_adamu | 1:dc648c5624b9 | 178 | } |
| joseph_adamu | 1:dc648c5624b9 | 179 | |
| joseph_adamu | 1:dc648c5624b9 | 180 | |
| joseph_adamu | 1:dc648c5624b9 | 181 | /** @brief |
| joseph_adamu | 1:dc648c5624b9 | 182 | * remove all directories and file in the given filepath |
| joseph_adamu | 1:dc648c5624b9 | 183 | * |
| joseph_adamu | 1:dc648c5624b9 | 184 | * ARGUMENTS |
| joseph_adamu | 1:dc648c5624b9 | 185 | * @param filepath IN file path string to split into component parts. Expected to start with '/' |
| joseph_adamu | 1:dc648c5624b9 | 186 | * |
| joseph_adamu | 1:dc648c5624b9 | 187 | * @return On success, this returns 0, otherwise < 0 is returned; |
| joseph_adamu | 1:dc648c5624b9 | 188 | */ |
| joseph_adamu | 1:dc648c5624b9 | 189 | int32_t fsfat_filepath_remove_all(char* filepath) |
| joseph_adamu | 1:dc648c5624b9 | 190 | { |
| joseph_adamu | 1:dc648c5624b9 | 191 | int32_t ret = -1; |
| joseph_adamu | 1:dc648c5624b9 | 192 | int32_t len = 0; |
| joseph_adamu | 1:dc648c5624b9 | 193 | char *fpathbuf = NULL; |
| joseph_adamu | 1:dc648c5624b9 | 194 | char *pos = NULL; |
| joseph_adamu | 1:dc648c5624b9 | 195 | |
| joseph_adamu | 1:dc648c5624b9 | 196 | FSFAT_FENTRYLOG("%s:entered\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 197 | len = strlen(filepath); |
| joseph_adamu | 1:dc648c5624b9 | 198 | fpathbuf = (char*) malloc(len+1); |
| joseph_adamu | 1:dc648c5624b9 | 199 | if (fpathbuf == NULL) { |
| joseph_adamu | 1:dc648c5624b9 | 200 | FSFAT_DBGLOG("%s: failed to duplicate string (out of memory)\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 201 | return ret; |
| joseph_adamu | 1:dc648c5624b9 | 202 | } |
| joseph_adamu | 1:dc648c5624b9 | 203 | memset(fpathbuf, 0, len+1); |
| joseph_adamu | 1:dc648c5624b9 | 204 | memcpy(fpathbuf, filepath, len); |
| joseph_adamu | 1:dc648c5624b9 | 205 | |
| joseph_adamu | 1:dc648c5624b9 | 206 | /* delete the leaf node first, and then successively parent directories. */ |
| joseph_adamu | 1:dc648c5624b9 | 207 | pos = fpathbuf + strlen(fpathbuf); |
| joseph_adamu | 1:dc648c5624b9 | 208 | while (pos != fpathbuf) { |
| joseph_adamu | 1:dc648c5624b9 | 209 | /* If the remaining file path is the mount point path then finish as the mount point cannot be removed */ |
| joseph_adamu | 1:dc648c5624b9 | 210 | if (strlen(fpathbuf) == strlen(FSFAT_FOPEN_TEST_MOUNT_PT_PATH) && strncmp(fpathbuf, FSFAT_FOPEN_TEST_MOUNT_PT_PATH, strlen(fpathbuf)) == 0) { |
| joseph_adamu | 1:dc648c5624b9 | 211 | break; |
| joseph_adamu | 1:dc648c5624b9 | 212 | } |
| joseph_adamu | 1:dc648c5624b9 | 213 | ret = remove(fpathbuf); |
| joseph_adamu | 1:dc648c5624b9 | 214 | pos = strrchr(fpathbuf, '/'); |
| joseph_adamu | 1:dc648c5624b9 | 215 | *pos = '\0'; |
| joseph_adamu | 1:dc648c5624b9 | 216 | } |
| joseph_adamu | 1:dc648c5624b9 | 217 | if (fpathbuf) { |
| joseph_adamu | 1:dc648c5624b9 | 218 | free(fpathbuf); |
| joseph_adamu | 1:dc648c5624b9 | 219 | } |
| joseph_adamu | 1:dc648c5624b9 | 220 | return ret; |
| joseph_adamu | 1:dc648c5624b9 | 221 | } |
| joseph_adamu | 1:dc648c5624b9 | 222 | |
| joseph_adamu | 1:dc648c5624b9 | 223 | |
| joseph_adamu | 1:dc648c5624b9 | 224 | /** @brief |
| joseph_adamu | 1:dc648c5624b9 | 225 | * make all directories in the given filepath. Do not create the file if present at end of filepath |
| joseph_adamu | 1:dc648c5624b9 | 226 | * |
| joseph_adamu | 1:dc648c5624b9 | 227 | * ARGUMENTS |
| joseph_adamu | 1:dc648c5624b9 | 228 | * @param filepath IN file path containing directories and file |
| joseph_adamu | 1:dc648c5624b9 | 229 | * @param do_asserts IN set to true if function should assert on errors |
| joseph_adamu | 1:dc648c5624b9 | 230 | * |
| joseph_adamu | 1:dc648c5624b9 | 231 | * @return On success, this returns 0, otherwise < 0 is returned; |
| joseph_adamu | 1:dc648c5624b9 | 232 | */ |
| joseph_adamu | 1:dc648c5624b9 | 233 | static int32_t fsfat_filepath_make_dirs(char* filepath, bool do_asserts) |
| joseph_adamu | 1:dc648c5624b9 | 234 | { |
| joseph_adamu | 1:dc648c5624b9 | 235 | int32_t i = 0; |
| joseph_adamu | 1:dc648c5624b9 | 236 | int32_t num_parts = 0; |
| joseph_adamu | 1:dc648c5624b9 | 237 | int32_t len = 0; |
| joseph_adamu | 1:dc648c5624b9 | 238 | int32_t ret = -1; |
| joseph_adamu | 1:dc648c5624b9 | 239 | char *fpathbuf = NULL; |
| joseph_adamu | 1:dc648c5624b9 | 240 | char *buf = NULL; |
| joseph_adamu | 1:dc648c5624b9 | 241 | int pos = 0; |
| joseph_adamu | 1:dc648c5624b9 | 242 | char *parts[FSFAT_FOPEN_TEST_FILEPATH_MAX_DEPTH]; |
| joseph_adamu | 1:dc648c5624b9 | 243 | |
| joseph_adamu | 1:dc648c5624b9 | 244 | FSFAT_DBGLOG("%s:entered\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 245 | /* find the dirs to create*/ |
| joseph_adamu | 1:dc648c5624b9 | 246 | memset(parts, 0, sizeof(parts)); |
| joseph_adamu | 1:dc648c5624b9 | 247 | len = strlen(filepath); |
| joseph_adamu | 1:dc648c5624b9 | 248 | fpathbuf = (char*) malloc(len+1); |
| joseph_adamu | 1:dc648c5624b9 | 249 | if (fpathbuf == NULL) { |
| joseph_adamu | 1:dc648c5624b9 | 250 | FSFAT_DBGLOG("%s: failed to duplicate string (out of memory)\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 251 | return ret; |
| joseph_adamu | 1:dc648c5624b9 | 252 | } |
| joseph_adamu | 1:dc648c5624b9 | 253 | memset(fpathbuf, 0, len+1); |
| joseph_adamu | 1:dc648c5624b9 | 254 | memcpy(fpathbuf, filepath, len); |
| joseph_adamu | 1:dc648c5624b9 | 255 | num_parts = fsfat_filepath_split(fpathbuf, parts, FSFAT_FOPEN_TEST_FILEPATH_MAX_DEPTH); |
| joseph_adamu | 1:dc648c5624b9 | 256 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to split filepath (filename=\"%s\", num_parts=%d)\n", __func__, filepath, (int) num_parts); |
| joseph_adamu | 1:dc648c5624b9 | 257 | TEST_ASSERT_MESSAGE(num_parts > 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 258 | |
| joseph_adamu | 1:dc648c5624b9 | 259 | /* Now create the directories on the directory path. |
| joseph_adamu | 1:dc648c5624b9 | 260 | * Skip creating dir for "/sd" which must be present */ |
| joseph_adamu | 1:dc648c5624b9 | 261 | buf = (char*) malloc(strlen(filepath)+1); |
| joseph_adamu | 1:dc648c5624b9 | 262 | memset(buf, 0, strlen(filepath)+1); |
| joseph_adamu | 1:dc648c5624b9 | 263 | pos = sprintf(buf, "/%s", parts[0]); |
| joseph_adamu | 1:dc648c5624b9 | 264 | for (i = 1; i < num_parts - 1; i++) { |
| joseph_adamu | 1:dc648c5624b9 | 265 | pos += sprintf(buf+pos, "/%s", parts[i]); |
| joseph_adamu | 1:dc648c5624b9 | 266 | FSFAT_DBGLOG("mkdir(%s)\n", buf); |
| joseph_adamu | 1:dc648c5624b9 | 267 | ret = mkdir(buf, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); |
| joseph_adamu | 1:dc648c5624b9 | 268 | if (do_asserts == true) { |
| joseph_adamu | 1:dc648c5624b9 | 269 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create directory (filepath2=\"%s\", ret=%d, errno=%d)\n", __func__, buf, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 270 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 271 | } |
| joseph_adamu | 1:dc648c5624b9 | 272 | } |
| joseph_adamu | 1:dc648c5624b9 | 273 | |
| joseph_adamu | 1:dc648c5624b9 | 274 | if (buf) { |
| joseph_adamu | 1:dc648c5624b9 | 275 | free(buf); |
| joseph_adamu | 1:dc648c5624b9 | 276 | } |
| joseph_adamu | 1:dc648c5624b9 | 277 | if (fpathbuf) { |
| joseph_adamu | 1:dc648c5624b9 | 278 | free(fpathbuf); |
| joseph_adamu | 1:dc648c5624b9 | 279 | } |
| joseph_adamu | 1:dc648c5624b9 | 280 | return ret; |
| joseph_adamu | 1:dc648c5624b9 | 281 | } |
| joseph_adamu | 1:dc648c5624b9 | 282 | |
| joseph_adamu | 1:dc648c5624b9 | 283 | |
| joseph_adamu | 1:dc648c5624b9 | 284 | /* FIX ME: errno not set correctly when error occurs. This indicates a problem with the implementation. */ |
| joseph_adamu | 1:dc648c5624b9 | 285 | |
| joseph_adamu | 1:dc648c5624b9 | 286 | /** @brief |
| joseph_adamu | 1:dc648c5624b9 | 287 | * Basic fopen test which does the following: |
| joseph_adamu | 1:dc648c5624b9 | 288 | * - creates file and writes some data to the value blob. |
| joseph_adamu | 1:dc648c5624b9 | 289 | * - closes the newly created file. |
| joseph_adamu | 1:dc648c5624b9 | 290 | * - opens the file (r-only) |
| joseph_adamu | 1:dc648c5624b9 | 291 | * - reads the file data and checks its the same as the previously created data. |
| joseph_adamu | 1:dc648c5624b9 | 292 | * - closes the opened file |
| joseph_adamu | 1:dc648c5624b9 | 293 | * |
| joseph_adamu | 1:dc648c5624b9 | 294 | * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. |
| joseph_adamu | 1:dc648c5624b9 | 295 | */ |
| joseph_adamu | 1:dc648c5624b9 | 296 | static control_t fsfat_fopen_test_01(const size_t call_count) |
| joseph_adamu | 1:dc648c5624b9 | 297 | { |
| joseph_adamu | 1:dc648c5624b9 | 298 | char* read_buf; |
| joseph_adamu | 1:dc648c5624b9 | 299 | int32_t ret = 0; |
| joseph_adamu | 1:dc648c5624b9 | 300 | size_t len = 0; |
| joseph_adamu | 1:dc648c5624b9 | 301 | fsfat_kv_data_t *node; |
| joseph_adamu | 1:dc648c5624b9 | 302 | FILE *fp = NULL; |
| joseph_adamu | 1:dc648c5624b9 | 303 | |
| joseph_adamu | 1:dc648c5624b9 | 304 | FSFAT_DBGLOG("%s:entered\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 305 | (void) call_count; |
| joseph_adamu | 1:dc648c5624b9 | 306 | node = fsfat_fopen_test_01_kv_data; |
| joseph_adamu | 1:dc648c5624b9 | 307 | |
| joseph_adamu | 1:dc648c5624b9 | 308 | /* remove file and directory from a previous failed test run, if present */ |
| joseph_adamu | 1:dc648c5624b9 | 309 | fsfat_filepath_remove_all((char*) node->filename); |
| joseph_adamu | 1:dc648c5624b9 | 310 | |
| joseph_adamu | 1:dc648c5624b9 | 311 | /* create dirs */ |
| joseph_adamu | 1:dc648c5624b9 | 312 | ret = fsfat_filepath_make_dirs((char*) node->filename, true); |
| joseph_adamu | 1:dc648c5624b9 | 313 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create dirs for filename (filename=\"%s\")(ret=%d)\n", __func__, node->filename, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 314 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 315 | |
| joseph_adamu | 1:dc648c5624b9 | 316 | FSFAT_DBGLOG("%s:About to create new file (filename=\"%s\", data=\"%s\")\n", __func__, node->filename, node->value); |
| joseph_adamu | 1:dc648c5624b9 | 317 | fp = fopen(node->filename, "w+"); |
| joseph_adamu | 1:dc648c5624b9 | 318 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create file (filename=\"%s\", data=\"%s\")(ret=%d, errno=%d)\n", __func__, node->filename, node->value, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 319 | TEST_ASSERT_MESSAGE(fp != NULL, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 320 | |
| joseph_adamu | 1:dc648c5624b9 | 321 | FSFAT_DBGLOG("%s:length of file=%d (filename=\"%s\", data=\"%s\")\n", __func__, (int) len, node->filename, node->value); |
| joseph_adamu | 1:dc648c5624b9 | 322 | len = strlen(node->value); |
| joseph_adamu | 1:dc648c5624b9 | 323 | ret = fwrite((const void*) node->value, len, 1, fp); |
| joseph_adamu | 1:dc648c5624b9 | 324 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to write file (filename=\"%s\", data=\"%s\")(ret=%d)\n", __func__, node->filename, node->value, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 325 | TEST_ASSERT_MESSAGE(ret == 1, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 326 | |
| joseph_adamu | 1:dc648c5624b9 | 327 | FSFAT_DBGLOG("Created file successfully (filename=\"%s\", data=\"%s\")\n", node->filename, node->value); |
| joseph_adamu | 1:dc648c5624b9 | 328 | ret = fclose(fp); |
| joseph_adamu | 1:dc648c5624b9 | 329 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to close file (ret=%d, errno=%d)\n", __func__, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 330 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 331 | |
| joseph_adamu | 1:dc648c5624b9 | 332 | /* now open the newly created key */ |
| joseph_adamu | 1:dc648c5624b9 | 333 | fp = NULL; |
| joseph_adamu | 1:dc648c5624b9 | 334 | fp = fopen(node->filename, "r"); |
| joseph_adamu | 1:dc648c5624b9 | 335 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to open file for reading (filename=\"%s\", data=\"%s\")(ret=%d)\n", __func__, node->filename, node->value, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 336 | TEST_ASSERT_MESSAGE(fp != NULL, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 337 | |
| joseph_adamu | 1:dc648c5624b9 | 338 | len = strlen(node->value) + 1; |
| joseph_adamu | 1:dc648c5624b9 | 339 | read_buf = (char*) malloc(len); |
| joseph_adamu | 1:dc648c5624b9 | 340 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to allocated read buffer \n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 341 | TEST_ASSERT_MESSAGE(read_buf != NULL, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 342 | |
| joseph_adamu | 1:dc648c5624b9 | 343 | FSFAT_DBGLOG("Opened file successfully (filename=\"%s\", data=\"%s\")\n", node->filename, node->value); |
| joseph_adamu | 1:dc648c5624b9 | 344 | memset(read_buf, 0, len); |
| joseph_adamu | 1:dc648c5624b9 | 345 | ret = fread((void*) read_buf, len, 1, fp); |
| joseph_adamu | 1:dc648c5624b9 | 346 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to read file (filename=\"%s\", data=\"%s\", read_buf=\"%s\", ret=%d)\n", __func__, node->filename, node->value, read_buf, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 347 | /* FIX ME: fread should return the number of items read, not 0 when an item is read successfully. |
| joseph_adamu | 1:dc648c5624b9 | 348 | * This indicates a problem with the implementation, as the correct data is read. The correct assert should be: |
| joseph_adamu | 1:dc648c5624b9 | 349 | * TEST_ASSERT_MESSAGE(ret == 1, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 350 | * The following assert is curerntly used until the implementation is fixed |
| joseph_adamu | 1:dc648c5624b9 | 351 | */ |
| joseph_adamu | 1:dc648c5624b9 | 352 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 353 | |
| joseph_adamu | 1:dc648c5624b9 | 354 | /* check read data is as expected */ |
| joseph_adamu | 1:dc648c5624b9 | 355 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: read value data (%s) != expected value data (filename=\"%s\", data=\"%s\", read_buf=\"%s\", ret=%d)\n", __func__, read_buf, node->filename, node->value, read_buf, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 356 | TEST_ASSERT_MESSAGE(strncmp(read_buf, node->value, strlen(node->value)) == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 357 | |
| joseph_adamu | 1:dc648c5624b9 | 358 | if(read_buf){ |
| joseph_adamu | 1:dc648c5624b9 | 359 | free(read_buf); |
| joseph_adamu | 1:dc648c5624b9 | 360 | } |
| joseph_adamu | 1:dc648c5624b9 | 361 | ret = fclose(fp); |
| joseph_adamu | 1:dc648c5624b9 | 362 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: fclose() call failed (ret=%d, errno=%d).\n", __func__, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 363 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 364 | return CaseNext; |
| joseph_adamu | 1:dc648c5624b9 | 365 | } |
| joseph_adamu | 1:dc648c5624b9 | 366 | |
| joseph_adamu | 1:dc648c5624b9 | 367 | static fsfat_kv_data_t fsfat_fopen_test_02_data[] = { |
| joseph_adamu | 1:dc648c5624b9 | 368 | FSFAT_INIT_1_TABLE_MID_NODE, |
| joseph_adamu | 1:dc648c5624b9 | 369 | { NULL, NULL}, |
| joseph_adamu | 1:dc648c5624b9 | 370 | }; |
| joseph_adamu | 1:dc648c5624b9 | 371 | |
| joseph_adamu | 1:dc648c5624b9 | 372 | /** |
| joseph_adamu | 1:dc648c5624b9 | 373 | * @brief test to fopen() a pre-existing key and try to write it, which should fail |
| joseph_adamu | 1:dc648c5624b9 | 374 | * as by default pre-existing keys are opened read-only |
| joseph_adamu | 1:dc648c5624b9 | 375 | * |
| joseph_adamu | 1:dc648c5624b9 | 376 | * Basic open test which does the following: |
| joseph_adamu | 1:dc648c5624b9 | 377 | * - creates file with default rw perms and writes some data to the value blob. |
| joseph_adamu | 1:dc648c5624b9 | 378 | * - closes the newly created file. |
| joseph_adamu | 1:dc648c5624b9 | 379 | * - opens the file with the default permissions (read-only) |
| joseph_adamu | 1:dc648c5624b9 | 380 | * - tries to write the file data which should fail because file was not opened with write flag set. |
| joseph_adamu | 1:dc648c5624b9 | 381 | * - closes the opened key |
| joseph_adamu | 1:dc648c5624b9 | 382 | * |
| joseph_adamu | 1:dc648c5624b9 | 383 | * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. |
| joseph_adamu | 1:dc648c5624b9 | 384 | */ |
| joseph_adamu | 1:dc648c5624b9 | 385 | control_t fsfat_fopen_test_02(const size_t call_count) |
| joseph_adamu | 1:dc648c5624b9 | 386 | { |
| joseph_adamu | 1:dc648c5624b9 | 387 | int32_t ret = -1; |
| joseph_adamu | 1:dc648c5624b9 | 388 | size_t len = 0; |
| joseph_adamu | 1:dc648c5624b9 | 389 | FILE *fp = NULL; |
| joseph_adamu | 1:dc648c5624b9 | 390 | |
| joseph_adamu | 1:dc648c5624b9 | 391 | FSFAT_FENTRYLOG("%s:entered\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 392 | (void) call_count; |
| joseph_adamu | 1:dc648c5624b9 | 393 | len = strlen(fsfat_fopen_test_02_data[0].value); |
| joseph_adamu | 1:dc648c5624b9 | 394 | ret = fsfat_test_create(fsfat_fopen_test_02_data[0].filename, (char*) fsfat_fopen_test_02_data[0].value, len); |
| joseph_adamu | 1:dc648c5624b9 | 395 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create file (ret=%d).\n", __func__, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 396 | TEST_ASSERT_MESSAGE(ret >= 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 397 | |
| joseph_adamu | 1:dc648c5624b9 | 398 | /* by default, owner of key opens with read-only permissions*/ |
| joseph_adamu | 1:dc648c5624b9 | 399 | fp = fopen(fsfat_fopen_test_02_data[0].filename, "r"); |
| joseph_adamu | 1:dc648c5624b9 | 400 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to open file (filename=\"%s\", ret=%d)\n", __func__, fsfat_fopen_test_02_data[0].filename, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 401 | TEST_ASSERT_MESSAGE(fp != NULL, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 402 | |
| joseph_adamu | 1:dc648c5624b9 | 403 | len = strlen(fsfat_fopen_test_02_data[0].value); |
| joseph_adamu | 1:dc648c5624b9 | 404 | ret = fwrite((const void*) fsfat_fopen_test_02_data[0].value, len, 1, fp); |
| joseph_adamu | 1:dc648c5624b9 | 405 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: call to fwrite() succeeded when should have failed for read-only file (filename=\"%s\")(ret=%d).\n", __func__, fsfat_fopen_test_02_data[0].filename, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 406 | TEST_ASSERT_MESSAGE(ret <= 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 407 | |
| joseph_adamu | 1:dc648c5624b9 | 408 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: fclose() call failed.\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 409 | TEST_ASSERT_MESSAGE(fclose(fp) == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 410 | |
| joseph_adamu | 1:dc648c5624b9 | 411 | return CaseNext; |
| joseph_adamu | 1:dc648c5624b9 | 412 | } |
| joseph_adamu | 1:dc648c5624b9 | 413 | |
| joseph_adamu | 1:dc648c5624b9 | 414 | |
| joseph_adamu | 1:dc648c5624b9 | 415 | /** |
| joseph_adamu | 1:dc648c5624b9 | 416 | * @brief test to fopen() a pre-existing file and try to write it, which should succeed |
| joseph_adamu | 1:dc648c5624b9 | 417 | * because the key was opened read-write permissions explicitly |
| joseph_adamu | 1:dc648c5624b9 | 418 | * |
| joseph_adamu | 1:dc648c5624b9 | 419 | * Basic open test which does the following: |
| joseph_adamu | 1:dc648c5624b9 | 420 | * - creates file with default rw perms and writes some data to the value blob. |
| joseph_adamu | 1:dc648c5624b9 | 421 | * - closes the newly created file. |
| joseph_adamu | 1:dc648c5624b9 | 422 | * - opens the file with the rw permissions (non default) |
| joseph_adamu | 1:dc648c5624b9 | 423 | * - tries to write the file data which should succeeds because file was opened with write flag set. |
| joseph_adamu | 1:dc648c5624b9 | 424 | * - closes the opened key |
| joseph_adamu | 1:dc648c5624b9 | 425 | * |
| joseph_adamu | 1:dc648c5624b9 | 426 | * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. |
| joseph_adamu | 1:dc648c5624b9 | 427 | */ |
| joseph_adamu | 1:dc648c5624b9 | 428 | control_t fsfat_fopen_test_03(const size_t call_count) |
| joseph_adamu | 1:dc648c5624b9 | 429 | { |
| joseph_adamu | 1:dc648c5624b9 | 430 | int32_t ret = -1; |
| joseph_adamu | 1:dc648c5624b9 | 431 | size_t len = 0; |
| joseph_adamu | 1:dc648c5624b9 | 432 | FILE *fp = NULL; |
| joseph_adamu | 1:dc648c5624b9 | 433 | |
| joseph_adamu | 1:dc648c5624b9 | 434 | FSFAT_FENTRYLOG("%s:entered\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 435 | (void) call_count; |
| joseph_adamu | 1:dc648c5624b9 | 436 | len = strlen(fsfat_fopen_test_02_data[0].value); |
| joseph_adamu | 1:dc648c5624b9 | 437 | ret = fsfat_test_create(fsfat_fopen_test_02_data[0].filename, (char*) fsfat_fopen_test_02_data[0].value, len); |
| joseph_adamu | 1:dc648c5624b9 | 438 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create file in store (ret=%d).\n", __func__, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 439 | TEST_ASSERT_MESSAGE(ret >= 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 440 | |
| joseph_adamu | 1:dc648c5624b9 | 441 | /* opens with read-write permissions*/ |
| joseph_adamu | 1:dc648c5624b9 | 442 | fp = fopen(fsfat_fopen_test_02_data[0].filename, "w+"); |
| joseph_adamu | 1:dc648c5624b9 | 443 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to open file (filename=\"%s\")(ret=%d)\n", __func__, fsfat_fopen_test_02_data[0].filename, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 444 | TEST_ASSERT_MESSAGE(ret >= 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 445 | |
| joseph_adamu | 1:dc648c5624b9 | 446 | len = strlen(fsfat_fopen_test_02_data[0].value); |
| joseph_adamu | 1:dc648c5624b9 | 447 | ret = fwrite((const void*) fsfat_fopen_test_02_data[0].value, len, 1, fp); |
| joseph_adamu | 1:dc648c5624b9 | 448 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: call to fwrite() failed when should have succeeded (filename=\"%s\", ret=%d).\n", __func__, fsfat_fopen_test_02_data[0].filename, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 449 | TEST_ASSERT_MESSAGE(ret >= 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 450 | |
| joseph_adamu | 1:dc648c5624b9 | 451 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: fclose() call failed.\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 452 | TEST_ASSERT_MESSAGE(fclose(fp) >= 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 453 | |
| joseph_adamu | 1:dc648c5624b9 | 454 | /* clean-up */ |
| joseph_adamu | 1:dc648c5624b9 | 455 | ret = remove(fsfat_fopen_test_02_data[0].filename); |
| joseph_adamu | 1:dc648c5624b9 | 456 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: unable to delete file (filename=%s, ret=%d) .\n", __func__, fsfat_fopen_test_02_data[0].filename, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 457 | TEST_ASSERT_MESSAGE(ret >= 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 458 | |
| joseph_adamu | 1:dc648c5624b9 | 459 | return CaseNext; |
| joseph_adamu | 1:dc648c5624b9 | 460 | } |
| joseph_adamu | 1:dc648c5624b9 | 461 | |
| joseph_adamu | 1:dc648c5624b9 | 462 | |
| joseph_adamu | 1:dc648c5624b9 | 463 | /** @brief test to call fopen() with a filename string that exceeds the maximum length |
| joseph_adamu | 1:dc648c5624b9 | 464 | * - chanFS supports the exFAT format which should support 255 char filenames |
| joseph_adamu | 1:dc648c5624b9 | 465 | * - check that filenames of this length can be created |
| joseph_adamu | 1:dc648c5624b9 | 466 | * |
| joseph_adamu | 1:dc648c5624b9 | 467 | * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. |
| joseph_adamu | 1:dc648c5624b9 | 468 | */ |
| joseph_adamu | 1:dc648c5624b9 | 469 | control_t fsfat_fopen_test_04(const size_t call_count) |
| joseph_adamu | 1:dc648c5624b9 | 470 | { |
| joseph_adamu | 1:dc648c5624b9 | 471 | char filename_good[FSFAT_FILENAME_MAX_LENGTH+1]; |
| joseph_adamu | 1:dc648c5624b9 | 472 | char filename_bad[FSFAT_FILENAME_MAX_LENGTH+2]; |
| joseph_adamu | 1:dc648c5624b9 | 473 | int32_t ret = -1; |
| joseph_adamu | 1:dc648c5624b9 | 474 | size_t len = 0; |
| joseph_adamu | 1:dc648c5624b9 | 475 | |
| joseph_adamu | 1:dc648c5624b9 | 476 | FSFAT_FENTRYLOG("%s:entered\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 477 | (void) call_count; |
| joseph_adamu | 1:dc648c5624b9 | 478 | |
| joseph_adamu | 1:dc648c5624b9 | 479 | memset(filename_good, 0, FSFAT_FILENAME_MAX_LENGTH+1); |
| joseph_adamu | 1:dc648c5624b9 | 480 | memset(filename_bad, 0, FSFAT_FILENAME_MAX_LENGTH+2); |
| joseph_adamu | 1:dc648c5624b9 | 481 | ret = fsfat_test_filename_gen(filename_good, FSFAT_FILENAME_MAX_LENGTH); |
| joseph_adamu | 1:dc648c5624b9 | 482 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: unable to generate filename_good.\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 483 | TEST_ASSERT_MESSAGE(ret >= 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 484 | |
| joseph_adamu | 1:dc648c5624b9 | 485 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: filename_good is not the correct length (filename_good=%s, len=%d, expected=%d).\n", __func__, filename_good, (int) strlen(filename_good), (int) FSFAT_FILENAME_MAX_LENGTH); |
| joseph_adamu | 1:dc648c5624b9 | 486 | TEST_ASSERT_MESSAGE(strlen(filename_good) == FSFAT_FILENAME_MAX_LENGTH, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 487 | |
| joseph_adamu | 1:dc648c5624b9 | 488 | ret = fsfat_test_filename_gen(filename_bad, FSFAT_FILENAME_MAX_LENGTH+1); |
| joseph_adamu | 1:dc648c5624b9 | 489 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: unable to generate filename_bad.\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 490 | TEST_ASSERT_MESSAGE(ret >= 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 491 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: filename_bad is not the correct length (len=%d, expected=%d).\n", __func__, (int) strlen(filename_bad), (int) FSFAT_FILENAME_MAX_LENGTH+1); |
| joseph_adamu | 1:dc648c5624b9 | 492 | TEST_ASSERT_MESSAGE(strlen(filename_bad) == FSFAT_FILENAME_MAX_LENGTH+1, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 493 | |
| joseph_adamu | 1:dc648c5624b9 | 494 | len = strlen(filename_good); |
| joseph_adamu | 1:dc648c5624b9 | 495 | ret = fsfat_test_create(filename_good, filename_good, len); |
| joseph_adamu | 1:dc648c5624b9 | 496 | /* FIXME: |
| joseph_adamu | 1:dc648c5624b9 | 497 | * The current implementation can create file with a filename with 9 chars (more than the 8 restriction of FAT32 Short File Names). |
| joseph_adamu | 1:dc648c5624b9 | 498 | * However, the exFAT 255 char filesnames is not supported and hence the following is commented out. Find out what is |
| joseph_adamu | 1:dc648c5624b9 | 499 | * the supported max filename length and change this testcase according. |
| joseph_adamu | 1:dc648c5624b9 | 500 | * |
| joseph_adamu | 1:dc648c5624b9 | 501 | * FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create file (filename=%s, ret=%d).\n", __func__, filename_good, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 502 | * TEST_ASSERT_MESSAGE(ret >= 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 503 | */ |
| joseph_adamu | 1:dc648c5624b9 | 504 | |
| joseph_adamu | 1:dc648c5624b9 | 505 | len = strlen(filename_bad); |
| joseph_adamu | 1:dc648c5624b9 | 506 | ret = fsfat_test_create(filename_bad, filename_bad, len); |
| joseph_adamu | 1:dc648c5624b9 | 507 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: created file in store for filename_bad when should have failed (filename=%s, ret=%d).\n", __func__, filename_bad, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 508 | TEST_ASSERT_MESSAGE(ret < 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 509 | return CaseNext; |
| joseph_adamu | 1:dc648c5624b9 | 510 | } |
| joseph_adamu | 1:dc648c5624b9 | 511 | |
| joseph_adamu | 1:dc648c5624b9 | 512 | |
| joseph_adamu | 1:dc648c5624b9 | 513 | /// @cond FSFAT_DOXYGEN_DISABLE |
| joseph_adamu | 1:dc648c5624b9 | 514 | typedef struct fsfat_fopen_kv_name_ascii_node { |
| joseph_adamu | 1:dc648c5624b9 | 515 | uint32_t code; |
| joseph_adamu | 1:dc648c5624b9 | 516 | uint32_t f_allowed : 1; |
| joseph_adamu | 1:dc648c5624b9 | 517 | } fsfat_fopen_kv_name_ascii_node; |
| joseph_adamu | 1:dc648c5624b9 | 518 | /// @endcond |
| joseph_adamu | 1:dc648c5624b9 | 519 | |
| joseph_adamu | 1:dc648c5624b9 | 520 | static const uint32_t fsfat_fopen_kv_name_ascii_table_code_sentinel_g = 256; |
| joseph_adamu | 1:dc648c5624b9 | 521 | |
| joseph_adamu | 1:dc648c5624b9 | 522 | /*@brief table recording ascii character codes permitted in kv names */ |
| joseph_adamu | 1:dc648c5624b9 | 523 | static fsfat_fopen_kv_name_ascii_node fsfat_fopen_kv_name_ascii_table[] = |
| joseph_adamu | 1:dc648c5624b9 | 524 | { |
| joseph_adamu | 1:dc648c5624b9 | 525 | {0 , true}, /* code 0-33 allowed*/ |
| joseph_adamu | 1:dc648c5624b9 | 526 | {34, false}, /* '"' not allowed */ |
| joseph_adamu | 1:dc648c5624b9 | 527 | {35, true}, /* allowed */ |
| joseph_adamu | 1:dc648c5624b9 | 528 | {42, false}, /* '*' not allowed */ |
| joseph_adamu | 1:dc648c5624b9 | 529 | {43, true}, /* allowed */ |
| joseph_adamu | 1:dc648c5624b9 | 530 | {47, false}, /* '/' not allowed */ |
| joseph_adamu | 1:dc648c5624b9 | 531 | {48, true}, /* allowed */ |
| joseph_adamu | 1:dc648c5624b9 | 532 | {58, false}, /* ':' not allowed */ |
| joseph_adamu | 1:dc648c5624b9 | 533 | {59, true}, /* allowed */ |
| joseph_adamu | 1:dc648c5624b9 | 534 | {60, false}, /* '<' not allowed */ |
| joseph_adamu | 1:dc648c5624b9 | 535 | {61, true}, /* allowed */ |
| joseph_adamu | 1:dc648c5624b9 | 536 | {62, false}, /* '?', '>' not allowed */ |
| joseph_adamu | 1:dc648c5624b9 | 537 | {64, true}, /* allowed */ |
| joseph_adamu | 1:dc648c5624b9 | 538 | {92, false}, /* '\' not allowed */ |
| joseph_adamu | 1:dc648c5624b9 | 539 | {93, true}, /* allowed */ |
| joseph_adamu | 1:dc648c5624b9 | 540 | {124, false}, /* '!' not allowed */ |
| joseph_adamu | 1:dc648c5624b9 | 541 | {125, true}, /* allowed */ |
| joseph_adamu | 1:dc648c5624b9 | 542 | {127, false}, /* DEL not allowed */ |
| joseph_adamu | 1:dc648c5624b9 | 543 | {128, true}, /* allowed */ |
| joseph_adamu | 1:dc648c5624b9 | 544 | {fsfat_fopen_kv_name_ascii_table_code_sentinel_g, false}, /* sentinel */ |
| joseph_adamu | 1:dc648c5624b9 | 545 | }; |
| joseph_adamu | 1:dc648c5624b9 | 546 | |
| joseph_adamu | 1:dc648c5624b9 | 547 | |
| joseph_adamu | 1:dc648c5624b9 | 548 | /// @cond FSFAT_DOXYGEN_DISABLE |
| joseph_adamu | 1:dc648c5624b9 | 549 | enum fsfat_fopen_kv_name_pos { |
| joseph_adamu | 1:dc648c5624b9 | 550 | fsfat_fopen_kv_name_pos_start = 0x0, |
| joseph_adamu | 1:dc648c5624b9 | 551 | fsfat_fopen_kv_name_pos_mid, |
| joseph_adamu | 1:dc648c5624b9 | 552 | fsfat_fopen_kv_name_pos_end, |
| joseph_adamu | 1:dc648c5624b9 | 553 | fsfat_fopen_kv_name_pos_max |
| joseph_adamu | 1:dc648c5624b9 | 554 | }; |
| joseph_adamu | 1:dc648c5624b9 | 555 | /// @endcond |
| joseph_adamu | 1:dc648c5624b9 | 556 | |
| joseph_adamu | 1:dc648c5624b9 | 557 | /** @brief test to call fopen() with filename that in includes illegal characters |
| joseph_adamu | 1:dc648c5624b9 | 558 | * - the character(s) can be at the beginning of the filename |
| joseph_adamu | 1:dc648c5624b9 | 559 | * - the character(s) can be at the end of the filename |
| joseph_adamu | 1:dc648c5624b9 | 560 | * - the character(s) can be somewhere within the filename string |
| joseph_adamu | 1:dc648c5624b9 | 561 | * - a max-length string of random characters (legal and illegal) |
| joseph_adamu | 1:dc648c5624b9 | 562 | * - a max-length string of random illegal characters only |
| joseph_adamu | 1:dc648c5624b9 | 563 | * |
| joseph_adamu | 1:dc648c5624b9 | 564 | * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. |
| joseph_adamu | 1:dc648c5624b9 | 565 | */ |
| joseph_adamu | 1:dc648c5624b9 | 566 | control_t fsfat_fopen_test_05(const size_t call_count) |
| joseph_adamu | 1:dc648c5624b9 | 567 | { |
| joseph_adamu | 1:dc648c5624b9 | 568 | bool f_allowed = false; |
| joseph_adamu | 1:dc648c5624b9 | 569 | const char *mnt_pt = FSFAT_FOPEN_TEST_MOUNT_PT_PATH; |
| joseph_adamu | 1:dc648c5624b9 | 570 | const char *basename = "goodfile"; |
| joseph_adamu | 1:dc648c5624b9 | 571 | const char *extname = "txt"; |
| joseph_adamu | 1:dc648c5624b9 | 572 | const size_t basename_len = strlen(basename); |
| joseph_adamu | 1:dc648c5624b9 | 573 | const size_t filename_len = strlen(mnt_pt)+strlen(basename)+strlen(extname)+2; /* extra 2 chars for '/' and '.' in "/sd/goodfile.txt" */ |
| joseph_adamu | 1:dc648c5624b9 | 574 | char filename[FSFAT_BUF_MAX_LENGTH]; |
| joseph_adamu | 1:dc648c5624b9 | 575 | size_t len = 0; |
| joseph_adamu | 1:dc648c5624b9 | 576 | uint32_t j = 0; |
| joseph_adamu | 1:dc648c5624b9 | 577 | int32_t ret = 0; |
| joseph_adamu | 1:dc648c5624b9 | 578 | fsfat_fopen_kv_name_ascii_node* node = NULL; |
| joseph_adamu | 1:dc648c5624b9 | 579 | uint32_t pos; |
| joseph_adamu | 1:dc648c5624b9 | 580 | |
| joseph_adamu | 1:dc648c5624b9 | 581 | FSFAT_FENTRYLOG("%s:entered\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 582 | (void) call_count; |
| joseph_adamu | 1:dc648c5624b9 | 583 | |
| joseph_adamu | 1:dc648c5624b9 | 584 | #ifdef FSFAT_DEBUG |
| joseph_adamu | 1:dc648c5624b9 | 585 | /* symbol only used why debug is enabled */ |
| joseph_adamu | 1:dc648c5624b9 | 586 | const char* pos_str = NULL; |
| joseph_adamu | 1:dc648c5624b9 | 587 | #endif |
| joseph_adamu | 1:dc648c5624b9 | 588 | |
| joseph_adamu | 1:dc648c5624b9 | 589 | /* create bad keyname strings with invalid character code at start of keyname */ |
| joseph_adamu | 1:dc648c5624b9 | 590 | node = fsfat_fopen_kv_name_ascii_table; |
| joseph_adamu | 1:dc648c5624b9 | 591 | memset(filename, 0, FSFAT_BUF_MAX_LENGTH); |
| joseph_adamu | 1:dc648c5624b9 | 592 | while(node->code != fsfat_fopen_kv_name_ascii_table_code_sentinel_g) |
| joseph_adamu | 1:dc648c5624b9 | 593 | { |
| joseph_adamu | 1:dc648c5624b9 | 594 | /* loop over range */ |
| joseph_adamu | 1:dc648c5624b9 | 595 | for(j = node->code; j < (node+1)->code; j++) |
| joseph_adamu | 1:dc648c5624b9 | 596 | { |
| joseph_adamu | 1:dc648c5624b9 | 597 | if( (j >= 48 && j <= 57) || (j >= 65 && j <= 90) || (j >= 97 && j <= 122)) { |
| joseph_adamu | 1:dc648c5624b9 | 598 | FSFAT_DBGLOG("%s: skipping alpha-numeric ascii character code %d (%c).\n", __func__, (int) j, (char) j); |
| joseph_adamu | 1:dc648c5624b9 | 599 | continue; |
| joseph_adamu | 1:dc648c5624b9 | 600 | } |
| joseph_adamu | 1:dc648c5624b9 | 601 | |
| joseph_adamu | 1:dc648c5624b9 | 602 | /* set the start, mid, last character of the name to the test char code */ |
| joseph_adamu | 1:dc648c5624b9 | 603 | for(pos = (uint32_t) fsfat_fopen_kv_name_pos_start; pos < (uint32_t) fsfat_fopen_kv_name_pos_max; pos++) |
| joseph_adamu | 1:dc648c5624b9 | 604 | { |
| joseph_adamu | 1:dc648c5624b9 | 605 | len = snprintf(filename, filename_len+1, "%s/%s.%s", mnt_pt, basename, extname); |
| joseph_adamu | 1:dc648c5624b9 | 606 | /* overwrite a char at the pos start, mid, end of the filename with an ascii char code (both illegal and legal)*/ |
| joseph_adamu | 1:dc648c5624b9 | 607 | switch(pos) |
| joseph_adamu | 1:dc648c5624b9 | 608 | { |
| joseph_adamu | 1:dc648c5624b9 | 609 | case fsfat_fopen_kv_name_pos_start: |
| joseph_adamu | 1:dc648c5624b9 | 610 | filename[5] = (char) j; /* 5 so at to write the second basename char (bad chars as first char not accepted)*/ |
| joseph_adamu | 1:dc648c5624b9 | 611 | break; |
| joseph_adamu | 1:dc648c5624b9 | 612 | case fsfat_fopen_kv_name_pos_mid: |
| joseph_adamu | 1:dc648c5624b9 | 613 | /* create bad keyname strings with invalid character code in the middle of keyname */ |
| joseph_adamu | 1:dc648c5624b9 | 614 | filename[5+basename_len/2] = (char) j; |
| joseph_adamu | 1:dc648c5624b9 | 615 | break; |
| joseph_adamu | 1:dc648c5624b9 | 616 | case fsfat_fopen_kv_name_pos_end: |
| joseph_adamu | 1:dc648c5624b9 | 617 | /* create bad keyname strings with invalid character code at end of keyname */ |
| joseph_adamu | 1:dc648c5624b9 | 618 | filename[5+basename_len-1] = (char) j; |
| joseph_adamu | 1:dc648c5624b9 | 619 | break; |
| joseph_adamu | 1:dc648c5624b9 | 620 | default: |
| joseph_adamu | 1:dc648c5624b9 | 621 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: unexpected value of pos (pos=%d).\n", __func__, (int) pos); |
| joseph_adamu | 1:dc648c5624b9 | 622 | TEST_ASSERT_MESSAGE(ret >= 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 623 | break; |
| joseph_adamu | 1:dc648c5624b9 | 624 | } |
| joseph_adamu | 1:dc648c5624b9 | 625 | |
| joseph_adamu | 1:dc648c5624b9 | 626 | #ifdef FSFAT_DEBUG |
| joseph_adamu | 1:dc648c5624b9 | 627 | /* processing only required when debug trace enabled */ |
| joseph_adamu | 1:dc648c5624b9 | 628 | switch(pos) |
| joseph_adamu | 1:dc648c5624b9 | 629 | { |
| joseph_adamu | 1:dc648c5624b9 | 630 | case fsfat_fopen_kv_name_pos_start: |
| joseph_adamu | 1:dc648c5624b9 | 631 | pos_str = "start"; |
| joseph_adamu | 1:dc648c5624b9 | 632 | break; |
| joseph_adamu | 1:dc648c5624b9 | 633 | case fsfat_fopen_kv_name_pos_mid: |
| joseph_adamu | 1:dc648c5624b9 | 634 | pos_str = "middle"; |
| joseph_adamu | 1:dc648c5624b9 | 635 | break; |
| joseph_adamu | 1:dc648c5624b9 | 636 | case fsfat_fopen_kv_name_pos_end: |
| joseph_adamu | 1:dc648c5624b9 | 637 | pos_str = "end"; |
| joseph_adamu | 1:dc648c5624b9 | 638 | break; |
| joseph_adamu | 1:dc648c5624b9 | 639 | default: |
| joseph_adamu | 1:dc648c5624b9 | 640 | break; |
| joseph_adamu | 1:dc648c5624b9 | 641 | } |
| joseph_adamu | 1:dc648c5624b9 | 642 | #endif |
| joseph_adamu | 1:dc648c5624b9 | 643 | ret = fsfat_test_create(filename, (const char*) filename, len); |
| joseph_adamu | 1:dc648c5624b9 | 644 | |
| joseph_adamu | 1:dc648c5624b9 | 645 | /* special cases */ |
| joseph_adamu | 1:dc648c5624b9 | 646 | switch(j) |
| joseph_adamu | 1:dc648c5624b9 | 647 | { |
| joseph_adamu | 1:dc648c5624b9 | 648 | //case 0 : |
| joseph_adamu | 1:dc648c5624b9 | 649 | //case 46 : |
| joseph_adamu | 1:dc648c5624b9 | 650 | // switch(pos) |
| joseph_adamu | 1:dc648c5624b9 | 651 | // { |
| joseph_adamu | 1:dc648c5624b9 | 652 | // /* for code = 0 (null terminator). permitted at mid and end of string */ |
| joseph_adamu | 1:dc648c5624b9 | 653 | // /* for code = 46 ('.'). permitted at mid and end of string but not at start */ |
| joseph_adamu | 1:dc648c5624b9 | 654 | // case fsfat_fopen_kv_name_pos_start: |
| joseph_adamu | 1:dc648c5624b9 | 655 | // f_allowed = false; |
| joseph_adamu | 1:dc648c5624b9 | 656 | // break; |
| joseph_adamu | 1:dc648c5624b9 | 657 | // case fsfat_fopen_kv_name_pos_mid: |
| joseph_adamu | 1:dc648c5624b9 | 658 | // case fsfat_fopen_kv_name_pos_end: |
| joseph_adamu | 1:dc648c5624b9 | 659 | // default: |
| joseph_adamu | 1:dc648c5624b9 | 660 | // f_allowed = true; |
| joseph_adamu | 1:dc648c5624b9 | 661 | // break; |
| joseph_adamu | 1:dc648c5624b9 | 662 | // } |
| joseph_adamu | 1:dc648c5624b9 | 663 | // break; |
| joseph_adamu | 1:dc648c5624b9 | 664 | default: |
| joseph_adamu | 1:dc648c5624b9 | 665 | f_allowed = node->f_allowed; |
| joseph_adamu | 1:dc648c5624b9 | 666 | break; |
| joseph_adamu | 1:dc648c5624b9 | 667 | } |
| joseph_adamu | 1:dc648c5624b9 | 668 | if(f_allowed == true) |
| joseph_adamu | 1:dc648c5624b9 | 669 | { |
| joseph_adamu | 1:dc648c5624b9 | 670 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create file in store when filename contains valid characters (code=%d, ret=%d).\n", __func__, (int) j, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 671 | TEST_ASSERT_MESSAGE(ret >= 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 672 | /* revert FSFAT_LOG for more trace */ |
| joseph_adamu | 1:dc648c5624b9 | 673 | FSFAT_DBGLOG("Successfully created a file with valid keyname containing ascii character code %d (%c) at the %s of the keyname.\n", (int) j, (int) j, pos_str); |
| joseph_adamu | 1:dc648c5624b9 | 674 | FSFAT_LOG("%c", '.'); |
| joseph_adamu | 1:dc648c5624b9 | 675 | |
| joseph_adamu | 1:dc648c5624b9 | 676 | ret = fsfat_test_delete(filename); |
| joseph_adamu | 1:dc648c5624b9 | 677 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to delete file previously created (code=%d, ret=%d).\n", __func__, (int) j, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 678 | TEST_ASSERT_MESSAGE(ret >= 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 679 | } |
| joseph_adamu | 1:dc648c5624b9 | 680 | else |
| joseph_adamu | 1:dc648c5624b9 | 681 | { /*node->f_allowed == false => not allowed to create kv name with ascii code */ |
| joseph_adamu | 1:dc648c5624b9 | 682 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: created file in store when filename contains an invalid character (code=%d, ret=%d).\n", __func__, (int) j, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 683 | TEST_ASSERT_MESSAGE(ret < 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 684 | /* revert FSFAT_LOG for more trace */ |
| joseph_adamu | 1:dc648c5624b9 | 685 | FSFAT_DBGLOG("Successfully failed to create a file with an invalid keyname containing ascii character code %d at the %s of the keyname.\n", (int) j, pos_str); |
| joseph_adamu | 1:dc648c5624b9 | 686 | FSFAT_LOG("%c", '.'); |
| joseph_adamu | 1:dc648c5624b9 | 687 | } |
| joseph_adamu | 1:dc648c5624b9 | 688 | } |
| joseph_adamu | 1:dc648c5624b9 | 689 | } |
| joseph_adamu | 1:dc648c5624b9 | 690 | node++; |
| joseph_adamu | 1:dc648c5624b9 | 691 | } |
| joseph_adamu | 1:dc648c5624b9 | 692 | |
| joseph_adamu | 1:dc648c5624b9 | 693 | FSFAT_LOG("%c", '\n'); |
| joseph_adamu | 1:dc648c5624b9 | 694 | return CaseNext; |
| joseph_adamu | 1:dc648c5624b9 | 695 | } |
| joseph_adamu | 1:dc648c5624b9 | 696 | |
| joseph_adamu | 1:dc648c5624b9 | 697 | |
| joseph_adamu | 1:dc648c5624b9 | 698 | static const char fsfat_fopen_ascii_illegal_buf_g[] = "\"�'*+,./:;<=>?[\\]|"; |
| joseph_adamu | 1:dc648c5624b9 | 699 | |
| joseph_adamu | 1:dc648c5624b9 | 700 | /** @brief test to call fopen() with filename that in includes |
| joseph_adamu | 1:dc648c5624b9 | 701 | * illegal characters |
| joseph_adamu | 1:dc648c5624b9 | 702 | * - a max-length string of random illegal characters only |
| joseph_adamu | 1:dc648c5624b9 | 703 | * |
| joseph_adamu | 1:dc648c5624b9 | 704 | * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. |
| joseph_adamu | 1:dc648c5624b9 | 705 | */ |
| joseph_adamu | 1:dc648c5624b9 | 706 | control_t fsfat_fopen_test_06(const size_t call_count) |
| joseph_adamu | 1:dc648c5624b9 | 707 | { |
| joseph_adamu | 1:dc648c5624b9 | 708 | const char *mnt_pt = FSFAT_FOPEN_TEST_MOUNT_PT_PATH; |
| joseph_adamu | 1:dc648c5624b9 | 709 | const char *extname = "txt"; |
| joseph_adamu | 1:dc648c5624b9 | 710 | const size_t filename_len = strlen(mnt_pt)+FSFAT_MAX_FILE_BASENAME+strlen(extname)+2; /* extra 2 chars for '/' and '.' in "/sd/goodfile.txt" */ |
| joseph_adamu | 1:dc648c5624b9 | 711 | char filename[FSFAT_BUF_MAX_LENGTH]; |
| joseph_adamu | 1:dc648c5624b9 | 712 | int32_t i = 0; |
| joseph_adamu | 1:dc648c5624b9 | 713 | int32_t j = 0; |
| joseph_adamu | 1:dc648c5624b9 | 714 | uint32_t pos = 0; |
| joseph_adamu | 1:dc648c5624b9 | 715 | uint32_t len = 0; |
| joseph_adamu | 1:dc648c5624b9 | 716 | int32_t ret = -1; |
| joseph_adamu | 1:dc648c5624b9 | 717 | size_t buf_data_max = 0; |
| joseph_adamu | 1:dc648c5624b9 | 718 | |
| joseph_adamu | 1:dc648c5624b9 | 719 | FSFAT_FENTRYLOG("%s:entered\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 720 | (void) call_count; |
| joseph_adamu | 1:dc648c5624b9 | 721 | |
| joseph_adamu | 1:dc648c5624b9 | 722 | memset(filename, 0, FSFAT_BUF_MAX_LENGTH); |
| joseph_adamu | 1:dc648c5624b9 | 723 | /* create bad keyname strings with invalid character code at start of keyname */ |
| joseph_adamu | 1:dc648c5624b9 | 724 | buf_data_max = strlen(fsfat_fopen_ascii_illegal_buf_g); |
| joseph_adamu | 1:dc648c5624b9 | 725 | |
| joseph_adamu | 1:dc648c5624b9 | 726 | /* generate a number of illegal filenames */ |
| joseph_adamu | 1:dc648c5624b9 | 727 | for (j = 0; i < FSFAT_MAX_FILE_BASENAME; j++) { |
| joseph_adamu | 1:dc648c5624b9 | 728 | /* generate a kv name of illegal chars*/ |
| joseph_adamu | 1:dc648c5624b9 | 729 | len = snprintf(filename, filename_len+1, "%s/", mnt_pt); |
| joseph_adamu | 1:dc648c5624b9 | 730 | for (i = 0; i < FSFAT_MAX_FILE_BASENAME; i++) { |
| joseph_adamu | 1:dc648c5624b9 | 731 | pos = rand() % (buf_data_max+1); |
| joseph_adamu | 1:dc648c5624b9 | 732 | len += snprintf(filename+len, filename_len+1, "%c", fsfat_fopen_ascii_illegal_buf_g[pos]); |
| joseph_adamu | 1:dc648c5624b9 | 733 | |
| joseph_adamu | 1:dc648c5624b9 | 734 | } |
| joseph_adamu | 1:dc648c5624b9 | 735 | len += snprintf(filename+len, filename_len+1, ".%s", extname); |
| joseph_adamu | 1:dc648c5624b9 | 736 | ret = fsfat_test_create(filename, filename, len); |
| joseph_adamu | 1:dc648c5624b9 | 737 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: created file when filename contains invalid characters (filename=%s, ret=%d).\n", __func__, filename, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 738 | TEST_ASSERT_MESSAGE(ret < 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 739 | } |
| joseph_adamu | 1:dc648c5624b9 | 740 | return CaseNext; |
| joseph_adamu | 1:dc648c5624b9 | 741 | } |
| joseph_adamu | 1:dc648c5624b9 | 742 | |
| joseph_adamu | 1:dc648c5624b9 | 743 | |
| joseph_adamu | 1:dc648c5624b9 | 744 | /** @brief test for errno reporting on a failed fopen()call |
| joseph_adamu | 1:dc648c5624b9 | 745 | * |
| joseph_adamu | 1:dc648c5624b9 | 746 | * This test does the following: |
| joseph_adamu | 1:dc648c5624b9 | 747 | * - tries to open a file that does not exist for reading, and checks that a NULL pointer is returned. |
| joseph_adamu | 1:dc648c5624b9 | 748 | * - checks that errno is not 0 as there is an error. |
| joseph_adamu | 1:dc648c5624b9 | 749 | * - checks that ferror() returns 1 indicating an error exists. |
| joseph_adamu | 1:dc648c5624b9 | 750 | * |
| joseph_adamu | 1:dc648c5624b9 | 751 | * Note: see NOTE_1 below. |
| joseph_adamu | 1:dc648c5624b9 | 752 | * |
| joseph_adamu | 1:dc648c5624b9 | 753 | * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. |
| joseph_adamu | 1:dc648c5624b9 | 754 | */ |
| joseph_adamu | 1:dc648c5624b9 | 755 | control_t fsfat_fopen_test_07(const size_t call_count) |
| joseph_adamu | 1:dc648c5624b9 | 756 | { |
| joseph_adamu | 1:dc648c5624b9 | 757 | FILE *f = NULL; |
| joseph_adamu | 1:dc648c5624b9 | 758 | int ret = -1; |
| joseph_adamu | 1:dc648c5624b9 | 759 | int errno_val = 0; |
| joseph_adamu | 1:dc648c5624b9 | 760 | const char *filename = sd_badfile_path; |
| joseph_adamu | 1:dc648c5624b9 | 761 | |
| joseph_adamu | 1:dc648c5624b9 | 762 | FSFAT_FENTRYLOG("%s:entered\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 763 | (void) call_count; |
| joseph_adamu | 1:dc648c5624b9 | 764 | |
| joseph_adamu | 1:dc648c5624b9 | 765 | errno = 0; |
| joseph_adamu | 1:dc648c5624b9 | 766 | /* this is expect to fail as the file doesnt exist */ |
| joseph_adamu | 1:dc648c5624b9 | 767 | f = fopen(filename,"r"); |
| joseph_adamu | 1:dc648c5624b9 | 768 | |
| joseph_adamu | 1:dc648c5624b9 | 769 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: opened non-existent file for reading (filename=%s, f=%p).\n", __func__, filename, f); |
| joseph_adamu | 1:dc648c5624b9 | 770 | TEST_ASSERT_MESSAGE(f == NULL, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 771 | |
| joseph_adamu | 1:dc648c5624b9 | 772 | /* check errno is set correctly */ |
| joseph_adamu | 1:dc648c5624b9 | 773 | #if ! defined(__ARMCC_VERSION) && defined(__GNUC__) |
| joseph_adamu | 1:dc648c5624b9 | 774 | /* Store errno so the current value set is not changed by new function call */ |
| joseph_adamu | 1:dc648c5624b9 | 775 | errno_val = errno; |
| joseph_adamu | 1:dc648c5624b9 | 776 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: errno has unexpected value (errno != 0 expected) (filename=%s, errno=%d).\n", __func__, filename, errno); |
| joseph_adamu | 1:dc648c5624b9 | 777 | TEST_ASSERT_MESSAGE(errno_val != 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 778 | #endif /* ! defined(__ARMCC_VERSION) && defined(__GNUC__) */ |
| joseph_adamu | 1:dc648c5624b9 | 779 | return CaseNext; |
| joseph_adamu | 1:dc648c5624b9 | 780 | } |
| joseph_adamu | 1:dc648c5624b9 | 781 | |
| joseph_adamu | 1:dc648c5624b9 | 782 | |
| joseph_adamu | 1:dc648c5624b9 | 783 | /** @brief test for operation of clearerr() and ferror() |
| joseph_adamu | 1:dc648c5624b9 | 784 | * |
| joseph_adamu | 1:dc648c5624b9 | 785 | * The test does the following: |
| joseph_adamu | 1:dc648c5624b9 | 786 | * - opens and then closes a file, but keeps a copy of the FILE pointer fp. |
| joseph_adamu | 1:dc648c5624b9 | 787 | * - set errno to 0. |
| joseph_adamu | 1:dc648c5624b9 | 788 | * - write to the close file with fwrite(fp) which should return 0 (no writes) and set the errno. |
| joseph_adamu | 1:dc648c5624b9 | 789 | * - check the error condition is set with ferror(). |
| joseph_adamu | 1:dc648c5624b9 | 790 | * - clear the error with clearerr(). |
| joseph_adamu | 1:dc648c5624b9 | 791 | * - check the error condition is reset with ferror(). |
| joseph_adamu | 1:dc648c5624b9 | 792 | * |
| joseph_adamu | 1:dc648c5624b9 | 793 | * NOTE_1: GCC/ARMCC support for setting errno |
| joseph_adamu | 1:dc648c5624b9 | 794 | * - Documentation (e.g. fwrite() man page) does not explicity say fwrite() sets errno |
| joseph_adamu | 1:dc648c5624b9 | 795 | * (e.g. for an fwrite() on a read-only file). |
| joseph_adamu | 1:dc648c5624b9 | 796 | * - GCC libc fwrite() appears to set errno as expected. |
| joseph_adamu | 1:dc648c5624b9 | 797 | * - ARMCC & IAR libc fwrite() appears not to set errno. |
| joseph_adamu | 1:dc648c5624b9 | 798 | * |
| joseph_adamu | 1:dc648c5624b9 | 799 | * The following ARMCC documents are silent on whether fwrite() sets errno: |
| joseph_adamu | 1:dc648c5624b9 | 800 | * - "ARM C and C++ Libraries and Floating-Point Support". |
| joseph_adamu | 1:dc648c5624b9 | 801 | * - "RL-ARM User Guide fwrite() section". |
| joseph_adamu | 1:dc648c5624b9 | 802 | * |
| joseph_adamu | 1:dc648c5624b9 | 803 | * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. |
| joseph_adamu | 1:dc648c5624b9 | 804 | */ |
| joseph_adamu | 1:dc648c5624b9 | 805 | control_t fsfat_fopen_test_08(const size_t call_count) |
| joseph_adamu | 1:dc648c5624b9 | 806 | { |
| joseph_adamu | 1:dc648c5624b9 | 807 | FILE *fp = NULL; |
| joseph_adamu | 1:dc648c5624b9 | 808 | int ret = -1; |
| joseph_adamu | 1:dc648c5624b9 | 809 | int ret_ferror = -1; |
| joseph_adamu | 1:dc648c5624b9 | 810 | const char *filename = sd_testfile_path; |
| joseph_adamu | 1:dc648c5624b9 | 811 | |
| joseph_adamu | 1:dc648c5624b9 | 812 | FSFAT_FENTRYLOG("%s:entered\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 813 | (void) call_count; |
| joseph_adamu | 1:dc648c5624b9 | 814 | |
| joseph_adamu | 1:dc648c5624b9 | 815 | errno = 0; |
| joseph_adamu | 1:dc648c5624b9 | 816 | fp = fopen(filename,"w+"); |
| joseph_adamu | 1:dc648c5624b9 | 817 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to open file (filename=%s, f=%p).\n", __func__, filename, fp); |
| joseph_adamu | 1:dc648c5624b9 | 818 | TEST_ASSERT_MESSAGE(fp != NULL, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 819 | |
| joseph_adamu | 1:dc648c5624b9 | 820 | /* close the fp but then try to read or write it */ |
| joseph_adamu | 1:dc648c5624b9 | 821 | ret = fclose(fp); |
| joseph_adamu | 1:dc648c5624b9 | 822 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to close file (ret=%d, errno=%d)\n", __func__, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 823 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 824 | |
| joseph_adamu | 1:dc648c5624b9 | 825 | /* open file */ |
| joseph_adamu | 1:dc648c5624b9 | 826 | errno = 0; |
| joseph_adamu | 1:dc648c5624b9 | 827 | fp = fopen(filename, "r"); |
| joseph_adamu | 1:dc648c5624b9 | 828 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to open file for reading (filename=\"%s\", ret=%d)\n", __func__, filename, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 829 | TEST_ASSERT_MESSAGE(fp != NULL, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 830 | |
| joseph_adamu | 1:dc648c5624b9 | 831 | /* Perform fwrite() operation that will fail. */ |
| joseph_adamu | 1:dc648c5624b9 | 832 | errno = 0; |
| joseph_adamu | 1:dc648c5624b9 | 833 | ret = fwrite("42!", 4, 1, fp); |
| joseph_adamu | 1:dc648c5624b9 | 834 | |
| joseph_adamu | 1:dc648c5624b9 | 835 | ret_ferror = ferror(fp); |
| joseph_adamu | 1:dc648c5624b9 | 836 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: ferror() failed to report error (filename=%s, ret_ferror=%d).\n", __func__, filename, (int) ret_ferror); |
| joseph_adamu | 1:dc648c5624b9 | 837 | TEST_ASSERT_MESSAGE(ret_ferror != 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 838 | |
| joseph_adamu | 1:dc648c5624b9 | 839 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: fwrite successfully wrote to read-only file (filename=%s, ret=%d).\n", __func__, filename, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 840 | /* the fwrite() should fail and return 0. */ |
| joseph_adamu | 1:dc648c5624b9 | 841 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 842 | |
| joseph_adamu | 1:dc648c5624b9 | 843 | #if ! defined(__ARMCC_VERSION) && defined(__GNUC__) |
| joseph_adamu | 1:dc648c5624b9 | 844 | /* check that errno is set. ARMCC appears not to set errno for fwrite() failure. */ |
| joseph_adamu | 1:dc648c5624b9 | 845 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: unexpected zero value for errno (filename=%s, ret=%d, errno=%d).\n", __func__, filename, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 846 | TEST_ASSERT_MESSAGE(errno != 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 847 | |
| joseph_adamu | 1:dc648c5624b9 | 848 | /* check that errno is set to the expected value (this may change differ for different libc's) */ |
| joseph_adamu | 1:dc648c5624b9 | 849 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: errno != EBADF (filename=%s, ret=%d, errno=%d).\n", __func__, filename, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 850 | TEST_ASSERT_MESSAGE(errno == EBADF, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 851 | #endif /* ! defined(__ARMCC_VERSION) && defined(__GNUC__) */ |
| joseph_adamu | 1:dc648c5624b9 | 852 | |
| joseph_adamu | 1:dc648c5624b9 | 853 | /* check clearerr() return clears the error */ |
| joseph_adamu | 1:dc648c5624b9 | 854 | clearerr(fp); |
| joseph_adamu | 1:dc648c5624b9 | 855 | ret = ferror(fp); |
| joseph_adamu | 1:dc648c5624b9 | 856 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: ferror() did not return zero value when error has been cleared (filename=%s, ret=%d).\n", __func__, filename, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 857 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 858 | |
| joseph_adamu | 1:dc648c5624b9 | 859 | fclose(fp); |
| joseph_adamu | 1:dc648c5624b9 | 860 | return CaseNext; |
| joseph_adamu | 1:dc648c5624b9 | 861 | } |
| joseph_adamu | 1:dc648c5624b9 | 862 | |
| joseph_adamu | 1:dc648c5624b9 | 863 | |
| joseph_adamu | 1:dc648c5624b9 | 864 | /** @brief test for operation of ftell() |
| joseph_adamu | 1:dc648c5624b9 | 865 | * |
| joseph_adamu | 1:dc648c5624b9 | 866 | * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. |
| joseph_adamu | 1:dc648c5624b9 | 867 | */ |
| joseph_adamu | 1:dc648c5624b9 | 868 | control_t fsfat_fopen_test_09(const size_t call_count) |
| joseph_adamu | 1:dc648c5624b9 | 869 | { |
| joseph_adamu | 1:dc648c5624b9 | 870 | FILE *fp = NULL; |
| joseph_adamu | 1:dc648c5624b9 | 871 | int ret = -1; |
| joseph_adamu | 1:dc648c5624b9 | 872 | int32_t len = 0; |
| joseph_adamu | 1:dc648c5624b9 | 873 | |
| joseph_adamu | 1:dc648c5624b9 | 874 | FSFAT_FENTRYLOG("%s:entered\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 875 | (void) call_count; |
| joseph_adamu | 1:dc648c5624b9 | 876 | |
| joseph_adamu | 1:dc648c5624b9 | 877 | /* create a file of a certain length */ |
| joseph_adamu | 1:dc648c5624b9 | 878 | len = strlen(fsfat_fopen_test_02_data[0].value); |
| joseph_adamu | 1:dc648c5624b9 | 879 | ret = fsfat_test_create(fsfat_fopen_test_02_data[0].filename, (char*) fsfat_fopen_test_02_data[0].value, len); |
| joseph_adamu | 1:dc648c5624b9 | 880 | |
| joseph_adamu | 1:dc648c5624b9 | 881 | errno = 0; |
| joseph_adamu | 1:dc648c5624b9 | 882 | /* Open the file for reading so the file is not truncated to 0 length. */ |
| joseph_adamu | 1:dc648c5624b9 | 883 | fp = fopen(fsfat_fopen_test_02_data[0].filename, "r"); |
| joseph_adamu | 1:dc648c5624b9 | 884 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to open file (filename=%s, fp=%p, errno=%d).\n", __func__, fsfat_fopen_test_02_data[0].filename, fp, errno); |
| joseph_adamu | 1:dc648c5624b9 | 885 | TEST_ASSERT_MESSAGE(fp != NULL, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 886 | |
| joseph_adamu | 1:dc648c5624b9 | 887 | errno = 0; |
| joseph_adamu | 1:dc648c5624b9 | 888 | ret = fseek(fp, 0, SEEK_END); |
| joseph_adamu | 1:dc648c5624b9 | 889 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: fseek() failed to SEEK_END (filename=%s, ret=%d, errno=%d).\n", __func__, fsfat_fopen_test_02_data[0].filename, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 890 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 891 | |
| joseph_adamu | 1:dc648c5624b9 | 892 | errno = 0; |
| joseph_adamu | 1:dc648c5624b9 | 893 | ret = ftell(fp); |
| joseph_adamu | 1:dc648c5624b9 | 894 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: ftell() failed to report correct offset value (filename=%s, ret=%d, errno=%d).\n", __func__, fsfat_fopen_test_02_data[0].filename, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 895 | TEST_ASSERT_MESSAGE(ret == len, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 896 | |
| joseph_adamu | 1:dc648c5624b9 | 897 | errno = 0; |
| joseph_adamu | 1:dc648c5624b9 | 898 | ret = fclose(fp); |
| joseph_adamu | 1:dc648c5624b9 | 899 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to close file (ret=%d, errno=%d)\n", __func__, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 900 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 901 | |
| joseph_adamu | 1:dc648c5624b9 | 902 | return CaseNext; |
| joseph_adamu | 1:dc648c5624b9 | 903 | } |
| joseph_adamu | 1:dc648c5624b9 | 904 | |
| joseph_adamu | 1:dc648c5624b9 | 905 | |
| joseph_adamu | 1:dc648c5624b9 | 906 | /* file data for test_10 */ |
| joseph_adamu | 1:dc648c5624b9 | 907 | static fsfat_kv_data_t fsfat_fopen_test_10_kv_data[] = { |
| joseph_adamu | 1:dc648c5624b9 | 908 | { "/sd/test_10/testfile.txt", "test_data"}, |
| joseph_adamu | 1:dc648c5624b9 | 909 | { NULL, NULL}, |
| joseph_adamu | 1:dc648c5624b9 | 910 | }; |
| joseph_adamu | 1:dc648c5624b9 | 911 | |
| joseph_adamu | 1:dc648c5624b9 | 912 | /** @brief test for operation of remove() |
| joseph_adamu | 1:dc648c5624b9 | 913 | * |
| joseph_adamu | 1:dc648c5624b9 | 914 | * Performs the following tests: |
| joseph_adamu | 1:dc648c5624b9 | 915 | * 1. test remove() on a file that exists. This should succeed. |
| joseph_adamu | 1:dc648c5624b9 | 916 | * 2. test remove() on a dir that exists. This should succeed. |
| joseph_adamu | 1:dc648c5624b9 | 917 | * 3. test remove() on a file that doesnt exist. This should fail. check errno set. |
| joseph_adamu | 1:dc648c5624b9 | 918 | * 4. test remove() on a dir that doesnt exist. This should fail. check errno set. |
| joseph_adamu | 1:dc648c5624b9 | 919 | * |
| joseph_adamu | 1:dc648c5624b9 | 920 | * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. |
| joseph_adamu | 1:dc648c5624b9 | 921 | */ |
| joseph_adamu | 1:dc648c5624b9 | 922 | control_t fsfat_fopen_test_10(const size_t call_count) |
| joseph_adamu | 1:dc648c5624b9 | 923 | { |
| joseph_adamu | 1:dc648c5624b9 | 924 | char buf[FSFAT_FOPEN_TEST_WORK_BUF_SIZE_1]; |
| joseph_adamu | 1:dc648c5624b9 | 925 | char *pos = NULL; |
| joseph_adamu | 1:dc648c5624b9 | 926 | int32_t ret = -1; |
| joseph_adamu | 1:dc648c5624b9 | 927 | size_t len = 0; |
| joseph_adamu | 1:dc648c5624b9 | 928 | fsfat_kv_data_t *node = fsfat_fopen_test_10_kv_data; |
| joseph_adamu | 1:dc648c5624b9 | 929 | |
| joseph_adamu | 1:dc648c5624b9 | 930 | FSFAT_FENTRYLOG("%s:entered\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 931 | (void) call_count; |
| joseph_adamu | 1:dc648c5624b9 | 932 | |
| joseph_adamu | 1:dc648c5624b9 | 933 | TEST_ASSERT(strlen(node->filename) < FSFAT_FOPEN_TEST_WORK_BUF_SIZE_1); |
| joseph_adamu | 1:dc648c5624b9 | 934 | |
| joseph_adamu | 1:dc648c5624b9 | 935 | /* start from a known state i.e. directory to be created in not present */ |
| joseph_adamu | 1:dc648c5624b9 | 936 | fsfat_filepath_remove_all((char*) node->filename); |
| joseph_adamu | 1:dc648c5624b9 | 937 | |
| joseph_adamu | 1:dc648c5624b9 | 938 | /* (1) */ |
| joseph_adamu | 1:dc648c5624b9 | 939 | errno = 0; |
| joseph_adamu | 1:dc648c5624b9 | 940 | ret = fsfat_filepath_make_dirs((char*) node->filename, false); |
| joseph_adamu | 1:dc648c5624b9 | 941 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create dir (dirname=%s, ret=%d, errno=%d)\n", __func__, node->filename, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 942 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 943 | |
| joseph_adamu | 1:dc648c5624b9 | 944 | len = strlen(node->value); |
| joseph_adamu | 1:dc648c5624b9 | 945 | ret = fsfat_test_create(node->filename, (char*) node->value, len); |
| joseph_adamu | 1:dc648c5624b9 | 946 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create file (ret=%d).\n", __func__, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 947 | TEST_ASSERT_MESSAGE(ret >= 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 948 | |
| joseph_adamu | 1:dc648c5624b9 | 949 | ret = remove(node->filename); |
| joseph_adamu | 1:dc648c5624b9 | 950 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: delete file operation failed (filename=%s, ret=%d) .\n", __func__, node->filename, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 951 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 952 | |
| joseph_adamu | 1:dc648c5624b9 | 953 | /* (3) */ |
| joseph_adamu | 1:dc648c5624b9 | 954 | ret = remove(node->filename); |
| joseph_adamu | 1:dc648c5624b9 | 955 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: deleted a file that doesn't exist (filename=%s, ret=%d, errno=%d) .\n", __func__, node->filename, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 956 | TEST_ASSERT_MESSAGE(ret != 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 957 | |
| joseph_adamu | 1:dc648c5624b9 | 958 | /* (2) */ |
| joseph_adamu | 1:dc648c5624b9 | 959 | memset(buf, 0, FSFAT_FOPEN_TEST_WORK_BUF_SIZE_1); |
| joseph_adamu | 1:dc648c5624b9 | 960 | memcpy(buf, node->filename, strlen(node->filename)); |
| joseph_adamu | 1:dc648c5624b9 | 961 | pos = strrchr(buf, '/'); |
| joseph_adamu | 1:dc648c5624b9 | 962 | *pos = '\0'; |
| joseph_adamu | 1:dc648c5624b9 | 963 | ret = remove(buf); |
| joseph_adamu | 1:dc648c5624b9 | 964 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: delete directory operation failed (directory name=%s, ret=%d, errno=%d).\n", __func__, buf, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 965 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 966 | |
| joseph_adamu | 1:dc648c5624b9 | 967 | /* (4) */ |
| joseph_adamu | 1:dc648c5624b9 | 968 | ret = remove(buf); |
| joseph_adamu | 1:dc648c5624b9 | 969 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: deleted a directory that doesn't exist (directory name=%s, ret=%d, errno=%d).\n", __func__, buf, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 970 | TEST_ASSERT_MESSAGE(ret != 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 971 | |
| joseph_adamu | 1:dc648c5624b9 | 972 | return CaseNext; |
| joseph_adamu | 1:dc648c5624b9 | 973 | } |
| joseph_adamu | 1:dc648c5624b9 | 974 | |
| joseph_adamu | 1:dc648c5624b9 | 975 | |
| joseph_adamu | 1:dc648c5624b9 | 976 | /* file data for test_11 */ |
| joseph_adamu | 1:dc648c5624b9 | 977 | static fsfat_kv_data_t fsfat_fopen_test_11_kv_data[] = { |
| joseph_adamu | 1:dc648c5624b9 | 978 | { "/sd/test_11/step0.txt", "test_data"}, |
| joseph_adamu | 1:dc648c5624b9 | 979 | { "/sd/test_11/step1.txt", "test_data"}, |
| joseph_adamu | 1:dc648c5624b9 | 980 | { "/sd/test_11/subdir/step3.txt", "test_data"}, |
| joseph_adamu | 1:dc648c5624b9 | 981 | { NULL, NULL}, |
| joseph_adamu | 1:dc648c5624b9 | 982 | }; |
| joseph_adamu | 1:dc648c5624b9 | 983 | |
| joseph_adamu | 1:dc648c5624b9 | 984 | /** @brief test for operation of rename() |
| joseph_adamu | 1:dc648c5624b9 | 985 | * |
| joseph_adamu | 1:dc648c5624b9 | 986 | * This test does the following: |
| joseph_adamu | 1:dc648c5624b9 | 987 | * 1) test rename() on a file that exists to a new filename within the same directory. |
| joseph_adamu | 1:dc648c5624b9 | 988 | * 2) test rename() on a file that exists to a new filename within a different directory. |
| joseph_adamu | 1:dc648c5624b9 | 989 | * |
| joseph_adamu | 1:dc648c5624b9 | 990 | * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. |
| joseph_adamu | 1:dc648c5624b9 | 991 | */ |
| joseph_adamu | 1:dc648c5624b9 | 992 | control_t fsfat_fopen_test_11(const size_t call_count) |
| joseph_adamu | 1:dc648c5624b9 | 993 | { |
| joseph_adamu | 1:dc648c5624b9 | 994 | int32_t ret = -1; |
| joseph_adamu | 1:dc648c5624b9 | 995 | size_t len = 0; |
| joseph_adamu | 1:dc648c5624b9 | 996 | fsfat_kv_data_t *node = fsfat_fopen_test_11_kv_data; |
| joseph_adamu | 1:dc648c5624b9 | 997 | |
| joseph_adamu | 1:dc648c5624b9 | 998 | FSFAT_FENTRYLOG("%s:entered\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 999 | (void) call_count; |
| joseph_adamu | 1:dc648c5624b9 | 1000 | |
| joseph_adamu | 1:dc648c5624b9 | 1001 | TEST_ASSERT(strlen(node->filename) < FSFAT_FOPEN_TEST_WORK_BUF_SIZE_1); |
| joseph_adamu | 1:dc648c5624b9 | 1002 | |
| joseph_adamu | 1:dc648c5624b9 | 1003 | /* start from a known state i.e. directory to be created in not present, files not present */ |
| joseph_adamu | 1:dc648c5624b9 | 1004 | while(node->filename != NULL) { |
| joseph_adamu | 1:dc648c5624b9 | 1005 | fsfat_filepath_remove_all((char*) node->filename); |
| joseph_adamu | 1:dc648c5624b9 | 1006 | node++; |
| joseph_adamu | 1:dc648c5624b9 | 1007 | } |
| joseph_adamu | 1:dc648c5624b9 | 1008 | |
| joseph_adamu | 1:dc648c5624b9 | 1009 | /* create file and directories ready for rename() tests */ |
| joseph_adamu | 1:dc648c5624b9 | 1010 | errno = 0; |
| joseph_adamu | 1:dc648c5624b9 | 1011 | node = fsfat_fopen_test_11_kv_data; |
| joseph_adamu | 1:dc648c5624b9 | 1012 | ret = fsfat_filepath_make_dirs((char*) node->filename, false); |
| joseph_adamu | 1:dc648c5624b9 | 1013 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create dir (dirname=%s, ret=%d, errno=%d)\n", __func__, node->filename, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 1014 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1015 | |
| joseph_adamu | 1:dc648c5624b9 | 1016 | len = strlen(node->value); |
| joseph_adamu | 1:dc648c5624b9 | 1017 | ret = fsfat_test_create(node->filename, (char*) node->value, len); |
| joseph_adamu | 1:dc648c5624b9 | 1018 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create file (ret=%d).\n", __func__, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 1019 | TEST_ASSERT_MESSAGE(ret >= 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1020 | |
| joseph_adamu | 1:dc648c5624b9 | 1021 | errno = 0; |
| joseph_adamu | 1:dc648c5624b9 | 1022 | node = &fsfat_fopen_test_11_kv_data[2]; |
| joseph_adamu | 1:dc648c5624b9 | 1023 | ret = fsfat_filepath_make_dirs((char*) node->filename, false); |
| joseph_adamu | 1:dc648c5624b9 | 1024 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create dir (dirname=%s, ret=%d, errno=%d)\n", __func__, node->filename, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 1025 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1026 | |
| joseph_adamu | 1:dc648c5624b9 | 1027 | /* (1) */ |
| joseph_adamu | 1:dc648c5624b9 | 1028 | ret = rename(fsfat_fopen_test_11_kv_data[0].filename, fsfat_fopen_test_11_kv_data[1].filename); |
| joseph_adamu | 1:dc648c5624b9 | 1029 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: unable to rename file from (%s) to (%s) (ret=%d, errno=%d).\n", __func__, fsfat_fopen_test_11_kv_data[0].filename, fsfat_fopen_test_11_kv_data[1].filename, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 1030 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1031 | |
| joseph_adamu | 1:dc648c5624b9 | 1032 | /* (2) */ |
| joseph_adamu | 1:dc648c5624b9 | 1033 | ret = rename(fsfat_fopen_test_11_kv_data[1].filename, fsfat_fopen_test_11_kv_data[2].filename); |
| joseph_adamu | 1:dc648c5624b9 | 1034 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: unable to rename file from (%s) to (%s) (ret=%d, errno=%d).\n", __func__, fsfat_fopen_test_11_kv_data[1].filename, fsfat_fopen_test_11_kv_data[2].filename, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 1035 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1036 | |
| joseph_adamu | 1:dc648c5624b9 | 1037 | return CaseNext; |
| joseph_adamu | 1:dc648c5624b9 | 1038 | } |
| joseph_adamu | 1:dc648c5624b9 | 1039 | |
| joseph_adamu | 1:dc648c5624b9 | 1040 | |
| joseph_adamu | 1:dc648c5624b9 | 1041 | /* file data for test_12 */ |
| joseph_adamu | 1:dc648c5624b9 | 1042 | static fsfat_kv_data_t fsfat_fopen_test_12_kv_data[] = { |
| joseph_adamu | 1:dc648c5624b9 | 1043 | { "/sd/test_12/subdir/testfil1.txt", "testfil1.txt"}, |
| joseph_adamu | 1:dc648c5624b9 | 1044 | { "/sd/test_12/testfil2.txt", "testfil2.txt"}, |
| joseph_adamu | 1:dc648c5624b9 | 1045 | { "/sd/test_12/testfil3.txt", "testfil3.txt"}, |
| joseph_adamu | 1:dc648c5624b9 | 1046 | { "/sd/test_12/testfil4.txt", "testfil4.txt"}, |
| joseph_adamu | 1:dc648c5624b9 | 1047 | { "/sd/test_12/testfil5.txt", "testfil5.txt"}, |
| joseph_adamu | 1:dc648c5624b9 | 1048 | { NULL, NULL}, |
| joseph_adamu | 1:dc648c5624b9 | 1049 | }; |
| joseph_adamu | 1:dc648c5624b9 | 1050 | |
| joseph_adamu | 1:dc648c5624b9 | 1051 | /** @brief test for operation of readdir(). |
| joseph_adamu | 1:dc648c5624b9 | 1052 | * |
| joseph_adamu | 1:dc648c5624b9 | 1053 | * Note, rewinddir(), telldir() and seekdir() dont appear to work reliably. |
| joseph_adamu | 1:dc648c5624b9 | 1054 | * opendir() not available on ARM/IAR toolchains. |
| joseph_adamu | 1:dc648c5624b9 | 1055 | * |
| joseph_adamu | 1:dc648c5624b9 | 1056 | * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. |
| joseph_adamu | 1:dc648c5624b9 | 1057 | */ |
| joseph_adamu | 1:dc648c5624b9 | 1058 | control_t fsfat_fopen_test_12(const size_t call_count) |
| joseph_adamu | 1:dc648c5624b9 | 1059 | { |
| joseph_adamu | 1:dc648c5624b9 | 1060 | char buf[FSFAT_FOPEN_TEST_WORK_BUF_SIZE_1]; |
| joseph_adamu | 1:dc648c5624b9 | 1061 | char *pos = NULL; |
| joseph_adamu | 1:dc648c5624b9 | 1062 | int32_t count = 0; |
| joseph_adamu | 1:dc648c5624b9 | 1063 | int32_t ret = -1; |
| joseph_adamu | 1:dc648c5624b9 | 1064 | size_t len = 0; |
| joseph_adamu | 1:dc648c5624b9 | 1065 | DIR *dir; |
| joseph_adamu | 1:dc648c5624b9 | 1066 | struct dirent *dp; |
| joseph_adamu | 1:dc648c5624b9 | 1067 | fsfat_kv_data_t *node = fsfat_fopen_test_12_kv_data; |
| joseph_adamu | 1:dc648c5624b9 | 1068 | |
| joseph_adamu | 1:dc648c5624b9 | 1069 | FSFAT_FENTRYLOG("%s:entered\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 1070 | (void) call_count; |
| joseph_adamu | 1:dc648c5624b9 | 1071 | |
| joseph_adamu | 1:dc648c5624b9 | 1072 | #if ! defined(__ARMCC_VERSION) && defined(__GNUC__) |
| joseph_adamu | 1:dc648c5624b9 | 1073 | |
| joseph_adamu | 1:dc648c5624b9 | 1074 | /* start from a known state i.e. directory to be created in not present */ |
| joseph_adamu | 1:dc648c5624b9 | 1075 | while(node->filename != NULL) { |
| joseph_adamu | 1:dc648c5624b9 | 1076 | fsfat_filepath_remove_all((char*) node->filename); |
| joseph_adamu | 1:dc648c5624b9 | 1077 | node++; |
| joseph_adamu | 1:dc648c5624b9 | 1078 | } |
| joseph_adamu | 1:dc648c5624b9 | 1079 | |
| joseph_adamu | 1:dc648c5624b9 | 1080 | /* create a file */ |
| joseph_adamu | 1:dc648c5624b9 | 1081 | node = fsfat_fopen_test_12_kv_data; |
| joseph_adamu | 1:dc648c5624b9 | 1082 | errno = 0; |
| joseph_adamu | 1:dc648c5624b9 | 1083 | ret = fsfat_filepath_make_dirs((char*) node->filename, false); |
| joseph_adamu | 1:dc648c5624b9 | 1084 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create dir (dirname=%s, ret=%d, errno=%d)\n", __func__, node->filename, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 1085 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1086 | |
| joseph_adamu | 1:dc648c5624b9 | 1087 | node = fsfat_fopen_test_12_kv_data; |
| joseph_adamu | 1:dc648c5624b9 | 1088 | while(node->filename != NULL) { |
| joseph_adamu | 1:dc648c5624b9 | 1089 | len = strlen(node->value); |
| joseph_adamu | 1:dc648c5624b9 | 1090 | ret = fsfat_test_create(node->filename, (char*) node->value, len); |
| joseph_adamu | 1:dc648c5624b9 | 1091 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create file (ret=%d).\n", __func__, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 1092 | TEST_ASSERT_MESSAGE(ret >= 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1093 | node++; |
| joseph_adamu | 1:dc648c5624b9 | 1094 | } |
| joseph_adamu | 1:dc648c5624b9 | 1095 | |
| joseph_adamu | 1:dc648c5624b9 | 1096 | node = fsfat_fopen_test_12_kv_data; |
| joseph_adamu | 1:dc648c5624b9 | 1097 | memset(buf, 0, FSFAT_FOPEN_TEST_WORK_BUF_SIZE_1); |
| joseph_adamu | 1:dc648c5624b9 | 1098 | memcpy(buf, node->filename, strlen(node->filename)); |
| joseph_adamu | 1:dc648c5624b9 | 1099 | pos = strrchr(buf, '/'); |
| joseph_adamu | 1:dc648c5624b9 | 1100 | *pos = '\0'; |
| joseph_adamu | 1:dc648c5624b9 | 1101 | dir = opendir(buf); |
| joseph_adamu | 1:dc648c5624b9 | 1102 | |
| joseph_adamu | 1:dc648c5624b9 | 1103 | dp = readdir(dir); |
| joseph_adamu | 1:dc648c5624b9 | 1104 | TEST_ASSERT_MESSAGE(dp != 0, "Error: readdir() failed\n"); |
| joseph_adamu | 1:dc648c5624b9 | 1105 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: unexpected object name (name=%s, expected=%s).\n", __func__, dp->d_name, "."); |
| joseph_adamu | 1:dc648c5624b9 | 1106 | TEST_ASSERT_MESSAGE(strncmp(dp->d_name, ".", strlen(".")) == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1107 | dp = readdir(dir); |
| joseph_adamu | 1:dc648c5624b9 | 1108 | TEST_ASSERT_MESSAGE(dp != 0, "Error: readdir() failed\n"); |
| joseph_adamu | 1:dc648c5624b9 | 1109 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: unexpected object name (name=%s, expected=%s).\n", __func__, dp->d_name, ".."); |
| joseph_adamu | 1:dc648c5624b9 | 1110 | TEST_ASSERT_MESSAGE(strncmp(dp->d_name, "..", strlen("..")) == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1111 | |
| joseph_adamu | 1:dc648c5624b9 | 1112 | while ((dp = readdir(dir)) != NULL) { |
| joseph_adamu | 1:dc648c5624b9 | 1113 | FSFAT_DBGLOG("%s: filename: \"%s\"\n", __func__, dp->d_name); |
| joseph_adamu | 1:dc648c5624b9 | 1114 | TEST_ASSERT_MESSAGE(dp != 0, "Error: readdir() failed\n"); |
| joseph_adamu | 1:dc648c5624b9 | 1115 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: unexpected object name (name=%s, expected=%s).\n", __func__, dp->d_name, fsfat_fopen_test_12_kv_data[count].value); |
| joseph_adamu | 1:dc648c5624b9 | 1116 | TEST_ASSERT_MESSAGE(strncmp(dp->d_name, fsfat_fopen_test_12_kv_data[count].value, strlen(fsfat_fopen_test_12_kv_data[count].value)) == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1117 | count++; |
| joseph_adamu | 1:dc648c5624b9 | 1118 | } |
| joseph_adamu | 1:dc648c5624b9 | 1119 | closedir(dir); |
| joseph_adamu | 1:dc648c5624b9 | 1120 | |
| joseph_adamu | 1:dc648c5624b9 | 1121 | /* cleanup */ |
| joseph_adamu | 1:dc648c5624b9 | 1122 | node = fsfat_fopen_test_12_kv_data; |
| joseph_adamu | 1:dc648c5624b9 | 1123 | while(node->filename != NULL) { |
| joseph_adamu | 1:dc648c5624b9 | 1124 | fsfat_filepath_remove_all((char*) node->filename); |
| joseph_adamu | 1:dc648c5624b9 | 1125 | node++; |
| joseph_adamu | 1:dc648c5624b9 | 1126 | } |
| joseph_adamu | 1:dc648c5624b9 | 1127 | #endif /* ! defined(__ARMCC_VERSION) && defined(__GNUC__) */ |
| joseph_adamu | 1:dc648c5624b9 | 1128 | return CaseNext; |
| joseph_adamu | 1:dc648c5624b9 | 1129 | } |
| joseph_adamu | 1:dc648c5624b9 | 1130 | |
| joseph_adamu | 1:dc648c5624b9 | 1131 | |
| joseph_adamu | 1:dc648c5624b9 | 1132 | /* file data for test_13 */ |
| joseph_adamu | 1:dc648c5624b9 | 1133 | static fsfat_kv_data_t fsfat_fopen_test_13_kv_data[] = { |
| joseph_adamu | 1:dc648c5624b9 | 1134 | /* a file is included in the filepath even though its not created by the test, |
| joseph_adamu | 1:dc648c5624b9 | 1135 | * as the fsfat_filepath_make_dirs() works with it present. */ |
| joseph_adamu | 1:dc648c5624b9 | 1136 | { "/sd/test_13/dummy.txt", "testdir"}, |
| joseph_adamu | 1:dc648c5624b9 | 1137 | { NULL, NULL}, |
| joseph_adamu | 1:dc648c5624b9 | 1138 | }; |
| joseph_adamu | 1:dc648c5624b9 | 1139 | /** @brief test for operation of mkdir()/remove() |
| joseph_adamu | 1:dc648c5624b9 | 1140 | * |
| joseph_adamu | 1:dc648c5624b9 | 1141 | * This test checks that: |
| joseph_adamu | 1:dc648c5624b9 | 1142 | * - The mkdir() function successfully creates a directory that is not already present. |
| joseph_adamu | 1:dc648c5624b9 | 1143 | * - The mkdir() function returns EEXIST when trying to create a directory thats already present. |
| joseph_adamu | 1:dc648c5624b9 | 1144 | * - The remove() function successfully removes a directory that is present. |
| joseph_adamu | 1:dc648c5624b9 | 1145 | * |
| joseph_adamu | 1:dc648c5624b9 | 1146 | * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. |
| joseph_adamu | 1:dc648c5624b9 | 1147 | */ |
| joseph_adamu | 1:dc648c5624b9 | 1148 | control_t fsfat_fopen_test_13(const size_t call_count) |
| joseph_adamu | 1:dc648c5624b9 | 1149 | { |
| joseph_adamu | 1:dc648c5624b9 | 1150 | int32_t ret = 0; |
| joseph_adamu | 1:dc648c5624b9 | 1151 | |
| joseph_adamu | 1:dc648c5624b9 | 1152 | FSFAT_DBGLOG("%s:entered\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 1153 | (void) call_count; |
| joseph_adamu | 1:dc648c5624b9 | 1154 | |
| joseph_adamu | 1:dc648c5624b9 | 1155 | /* start from a known state i.e. directory to be created in not present */ |
| joseph_adamu | 1:dc648c5624b9 | 1156 | fsfat_filepath_remove_all((char*) fsfat_fopen_test_13_kv_data[0].filename); |
| joseph_adamu | 1:dc648c5624b9 | 1157 | |
| joseph_adamu | 1:dc648c5624b9 | 1158 | errno = 0; |
| joseph_adamu | 1:dc648c5624b9 | 1159 | ret = fsfat_filepath_make_dirs((char*) fsfat_fopen_test_13_kv_data[0].filename, false); |
| joseph_adamu | 1:dc648c5624b9 | 1160 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create dir (dirname=%s, ret=%d, errno=%d)\n", __func__, fsfat_fopen_test_13_kv_data[0].filename, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 1161 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1162 | |
| joseph_adamu | 1:dc648c5624b9 | 1163 | /* check that get a suitable error when try to create it again.*/ |
| joseph_adamu | 1:dc648c5624b9 | 1164 | errno = 0; |
| joseph_adamu | 1:dc648c5624b9 | 1165 | ret = fsfat_filepath_make_dirs((char*) fsfat_fopen_test_13_kv_data[0].filename, false); |
| joseph_adamu | 1:dc648c5624b9 | 1166 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: permitted to create directory when already exists (dirname=%s, ret=%d, errno=%d)\n", __func__, fsfat_fopen_test_13_kv_data[0].filename, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 1167 | TEST_ASSERT_MESSAGE(ret != 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1168 | |
| joseph_adamu | 1:dc648c5624b9 | 1169 | /* check errno is as expected */ |
| joseph_adamu | 1:dc648c5624b9 | 1170 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: errno != EEXIST (dirname=%s, ret=%d, errno=%d)\n", __func__, fsfat_fopen_test_13_kv_data[0].filename, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 1171 | TEST_ASSERT_MESSAGE(errno == EEXIST, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1172 | |
| joseph_adamu | 1:dc648c5624b9 | 1173 | ret = fsfat_filepath_remove_all((char*) fsfat_fopen_test_13_kv_data[0].filename); |
| joseph_adamu | 1:dc648c5624b9 | 1174 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to remove directory (dirname=%s, ret=%d, errno=%d)\n", __func__, fsfat_fopen_test_13_kv_data[0].filename, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 1175 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1176 | |
| joseph_adamu | 1:dc648c5624b9 | 1177 | return CaseNext; |
| joseph_adamu | 1:dc648c5624b9 | 1178 | } |
| joseph_adamu | 1:dc648c5624b9 | 1179 | |
| joseph_adamu | 1:dc648c5624b9 | 1180 | /* file data for test_14 */ |
| joseph_adamu | 1:dc648c5624b9 | 1181 | static fsfat_kv_data_t fsfat_fopen_test_14_kv_data[] = { |
| joseph_adamu | 1:dc648c5624b9 | 1182 | /* a file is included in the filepath even though its not created by the test, |
| joseph_adamu | 1:dc648c5624b9 | 1183 | * as the fsfat_filepath_make_dirs() works with it present. */ |
| joseph_adamu | 1:dc648c5624b9 | 1184 | { "/sd/test_14/testfile.txt", "testdata"}, |
| joseph_adamu | 1:dc648c5624b9 | 1185 | { NULL, NULL}, |
| joseph_adamu | 1:dc648c5624b9 | 1186 | }; |
| joseph_adamu | 1:dc648c5624b9 | 1187 | |
| joseph_adamu | 1:dc648c5624b9 | 1188 | /** @brief test for operation of stat() |
| joseph_adamu | 1:dc648c5624b9 | 1189 | * |
| joseph_adamu | 1:dc648c5624b9 | 1190 | * stat() is currently no supported by ARMCC and IAR toolchains libc. |
| joseph_adamu | 1:dc648c5624b9 | 1191 | * |
| joseph_adamu | 1:dc648c5624b9 | 1192 | * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. |
| joseph_adamu | 1:dc648c5624b9 | 1193 | */ |
| joseph_adamu | 1:dc648c5624b9 | 1194 | control_t fsfat_fopen_test_14(const size_t call_count) |
| joseph_adamu | 1:dc648c5624b9 | 1195 | { |
| joseph_adamu | 1:dc648c5624b9 | 1196 | #if ! defined(__ARMCC_VERSION) && defined(__GNUC__) |
| joseph_adamu | 1:dc648c5624b9 | 1197 | |
| joseph_adamu | 1:dc648c5624b9 | 1198 | char buf[FSFAT_FOPEN_TEST_WORK_BUF_SIZE_1]; |
| joseph_adamu | 1:dc648c5624b9 | 1199 | char *pos = NULL; |
| joseph_adamu | 1:dc648c5624b9 | 1200 | int32_t ret = -1; |
| joseph_adamu | 1:dc648c5624b9 | 1201 | size_t len = 0; |
| joseph_adamu | 1:dc648c5624b9 | 1202 | struct stat file_stat; |
| joseph_adamu | 1:dc648c5624b9 | 1203 | fsfat_kv_data_t *node = fsfat_fopen_test_14_kv_data; |
| joseph_adamu | 1:dc648c5624b9 | 1204 | |
| joseph_adamu | 1:dc648c5624b9 | 1205 | FSFAT_FENTRYLOG("%s:entered\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 1206 | (void) call_count; |
| joseph_adamu | 1:dc648c5624b9 | 1207 | |
| joseph_adamu | 1:dc648c5624b9 | 1208 | TEST_ASSERT(strlen(node->filename) < FSFAT_FOPEN_TEST_WORK_BUF_SIZE_1); |
| joseph_adamu | 1:dc648c5624b9 | 1209 | |
| joseph_adamu | 1:dc648c5624b9 | 1210 | /* start from a known state i.e. directory to be created in not present */ |
| joseph_adamu | 1:dc648c5624b9 | 1211 | fsfat_filepath_remove_all((char*) node->filename); |
| joseph_adamu | 1:dc648c5624b9 | 1212 | |
| joseph_adamu | 1:dc648c5624b9 | 1213 | /* Create file in a directory. */ |
| joseph_adamu | 1:dc648c5624b9 | 1214 | errno = 0; |
| joseph_adamu | 1:dc648c5624b9 | 1215 | ret = fsfat_filepath_make_dirs((char*) node->filename, false); |
| joseph_adamu | 1:dc648c5624b9 | 1216 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create dir (dirname=%s, ret=%d, errno=%d)\n", __func__, node->filename, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 1217 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1218 | |
| joseph_adamu | 1:dc648c5624b9 | 1219 | len = strlen(node->value); |
| joseph_adamu | 1:dc648c5624b9 | 1220 | ret = fsfat_test_create(node->filename, (char*) node->value, len); |
| joseph_adamu | 1:dc648c5624b9 | 1221 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create file (ret=%d).\n", __func__, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 1222 | TEST_ASSERT_MESSAGE(ret >= 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1223 | |
| joseph_adamu | 1:dc648c5624b9 | 1224 | /* Test stat() on the file returns the correct attribute set */ |
| joseph_adamu | 1:dc648c5624b9 | 1225 | memset(&file_stat, 0, sizeof(file_stat)); |
| joseph_adamu | 1:dc648c5624b9 | 1226 | ret = stat(node->filename, &file_stat); |
| joseph_adamu | 1:dc648c5624b9 | 1227 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: stat() operation on file failed (filename=%s, ret=%d, errno=%d).\n", __func__, node->filename, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 1228 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1229 | |
| joseph_adamu | 1:dc648c5624b9 | 1230 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: expected st_mode S_IFREG flag not set (filename=%s).\n", __func__, node->filename); |
| joseph_adamu | 1:dc648c5624b9 | 1231 | TEST_ASSERT_MESSAGE((file_stat.st_mode & S_IFREG) == S_IFREG, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1232 | |
| joseph_adamu | 1:dc648c5624b9 | 1233 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: unexpected st_mode S_IFDIR flag set (filename=%s).\n", __func__, node->filename); |
| joseph_adamu | 1:dc648c5624b9 | 1234 | TEST_ASSERT_MESSAGE((file_stat.st_mode & S_IFDIR) != S_IFDIR, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1235 | |
| joseph_adamu | 1:dc648c5624b9 | 1236 | /* Test stat() on the directory returns the correct attribute set */ |
| joseph_adamu | 1:dc648c5624b9 | 1237 | memset(&file_stat, 0, sizeof(file_stat)); |
| joseph_adamu | 1:dc648c5624b9 | 1238 | memset(buf, 0, FSFAT_FOPEN_TEST_WORK_BUF_SIZE_1); |
| joseph_adamu | 1:dc648c5624b9 | 1239 | memcpy(buf, node->filename, strlen(node->filename)); |
| joseph_adamu | 1:dc648c5624b9 | 1240 | pos = strrchr(buf, '/'); |
| joseph_adamu | 1:dc648c5624b9 | 1241 | *pos = '\0'; |
| joseph_adamu | 1:dc648c5624b9 | 1242 | ret = stat(buf, &file_stat); |
| joseph_adamu | 1:dc648c5624b9 | 1243 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: stat() operation on directory failed (directory name=%s, ret=%d, errno=%d).\n", __func__, buf, (int) ret, errno); |
| joseph_adamu | 1:dc648c5624b9 | 1244 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1245 | |
| joseph_adamu | 1:dc648c5624b9 | 1246 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: unexpected st_mode S_IFREG flag set (directory name=%s).\n", __func__, buf); |
| joseph_adamu | 1:dc648c5624b9 | 1247 | TEST_ASSERT_MESSAGE((file_stat.st_mode & S_IFREG) != S_IFREG, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1248 | |
| joseph_adamu | 1:dc648c5624b9 | 1249 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: expected st_mode S_IFDIR flag not set (directory name=%s).\n", __func__, buf); |
| joseph_adamu | 1:dc648c5624b9 | 1250 | TEST_ASSERT_MESSAGE((file_stat.st_mode & S_IFDIR) == S_IFDIR, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1251 | |
| joseph_adamu | 1:dc648c5624b9 | 1252 | /* clean up after successful test */ |
| joseph_adamu | 1:dc648c5624b9 | 1253 | fsfat_filepath_remove_all((char*) node->filename); |
| joseph_adamu | 1:dc648c5624b9 | 1254 | |
| joseph_adamu | 1:dc648c5624b9 | 1255 | #endif /* ! defined(__ARMCC_VERSION) && defined(__GNUC__) */ |
| joseph_adamu | 1:dc648c5624b9 | 1256 | return CaseNext; |
| joseph_adamu | 1:dc648c5624b9 | 1257 | } |
| joseph_adamu | 1:dc648c5624b9 | 1258 | |
| joseph_adamu | 1:dc648c5624b9 | 1259 | /** @brief test for operation of SDFileSystem::format() |
| joseph_adamu | 1:dc648c5624b9 | 1260 | * |
| joseph_adamu | 1:dc648c5624b9 | 1261 | * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. |
| joseph_adamu | 1:dc648c5624b9 | 1262 | */ |
| joseph_adamu | 1:dc648c5624b9 | 1263 | control_t fsfat_fopen_test_15(const size_t call_count) |
| joseph_adamu | 1:dc648c5624b9 | 1264 | { |
| joseph_adamu | 1:dc648c5624b9 | 1265 | |
| joseph_adamu | 1:dc648c5624b9 | 1266 | FSFAT_FENTRYLOG("%s:entered\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 1267 | (void) call_count; |
| joseph_adamu | 1:dc648c5624b9 | 1268 | int32_t ret = -1; |
| joseph_adamu | 1:dc648c5624b9 | 1269 | |
| joseph_adamu | 1:dc648c5624b9 | 1270 | /* the allocation_unit of 0 means chanFS will use the default for the card (varies according to capacity). */ |
| joseph_adamu | 1:dc648c5624b9 | 1271 | fs.unmount(); |
| joseph_adamu | 1:dc648c5624b9 | 1272 | ret = fs.format(&sd); |
| joseph_adamu | 1:dc648c5624b9 | 1273 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to format sdcard (ret=%d)\n", __func__, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 1274 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1275 | fs.mount(&sd); |
| joseph_adamu | 1:dc648c5624b9 | 1276 | return CaseNext; |
| joseph_adamu | 1:dc648c5624b9 | 1277 | } |
| joseph_adamu | 1:dc648c5624b9 | 1278 | |
| joseph_adamu | 1:dc648c5624b9 | 1279 | |
| joseph_adamu | 1:dc648c5624b9 | 1280 | /* @brief test utility function to create a file of a given size. |
| joseph_adamu | 1:dc648c5624b9 | 1281 | * |
| joseph_adamu | 1:dc648c5624b9 | 1282 | * A reference data table is used of so that the data file can be later be |
| joseph_adamu | 1:dc648c5624b9 | 1283 | * checked with fsfat_test_check_data_file(). |
| joseph_adamu | 1:dc648c5624b9 | 1284 | * |
| joseph_adamu | 1:dc648c5624b9 | 1285 | * @param filename name of the file including path |
| joseph_adamu | 1:dc648c5624b9 | 1286 | * @param data data to store in file |
| joseph_adamu | 1:dc648c5624b9 | 1287 | * @param len number of bytes of data present in the data buffer. |
| joseph_adamu | 1:dc648c5624b9 | 1288 | */ |
| joseph_adamu | 1:dc648c5624b9 | 1289 | int32_t fsfat_test_create_data_file(const char* filename, size_t len) |
| joseph_adamu | 1:dc648c5624b9 | 1290 | { |
| joseph_adamu | 1:dc648c5624b9 | 1291 | int32_t ret = -1; |
| joseph_adamu | 1:dc648c5624b9 | 1292 | FILE *fp = NULL; |
| joseph_adamu | 1:dc648c5624b9 | 1293 | size_t write_len = 0; |
| joseph_adamu | 1:dc648c5624b9 | 1294 | size_t written_len = 0; |
| joseph_adamu | 1:dc648c5624b9 | 1295 | int32_t exp = 0; |
| joseph_adamu | 1:dc648c5624b9 | 1296 | const int32_t exp_max = 8; /* so as not to exceed FSFAT_TEST_BYTE_DATA_TABLE_SIZE/2 */ |
| joseph_adamu | 1:dc648c5624b9 | 1297 | |
| joseph_adamu | 1:dc648c5624b9 | 1298 | FSFAT_FENTRYLOG("%s:entered (filename=%s, len=%d).\n", __func__, filename, (int) len); |
| joseph_adamu | 1:dc648c5624b9 | 1299 | TEST_ASSERT(len % FSFAT_TEST_BYTE_DATA_TABLE_SIZE == 0); |
| joseph_adamu | 1:dc648c5624b9 | 1300 | fp = fopen(filename, "a"); |
| joseph_adamu | 1:dc648c5624b9 | 1301 | if(fp == NULL){ |
| joseph_adamu | 1:dc648c5624b9 | 1302 | return ret; |
| joseph_adamu | 1:dc648c5624b9 | 1303 | } |
| joseph_adamu | 1:dc648c5624b9 | 1304 | |
| joseph_adamu | 1:dc648c5624b9 | 1305 | while(written_len < len) { |
| joseph_adamu | 1:dc648c5624b9 | 1306 | /* write fsfat_test_byte_data_table or part thereof, in 9 writes of sizes |
| joseph_adamu | 1:dc648c5624b9 | 1307 | * 1, 2, 4, 8, 16, 32, 64, 128, 1, totalling 256 bytes len permitting. */ |
| joseph_adamu | 1:dc648c5624b9 | 1308 | for(exp = 0; (exp <= exp_max) && (written_len < len); exp++){ |
| joseph_adamu | 1:dc648c5624b9 | 1309 | write_len = 0x1 << (exp % exp_max); |
| joseph_adamu | 1:dc648c5624b9 | 1310 | write_len = len - written_len > write_len ? write_len : len - written_len; |
| joseph_adamu | 1:dc648c5624b9 | 1311 | ret = fwrite((const void*) &fsfat_test_byte_data_table[written_len % FSFAT_TEST_BYTE_DATA_TABLE_SIZE], write_len, 1, fp); |
| joseph_adamu | 1:dc648c5624b9 | 1312 | written_len += write_len; |
| joseph_adamu | 1:dc648c5624b9 | 1313 | if(ret != 1){ |
| joseph_adamu | 1:dc648c5624b9 | 1314 | FSFAT_DBGLOG("%s:Error: fwrite() failed (ret=%d)\n", __func__, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 1315 | ret = -1; |
| joseph_adamu | 1:dc648c5624b9 | 1316 | goto out0; |
| joseph_adamu | 1:dc648c5624b9 | 1317 | } |
| joseph_adamu | 1:dc648c5624b9 | 1318 | } |
| joseph_adamu | 1:dc648c5624b9 | 1319 | } |
| joseph_adamu | 1:dc648c5624b9 | 1320 | if(written_len == len) { |
| joseph_adamu | 1:dc648c5624b9 | 1321 | ret = 0; |
| joseph_adamu | 1:dc648c5624b9 | 1322 | } else { |
| joseph_adamu | 1:dc648c5624b9 | 1323 | ret = -1; |
| joseph_adamu | 1:dc648c5624b9 | 1324 | } |
| joseph_adamu | 1:dc648c5624b9 | 1325 | out0: |
| joseph_adamu | 1:dc648c5624b9 | 1326 | fclose(fp); |
| joseph_adamu | 1:dc648c5624b9 | 1327 | return ret; |
| joseph_adamu | 1:dc648c5624b9 | 1328 | } |
| joseph_adamu | 1:dc648c5624b9 | 1329 | |
| joseph_adamu | 1:dc648c5624b9 | 1330 | |
| joseph_adamu | 1:dc648c5624b9 | 1331 | /* @brief test utility function to check the data in the specified file is correct. |
| joseph_adamu | 1:dc648c5624b9 | 1332 | * |
| joseph_adamu | 1:dc648c5624b9 | 1333 | * The data read from the file is check that it agrees with the data written by |
| joseph_adamu | 1:dc648c5624b9 | 1334 | * fsfat_test_create_data_file(). |
| joseph_adamu | 1:dc648c5624b9 | 1335 | * |
| joseph_adamu | 1:dc648c5624b9 | 1336 | * @param filename name of the file including path |
| joseph_adamu | 1:dc648c5624b9 | 1337 | * @param data data to store in file |
| joseph_adamu | 1:dc648c5624b9 | 1338 | * @param len number of bytes of data present in the data buffer. |
| joseph_adamu | 1:dc648c5624b9 | 1339 | */ |
| joseph_adamu | 1:dc648c5624b9 | 1340 | int32_t fsfat_test_check_data_file(const char* filename, size_t len) |
| joseph_adamu | 1:dc648c5624b9 | 1341 | { |
| joseph_adamu | 1:dc648c5624b9 | 1342 | int32_t ret = -1; |
| joseph_adamu | 1:dc648c5624b9 | 1343 | FILE *fp = NULL; |
| joseph_adamu | 1:dc648c5624b9 | 1344 | size_t read_len = 0; |
| joseph_adamu | 1:dc648c5624b9 | 1345 | uint8_t buf[FSFAT_TEST_BYTE_DATA_TABLE_SIZE]; |
| joseph_adamu | 1:dc648c5624b9 | 1346 | |
| joseph_adamu | 1:dc648c5624b9 | 1347 | FSFAT_FENTRYLOG("%s:entered (filename=%s, len=%d).\n", __func__, filename, (int) len); |
| joseph_adamu | 1:dc648c5624b9 | 1348 | TEST_ASSERT(len % FSFAT_TEST_BYTE_DATA_TABLE_SIZE == 0); |
| joseph_adamu | 1:dc648c5624b9 | 1349 | fp = fopen(filename, "r"); |
| joseph_adamu | 1:dc648c5624b9 | 1350 | if(fp == NULL){ |
| joseph_adamu | 1:dc648c5624b9 | 1351 | return ret; |
| joseph_adamu | 1:dc648c5624b9 | 1352 | } |
| joseph_adamu | 1:dc648c5624b9 | 1353 | |
| joseph_adamu | 1:dc648c5624b9 | 1354 | while(read_len < len) { |
| joseph_adamu | 1:dc648c5624b9 | 1355 | ret = fread((void*) buf, FSFAT_TEST_BYTE_DATA_TABLE_SIZE, 1, fp); |
| joseph_adamu | 1:dc648c5624b9 | 1356 | read_len += FSFAT_TEST_BYTE_DATA_TABLE_SIZE; |
| joseph_adamu | 1:dc648c5624b9 | 1357 | if(ret == 0){ |
| joseph_adamu | 1:dc648c5624b9 | 1358 | /* end of read*/ |
| joseph_adamu | 1:dc648c5624b9 | 1359 | FSFAT_DBGLOG("%s:unable to read data\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 1360 | break; |
| joseph_adamu | 1:dc648c5624b9 | 1361 | } |
| joseph_adamu | 1:dc648c5624b9 | 1362 | if(memcmp(buf, fsfat_test_byte_data_table, FSFAT_TEST_BYTE_DATA_TABLE_SIZE) != 0) { |
| joseph_adamu | 1:dc648c5624b9 | 1363 | FSFAT_DBGLOG("%s:Error: read data not as expected (0x%2x, 0x%2x, 0x%2x, 0x%2x, 0x%2x, 0x%2x, 0x%2x, 0x%2x, 0x%2x, 0x%2x, 0x%2x, 0x%2x, 0x%2x, 0x%2x, 0x%2x, 0x%2x\n", __func__, |
| joseph_adamu | 1:dc648c5624b9 | 1364 | buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], buf[10], buf[11], buf[12], buf[13], buf[14], buf[15]); |
| joseph_adamu | 1:dc648c5624b9 | 1365 | ret = -1; |
| joseph_adamu | 1:dc648c5624b9 | 1366 | goto out0; |
| joseph_adamu | 1:dc648c5624b9 | 1367 | } |
| joseph_adamu | 1:dc648c5624b9 | 1368 | } |
| joseph_adamu | 1:dc648c5624b9 | 1369 | if(read_len == len) { |
| joseph_adamu | 1:dc648c5624b9 | 1370 | ret = 0; |
| joseph_adamu | 1:dc648c5624b9 | 1371 | } |
| joseph_adamu | 1:dc648c5624b9 | 1372 | out0: |
| joseph_adamu | 1:dc648c5624b9 | 1373 | fclose(fp); |
| joseph_adamu | 1:dc648c5624b9 | 1374 | return ret; |
| joseph_adamu | 1:dc648c5624b9 | 1375 | } |
| joseph_adamu | 1:dc648c5624b9 | 1376 | |
| joseph_adamu | 1:dc648c5624b9 | 1377 | /* file data for test_16 */ |
| joseph_adamu | 1:dc648c5624b9 | 1378 | static fsfat_kv_data_t fsfat_fopen_test_16_kv_data[] = { |
| joseph_adamu | 1:dc648c5624b9 | 1379 | { "/sd/tst16_0/testfil0.txt", "dummy_data"}, |
| joseph_adamu | 1:dc648c5624b9 | 1380 | { "/sd/tst16_1/subdir0/testfil0.txt", "dummy_data"}, |
| joseph_adamu | 1:dc648c5624b9 | 1381 | { "/sd/tst16_2/subdir0/subdir1/testfil0.txt", "dummy_data"}, |
| joseph_adamu | 1:dc648c5624b9 | 1382 | { "/sd/tst16_3/subdir0/subdir1/subdir2/subdir3/testfil0.txt", "dummy_data"}, |
| joseph_adamu | 1:dc648c5624b9 | 1383 | { "/sd/tst16_4/subdir0/subdir1/subdir2/subdir3/subdir4/testfil0.txt", "dummy_data"}, |
| joseph_adamu | 1:dc648c5624b9 | 1384 | { "/sd/tst16_5/subdir0/subdir1/subdir2/subdir3/subdir4/subdir5/testfil0.txt", "dummy_data"}, |
| joseph_adamu | 1:dc648c5624b9 | 1385 | { "/sd/tst16_6/subdir0/subdir1/subdir2/subdir3/subdir4/subdir5/subdir6/testfil0.txt", "dummy_data"}, |
| joseph_adamu | 1:dc648c5624b9 | 1386 | { "/sd/tst16_7/subdir0/subdir1/subdir2/subdir3/subdir4/subdir5/subdir6/subdir7/testfil0.txt", "dummy_data"}, |
| joseph_adamu | 1:dc648c5624b9 | 1387 | { "/sd/tst16_8/subdir0/subdir1/subdir2/subdir3/subdir4/subdir5/subdir6/subdir7/subdir8/testfil0.txt", "dummy_data"}, |
| joseph_adamu | 1:dc648c5624b9 | 1388 | { "/sd/tst16_9/subdir0/subdir1/subdir2/subdir3/subdir4/subdir5/subdir6/subdir7/subdir8/subdir9/testfil0.txt", "dummy_data"}, |
| joseph_adamu | 1:dc648c5624b9 | 1389 | { NULL, NULL}, |
| joseph_adamu | 1:dc648c5624b9 | 1390 | }; |
| joseph_adamu | 1:dc648c5624b9 | 1391 | |
| joseph_adamu | 1:dc648c5624b9 | 1392 | |
| joseph_adamu | 1:dc648c5624b9 | 1393 | /** @brief stress test to write data to fs |
| joseph_adamu | 1:dc648c5624b9 | 1394 | * |
| joseph_adamu | 1:dc648c5624b9 | 1395 | * @return on success returns CaseNext to continue to next test case, otherwise will assert on errors. |
| joseph_adamu | 1:dc648c5624b9 | 1396 | */ |
| joseph_adamu | 1:dc648c5624b9 | 1397 | control_t fsfat_fopen_test_16(const size_t call_count) |
| joseph_adamu | 1:dc648c5624b9 | 1398 | { |
| joseph_adamu | 1:dc648c5624b9 | 1399 | int32_t ret = 0; |
| joseph_adamu | 1:dc648c5624b9 | 1400 | fsfat_kv_data_t *node = fsfat_fopen_test_16_kv_data; |
| joseph_adamu | 1:dc648c5624b9 | 1401 | const int32_t num_blocks = 100; /* each file ~25kB */ |
| joseph_adamu | 1:dc648c5624b9 | 1402 | |
| joseph_adamu | 1:dc648c5624b9 | 1403 | FSFAT_DBGLOG("%s:entered\n", __func__); |
| joseph_adamu | 1:dc648c5624b9 | 1404 | (void) call_count; |
| joseph_adamu | 1:dc648c5624b9 | 1405 | |
| joseph_adamu | 1:dc648c5624b9 | 1406 | /* remove file and directory from a previous failed test run, if present */ |
| joseph_adamu | 1:dc648c5624b9 | 1407 | while(node->filename != NULL) { |
| joseph_adamu | 1:dc648c5624b9 | 1408 | fsfat_filepath_remove_all((char*) node->filename); |
| joseph_adamu | 1:dc648c5624b9 | 1409 | node++; |
| joseph_adamu | 1:dc648c5624b9 | 1410 | } |
| joseph_adamu | 1:dc648c5624b9 | 1411 | |
| joseph_adamu | 1:dc648c5624b9 | 1412 | /* create dirs */ |
| joseph_adamu | 1:dc648c5624b9 | 1413 | node = fsfat_fopen_test_16_kv_data; |
| joseph_adamu | 1:dc648c5624b9 | 1414 | while(node->filename != NULL) { |
| joseph_adamu | 1:dc648c5624b9 | 1415 | ret = fsfat_filepath_make_dirs((char*) node->filename, true); |
| joseph_adamu | 1:dc648c5624b9 | 1416 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create dirs for filename (filename=\"%s\")(ret=%d)\n", __func__, node->filename, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 1417 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1418 | node++; |
| joseph_adamu | 1:dc648c5624b9 | 1419 | } |
| joseph_adamu | 1:dc648c5624b9 | 1420 | |
| joseph_adamu | 1:dc648c5624b9 | 1421 | /* create the data files */ |
| joseph_adamu | 1:dc648c5624b9 | 1422 | node = fsfat_fopen_test_16_kv_data; |
| joseph_adamu | 1:dc648c5624b9 | 1423 | while(node->filename != NULL) { |
| joseph_adamu | 1:dc648c5624b9 | 1424 | ret = fsfat_test_create_data_file(node->filename, num_blocks * FSFAT_TEST_BYTE_DATA_TABLE_SIZE); |
| joseph_adamu | 1:dc648c5624b9 | 1425 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create data file (filename=\"%s\")(ret=%d)\n", __func__, node->filename, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 1426 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1427 | node++; |
| joseph_adamu | 1:dc648c5624b9 | 1428 | } |
| joseph_adamu | 1:dc648c5624b9 | 1429 | |
| joseph_adamu | 1:dc648c5624b9 | 1430 | /* read the data back and check its as expected */ |
| joseph_adamu | 1:dc648c5624b9 | 1431 | node = fsfat_fopen_test_16_kv_data; |
| joseph_adamu | 1:dc648c5624b9 | 1432 | while(node->filename != NULL) { |
| joseph_adamu | 1:dc648c5624b9 | 1433 | ret = fsfat_test_check_data_file(node->filename, num_blocks * FSFAT_TEST_BYTE_DATA_TABLE_SIZE); |
| joseph_adamu | 1:dc648c5624b9 | 1434 | FSFAT_TEST_UTEST_MESSAGE(fsfat_fopen_utest_msg_g, FSFAT_UTEST_MSG_BUF_SIZE, "%s:Error: failed to check data file (filename=\"%s\")(ret=%d)\n", __func__, node->filename, (int) ret); |
| joseph_adamu | 1:dc648c5624b9 | 1435 | TEST_ASSERT_MESSAGE(ret == 0, fsfat_fopen_utest_msg_g); |
| joseph_adamu | 1:dc648c5624b9 | 1436 | node++; |
| joseph_adamu | 1:dc648c5624b9 | 1437 | } |
| joseph_adamu | 1:dc648c5624b9 | 1438 | |
| joseph_adamu | 1:dc648c5624b9 | 1439 | /* clean up */ |
| joseph_adamu | 1:dc648c5624b9 | 1440 | node = fsfat_fopen_test_16_kv_data; |
| joseph_adamu | 1:dc648c5624b9 | 1441 | while(node->filename != NULL) { |
| joseph_adamu | 1:dc648c5624b9 | 1442 | fsfat_filepath_remove_all((char*) node->filename); |
| joseph_adamu | 1:dc648c5624b9 | 1443 | node++; |
| joseph_adamu | 1:dc648c5624b9 | 1444 | } |
| joseph_adamu | 1:dc648c5624b9 | 1445 | return CaseNext; |
| joseph_adamu | 1:dc648c5624b9 | 1446 | } |
| joseph_adamu | 1:dc648c5624b9 | 1447 | |
| joseph_adamu | 1:dc648c5624b9 | 1448 | |
| joseph_adamu | 1:dc648c5624b9 | 1449 | #else |
| joseph_adamu | 1:dc648c5624b9 | 1450 | |
| joseph_adamu | 1:dc648c5624b9 | 1451 | |
| joseph_adamu | 1:dc648c5624b9 | 1452 | #define FSFAT_FOPEN_TEST_01 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1453 | #define FSFAT_FOPEN_TEST_02 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1454 | #define FSFAT_FOPEN_TEST_03 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1455 | #define FSFAT_FOPEN_TEST_04 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1456 | #define FSFAT_FOPEN_TEST_05 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1457 | #define FSFAT_FOPEN_TEST_06 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1458 | #define FSFAT_FOPEN_TEST_07 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1459 | #define FSFAT_FOPEN_TEST_08 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1460 | #define FSFAT_FOPEN_TEST_09 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1461 | #define FSFAT_FOPEN_TEST_10 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1462 | #define FSFAT_FOPEN_TEST_11 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1463 | #define FSFAT_FOPEN_TEST_12 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1464 | #define FSFAT_FOPEN_TEST_13 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1465 | #define FSFAT_FOPEN_TEST_14 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1466 | #define FSFAT_FOPEN_TEST_15 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1467 | #define FSFAT_FOPEN_TEST_16 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1468 | #define FSFAT_FOPEN_TEST_17 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1469 | #define FSFAT_FOPEN_TEST_18 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1470 | #define FSFAT_FOPEN_TEST_19 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1471 | #define FSFAT_FOPEN_TEST_20 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1472 | #define FSFAT_FOPEN_TEST_21 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1473 | #define FSFAT_FOPEN_TEST_22 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1474 | #define FSFAT_FOPEN_TEST_23 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1475 | #define FSFAT_FOPEN_TEST_24 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1476 | #define FSFAT_FOPEN_TEST_25 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1477 | #define FSFAT_FOPEN_TEST_26 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1478 | #define FSFAT_FOPEN_TEST_27 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1479 | #define FSFAT_FOPEN_TEST_28 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1480 | #define FSFAT_FOPEN_TEST_29 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1481 | #define FSFAT_FOPEN_TEST_30 fsfat_fopen_test_dummy |
| joseph_adamu | 1:dc648c5624b9 | 1482 | |
| joseph_adamu | 1:dc648c5624b9 | 1483 | /** @brief fsfat_fopen_test_dummy Dummy test case for testing when platform doesnt have an SDCard installed. |
| joseph_adamu | 1:dc648c5624b9 | 1484 | * |
| joseph_adamu | 1:dc648c5624b9 | 1485 | * @return success always |
| joseph_adamu | 1:dc648c5624b9 | 1486 | */ |
| joseph_adamu | 1:dc648c5624b9 | 1487 | static control_t fsfat_fopen_test_dummy() |
| joseph_adamu | 1:dc648c5624b9 | 1488 | { |
| joseph_adamu | 1:dc648c5624b9 | 1489 | printf("Null test\n"); |
| joseph_adamu | 1:dc648c5624b9 | 1490 | return CaseNext; |
| joseph_adamu | 1:dc648c5624b9 | 1491 | } |
| joseph_adamu | 1:dc648c5624b9 | 1492 | |
| joseph_adamu | 1:dc648c5624b9 | 1493 | #endif /* defined(DEVICE_SPI) && defined(MBED_CONF_APP_FSFAT_SDCARD_INSTALLED) */ |
| joseph_adamu | 1:dc648c5624b9 | 1494 | |
| joseph_adamu | 1:dc648c5624b9 | 1495 | |
| joseph_adamu | 1:dc648c5624b9 | 1496 | /// @cond FSFAT_DOXYGEN_DISABLE |
| joseph_adamu | 1:dc648c5624b9 | 1497 | utest::v1::status_t greentea_setup(const size_t number_of_cases) |
| joseph_adamu | 1:dc648c5624b9 | 1498 | { |
| joseph_adamu | 1:dc648c5624b9 | 1499 | GREENTEA_SETUP(FSFAT_FOPEN_GREENTEA_TIMEOUT_S, "default_auto"); |
| joseph_adamu | 1:dc648c5624b9 | 1500 | return greentea_test_setup_handler(number_of_cases); |
| joseph_adamu | 1:dc648c5624b9 | 1501 | } |
| joseph_adamu | 1:dc648c5624b9 | 1502 | |
| joseph_adamu | 1:dc648c5624b9 | 1503 | Case cases[] = { |
| joseph_adamu | 1:dc648c5624b9 | 1504 | /* 1 2 3 4 5 6 7 */ |
| joseph_adamu | 1:dc648c5624b9 | 1505 | /* 1234567890123456789012345678901234567890123456789012345678901234567890 */ |
| joseph_adamu | 1:dc648c5624b9 | 1506 | Case("FSFAT_FOPEN_TEST_01: fopen()/fwrite()/fclose() directories/file in multi-dir filepath.", FSFAT_FOPEN_TEST_01), |
| joseph_adamu | 1:dc648c5624b9 | 1507 | Case("FSFAT_FOPEN_TEST_02: fopen(r) pre-existing file try to write it.", FSFAT_FOPEN_TEST_02), |
| joseph_adamu | 1:dc648c5624b9 | 1508 | Case("FSFAT_FOPEN_TEST_03: fopen(w+) pre-existing file try to write it.", FSFAT_FOPEN_TEST_03), |
| joseph_adamu | 1:dc648c5624b9 | 1509 | Case("FSFAT_FOPEN_TEST_04: fopen() with a filename exceeding the maximum length.", FSFAT_FOPEN_TEST_04), |
| joseph_adamu | 1:dc648c5624b9 | 1510 | #ifdef FOPEN_EXTENDED_TESTING |
| joseph_adamu | 1:dc648c5624b9 | 1511 | Case("FSFAT_FOPEN_TEST_05: fopen() with bad filenames (extended).", FSFAT_FOPEN_TEST_05), |
| joseph_adamu | 1:dc648c5624b9 | 1512 | #endif |
| joseph_adamu | 1:dc648c5624b9 | 1513 | Case("FSFAT_FOPEN_TEST_06: fopen() with bad filenames (minimal).", FSFAT_FOPEN_TEST_06), |
| joseph_adamu | 1:dc648c5624b9 | 1514 | Case("FSFAT_FOPEN_TEST_07: fopen()/errno handling.", FSFAT_FOPEN_TEST_07), |
| joseph_adamu | 1:dc648c5624b9 | 1515 | Case("FSFAT_FOPEN_TEST_08: ferror()/clearerr()/errno handling.", FSFAT_FOPEN_TEST_08), |
| joseph_adamu | 1:dc648c5624b9 | 1516 | Case("FSFAT_FOPEN_TEST_09: ftell() handling.", FSFAT_FOPEN_TEST_09), |
| joseph_adamu | 1:dc648c5624b9 | 1517 | Case("FSFAT_FOPEN_TEST_10: remove() test.", FSFAT_FOPEN_TEST_10), |
| joseph_adamu | 1:dc648c5624b9 | 1518 | Case("FSFAT_FOPEN_TEST_11: rename().", FSFAT_FOPEN_TEST_11), |
| joseph_adamu | 1:dc648c5624b9 | 1519 | Case("FSFAT_FOPEN_TEST_12: opendir(), readdir(), closedir() test.", FSFAT_FOPEN_TEST_12), |
| joseph_adamu | 1:dc648c5624b9 | 1520 | Case("FSFAT_FOPEN_TEST_13: mkdir() test.", FSFAT_FOPEN_TEST_13), |
| joseph_adamu | 1:dc648c5624b9 | 1521 | Case("FSFAT_FOPEN_TEST_14: stat() test.", FSFAT_FOPEN_TEST_14), |
| joseph_adamu | 1:dc648c5624b9 | 1522 | Case("FSFAT_FOPEN_TEST_15: format() test.", FSFAT_FOPEN_TEST_15), |
| joseph_adamu | 1:dc648c5624b9 | 1523 | Case("FSFAT_FOPEN_TEST_16: write/check n x 25kB data files.", FSFAT_FOPEN_TEST_16), |
| joseph_adamu | 1:dc648c5624b9 | 1524 | }; |
| joseph_adamu | 1:dc648c5624b9 | 1525 | |
| joseph_adamu | 1:dc648c5624b9 | 1526 | |
| joseph_adamu | 1:dc648c5624b9 | 1527 | /* Declare your test specification with a custom setup handler */ |
| joseph_adamu | 1:dc648c5624b9 | 1528 | Specification specification(greentea_setup, cases); |
| joseph_adamu | 1:dc648c5624b9 | 1529 | |
| joseph_adamu | 1:dc648c5624b9 | 1530 | int main() |
| joseph_adamu | 1:dc648c5624b9 | 1531 | { |
| joseph_adamu | 1:dc648c5624b9 | 1532 | return !Harness::run(specification); |
| joseph_adamu | 1:dc648c5624b9 | 1533 | } |
| joseph_adamu | 1:dc648c5624b9 | 1534 | /// @endcond |
