Fork of Final351CW_FINAL by Liam Grazier

Committer:
liam_grazier
Date:
Tue Jan 09 11:59:10 2018 +0000
Revision:
11:ce2a977dcab0
NEW NON LIB;

Who changed what in which revision?

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