RTC auf true

Committer:
kevman
Date:
Wed Mar 13 11:03:24 2019 +0000
Revision:
2:7aab896b1a3b
2019-03-13

Who changed what in which revision?

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