Seeed / Mbed OS Wio_3G-example-sd-driver

Fork of Wio_3G-example-sd-driver by Toyomasa Watarai

Committer:
MACRUM
Date:
Thu Aug 09 01:42:53 2018 +0000
Revision:
0:8eedb2495d52
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MACRUM 0:8eedb2495d52 1 #include "mbed.h"
MACRUM 0:8eedb2495d52 2 #include "greentea-client/test_env.h"
MACRUM 0:8eedb2495d52 3 #include "unity.h"
MACRUM 0:8eedb2495d52 4 #include "utest.h"
MACRUM 0:8eedb2495d52 5 #include <stdlib.h>
MACRUM 0:8eedb2495d52 6 #include <errno.h>
MACRUM 0:8eedb2495d52 7
MACRUM 0:8eedb2495d52 8 using namespace utest::v1;
MACRUM 0:8eedb2495d52 9
MACRUM 0:8eedb2495d52 10 // test configuration
MACRUM 0:8eedb2495d52 11 #ifndef MBED_TEST_FILESYSTEM
MACRUM 0:8eedb2495d52 12 #define MBED_TEST_FILESYSTEM FATFileSystem
MACRUM 0:8eedb2495d52 13 #endif
MACRUM 0:8eedb2495d52 14
MACRUM 0:8eedb2495d52 15 #ifndef MBED_TEST_FILESYSTEM_DECL
MACRUM 0:8eedb2495d52 16 #define MBED_TEST_FILESYSTEM_DECL MBED_TEST_FILESYSTEM fs("fs")
MACRUM 0:8eedb2495d52 17 #endif
MACRUM 0:8eedb2495d52 18
MACRUM 0:8eedb2495d52 19 #ifndef MBED_TEST_BLOCKDEVICE
MACRUM 0:8eedb2495d52 20 #define MBED_TEST_BLOCKDEVICE SDBlockDevice
MACRUM 0:8eedb2495d52 21 #define MBED_TEST_BLOCKDEVICE_DECL SDBlockDevice bd(MBED_CONF_SD_SPI_MOSI, MBED_CONF_SD_SPI_MISO, MBED_CONF_SD_SPI_CLK, MBED_CONF_SD_SPI_CS);
MACRUM 0:8eedb2495d52 22 #endif
MACRUM 0:8eedb2495d52 23
MACRUM 0:8eedb2495d52 24 #ifndef MBED_TEST_BLOCKDEVICE_DECL
MACRUM 0:8eedb2495d52 25 #define MBED_TEST_BLOCKDEVICE_DECL MBED_TEST_BLOCKDEVICE bd
MACRUM 0:8eedb2495d52 26 #endif
MACRUM 0:8eedb2495d52 27
MACRUM 0:8eedb2495d52 28 #ifndef MBED_TEST_FILES
MACRUM 0:8eedb2495d52 29 #define MBED_TEST_FILES 4
MACRUM 0:8eedb2495d52 30 #endif
MACRUM 0:8eedb2495d52 31
MACRUM 0:8eedb2495d52 32 #ifndef MBED_TEST_DIRS
MACRUM 0:8eedb2495d52 33 #define MBED_TEST_DIRS 4
MACRUM 0:8eedb2495d52 34 #endif
MACRUM 0:8eedb2495d52 35
MACRUM 0:8eedb2495d52 36 #ifndef MBED_TEST_BUFFER
MACRUM 0:8eedb2495d52 37 #define MBED_TEST_BUFFER 8192
MACRUM 0:8eedb2495d52 38 #endif
MACRUM 0:8eedb2495d52 39
MACRUM 0:8eedb2495d52 40 #ifndef MBED_TEST_TIMEOUT
MACRUM 0:8eedb2495d52 41 #define MBED_TEST_TIMEOUT 120
MACRUM 0:8eedb2495d52 42 #endif
MACRUM 0:8eedb2495d52 43
MACRUM 0:8eedb2495d52 44
MACRUM 0:8eedb2495d52 45 // declarations
MACRUM 0:8eedb2495d52 46 #define STRINGIZE(x) STRINGIZE2(x)
MACRUM 0:8eedb2495d52 47 #define STRINGIZE2(x) #x
MACRUM 0:8eedb2495d52 48 #define INCLUDE(x) STRINGIZE(x.h)
MACRUM 0:8eedb2495d52 49
MACRUM 0:8eedb2495d52 50 #include INCLUDE(MBED_TEST_FILESYSTEM)
MACRUM 0:8eedb2495d52 51 #include INCLUDE(MBED_TEST_BLOCKDEVICE)
MACRUM 0:8eedb2495d52 52
MACRUM 0:8eedb2495d52 53 MBED_TEST_FILESYSTEM_DECL;
MACRUM 0:8eedb2495d52 54 MBED_TEST_BLOCKDEVICE_DECL;
MACRUM 0:8eedb2495d52 55
MACRUM 0:8eedb2495d52 56 Dir dir[MBED_TEST_DIRS];
MACRUM 0:8eedb2495d52 57 File file[MBED_TEST_FILES];
MACRUM 0:8eedb2495d52 58 DIR *dd[MBED_TEST_DIRS];
MACRUM 0:8eedb2495d52 59 FILE *fd[MBED_TEST_FILES];
MACRUM 0:8eedb2495d52 60 struct dirent ent;
MACRUM 0:8eedb2495d52 61 struct dirent *ed;
MACRUM 0:8eedb2495d52 62 size_t size;
MACRUM 0:8eedb2495d52 63 uint8_t buffer[MBED_TEST_BUFFER];
MACRUM 0:8eedb2495d52 64 uint8_t rbuffer[MBED_TEST_BUFFER];
MACRUM 0:8eedb2495d52 65 uint8_t wbuffer[MBED_TEST_BUFFER];
MACRUM 0:8eedb2495d52 66
MACRUM 0:8eedb2495d52 67 static char file_counter = 0;
MACRUM 0:8eedb2495d52 68 const char *filenames[] = {"smallavacado", "mediumavacado", "largeavacado",
MACRUM 0:8eedb2495d52 69 "blockfile", "bigblockfile", "hello", ".", ".."};
MACRUM 0:8eedb2495d52 70
MACRUM 0:8eedb2495d52 71 // tests
MACRUM 0:8eedb2495d52 72
MACRUM 0:8eedb2495d52 73 void test_file_tests() {
MACRUM 0:8eedb2495d52 74 int res = bd.init();
MACRUM 0:8eedb2495d52 75 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 76
MACRUM 0:8eedb2495d52 77 {
MACRUM 0:8eedb2495d52 78 res = MBED_TEST_FILESYSTEM::format(&bd);
MACRUM 0:8eedb2495d52 79 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 80 }
MACRUM 0:8eedb2495d52 81
MACRUM 0:8eedb2495d52 82 res = bd.deinit();
MACRUM 0:8eedb2495d52 83 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 84 }
MACRUM 0:8eedb2495d52 85
MACRUM 0:8eedb2495d52 86 void test_simple_file_test() {
MACRUM 0:8eedb2495d52 87 int res = bd.init();
MACRUM 0:8eedb2495d52 88 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 89
MACRUM 0:8eedb2495d52 90 {
MACRUM 0:8eedb2495d52 91 res = fs.mount(&bd);
MACRUM 0:8eedb2495d52 92 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 93 res = file[0].open(&fs, "hello", O_WRONLY | O_CREAT);
MACRUM 0:8eedb2495d52 94 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 95 size = strlen("Hello World!\n");
MACRUM 0:8eedb2495d52 96 memcpy(wbuffer, "Hello World!\n", size);
MACRUM 0:8eedb2495d52 97 res = file[0].write(wbuffer, size);
MACRUM 0:8eedb2495d52 98 TEST_ASSERT_EQUAL(size, res);
MACRUM 0:8eedb2495d52 99 res = file[0].close();
MACRUM 0:8eedb2495d52 100 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 101 res = file[0].open(&fs, "hello", O_RDONLY);
MACRUM 0:8eedb2495d52 102 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 103 size = strlen("Hello World!\n");
MACRUM 0:8eedb2495d52 104 res = file[0].read(rbuffer, size);
MACRUM 0:8eedb2495d52 105 TEST_ASSERT_EQUAL(size, res);
MACRUM 0:8eedb2495d52 106 res = memcmp(rbuffer, wbuffer, size);
MACRUM 0:8eedb2495d52 107 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 108 res = file[0].close();
MACRUM 0:8eedb2495d52 109 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 110 res = fs.unmount();
MACRUM 0:8eedb2495d52 111 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 112 }
MACRUM 0:8eedb2495d52 113
MACRUM 0:8eedb2495d52 114 res = bd.deinit();
MACRUM 0:8eedb2495d52 115 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 116 }
MACRUM 0:8eedb2495d52 117
MACRUM 0:8eedb2495d52 118 template <int file_size, int write_size, int read_size>
MACRUM 0:8eedb2495d52 119 void test_write_file_test() {
MACRUM 0:8eedb2495d52 120 int res = bd.init();
MACRUM 0:8eedb2495d52 121 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 122
MACRUM 0:8eedb2495d52 123 {
MACRUM 0:8eedb2495d52 124 size_t size = file_size;
MACRUM 0:8eedb2495d52 125 size_t chunk = write_size;
MACRUM 0:8eedb2495d52 126 srand(0);
MACRUM 0:8eedb2495d52 127 res = fs.mount(&bd);
MACRUM 0:8eedb2495d52 128 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 129 res = file[0].open(&fs, filenames[file_counter], O_WRONLY | O_CREAT);
MACRUM 0:8eedb2495d52 130 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 131 for (size_t i = 0; i < size; i += chunk) {
MACRUM 0:8eedb2495d52 132 chunk = (chunk < size - i) ? chunk : size - i;
MACRUM 0:8eedb2495d52 133 for (size_t b = 0; b < chunk; b++) {
MACRUM 0:8eedb2495d52 134 buffer[b] = rand() & 0xff;
MACRUM 0:8eedb2495d52 135 }
MACRUM 0:8eedb2495d52 136 res = file[0].write(buffer, chunk);
MACRUM 0:8eedb2495d52 137 TEST_ASSERT_EQUAL(chunk, res);
MACRUM 0:8eedb2495d52 138 }
MACRUM 0:8eedb2495d52 139 res = file[0].close();
MACRUM 0:8eedb2495d52 140 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 141 res = fs.unmount();
MACRUM 0:8eedb2495d52 142 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 143 }
MACRUM 0:8eedb2495d52 144
MACRUM 0:8eedb2495d52 145 {
MACRUM 0:8eedb2495d52 146 size_t size = file_size;
MACRUM 0:8eedb2495d52 147 size_t chunk = read_size;
MACRUM 0:8eedb2495d52 148 srand(0);
MACRUM 0:8eedb2495d52 149 res = fs.mount(&bd);
MACRUM 0:8eedb2495d52 150 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 151 res = file[0].open(&fs, filenames[file_counter], O_RDONLY);
MACRUM 0:8eedb2495d52 152 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 153 for (size_t i = 0; i < size; i += chunk) {
MACRUM 0:8eedb2495d52 154 chunk = (chunk < size - i) ? chunk : size - i;
MACRUM 0:8eedb2495d52 155 res = file[0].read(buffer, chunk);
MACRUM 0:8eedb2495d52 156 TEST_ASSERT_EQUAL(chunk, res);
MACRUM 0:8eedb2495d52 157 for (size_t b = 0; b < chunk && i+b < size; b++) {
MACRUM 0:8eedb2495d52 158 res = buffer[b];
MACRUM 0:8eedb2495d52 159 TEST_ASSERT_EQUAL(rand() & 0xff, res);
MACRUM 0:8eedb2495d52 160 }
MACRUM 0:8eedb2495d52 161 }
MACRUM 0:8eedb2495d52 162 res = file[0].close();
MACRUM 0:8eedb2495d52 163 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 164 res = fs.unmount();
MACRUM 0:8eedb2495d52 165 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 166 }
MACRUM 0:8eedb2495d52 167
MACRUM 0:8eedb2495d52 168 file_counter++;
MACRUM 0:8eedb2495d52 169 res = bd.deinit();
MACRUM 0:8eedb2495d52 170 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 171 }
MACRUM 0:8eedb2495d52 172
MACRUM 0:8eedb2495d52 173 void test_non_overlap_check() {
MACRUM 0:8eedb2495d52 174 int res = bd.init();
MACRUM 0:8eedb2495d52 175 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 176
MACRUM 0:8eedb2495d52 177 {
MACRUM 0:8eedb2495d52 178 size_t size = 32;
MACRUM 0:8eedb2495d52 179 size_t chunk = 29;
MACRUM 0:8eedb2495d52 180 srand(0);
MACRUM 0:8eedb2495d52 181 res = fs.mount(&bd);
MACRUM 0:8eedb2495d52 182 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 183 res = file[0].open(&fs, "smallavacado", O_RDONLY);
MACRUM 0:8eedb2495d52 184 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 185 for (size_t i = 0; i < size; i += chunk) {
MACRUM 0:8eedb2495d52 186 chunk = (chunk < size - i) ? chunk : size - i;
MACRUM 0:8eedb2495d52 187 res = file[0].read(buffer, chunk);
MACRUM 0:8eedb2495d52 188 TEST_ASSERT_EQUAL(chunk, res);
MACRUM 0:8eedb2495d52 189 for (size_t b = 0; b < chunk && i+b < size; b++) {
MACRUM 0:8eedb2495d52 190 res = buffer[b];
MACRUM 0:8eedb2495d52 191 TEST_ASSERT_EQUAL(rand() & 0xff, res);
MACRUM 0:8eedb2495d52 192 }
MACRUM 0:8eedb2495d52 193 }
MACRUM 0:8eedb2495d52 194 res = file[0].close();
MACRUM 0:8eedb2495d52 195 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 196 res = fs.unmount();
MACRUM 0:8eedb2495d52 197 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 198 }
MACRUM 0:8eedb2495d52 199
MACRUM 0:8eedb2495d52 200 {
MACRUM 0:8eedb2495d52 201 size_t size = 8192;
MACRUM 0:8eedb2495d52 202 size_t chunk = 29;
MACRUM 0:8eedb2495d52 203 srand(0);
MACRUM 0:8eedb2495d52 204 res = fs.mount(&bd);
MACRUM 0:8eedb2495d52 205 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 206 res = file[0].open(&fs, "mediumavacado", O_RDONLY);
MACRUM 0:8eedb2495d52 207 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 208 for (size_t i = 0; i < size; i += chunk) {
MACRUM 0:8eedb2495d52 209 chunk = (chunk < size - i) ? chunk : size - i;
MACRUM 0:8eedb2495d52 210 res = file[0].read(buffer, chunk);
MACRUM 0:8eedb2495d52 211 TEST_ASSERT_EQUAL(chunk, res);
MACRUM 0:8eedb2495d52 212 for (size_t b = 0; b < chunk && i+b < size; b++) {
MACRUM 0:8eedb2495d52 213 res = buffer[b];
MACRUM 0:8eedb2495d52 214 TEST_ASSERT_EQUAL(rand() & 0xff, res);
MACRUM 0:8eedb2495d52 215 }
MACRUM 0:8eedb2495d52 216 }
MACRUM 0:8eedb2495d52 217 res = file[0].close();
MACRUM 0:8eedb2495d52 218 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 219 res = fs.unmount();
MACRUM 0:8eedb2495d52 220 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 221 }
MACRUM 0:8eedb2495d52 222
MACRUM 0:8eedb2495d52 223 {
MACRUM 0:8eedb2495d52 224 size_t size = 262144;
MACRUM 0:8eedb2495d52 225 size_t chunk = 29;
MACRUM 0:8eedb2495d52 226 srand(0);
MACRUM 0:8eedb2495d52 227 res = fs.mount(&bd);
MACRUM 0:8eedb2495d52 228 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 229 res = file[0].open(&fs, "largeavacado", O_RDONLY);
MACRUM 0:8eedb2495d52 230 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 231 for (size_t i = 0; i < size; i += chunk) {
MACRUM 0:8eedb2495d52 232 chunk = (chunk < size - i) ? chunk : size - i;
MACRUM 0:8eedb2495d52 233 res = file[0].read(buffer, chunk);
MACRUM 0:8eedb2495d52 234 TEST_ASSERT_EQUAL(chunk, res);
MACRUM 0:8eedb2495d52 235 for (size_t b = 0; b < chunk && i+b < size; b++) {
MACRUM 0:8eedb2495d52 236 res = buffer[b];
MACRUM 0:8eedb2495d52 237 TEST_ASSERT_EQUAL(rand() & 0xff, res);
MACRUM 0:8eedb2495d52 238 }
MACRUM 0:8eedb2495d52 239 }
MACRUM 0:8eedb2495d52 240 res = file[0].close();
MACRUM 0:8eedb2495d52 241 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 242 res = fs.unmount();
MACRUM 0:8eedb2495d52 243 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 244 }
MACRUM 0:8eedb2495d52 245
MACRUM 0:8eedb2495d52 246 res = bd.deinit();
MACRUM 0:8eedb2495d52 247 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 248 }
MACRUM 0:8eedb2495d52 249
MACRUM 0:8eedb2495d52 250 void test_dir_check() {
MACRUM 0:8eedb2495d52 251
MACRUM 0:8eedb2495d52 252 int res = bd.init();
MACRUM 0:8eedb2495d52 253 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 254
MACRUM 0:8eedb2495d52 255 {
MACRUM 0:8eedb2495d52 256 res = fs.mount(&bd);
MACRUM 0:8eedb2495d52 257 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 258 res = dir[0].open(&fs, "/");
MACRUM 0:8eedb2495d52 259 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 260 int numFiles = sizeof(filenames)/sizeof(filenames[0]);
MACRUM 0:8eedb2495d52 261 // Check the filenames in directory
MACRUM 0:8eedb2495d52 262 while(1) {
MACRUM 0:8eedb2495d52 263 res = dir[0].read(&ent);
MACRUM 0:8eedb2495d52 264 if (0 == res) {
MACRUM 0:8eedb2495d52 265 break;
MACRUM 0:8eedb2495d52 266 }
MACRUM 0:8eedb2495d52 267 for (int i=0; i < numFiles ; i++) {
MACRUM 0:8eedb2495d52 268 res = strcmp(ent.d_name, filenames[i]);
MACRUM 0:8eedb2495d52 269 if (0 == res) {
MACRUM 0:8eedb2495d52 270 res = ent.d_type;
MACRUM 0:8eedb2495d52 271 if ((DT_REG != res) && (DT_DIR != res)) {
MACRUM 0:8eedb2495d52 272 TEST_ASSERT(1);
MACRUM 0:8eedb2495d52 273 }
MACRUM 0:8eedb2495d52 274 break;
MACRUM 0:8eedb2495d52 275 }
MACRUM 0:8eedb2495d52 276 else if( i == numFiles) {
MACRUM 0:8eedb2495d52 277 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 278 }
MACRUM 0:8eedb2495d52 279 }
MACRUM 0:8eedb2495d52 280 }
MACRUM 0:8eedb2495d52 281 res = dir[0].close();
MACRUM 0:8eedb2495d52 282 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 283 res = fs.unmount();
MACRUM 0:8eedb2495d52 284 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 285 }
MACRUM 0:8eedb2495d52 286
MACRUM 0:8eedb2495d52 287 res = bd.deinit();
MACRUM 0:8eedb2495d52 288 TEST_ASSERT_EQUAL(0, res);
MACRUM 0:8eedb2495d52 289 }
MACRUM 0:8eedb2495d52 290
MACRUM 0:8eedb2495d52 291
MACRUM 0:8eedb2495d52 292 // test setup
MACRUM 0:8eedb2495d52 293 utest::v1::status_t test_setup(const size_t number_of_cases) {
MACRUM 0:8eedb2495d52 294 GREENTEA_SETUP(MBED_TEST_TIMEOUT, "default_auto");
MACRUM 0:8eedb2495d52 295 return verbose_test_setup_handler(number_of_cases);
MACRUM 0:8eedb2495d52 296 }
MACRUM 0:8eedb2495d52 297
MACRUM 0:8eedb2495d52 298 Case cases[] = {
MACRUM 0:8eedb2495d52 299 Case("File tests", test_file_tests),
MACRUM 0:8eedb2495d52 300 Case("Simple file test", test_simple_file_test),
MACRUM 0:8eedb2495d52 301 Case("Small file test", test_write_file_test<32, 31, 29>),
MACRUM 0:8eedb2495d52 302 Case("Medium file test", test_write_file_test<8192, 31, 29>),
MACRUM 0:8eedb2495d52 303 Case("Large file test", test_write_file_test<262144, 31, 29>),
MACRUM 0:8eedb2495d52 304 Case("Block Size file test", test_write_file_test<9000, 512, 512>),
MACRUM 0:8eedb2495d52 305 Case("Multiple block size file test", test_write_file_test<26215, MBED_TEST_BUFFER, MBED_TEST_BUFFER>),
MACRUM 0:8eedb2495d52 306 Case("Non-overlap check", test_non_overlap_check),
MACRUM 0:8eedb2495d52 307 Case("Dir check", test_dir_check),
MACRUM 0:8eedb2495d52 308 };
MACRUM 0:8eedb2495d52 309
MACRUM 0:8eedb2495d52 310 Specification specification(test_setup, cases);
MACRUM 0:8eedb2495d52 311
MACRUM 0:8eedb2495d52 312 int main() {
MACRUM 0:8eedb2495d52 313 return !Harness::run(specification);
MACRUM 0:8eedb2495d52 314 }