Denislam Valeev / Mbed OS Nucleo_rtos_basic
Committer:
valeyev
Date:
Tue Mar 13 07:17:50 2018 +0000
Revision:
0:e056ac8fecf8
looking for...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
valeyev 0:e056ac8fecf8 1 /* mbed Microcontroller Library
valeyev 0:e056ac8fecf8 2 * Copyright (c) 2017 ARM Limited
valeyev 0:e056ac8fecf8 3 *
valeyev 0:e056ac8fecf8 4 * Licensed under the Apache License, Version 2.0 (the "License");
valeyev 0:e056ac8fecf8 5 * you may not use this file except in compliance with the License.
valeyev 0:e056ac8fecf8 6 * You may obtain a copy of the License at
valeyev 0:e056ac8fecf8 7 *
valeyev 0:e056ac8fecf8 8 * http://www.apache.org/licenses/LICENSE-2.0
valeyev 0:e056ac8fecf8 9 *
valeyev 0:e056ac8fecf8 10 * Unless required by applicable law or agreed to in writing, software
valeyev 0:e056ac8fecf8 11 * distributed under the License is distributed on an "AS IS" BASIS,
valeyev 0:e056ac8fecf8 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
valeyev 0:e056ac8fecf8 13 * See the License for the specific language governing permissions and
valeyev 0:e056ac8fecf8 14 * limitations under the License.
valeyev 0:e056ac8fecf8 15 */
valeyev 0:e056ac8fecf8 16 #include "mbed_events.h"
valeyev 0:e056ac8fecf8 17 #include "mbed.h"
valeyev 0:e056ac8fecf8 18 #include "rtos.h"
valeyev 0:e056ac8fecf8 19 #include "greentea-client/test_env.h"
valeyev 0:e056ac8fecf8 20 #include "unity.h"
valeyev 0:e056ac8fecf8 21 #include "utest.h"
valeyev 0:e056ac8fecf8 22
valeyev 0:e056ac8fecf8 23 using namespace utest::v1;
valeyev 0:e056ac8fecf8 24
valeyev 0:e056ac8fecf8 25 // TEST_EQUEUE_SIZE was reduced below 1024B to fit this test to devices with small RAM (RAM <= 16kB)
valeyev 0:e056ac8fecf8 26 // additionally TEST_EQUEUE_SIZE was expressed in EVENTS_EVENT_SIZE to increase readability
valeyev 0:e056ac8fecf8 27 // (for more details about EVENTS_EVENT_SIZE see EventQueue constructor)
valeyev 0:e056ac8fecf8 28 #define TEST_EQUEUE_SIZE (18*EVENTS_EVENT_SIZE)
valeyev 0:e056ac8fecf8 29
valeyev 0:e056ac8fecf8 30 // flag for called
valeyev 0:e056ac8fecf8 31 volatile bool touched = false;
valeyev 0:e056ac8fecf8 32
valeyev 0:e056ac8fecf8 33 // static functions
valeyev 0:e056ac8fecf8 34 void func5(int a0, int a1, int a2, int a3, int a4) {
valeyev 0:e056ac8fecf8 35 touched = true;
valeyev 0:e056ac8fecf8 36 TEST_ASSERT_EQUAL(a0 | a1 | a2 | a3 | a4, 0x1f);
valeyev 0:e056ac8fecf8 37 }
valeyev 0:e056ac8fecf8 38
valeyev 0:e056ac8fecf8 39 void func4(int a0, int a1, int a2, int a3) {
valeyev 0:e056ac8fecf8 40 touched = true;
valeyev 0:e056ac8fecf8 41 TEST_ASSERT_EQUAL(a0 | a1 | a2 | a3, 0xf);
valeyev 0:e056ac8fecf8 42 }
valeyev 0:e056ac8fecf8 43
valeyev 0:e056ac8fecf8 44 void func3(int a0, int a1, int a2) {
valeyev 0:e056ac8fecf8 45 touched = true;
valeyev 0:e056ac8fecf8 46 TEST_ASSERT_EQUAL(a0 | a1 | a2, 0x7);
valeyev 0:e056ac8fecf8 47 }
valeyev 0:e056ac8fecf8 48
valeyev 0:e056ac8fecf8 49 void func2(int a0, int a1) {
valeyev 0:e056ac8fecf8 50 touched = true;
valeyev 0:e056ac8fecf8 51 TEST_ASSERT_EQUAL(a0 | a1, 0x3);
valeyev 0:e056ac8fecf8 52 }
valeyev 0:e056ac8fecf8 53
valeyev 0:e056ac8fecf8 54 void func1(int a0) {
valeyev 0:e056ac8fecf8 55 touched = true;
valeyev 0:e056ac8fecf8 56 TEST_ASSERT_EQUAL(a0, 0x1);
valeyev 0:e056ac8fecf8 57 }
valeyev 0:e056ac8fecf8 58
valeyev 0:e056ac8fecf8 59 void func0() {
valeyev 0:e056ac8fecf8 60 touched = true;
valeyev 0:e056ac8fecf8 61 }
valeyev 0:e056ac8fecf8 62
valeyev 0:e056ac8fecf8 63 #define SIMPLE_POSTS_TEST(i, ...) \
valeyev 0:e056ac8fecf8 64 void simple_posts_test##i() { \
valeyev 0:e056ac8fecf8 65 EventQueue queue(TEST_EQUEUE_SIZE); \
valeyev 0:e056ac8fecf8 66 \
valeyev 0:e056ac8fecf8 67 touched = false; \
valeyev 0:e056ac8fecf8 68 queue.call(func##i,##__VA_ARGS__); \
valeyev 0:e056ac8fecf8 69 queue.dispatch(0); \
valeyev 0:e056ac8fecf8 70 TEST_ASSERT(touched); \
valeyev 0:e056ac8fecf8 71 \
valeyev 0:e056ac8fecf8 72 touched = false; \
valeyev 0:e056ac8fecf8 73 queue.call_in(1, func##i,##__VA_ARGS__); \
valeyev 0:e056ac8fecf8 74 queue.dispatch(2); \
valeyev 0:e056ac8fecf8 75 TEST_ASSERT(touched); \
valeyev 0:e056ac8fecf8 76 \
valeyev 0:e056ac8fecf8 77 touched = false; \
valeyev 0:e056ac8fecf8 78 queue.call_every(1, func##i,##__VA_ARGS__); \
valeyev 0:e056ac8fecf8 79 queue.dispatch(2); \
valeyev 0:e056ac8fecf8 80 TEST_ASSERT(touched); \
valeyev 0:e056ac8fecf8 81 }
valeyev 0:e056ac8fecf8 82
valeyev 0:e056ac8fecf8 83 SIMPLE_POSTS_TEST(5, 0x01, 0x02, 0x04, 0x08, 0x010)
valeyev 0:e056ac8fecf8 84 SIMPLE_POSTS_TEST(4, 0x01, 0x02, 0x04, 0x08)
valeyev 0:e056ac8fecf8 85 SIMPLE_POSTS_TEST(3, 0x01, 0x02, 0x04)
valeyev 0:e056ac8fecf8 86 SIMPLE_POSTS_TEST(2, 0x01, 0x02)
valeyev 0:e056ac8fecf8 87 SIMPLE_POSTS_TEST(1, 0x01)
valeyev 0:e056ac8fecf8 88 SIMPLE_POSTS_TEST(0)
valeyev 0:e056ac8fecf8 89
valeyev 0:e056ac8fecf8 90
valeyev 0:e056ac8fecf8 91 void time_func(Timer *t, int ms) {
valeyev 0:e056ac8fecf8 92 TEST_ASSERT_INT_WITHIN(5, ms, t->read_ms());
valeyev 0:e056ac8fecf8 93 t->reset();
valeyev 0:e056ac8fecf8 94 }
valeyev 0:e056ac8fecf8 95
valeyev 0:e056ac8fecf8 96 template <int N>
valeyev 0:e056ac8fecf8 97 void call_in_test() {
valeyev 0:e056ac8fecf8 98 Timer tickers[N];
valeyev 0:e056ac8fecf8 99
valeyev 0:e056ac8fecf8 100 EventQueue queue(TEST_EQUEUE_SIZE);
valeyev 0:e056ac8fecf8 101
valeyev 0:e056ac8fecf8 102 for (int i = 0; i < N; i++) {
valeyev 0:e056ac8fecf8 103 tickers[i].start();
valeyev 0:e056ac8fecf8 104 queue.call_in((i+1)*100, time_func, &tickers[i], (i+1)*100);
valeyev 0:e056ac8fecf8 105 }
valeyev 0:e056ac8fecf8 106
valeyev 0:e056ac8fecf8 107 queue.dispatch(N*100);
valeyev 0:e056ac8fecf8 108 }
valeyev 0:e056ac8fecf8 109
valeyev 0:e056ac8fecf8 110 template <int N>
valeyev 0:e056ac8fecf8 111 void call_every_test() {
valeyev 0:e056ac8fecf8 112 Timer tickers[N];
valeyev 0:e056ac8fecf8 113
valeyev 0:e056ac8fecf8 114 EventQueue queue(TEST_EQUEUE_SIZE);
valeyev 0:e056ac8fecf8 115
valeyev 0:e056ac8fecf8 116 for (int i = 0; i < N; i++) {
valeyev 0:e056ac8fecf8 117 tickers[i].start();
valeyev 0:e056ac8fecf8 118 queue.call_every((i+1)*100, time_func, &tickers[i], (i+1)*100);
valeyev 0:e056ac8fecf8 119 }
valeyev 0:e056ac8fecf8 120
valeyev 0:e056ac8fecf8 121 queue.dispatch(N*100);
valeyev 0:e056ac8fecf8 122 }
valeyev 0:e056ac8fecf8 123
valeyev 0:e056ac8fecf8 124 void allocate_failure_test() {
valeyev 0:e056ac8fecf8 125 EventQueue queue(TEST_EQUEUE_SIZE);
valeyev 0:e056ac8fecf8 126 int id;
valeyev 0:e056ac8fecf8 127
valeyev 0:e056ac8fecf8 128 for (int i = 0; i < 100; i++) {
valeyev 0:e056ac8fecf8 129 id = queue.call((void (*)())0);
valeyev 0:e056ac8fecf8 130 }
valeyev 0:e056ac8fecf8 131
valeyev 0:e056ac8fecf8 132 TEST_ASSERT(!id);
valeyev 0:e056ac8fecf8 133 }
valeyev 0:e056ac8fecf8 134
valeyev 0:e056ac8fecf8 135 void no() {
valeyev 0:e056ac8fecf8 136 TEST_ASSERT(false);
valeyev 0:e056ac8fecf8 137 }
valeyev 0:e056ac8fecf8 138
valeyev 0:e056ac8fecf8 139 template <int N>
valeyev 0:e056ac8fecf8 140 void cancel_test1() {
valeyev 0:e056ac8fecf8 141 EventQueue queue(TEST_EQUEUE_SIZE);
valeyev 0:e056ac8fecf8 142
valeyev 0:e056ac8fecf8 143 int ids[N];
valeyev 0:e056ac8fecf8 144
valeyev 0:e056ac8fecf8 145 for (int i = 0; i < N; i++) {
valeyev 0:e056ac8fecf8 146 ids[i] = queue.call_in(1000, no);
valeyev 0:e056ac8fecf8 147 }
valeyev 0:e056ac8fecf8 148
valeyev 0:e056ac8fecf8 149 for (int i = N-1; i >= 0; i--) {
valeyev 0:e056ac8fecf8 150 queue.cancel(ids[i]);
valeyev 0:e056ac8fecf8 151 }
valeyev 0:e056ac8fecf8 152
valeyev 0:e056ac8fecf8 153 queue.dispatch(0);
valeyev 0:e056ac8fecf8 154 }
valeyev 0:e056ac8fecf8 155
valeyev 0:e056ac8fecf8 156
valeyev 0:e056ac8fecf8 157 // Testing the dynamic arguments to the event class
valeyev 0:e056ac8fecf8 158 unsigned counter = 0;
valeyev 0:e056ac8fecf8 159
valeyev 0:e056ac8fecf8 160 void count5(unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a5) {
valeyev 0:e056ac8fecf8 161 counter += a0 + a1 + a2 + a3 + a5;
valeyev 0:e056ac8fecf8 162 }
valeyev 0:e056ac8fecf8 163
valeyev 0:e056ac8fecf8 164 void count4(unsigned a0, unsigned a1, unsigned a2, unsigned a3) {
valeyev 0:e056ac8fecf8 165 counter += a0 + a1 + a2 + a3;
valeyev 0:e056ac8fecf8 166 }
valeyev 0:e056ac8fecf8 167
valeyev 0:e056ac8fecf8 168 void count3(unsigned a0, unsigned a1, unsigned a2) {
valeyev 0:e056ac8fecf8 169 counter += a0 + a1 + a2;
valeyev 0:e056ac8fecf8 170 }
valeyev 0:e056ac8fecf8 171
valeyev 0:e056ac8fecf8 172 void count2(unsigned a0, unsigned a1) {
valeyev 0:e056ac8fecf8 173 counter += a0 + a1;
valeyev 0:e056ac8fecf8 174 }
valeyev 0:e056ac8fecf8 175
valeyev 0:e056ac8fecf8 176 void count1(unsigned a0) {
valeyev 0:e056ac8fecf8 177 counter += a0;
valeyev 0:e056ac8fecf8 178 }
valeyev 0:e056ac8fecf8 179
valeyev 0:e056ac8fecf8 180 void count0() {
valeyev 0:e056ac8fecf8 181 counter += 0;
valeyev 0:e056ac8fecf8 182 }
valeyev 0:e056ac8fecf8 183
valeyev 0:e056ac8fecf8 184 void event_class_test() {
valeyev 0:e056ac8fecf8 185 counter = 0;
valeyev 0:e056ac8fecf8 186 EventQueue queue(TEST_EQUEUE_SIZE);
valeyev 0:e056ac8fecf8 187
valeyev 0:e056ac8fecf8 188 Event<void(int, int, int, int, int)> e5(&queue, count5);
valeyev 0:e056ac8fecf8 189 Event<void(int, int, int, int)> e4(&queue, count5, 1);
valeyev 0:e056ac8fecf8 190 Event<void(int, int, int)> e3(&queue, count5, 1, 1);
valeyev 0:e056ac8fecf8 191 Event<void(int, int)> e2(&queue, count5, 1, 1, 1);
valeyev 0:e056ac8fecf8 192 Event<void(int)> e1(&queue, count5, 1, 1, 1, 1);
valeyev 0:e056ac8fecf8 193 Event<void()> e0(&queue, count5, 1, 1, 1, 1, 1);
valeyev 0:e056ac8fecf8 194
valeyev 0:e056ac8fecf8 195 e5.post(1, 1, 1, 1, 1);
valeyev 0:e056ac8fecf8 196 e4.post(1, 1, 1, 1);
valeyev 0:e056ac8fecf8 197 e3.post(1, 1, 1);
valeyev 0:e056ac8fecf8 198 e2.post(1, 1);
valeyev 0:e056ac8fecf8 199 e1.post(1);
valeyev 0:e056ac8fecf8 200 e0.post();
valeyev 0:e056ac8fecf8 201
valeyev 0:e056ac8fecf8 202 queue.dispatch(0);
valeyev 0:e056ac8fecf8 203
valeyev 0:e056ac8fecf8 204 TEST_ASSERT_EQUAL(counter, 30);
valeyev 0:e056ac8fecf8 205 }
valeyev 0:e056ac8fecf8 206
valeyev 0:e056ac8fecf8 207 void event_class_helper_test() {
valeyev 0:e056ac8fecf8 208 counter = 0;
valeyev 0:e056ac8fecf8 209 EventQueue queue(TEST_EQUEUE_SIZE);
valeyev 0:e056ac8fecf8 210
valeyev 0:e056ac8fecf8 211 Event<void()> e5 = queue.event(count5, 1, 1, 1, 1, 1);
valeyev 0:e056ac8fecf8 212 Event<void()> e4 = queue.event(count4, 1, 1, 1, 1);
valeyev 0:e056ac8fecf8 213 Event<void()> e3 = queue.event(count3, 1, 1, 1);
valeyev 0:e056ac8fecf8 214 Event<void()> e2 = queue.event(count2, 1, 1);
valeyev 0:e056ac8fecf8 215 Event<void()> e1 = queue.event(count1, 1);
valeyev 0:e056ac8fecf8 216 Event<void()> e0 = queue.event(count0);
valeyev 0:e056ac8fecf8 217
valeyev 0:e056ac8fecf8 218 e5.post();
valeyev 0:e056ac8fecf8 219 e4.post();
valeyev 0:e056ac8fecf8 220 e3.post();
valeyev 0:e056ac8fecf8 221 e2.post();
valeyev 0:e056ac8fecf8 222 e1.post();
valeyev 0:e056ac8fecf8 223 e0.post();
valeyev 0:e056ac8fecf8 224
valeyev 0:e056ac8fecf8 225 queue.dispatch(0);
valeyev 0:e056ac8fecf8 226
valeyev 0:e056ac8fecf8 227 TEST_ASSERT_EQUAL(counter, 15);
valeyev 0:e056ac8fecf8 228 }
valeyev 0:e056ac8fecf8 229
valeyev 0:e056ac8fecf8 230 void event_inference_test() {
valeyev 0:e056ac8fecf8 231 counter = 0;
valeyev 0:e056ac8fecf8 232 EventQueue queue(TEST_EQUEUE_SIZE);
valeyev 0:e056ac8fecf8 233
valeyev 0:e056ac8fecf8 234 queue.event(count5, 1, 1, 1, 1, 1).post();
valeyev 0:e056ac8fecf8 235 queue.event(count5, 1, 1, 1, 1).post(1);
valeyev 0:e056ac8fecf8 236 queue.event(count5, 1, 1, 1).post(1, 1);
valeyev 0:e056ac8fecf8 237 queue.event(count5, 1, 1).post(1, 1, 1);
valeyev 0:e056ac8fecf8 238 queue.event(count5, 1).post(1, 1, 1, 1);
valeyev 0:e056ac8fecf8 239 queue.event(count5).post(1, 1, 1, 1, 1);
valeyev 0:e056ac8fecf8 240
valeyev 0:e056ac8fecf8 241 queue.event(callback(count5), 1, 1, 1, 1, 1).post();
valeyev 0:e056ac8fecf8 242 queue.event(callback(count5), 1, 1, 1, 1).post(1);
valeyev 0:e056ac8fecf8 243 queue.event(callback(count5), 1, 1, 1).post(1, 1);
valeyev 0:e056ac8fecf8 244 queue.event(callback(count5), 1, 1).post(1, 1, 1);
valeyev 0:e056ac8fecf8 245 queue.event(callback(count5), 1).post(1, 1, 1, 1);
valeyev 0:e056ac8fecf8 246 queue.event(callback(count5)).post(1, 1, 1, 1, 1);
valeyev 0:e056ac8fecf8 247
valeyev 0:e056ac8fecf8 248 queue.dispatch(0);
valeyev 0:e056ac8fecf8 249
valeyev 0:e056ac8fecf8 250 TEST_ASSERT_EQUAL(counter, 60);
valeyev 0:e056ac8fecf8 251 }
valeyev 0:e056ac8fecf8 252
valeyev 0:e056ac8fecf8 253
valeyev 0:e056ac8fecf8 254 // Test setup
valeyev 0:e056ac8fecf8 255 utest::v1::status_t test_setup(const size_t number_of_cases) {
valeyev 0:e056ac8fecf8 256 GREENTEA_SETUP(20, "default_auto");
valeyev 0:e056ac8fecf8 257 return verbose_test_setup_handler(number_of_cases);
valeyev 0:e056ac8fecf8 258 }
valeyev 0:e056ac8fecf8 259
valeyev 0:e056ac8fecf8 260 const Case cases[] = {
valeyev 0:e056ac8fecf8 261 Case("Testing calls with 5 args", simple_posts_test5),
valeyev 0:e056ac8fecf8 262 Case("Testing calls with 4 args", simple_posts_test4),
valeyev 0:e056ac8fecf8 263 Case("Testing calls with 3 args", simple_posts_test3),
valeyev 0:e056ac8fecf8 264 Case("Testing calls with 2 args", simple_posts_test2),
valeyev 0:e056ac8fecf8 265 Case("Testing calls with 1 args", simple_posts_test1),
valeyev 0:e056ac8fecf8 266 Case("Testing calls with 0 args", simple_posts_test0),
valeyev 0:e056ac8fecf8 267
valeyev 0:e056ac8fecf8 268 Case("Testing call_in", call_in_test<20>),
valeyev 0:e056ac8fecf8 269 Case("Testing call_every", call_every_test<20>),
valeyev 0:e056ac8fecf8 270
valeyev 0:e056ac8fecf8 271 Case("Testing allocate failure", allocate_failure_test),
valeyev 0:e056ac8fecf8 272
valeyev 0:e056ac8fecf8 273 Case("Testing event cancel 1", cancel_test1<20>),
valeyev 0:e056ac8fecf8 274 Case("Testing the event class", event_class_test),
valeyev 0:e056ac8fecf8 275 Case("Testing the event class helpers", event_class_helper_test),
valeyev 0:e056ac8fecf8 276 Case("Testing the event inference", event_inference_test),
valeyev 0:e056ac8fecf8 277 };
valeyev 0:e056ac8fecf8 278
valeyev 0:e056ac8fecf8 279 Specification specification(test_setup, cases);
valeyev 0:e056ac8fecf8 280
valeyev 0:e056ac8fecf8 281 int main() {
valeyev 0:e056ac8fecf8 282 return !Harness::run(specification);
valeyev 0:e056ac8fecf8 283 }
valeyev 0:e056ac8fecf8 284