RTC auf true

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kevman 2:7aab896b1a3b 1 /* mbed Microcontroller Library
kevman 2:7aab896b1a3b 2 * Copyright (c) 2016 ARM Limited
kevman 2:7aab896b1a3b 3 *
kevman 2:7aab896b1a3b 4 * Licensed under the Apache License, Version 2.0 (the "License");
kevman 2:7aab896b1a3b 5 * you may not use this file except in compliance with the License.
kevman 2:7aab896b1a3b 6 * You may obtain a copy of the License at
kevman 2:7aab896b1a3b 7 *
kevman 2:7aab896b1a3b 8 * http://www.apache.org/licenses/LICENSE-2.0
kevman 2:7aab896b1a3b 9 *
kevman 2:7aab896b1a3b 10 * Unless required by applicable law or agreed to in writing, software
kevman 2:7aab896b1a3b 11 * distributed under the License is distributed on an "AS IS" BASIS,
kevman 2:7aab896b1a3b 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kevman 2:7aab896b1a3b 13 * See the License for the specific language governing permissions and
kevman 2:7aab896b1a3b 14 * limitations under the License.
kevman 2:7aab896b1a3b 15 */
kevman 2:7aab896b1a3b 16
kevman 2:7aab896b1a3b 17 #include "mbed.h"
kevman 2:7aab896b1a3b 18 #include "greentea-client/test_env.h"
kevman 2:7aab896b1a3b 19 #include "unity.h"
kevman 2:7aab896b1a3b 20 #include "utest.h"
kevman 2:7aab896b1a3b 21 #include <stdlib.h>
kevman 2:7aab896b1a3b 22 #include <errno.h>
kevman 2:7aab896b1a3b 23
kevman 2:7aab896b1a3b 24 using namespace utest::v1;
kevman 2:7aab896b1a3b 25
kevman 2:7aab896b1a3b 26 // test configuration
kevman 2:7aab896b1a3b 27 #ifndef MBED_TEST_FILESYSTEM
kevman 2:7aab896b1a3b 28 #define MBED_TEST_FILESYSTEM FATFileSystem
kevman 2:7aab896b1a3b 29 #endif
kevman 2:7aab896b1a3b 30
kevman 2:7aab896b1a3b 31 #ifndef MBED_TEST_FILESYSTEM_DECL
kevman 2:7aab896b1a3b 32 #define MBED_TEST_FILESYSTEM_DECL MBED_TEST_FILESYSTEM fs("fs")
kevman 2:7aab896b1a3b 33 #endif
kevman 2:7aab896b1a3b 34
kevman 2:7aab896b1a3b 35 #ifndef MBED_TEST_BLOCKDEVICE
kevman 2:7aab896b1a3b 36 #define MBED_TEST_BLOCKDEVICE SDBlockDevice
kevman 2:7aab896b1a3b 37 #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);
kevman 2:7aab896b1a3b 38 #endif
kevman 2:7aab896b1a3b 39
kevman 2:7aab896b1a3b 40 #ifndef MBED_TEST_BLOCKDEVICE_DECL
kevman 2:7aab896b1a3b 41 #define MBED_TEST_BLOCKDEVICE_DECL MBED_TEST_BLOCKDEVICE bd
kevman 2:7aab896b1a3b 42 #endif
kevman 2:7aab896b1a3b 43
kevman 2:7aab896b1a3b 44 #ifndef MBED_TEST_FILES
kevman 2:7aab896b1a3b 45 #define MBED_TEST_FILES 4
kevman 2:7aab896b1a3b 46 #endif
kevman 2:7aab896b1a3b 47
kevman 2:7aab896b1a3b 48 #ifndef MBED_TEST_DIRS
kevman 2:7aab896b1a3b 49 #define MBED_TEST_DIRS 4
kevman 2:7aab896b1a3b 50 #endif
kevman 2:7aab896b1a3b 51
kevman 2:7aab896b1a3b 52 #ifndef MBED_TEST_BUFFER
kevman 2:7aab896b1a3b 53 #define MBED_TEST_BUFFER 512
kevman 2:7aab896b1a3b 54 #endif
kevman 2:7aab896b1a3b 55
kevman 2:7aab896b1a3b 56 #ifndef MBED_TEST_TIMEOUT
kevman 2:7aab896b1a3b 57 #define MBED_TEST_TIMEOUT 120
kevman 2:7aab896b1a3b 58 #endif
kevman 2:7aab896b1a3b 59
kevman 2:7aab896b1a3b 60 #ifndef MBED_THREAD_COUNT
kevman 2:7aab896b1a3b 61 #define MBED_THREAD_COUNT MBED_TEST_FILES
kevman 2:7aab896b1a3b 62 #endif
kevman 2:7aab896b1a3b 63
kevman 2:7aab896b1a3b 64 // declarations
kevman 2:7aab896b1a3b 65 #define STRINGIZE(x) STRINGIZE2(x)
kevman 2:7aab896b1a3b 66 #define STRINGIZE2(x) #x
kevman 2:7aab896b1a3b 67 #define INCLUDE(x) STRINGIZE(x.h)
kevman 2:7aab896b1a3b 68
kevman 2:7aab896b1a3b 69 #include INCLUDE(MBED_TEST_FILESYSTEM)
kevman 2:7aab896b1a3b 70 #include INCLUDE(MBED_TEST_BLOCKDEVICE)
kevman 2:7aab896b1a3b 71
kevman 2:7aab896b1a3b 72 MBED_TEST_FILESYSTEM_DECL;
kevman 2:7aab896b1a3b 73 MBED_TEST_BLOCKDEVICE_DECL;
kevman 2:7aab896b1a3b 74
kevman 2:7aab896b1a3b 75 Dir dir[MBED_TEST_DIRS];
kevman 2:7aab896b1a3b 76 File file[MBED_TEST_FILES];
kevman 2:7aab896b1a3b 77 DIR *dd[MBED_TEST_DIRS];
kevman 2:7aab896b1a3b 78 FILE *fd[MBED_TEST_FILES];
kevman 2:7aab896b1a3b 79 struct dirent ent;
kevman 2:7aab896b1a3b 80 struct dirent *ed;
kevman 2:7aab896b1a3b 81
kevman 2:7aab896b1a3b 82 volatile bool count_done = 0;
kevman 2:7aab896b1a3b 83
kevman 2:7aab896b1a3b 84 // tests
kevman 2:7aab896b1a3b 85
kevman 2:7aab896b1a3b 86 void test_file_tests()
kevman 2:7aab896b1a3b 87 {
kevman 2:7aab896b1a3b 88 int res = bd.init();
kevman 2:7aab896b1a3b 89 TEST_ASSERT_EQUAL(0, res);
kevman 2:7aab896b1a3b 90
kevman 2:7aab896b1a3b 91 {
kevman 2:7aab896b1a3b 92 res = MBED_TEST_FILESYSTEM::format(&bd);
kevman 2:7aab896b1a3b 93 TEST_ASSERT_EQUAL(0, res);
kevman 2:7aab896b1a3b 94 }
kevman 2:7aab896b1a3b 95
kevman 2:7aab896b1a3b 96 res = bd.deinit();
kevman 2:7aab896b1a3b 97 TEST_ASSERT_EQUAL(0, res);
kevman 2:7aab896b1a3b 98 }
kevman 2:7aab896b1a3b 99
kevman 2:7aab896b1a3b 100 void write_file_data(char count)
kevman 2:7aab896b1a3b 101 {
kevman 2:7aab896b1a3b 102
kevman 2:7aab896b1a3b 103 char filename[10];
kevman 2:7aab896b1a3b 104 uint8_t wbuffer[MBED_TEST_BUFFER];
kevman 2:7aab896b1a3b 105 int res;
kevman 2:7aab896b1a3b 106
kevman 2:7aab896b1a3b 107 sprintf(filename, "%s%d", "data", count);
kevman 2:7aab896b1a3b 108 res = file[count].open(&fs, filename, O_WRONLY | O_CREAT);
kevman 2:7aab896b1a3b 109 TEST_ASSERT_EQUAL(0, res);
kevman 2:7aab896b1a3b 110
kevman 2:7aab896b1a3b 111 char letter = 'A' + count;
kevman 2:7aab896b1a3b 112 for (uint32_t i = 0; i < MBED_TEST_BUFFER; i++) {
kevman 2:7aab896b1a3b 113 wbuffer[i] = letter++;
kevman 2:7aab896b1a3b 114 if ('z' == letter) {
kevman 2:7aab896b1a3b 115 letter = 'A' + count;
kevman 2:7aab896b1a3b 116 }
kevman 2:7aab896b1a3b 117 }
kevman 2:7aab896b1a3b 118
kevman 2:7aab896b1a3b 119 for (uint32_t i = 0; i < 5; i++) {
kevman 2:7aab896b1a3b 120 res = file[count].write(wbuffer, MBED_TEST_BUFFER);
kevman 2:7aab896b1a3b 121 TEST_ASSERT_EQUAL(MBED_TEST_BUFFER, res);
kevman 2:7aab896b1a3b 122 }
kevman 2:7aab896b1a3b 123
kevman 2:7aab896b1a3b 124 res = file[count].close();
kevman 2:7aab896b1a3b 125 TEST_ASSERT_EQUAL(0, res);
kevman 2:7aab896b1a3b 126 }
kevman 2:7aab896b1a3b 127
kevman 2:7aab896b1a3b 128 void read_file_data(char count)
kevman 2:7aab896b1a3b 129 {
kevman 2:7aab896b1a3b 130 char filename[10];
kevman 2:7aab896b1a3b 131 uint8_t rbuffer[MBED_TEST_BUFFER];
kevman 2:7aab896b1a3b 132 int res;
kevman 2:7aab896b1a3b 133
kevman 2:7aab896b1a3b 134 sprintf(filename, "%s%d", "data", count);
kevman 2:7aab896b1a3b 135 res = file[count].open(&fs, filename, O_RDONLY);
kevman 2:7aab896b1a3b 136 TEST_ASSERT_EQUAL(0, res);
kevman 2:7aab896b1a3b 137
kevman 2:7aab896b1a3b 138 for (uint32_t i = 0; i < 5; i++) {
kevman 2:7aab896b1a3b 139 res = file[count].read(rbuffer, MBED_TEST_BUFFER);
kevman 2:7aab896b1a3b 140 TEST_ASSERT_EQUAL(MBED_TEST_BUFFER, res);
kevman 2:7aab896b1a3b 141 char letter = 'A' + count;
kevman 2:7aab896b1a3b 142 for (uint32_t i = 0; i < MBED_TEST_BUFFER; i++) {
kevman 2:7aab896b1a3b 143 res = rbuffer[i];
kevman 2:7aab896b1a3b 144 TEST_ASSERT_EQUAL(letter++, res);
kevman 2:7aab896b1a3b 145 if ('z' == letter) {
kevman 2:7aab896b1a3b 146 letter = 'A' + count;
kevman 2:7aab896b1a3b 147 }
kevman 2:7aab896b1a3b 148 }
kevman 2:7aab896b1a3b 149 }
kevman 2:7aab896b1a3b 150
kevman 2:7aab896b1a3b 151 res = file[count].close();
kevman 2:7aab896b1a3b 152 TEST_ASSERT_EQUAL(0, res);
kevman 2:7aab896b1a3b 153 }
kevman 2:7aab896b1a3b 154
kevman 2:7aab896b1a3b 155 void test_thread_access_test()
kevman 2:7aab896b1a3b 156 {
kevman 2:7aab896b1a3b 157 char *dummy = new (std::nothrow) char[OS_STACK_SIZE * MBED_THREAD_COUNT];
kevman 2:7aab896b1a3b 158 delete[] dummy;
kevman 2:7aab896b1a3b 159 TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory to run test");
kevman 2:7aab896b1a3b 160
kevman 2:7aab896b1a3b 161 Thread *data[MBED_THREAD_COUNT];
kevman 2:7aab896b1a3b 162 int res = bd.init();
kevman 2:7aab896b1a3b 163 TEST_ASSERT_EQUAL(0, res);
kevman 2:7aab896b1a3b 164 res = fs.mount(&bd);
kevman 2:7aab896b1a3b 165 TEST_ASSERT_EQUAL(0, res);
kevman 2:7aab896b1a3b 166
kevman 2:7aab896b1a3b 167 // Write threads in parallel
kevman 2:7aab896b1a3b 168 for (char thread_count = 0; thread_count < MBED_THREAD_COUNT; thread_count++) {
kevman 2:7aab896b1a3b 169 data[thread_count] = new Thread(osPriorityNormal);
kevman 2:7aab896b1a3b 170 data[thread_count]->start(callback((void(*)(void *))write_file_data, (void *)thread_count));
kevman 2:7aab896b1a3b 171 }
kevman 2:7aab896b1a3b 172
kevman 2:7aab896b1a3b 173 // Wait for write thread to join before creating read thread
kevman 2:7aab896b1a3b 174 for (char thread_count = 0; thread_count < MBED_THREAD_COUNT; thread_count++) {
kevman 2:7aab896b1a3b 175 data[thread_count]->join();
kevman 2:7aab896b1a3b 176 delete data[thread_count];
kevman 2:7aab896b1a3b 177 data[thread_count] = new Thread(osPriorityNormal);
kevman 2:7aab896b1a3b 178 data[thread_count]->start(callback((void(*)(void *))read_file_data, (void *)thread_count));
kevman 2:7aab896b1a3b 179 }
kevman 2:7aab896b1a3b 180
kevman 2:7aab896b1a3b 181 // Wait for read threads to join
kevman 2:7aab896b1a3b 182 for (char thread_count = 0; thread_count < MBED_THREAD_COUNT; thread_count++) {
kevman 2:7aab896b1a3b 183 data[thread_count]->join();
kevman 2:7aab896b1a3b 184 delete data[thread_count];
kevman 2:7aab896b1a3b 185 }
kevman 2:7aab896b1a3b 186 res = fs.unmount();
kevman 2:7aab896b1a3b 187 TEST_ASSERT_EQUAL(0, res);
kevman 2:7aab896b1a3b 188 res = bd.deinit();
kevman 2:7aab896b1a3b 189 TEST_ASSERT_EQUAL(0, res);
kevman 2:7aab896b1a3b 190 }
kevman 2:7aab896b1a3b 191
kevman 2:7aab896b1a3b 192 // test setup
kevman 2:7aab896b1a3b 193 utest::v1::status_t test_setup(const size_t number_of_cases)
kevman 2:7aab896b1a3b 194 {
kevman 2:7aab896b1a3b 195 GREENTEA_SETUP(MBED_TEST_TIMEOUT, "default_auto");
kevman 2:7aab896b1a3b 196 return verbose_test_setup_handler(number_of_cases);
kevman 2:7aab896b1a3b 197 }
kevman 2:7aab896b1a3b 198
kevman 2:7aab896b1a3b 199 Case cases[] = {
kevman 2:7aab896b1a3b 200 Case("File tests", test_file_tests),
kevman 2:7aab896b1a3b 201 Case("Filesystem access from multiple threads", test_thread_access_test),
kevman 2:7aab896b1a3b 202 };
kevman 2:7aab896b1a3b 203
kevman 2:7aab896b1a3b 204 Specification specification(test_setup, cases);
kevman 2:7aab896b1a3b 205
kevman 2:7aab896b1a3b 206 int main()
kevman 2:7aab896b1a3b 207 {
kevman 2:7aab896b1a3b 208 return !Harness::run(specification);
kevman 2:7aab896b1a3b 209 }