1

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.h"
valeyev 0:e056ac8fecf8 17 #include "greentea-client/test_env.h"
valeyev 0:e056ac8fecf8 18 #include "utest/utest.h"
valeyev 0:e056ac8fecf8 19 #include "unity/unity.h"
valeyev 0:e056ac8fecf8 20
valeyev 0:e056ac8fecf8 21 using utest::v1::Case;
valeyev 0:e056ac8fecf8 22
valeyev 0:e056ac8fecf8 23
valeyev 0:e056ac8fecf8 24 #if defined(MBED_RTOS_SINGLE_THREAD)
valeyev 0:e056ac8fecf8 25 #error [NOT_SUPPORTED] test not supported
valeyev 0:e056ac8fecf8 26 #endif
valeyev 0:e056ac8fecf8 27
valeyev 0:e056ac8fecf8 28 #define TEST_STACK_SIZE 512
valeyev 0:e056ac8fecf8 29 #define MAX_FLAG_POS 30
valeyev 0:e056ac8fecf8 30
valeyev 0:e056ac8fecf8 31 #define ALL_SIGNALS 0x7fffffff
valeyev 0:e056ac8fecf8 32 #define NO_SIGNALS 0x0
valeyev 0:e056ac8fecf8 33 #define PROHIBITED_SIGNAL 0x80000000
valeyev 0:e056ac8fecf8 34 #define SIGNAL1 0x1
valeyev 0:e056ac8fecf8 35 #define SIGNAL2 0x2
valeyev 0:e056ac8fecf8 36 #define SIGNAL3 0x4
valeyev 0:e056ac8fecf8 37
valeyev 0:e056ac8fecf8 38 struct Sync {
valeyev 0:e056ac8fecf8 39 Sync(Semaphore &parent, Semaphore &child): sem_parent(parent), sem_child(child)
valeyev 0:e056ac8fecf8 40 {}
valeyev 0:e056ac8fecf8 41
valeyev 0:e056ac8fecf8 42 Semaphore &sem_parent;
valeyev 0:e056ac8fecf8 43 Semaphore &sem_child;
valeyev 0:e056ac8fecf8 44 };
valeyev 0:e056ac8fecf8 45
valeyev 0:e056ac8fecf8 46
valeyev 0:e056ac8fecf8 47 /* In order to successfully run this test suite when compiled with --profile=debug
valeyev 0:e056ac8fecf8 48 * error() has to be redefined as noop.
valeyev 0:e056ac8fecf8 49 *
valeyev 0:e056ac8fecf8 50 * ThreadFlags calls RTX API which uses Event Recorder functionality. When compiled
valeyev 0:e056ac8fecf8 51 * with MBED_TRAP_ERRORS_ENABLED=1 (set in debug profile) EvrRtxEventFlagsError() calls error()
valeyev 0:e056ac8fecf8 52 * which aborts test program.
valeyev 0:e056ac8fecf8 53 */
valeyev 0:e056ac8fecf8 54 #if defined(MBED_TRAP_ERRORS_ENABLED) && MBED_TRAP_ERRORS_ENABLED
valeyev 0:e056ac8fecf8 55 void error(const char* format, ...) {
valeyev 0:e056ac8fecf8 56 (void) format;
valeyev 0:e056ac8fecf8 57 }
valeyev 0:e056ac8fecf8 58 #endif
valeyev 0:e056ac8fecf8 59
valeyev 0:e056ac8fecf8 60
valeyev 0:e056ac8fecf8 61 template <int32_t signals, uint32_t timeout, int32_t test_val>
valeyev 0:e056ac8fecf8 62 void run_signal_wait(void)
valeyev 0:e056ac8fecf8 63 {
valeyev 0:e056ac8fecf8 64 osEvent ev = Thread::signal_wait(signals, timeout);
valeyev 0:e056ac8fecf8 65 TEST_ASSERT_EQUAL(test_val, ev.status);
valeyev 0:e056ac8fecf8 66 }
valeyev 0:e056ac8fecf8 67
valeyev 0:e056ac8fecf8 68 template <int32_t signals, uint32_t timeout, int32_t test_val>
valeyev 0:e056ac8fecf8 69 void run_release_signal_wait(Semaphore *sem)
valeyev 0:e056ac8fecf8 70 {
valeyev 0:e056ac8fecf8 71 sem->release();
valeyev 0:e056ac8fecf8 72 osEvent ev = Thread::signal_wait(signals, timeout);
valeyev 0:e056ac8fecf8 73 TEST_ASSERT_EQUAL(test_val, ev.status);
valeyev 0:e056ac8fecf8 74 }
valeyev 0:e056ac8fecf8 75
valeyev 0:e056ac8fecf8 76 template <int32_t signals, uint32_t timeout, int32_t test_val>
valeyev 0:e056ac8fecf8 77 void run_release_wait_signal_wait(Sync *sync)
valeyev 0:e056ac8fecf8 78 {
valeyev 0:e056ac8fecf8 79 sync->sem_parent.release();
valeyev 0:e056ac8fecf8 80 sync->sem_child.wait();
valeyev 0:e056ac8fecf8 81 osEvent ev = Thread::signal_wait(signals, timeout);
valeyev 0:e056ac8fecf8 82 TEST_ASSERT_EQUAL(test_val, ev.status);
valeyev 0:e056ac8fecf8 83 }
valeyev 0:e056ac8fecf8 84
valeyev 0:e056ac8fecf8 85 template <int32_t signals, int32_t test_val>
valeyev 0:e056ac8fecf8 86 void run_clear(void)
valeyev 0:e056ac8fecf8 87 {
valeyev 0:e056ac8fecf8 88 int32_t ret = Thread::signal_clr(signals);
valeyev 0:e056ac8fecf8 89 TEST_ASSERT_EQUAL(test_val, ret);
valeyev 0:e056ac8fecf8 90 }
valeyev 0:e056ac8fecf8 91
valeyev 0:e056ac8fecf8 92 template <int32_t signals, int32_t test_val>
valeyev 0:e056ac8fecf8 93 void run_wait_clear(Sync *sync)
valeyev 0:e056ac8fecf8 94 {
valeyev 0:e056ac8fecf8 95 sync->sem_parent.release();
valeyev 0:e056ac8fecf8 96 sync->sem_child.wait();
valeyev 0:e056ac8fecf8 97 int32_t ret = Thread::signal_clr(signals);
valeyev 0:e056ac8fecf8 98 TEST_ASSERT_EQUAL(test_val, ret);
valeyev 0:e056ac8fecf8 99 }
valeyev 0:e056ac8fecf8 100
valeyev 0:e056ac8fecf8 101 template <int32_t signals1, int32_t signals2, int32_t test_val1, int32_t test_val2>
valeyev 0:e056ac8fecf8 102 void run_double_wait_clear(Sync *sync)
valeyev 0:e056ac8fecf8 103 {
valeyev 0:e056ac8fecf8 104 int32_t ret;
valeyev 0:e056ac8fecf8 105
valeyev 0:e056ac8fecf8 106 sync->sem_parent.release();
valeyev 0:e056ac8fecf8 107 sync->sem_child.wait();
valeyev 0:e056ac8fecf8 108 ret = Thread::signal_clr(signals1);
valeyev 0:e056ac8fecf8 109 TEST_ASSERT_EQUAL(test_val1, ret);
valeyev 0:e056ac8fecf8 110
valeyev 0:e056ac8fecf8 111 ret = Thread::signal_clr(signals2);
valeyev 0:e056ac8fecf8 112 TEST_ASSERT_EQUAL(test_val2, ret);
valeyev 0:e056ac8fecf8 113 }
valeyev 0:e056ac8fecf8 114
valeyev 0:e056ac8fecf8 115 void run_loop_wait_clear(Sync *sync)
valeyev 0:e056ac8fecf8 116 {
valeyev 0:e056ac8fecf8 117 int32_t signals = NO_SIGNALS;
valeyev 0:e056ac8fecf8 118 for (int i = 0; i <= MAX_FLAG_POS; i++) {
valeyev 0:e056ac8fecf8 119 int32_t signal = 1 << i;
valeyev 0:e056ac8fecf8 120 signals |= signal;
valeyev 0:e056ac8fecf8 121 sync->sem_child.wait();
valeyev 0:e056ac8fecf8 122 int32_t ret = Thread::signal_clr(NO_SIGNALS);
valeyev 0:e056ac8fecf8 123 TEST_ASSERT_EQUAL(signals, ret);
valeyev 0:e056ac8fecf8 124 sync->sem_parent.release();
valeyev 0:e056ac8fecf8 125 }
valeyev 0:e056ac8fecf8 126 }
valeyev 0:e056ac8fecf8 127
valeyev 0:e056ac8fecf8 128
valeyev 0:e056ac8fecf8 129 /** Validate that call signal_clr(NO_SIGNALS) doesn't change thread signals and return actual signals
valeyev 0:e056ac8fecf8 130
valeyev 0:e056ac8fecf8 131 Given two threads A & B are started, B with all signals already set
valeyev 0:e056ac8fecf8 132 When thread B calls @a signal_clr(NO_SIGNALS)
valeyev 0:e056ac8fecf8 133 Then thread B @a signal_clr status should be ALL_SIGNALS indicating that thread B state is unchanged
valeyev 0:e056ac8fecf8 134 */
valeyev 0:e056ac8fecf8 135 void test_clear_no_signals(void)
valeyev 0:e056ac8fecf8 136 {
valeyev 0:e056ac8fecf8 137 Semaphore sem_parent(0, 1);
valeyev 0:e056ac8fecf8 138 Semaphore sem_child(0, 1);
valeyev 0:e056ac8fecf8 139 Sync sync(sem_parent, sem_child);
valeyev 0:e056ac8fecf8 140
valeyev 0:e056ac8fecf8 141 Thread t(osPriorityNormal, TEST_STACK_SIZE);
valeyev 0:e056ac8fecf8 142 t.start(callback(run_double_wait_clear<NO_SIGNALS, NO_SIGNALS, ALL_SIGNALS, ALL_SIGNALS>, &sync));
valeyev 0:e056ac8fecf8 143 sem_parent.wait();
valeyev 0:e056ac8fecf8 144 t.signal_set(ALL_SIGNALS);
valeyev 0:e056ac8fecf8 145 sem_child.release();
valeyev 0:e056ac8fecf8 146 t.join();
valeyev 0:e056ac8fecf8 147 }
valeyev 0:e056ac8fecf8 148
valeyev 0:e056ac8fecf8 149 /** Validate if any signals are set on just created thread
valeyev 0:e056ac8fecf8 150
valeyev 0:e056ac8fecf8 151 Given the thread is running
valeyev 0:e056ac8fecf8 152 When thread execute @a signal_clr(NO_SIGNALS)
valeyev 0:e056ac8fecf8 153 Then thread @a signal_clr return status should be NO_SIGNALS(0) indicating no signals set
valeyev 0:e056ac8fecf8 154 */
valeyev 0:e056ac8fecf8 155 void test_init_state(void)
valeyev 0:e056ac8fecf8 156 {
valeyev 0:e056ac8fecf8 157 Thread t(osPriorityNormal, TEST_STACK_SIZE);
valeyev 0:e056ac8fecf8 158 t.start(callback(run_clear<NO_SIGNALS, NO_SIGNALS>));
valeyev 0:e056ac8fecf8 159 t.join();
valeyev 0:e056ac8fecf8 160 }
valeyev 0:e056ac8fecf8 161
valeyev 0:e056ac8fecf8 162 /** Validate all signals set in one shot
valeyev 0:e056ac8fecf8 163
valeyev 0:e056ac8fecf8 164 Given two threads A & B are started
valeyev 0:e056ac8fecf8 165 When thread A call @a signal_set(ALL_SIGNALS) with all possible signals
valeyev 0:e056ac8fecf8 166 Then thread B @a signal_clr(NO_SIGNALS) status should be ALL_SIGNALS indicating all signals set correctly
valeyev 0:e056ac8fecf8 167 */
valeyev 0:e056ac8fecf8 168 void test_set_all(void)
valeyev 0:e056ac8fecf8 169 {
valeyev 0:e056ac8fecf8 170 int32_t ret;
valeyev 0:e056ac8fecf8 171 Semaphore sem_parent(0, 1);
valeyev 0:e056ac8fecf8 172 Semaphore sem_child(0, 1);
valeyev 0:e056ac8fecf8 173 Sync sync(sem_parent, sem_child);
valeyev 0:e056ac8fecf8 174
valeyev 0:e056ac8fecf8 175 Thread t(osPriorityNormal, TEST_STACK_SIZE);
valeyev 0:e056ac8fecf8 176 t.start(callback(run_wait_clear<NO_SIGNALS, ALL_SIGNALS>, &sync));
valeyev 0:e056ac8fecf8 177
valeyev 0:e056ac8fecf8 178 sem_parent.wait();
valeyev 0:e056ac8fecf8 179 ret = t.signal_set(ALL_SIGNALS);
valeyev 0:e056ac8fecf8 180 TEST_ASSERT_EQUAL(ALL_SIGNALS, ret);
valeyev 0:e056ac8fecf8 181
valeyev 0:e056ac8fecf8 182 sem_child.release();
valeyev 0:e056ac8fecf8 183 t.join();
valeyev 0:e056ac8fecf8 184 }
valeyev 0:e056ac8fecf8 185
valeyev 0:e056ac8fecf8 186 /** Validate that call signal_set with prohibited signal doesn't change thread signals
valeyev 0:e056ac8fecf8 187
valeyev 0:e056ac8fecf8 188 Given two threads A & B are started, B with all signals set
valeyev 0:e056ac8fecf8 189 When thread A executes @a signal_set(PROHIBITED_SIGNAL) with prohibited signal
valeyev 0:e056ac8fecf8 190 Then thread B @a signal_clr(NO_SIGNALS) status should be ALL_SIGNALS indicating that thread B signals are unchanged
valeyev 0:e056ac8fecf8 191
valeyev 0:e056ac8fecf8 192 @note Each signal has up to 31 event flags 0x1, 0x2, 0x4, 0x8, ..., 0x40000000
valeyev 0:e056ac8fecf8 193 Most significant bit is reserved and thereby flag 0x80000000 is prohibited
valeyev 0:e056ac8fecf8 194 */
valeyev 0:e056ac8fecf8 195 void test_set_prohibited(void)
valeyev 0:e056ac8fecf8 196 {
valeyev 0:e056ac8fecf8 197 int32_t ret;
valeyev 0:e056ac8fecf8 198 Semaphore sem_parent(0, 1);
valeyev 0:e056ac8fecf8 199 Semaphore sem_child(0, 1);
valeyev 0:e056ac8fecf8 200 Sync sync(sem_parent, sem_child);
valeyev 0:e056ac8fecf8 201
valeyev 0:e056ac8fecf8 202 Thread t(osPriorityNormal, TEST_STACK_SIZE);
valeyev 0:e056ac8fecf8 203 t.start(callback(run_wait_clear<NO_SIGNALS, ALL_SIGNALS>, &sync));
valeyev 0:e056ac8fecf8 204
valeyev 0:e056ac8fecf8 205 sem_parent.wait();
valeyev 0:e056ac8fecf8 206 t.signal_set(ALL_SIGNALS);
valeyev 0:e056ac8fecf8 207
valeyev 0:e056ac8fecf8 208 ret = t.signal_set(PROHIBITED_SIGNAL);
valeyev 0:e056ac8fecf8 209 TEST_ASSERT_EQUAL(osErrorParameter, ret);
valeyev 0:e056ac8fecf8 210
valeyev 0:e056ac8fecf8 211 sem_child.release();
valeyev 0:e056ac8fecf8 212 t.join();
valeyev 0:e056ac8fecf8 213 }
valeyev 0:e056ac8fecf8 214
valeyev 0:e056ac8fecf8 215 /** Validate all signals clear in one shot
valeyev 0:e056ac8fecf8 216
valeyev 0:e056ac8fecf8 217 Given two threads A & B are started, B with all signals set
valeyev 0:e056ac8fecf8 218 When thread B execute @a signal_clr(ALL_SIGNALS) with all possible signals
valeyev 0:e056ac8fecf8 219 Then thread B @a signal_clr(NO_SIGNALS) status should be NO_SIGNALS(0) indicating all signals cleared correctly
valeyev 0:e056ac8fecf8 220 */
valeyev 0:e056ac8fecf8 221 void test_clear_all(void)
valeyev 0:e056ac8fecf8 222 {
valeyev 0:e056ac8fecf8 223 Semaphore sem_parent(0, 1);
valeyev 0:e056ac8fecf8 224 Semaphore sem_child(0, 1);
valeyev 0:e056ac8fecf8 225 Sync sync(sem_parent, sem_child);
valeyev 0:e056ac8fecf8 226
valeyev 0:e056ac8fecf8 227 Thread t(osPriorityNormal, TEST_STACK_SIZE);
valeyev 0:e056ac8fecf8 228 t.start(callback(run_double_wait_clear<ALL_SIGNALS, NO_SIGNALS, ALL_SIGNALS, NO_SIGNALS>, &sync));
valeyev 0:e056ac8fecf8 229 sem_parent.wait();
valeyev 0:e056ac8fecf8 230 t.signal_set(ALL_SIGNALS);
valeyev 0:e056ac8fecf8 231 sem_child.release();
valeyev 0:e056ac8fecf8 232 t.join();
valeyev 0:e056ac8fecf8 233 }
valeyev 0:e056ac8fecf8 234
valeyev 0:e056ac8fecf8 235 /** Validate all signals set one by one in loop
valeyev 0:e056ac8fecf8 236
valeyev 0:e056ac8fecf8 237 Given two threads A & B are started
valeyev 0:e056ac8fecf8 238 When thread A executes @a signal_set(signal) in loop with all possible signals
valeyev 0:e056ac8fecf8 239 */
valeyev 0:e056ac8fecf8 240 void test_set_all_loop(void)
valeyev 0:e056ac8fecf8 241 {
valeyev 0:e056ac8fecf8 242 int32_t ret;
valeyev 0:e056ac8fecf8 243 Semaphore sem_parent(0, 1);
valeyev 0:e056ac8fecf8 244 Semaphore sem_child(0, 1);
valeyev 0:e056ac8fecf8 245 Sync sync(sem_parent, sem_child);
valeyev 0:e056ac8fecf8 246
valeyev 0:e056ac8fecf8 247 Thread t(osPriorityNormal, TEST_STACK_SIZE);
valeyev 0:e056ac8fecf8 248 t.start(callback(run_loop_wait_clear, &sync));
valeyev 0:e056ac8fecf8 249
valeyev 0:e056ac8fecf8 250 int32_t signals = 0;
valeyev 0:e056ac8fecf8 251 for (int i = 0; i <= MAX_FLAG_POS; i++) {
valeyev 0:e056ac8fecf8 252 int32_t signal = 1 << i;
valeyev 0:e056ac8fecf8 253
valeyev 0:e056ac8fecf8 254 ret = t.signal_set(signal);
valeyev 0:e056ac8fecf8 255 signals |= signal;
valeyev 0:e056ac8fecf8 256 TEST_ASSERT_EQUAL(signals, ret);
valeyev 0:e056ac8fecf8 257 sem_child.release();
valeyev 0:e056ac8fecf8 258 sem_parent.wait();
valeyev 0:e056ac8fecf8 259 }
valeyev 0:e056ac8fecf8 260 t.join();
valeyev 0:e056ac8fecf8 261 }
valeyev 0:e056ac8fecf8 262
valeyev 0:e056ac8fecf8 263 /** Validate signal_wait return status if timeout specified
valeyev 0:e056ac8fecf8 264
valeyev 0:e056ac8fecf8 265 Given the thread is running
valeyev 0:e056ac8fecf8 266 When thread executes @a signal_wait(signals, timeout) with specified signals and timeout
valeyev 0:e056ac8fecf8 267 Then thread @a signal_wait status should be osEventTimeout indicating a timeout
valeyev 0:e056ac8fecf8 268 thread @a signal_wait status should be osOK indicating 0[ms] timeout set
valeyev 0:e056ac8fecf8 269 */
valeyev 0:e056ac8fecf8 270 template <int32_t signals, uint32_t timeout, int32_t status>
valeyev 0:e056ac8fecf8 271 void test_wait_timeout(void)
valeyev 0:e056ac8fecf8 272 {
valeyev 0:e056ac8fecf8 273 Thread t(osPriorityNormal, TEST_STACK_SIZE);
valeyev 0:e056ac8fecf8 274 t.start(callback(run_signal_wait<signals, timeout, status>));
valeyev 0:e056ac8fecf8 275 t.join();
valeyev 0:e056ac8fecf8 276 }
valeyev 0:e056ac8fecf8 277
valeyev 0:e056ac8fecf8 278 /** Validate that call of signal_wait return correctly when thread has all signals already set
valeyev 0:e056ac8fecf8 279
valeyev 0:e056ac8fecf8 280 Given two threads A & B are started, B with all signals already set
valeyev 0:e056ac8fecf8 281 When thread B executes @a signal_wait(ALL_SIGNALS, osWaitForever),
valeyev 0:e056ac8fecf8 282 Then thread B @a signal_wait return immediately with status osEventSignal indicating all wait signals was already set
valeyev 0:e056ac8fecf8 283 */
valeyev 0:e056ac8fecf8 284 void test_wait_all_already_set(void)
valeyev 0:e056ac8fecf8 285 {
valeyev 0:e056ac8fecf8 286 Semaphore sem_parent(0, 1);
valeyev 0:e056ac8fecf8 287 Semaphore sem_child(0, 1);
valeyev 0:e056ac8fecf8 288 Sync sync(sem_parent, sem_child);
valeyev 0:e056ac8fecf8 289
valeyev 0:e056ac8fecf8 290 Thread t(osPriorityNormal, TEST_STACK_SIZE);
valeyev 0:e056ac8fecf8 291 t.start(callback(run_release_wait_signal_wait<ALL_SIGNALS, osWaitForever, osEventSignal>, &sync));
valeyev 0:e056ac8fecf8 292
valeyev 0:e056ac8fecf8 293 sem_parent.wait();
valeyev 0:e056ac8fecf8 294 TEST_ASSERT_EQUAL(Thread::WaitingSemaphore, t.get_state());
valeyev 0:e056ac8fecf8 295 t.signal_set(ALL_SIGNALS);
valeyev 0:e056ac8fecf8 296 sem_child.release();
valeyev 0:e056ac8fecf8 297 t.join();
valeyev 0:e056ac8fecf8 298 }
valeyev 0:e056ac8fecf8 299
valeyev 0:e056ac8fecf8 300 /** Validate if signal_wait return correctly when all signals set
valeyev 0:e056ac8fecf8 301
valeyev 0:e056ac8fecf8 302 Given two threads A & B are started and B waiting for a thread flag to be set
valeyev 0:e056ac8fecf8 303 When thread A executes @a signal_set(ALL_SIGNALS) with all possible signals
valeyev 0:e056ac8fecf8 304 Then thread B @a signal_wait status is osEventSignal indicating all wait signals was set
valeyev 0:e056ac8fecf8 305 */
valeyev 0:e056ac8fecf8 306 void test_wait_all(void)
valeyev 0:e056ac8fecf8 307 {
valeyev 0:e056ac8fecf8 308 Semaphore sem(0, 1);
valeyev 0:e056ac8fecf8 309
valeyev 0:e056ac8fecf8 310 Thread t(osPriorityNormal, TEST_STACK_SIZE);
valeyev 0:e056ac8fecf8 311 t.start(callback(run_release_signal_wait<ALL_SIGNALS, osWaitForever, osEventSignal>, &sem));
valeyev 0:e056ac8fecf8 312
valeyev 0:e056ac8fecf8 313 sem.wait();
valeyev 0:e056ac8fecf8 314 TEST_ASSERT_EQUAL(Thread::WaitingThreadFlag, t.get_state());
valeyev 0:e056ac8fecf8 315
valeyev 0:e056ac8fecf8 316 t.signal_set(ALL_SIGNALS);
valeyev 0:e056ac8fecf8 317 t.join();
valeyev 0:e056ac8fecf8 318 }
valeyev 0:e056ac8fecf8 319
valeyev 0:e056ac8fecf8 320 /** Validate if signal_wait accumulate signals and return correctly when all signals set
valeyev 0:e056ac8fecf8 321
valeyev 0:e056ac8fecf8 322 Given two threads A & B are started and B waiting for a thread signals to be set
valeyev 0:e056ac8fecf8 323 When thread A executes @a signal_set setting all signals in loop
valeyev 0:e056ac8fecf8 324 Then thread B @a signal_wait status is osEventSignal indicating that all wait signals was set
valeyev 0:e056ac8fecf8 325 */
valeyev 0:e056ac8fecf8 326 void test_wait_all_loop(void)
valeyev 0:e056ac8fecf8 327 {
valeyev 0:e056ac8fecf8 328 int32_t ret;
valeyev 0:e056ac8fecf8 329 Semaphore sem(0, 1);
valeyev 0:e056ac8fecf8 330
valeyev 0:e056ac8fecf8 331 Thread t(osPriorityNormal, TEST_STACK_SIZE);
valeyev 0:e056ac8fecf8 332 t.start(callback(run_release_signal_wait<ALL_SIGNALS, osWaitForever, osEventSignal>, &sem));
valeyev 0:e056ac8fecf8 333
valeyev 0:e056ac8fecf8 334 sem.wait();
valeyev 0:e056ac8fecf8 335 TEST_ASSERT_EQUAL(Thread::WaitingThreadFlag, t.get_state());
valeyev 0:e056ac8fecf8 336
valeyev 0:e056ac8fecf8 337 for (int i = 0; i < MAX_FLAG_POS; i++) {
valeyev 0:e056ac8fecf8 338 int32_t signal = 1 << i;
valeyev 0:e056ac8fecf8 339 ret = t.signal_set(signal);
valeyev 0:e056ac8fecf8 340 }
valeyev 0:e056ac8fecf8 341 ret = t.signal_set(1 << MAX_FLAG_POS);
valeyev 0:e056ac8fecf8 342 TEST_ASSERT_EQUAL(NO_SIGNALS, ret);
valeyev 0:e056ac8fecf8 343 t.join();
valeyev 0:e056ac8fecf8 344 }
valeyev 0:e056ac8fecf8 345
valeyev 0:e056ac8fecf8 346 /** Validate if setting same signal twice cause any unwanted behaviour
valeyev 0:e056ac8fecf8 347
valeyev 0:e056ac8fecf8 348 Given two threads A & B are started and B waiting for a thread signals to be set
valeyev 0:e056ac8fecf8 349 When thread A executes @a signal_set twice for the same signal
valeyev 0:e056ac8fecf8 350 Then thread A @a signal_set status is current signal set
valeyev 0:e056ac8fecf8 351 thread B @a signal_wait status is osEventSignal indicating that all wait signals was set
valeyev 0:e056ac8fecf8 352 */
valeyev 0:e056ac8fecf8 353 void test_set_double(void)
valeyev 0:e056ac8fecf8 354 {
valeyev 0:e056ac8fecf8 355 int32_t ret;
valeyev 0:e056ac8fecf8 356 Semaphore sem(0, 1);
valeyev 0:e056ac8fecf8 357
valeyev 0:e056ac8fecf8 358 Thread t(osPriorityNormal, TEST_STACK_SIZE);
valeyev 0:e056ac8fecf8 359 t.start(callback(run_release_signal_wait<SIGNAL1|SIGNAL2|SIGNAL3, osWaitForever, osEventSignal>, &sem));
valeyev 0:e056ac8fecf8 360
valeyev 0:e056ac8fecf8 361 sem.wait();
valeyev 0:e056ac8fecf8 362 TEST_ASSERT_EQUAL(Thread::WaitingThreadFlag, t.get_state());
valeyev 0:e056ac8fecf8 363
valeyev 0:e056ac8fecf8 364 ret = t.signal_set(SIGNAL1);
valeyev 0:e056ac8fecf8 365 TEST_ASSERT_EQUAL(SIGNAL1, ret);
valeyev 0:e056ac8fecf8 366
valeyev 0:e056ac8fecf8 367 ret = t.signal_set(SIGNAL2);
valeyev 0:e056ac8fecf8 368 TEST_ASSERT_EQUAL(SIGNAL1 | SIGNAL2, ret);
valeyev 0:e056ac8fecf8 369
valeyev 0:e056ac8fecf8 370 ret = t.signal_set(SIGNAL2);
valeyev 0:e056ac8fecf8 371 TEST_ASSERT_EQUAL(SIGNAL1 | SIGNAL2, ret);
valeyev 0:e056ac8fecf8 372 TEST_ASSERT_EQUAL(Thread::WaitingThreadFlag, t.get_state());
valeyev 0:e056ac8fecf8 373
valeyev 0:e056ac8fecf8 374 ret = t.signal_set(SIGNAL3);
valeyev 0:e056ac8fecf8 375 TEST_ASSERT_EQUAL(NO_SIGNALS, ret);
valeyev 0:e056ac8fecf8 376 t.join();
valeyev 0:e056ac8fecf8 377 }
valeyev 0:e056ac8fecf8 378
valeyev 0:e056ac8fecf8 379
valeyev 0:e056ac8fecf8 380 utest::v1::status_t test_setup(const size_t number_of_cases)
valeyev 0:e056ac8fecf8 381 {
valeyev 0:e056ac8fecf8 382 GREENTEA_SETUP(10, "default_auto");
valeyev 0:e056ac8fecf8 383 return utest::v1::verbose_test_setup_handler(number_of_cases);
valeyev 0:e056ac8fecf8 384 }
valeyev 0:e056ac8fecf8 385
valeyev 0:e056ac8fecf8 386 Case cases[] = {
valeyev 0:e056ac8fecf8 387 Case("Validate that call signal_clr(NO_SIGNALS) doesn't change thread signals and return actual signals", test_clear_no_signals),
valeyev 0:e056ac8fecf8 388 Case("Validate if any signals are set on just created thread", test_init_state),
valeyev 0:e056ac8fecf8 389 Case("Validate all signals set in one shot", test_set_all),
valeyev 0:e056ac8fecf8 390 Case("Validate that call signal_set with prohibited signal doesn't change thread signals", test_set_prohibited),
valeyev 0:e056ac8fecf8 391 Case("Validate all signals clear in one shot", test_clear_all),
valeyev 0:e056ac8fecf8 392 Case("Validate all signals set one by one in loop", test_set_all_loop),
valeyev 0:e056ac8fecf8 393 Case("Validate signal_wait return status if timeout specified: 0[ms] no signals", test_wait_timeout<0, 0, osOK>),
valeyev 0:e056ac8fecf8 394 Case("Validate signal_wait return status if timeout specified: 0[ms] all signals", test_wait_timeout<ALL_SIGNALS, 0, osOK>),
valeyev 0:e056ac8fecf8 395 Case("Validate signal_wait return status if timeout specified: 1[ms] no signals", test_wait_timeout<0, 1, osEventTimeout>),
valeyev 0:e056ac8fecf8 396 Case("Validate signal_wait return status if timeout specified: 1[ms] all signals", test_wait_timeout<ALL_SIGNALS, 1, osEventTimeout>),
valeyev 0:e056ac8fecf8 397 Case("Validate that call of signal_wait return correctly when thread has all signals already set", test_wait_all_already_set),
valeyev 0:e056ac8fecf8 398 Case("Validate if signal_wait return correctly when all signals set", test_wait_all),
valeyev 0:e056ac8fecf8 399 Case("Validate if signal_wait accumulate signals and return correctly when all signals set", test_wait_all_loop),
valeyev 0:e056ac8fecf8 400 Case("Validate if setting same signal twice cause any unwanted behaviour", test_set_double)
valeyev 0:e056ac8fecf8 401 };
valeyev 0:e056ac8fecf8 402
valeyev 0:e056ac8fecf8 403 utest::v1::Specification specification(test_setup, cases);
valeyev 0:e056ac8fecf8 404
valeyev 0:e056ac8fecf8 405 int main()
valeyev 0:e056ac8fecf8 406 {
valeyev 0:e056ac8fecf8 407 return !utest::v1::Harness::run(specification);
valeyev 0:e056ac8fecf8 408 }