Skip to content

Commit 5093030

Browse files
pswarnaknashif
authored andcommitted
tests: cmsis_rtos_v1: Add additional test scenarios
Add additional test scenarios to validate signal event APIs such as setting signal from ISR, setting/clearing each unique flag and few negative test cases too. Signed-off-by: Praful Swarnakar <[email protected]>
1 parent 8be1cb3 commit 5093030

File tree

3 files changed

+116
-7
lines changed

3 files changed

+116
-7
lines changed

tests/cmsis_rtos_v1/prj.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
CONFIG_ZTEST=y
22
CONFIG_CMSIS_RTOS_V1=y
3+
CONFIG_IRQ_OFFLOAD=y

tests/cmsis_rtos_v1/src/main.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ extern void test_messageq(void);
2323
extern void test_signal_events_no_wait(void);
2424
extern void test_signal_events_timeout(void);
2525
extern void test_signal_events_signalled(void);
26+
extern void test_signal_events_isr(void);
2627

2728
void test_main(void)
2829
{
@@ -41,7 +42,7 @@ void test_main(void)
4142
ztest_unit_test(test_messageq),
4243
ztest_unit_test(test_signal_events_no_wait),
4344
ztest_unit_test(test_signal_events_timeout),
44-
ztest_unit_test(test_signal_events_signalled));
45-
45+
ztest_unit_test(test_signal_events_signalled),
46+
ztest_unit_test(test_signal_events_isr));
4647
ztest_run_test_suite(test_cmsis_apis);
4748
}

tests/cmsis_rtos_v1/src/signal.c

Lines changed: 112 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,20 @@
88
#include <kernel.h>
99
#include <cmsis_os.h>
1010

11+
#include <irq_offload.h>
12+
#include <kernel_structs.h>
13+
1114
#define TIMEOUT (100)
1215
#define SIGNAL1 (0x00000020)
1316
#define SIGNAL2 (0x00000004)
1417
#define SIGNAL (SIGNAL1 | SIGNAL2)
1518

19+
#define SIGNAL_FLAG 0x00000001
20+
#define ISR_SIGNAL 0x50
21+
22+
#define SIGNAL_ALL_FLAGS ((1 << osFeature_Signals) - 1)
23+
#define SIGNAL_OUTOFLIMIT_FLAG ((1 << (osFeature_Signals + 1))-1)
24+
1625
void Thread_1(void const *arg)
1726
{
1827
int signals = osSignalSet((osThreadId)arg, SIGNAL1);
@@ -27,6 +36,36 @@ void Thread_2(void const *arg)
2736
zassert_not_equal(signals, 0x80000000, "");
2837
}
2938

39+
void test_multiple_signal_flags(void const *thread_id)
40+
{
41+
int max_signal_cnt = osFeature_Signals;
42+
int signals, sig_cnt;
43+
44+
for (sig_cnt = 0; sig_cnt < max_signal_cnt; sig_cnt++) {
45+
/* create unique signal flags to set one flag at a time */
46+
s32_t signal_each_flag = SIGNAL_FLAG << sig_cnt;
47+
/* check if each signal flag is set properly */
48+
signals = osSignalSet((osThreadId)thread_id, signal_each_flag);
49+
zassert_not_equal(signals, 0x80000000,
50+
"Setting each signal flag failed");
51+
}
52+
/* clear all the bits to check next scenario */
53+
signals = osSignalClear((osThreadId)thread_id, SIGNAL_ALL_FLAGS);
54+
zassert_not_equal(signals, 0x80000000, "");
55+
56+
/* signal all the available flags at one shot */
57+
signals = osSignalSet((osThreadId)thread_id, SIGNAL_ALL_FLAGS);
58+
zassert_not_equal(signals, 0x80000000,
59+
"Signal flags maximum limit failed");
60+
/* clear all the bits to check next scenario */
61+
signals = osSignalClear((osThreadId)thread_id, SIGNAL_ALL_FLAGS);
62+
zassert_not_equal(signals, 0x80000000, "");
63+
64+
/* signal invalid flag to validate permissible flag limit */
65+
signals = osSignalSet((osThreadId)thread_id, SIGNAL_OUTOFLIMIT_FLAG);
66+
zassert_equal(signals, 0x80000000, "Signal flags set unexpectedly");
67+
}
68+
3069
osThreadDef(Thread_1, osPriorityHigh, 3, 0);
3170
osThreadDef(Thread_2, osPriorityHigh, 1, 0);
3271

@@ -47,6 +86,7 @@ void test_signal_events_no_wait(void)
4786
evt = osSignalWait(SIGNAL1, 0);
4887
zassert_equal(evt.status, osEventSignal, "");
4988
zassert_equal((evt.value.signals & SIGNAL1), SIGNAL1, "");
89+
osThreadTerminate(id1);
5090
}
5191

5292
void test_signal_events_timeout(void)
@@ -62,28 +102,95 @@ void test_signal_events_timeout(void)
62102
osDelay(10);
63103

64104
signals = osSignalClear(osThreadGetId(), SIGNAL1);
65-
zassert_not_equal(signals, 0x80000000, "");
105+
zassert_not_equal(signals, 0x80000000, "signal clear failed");
66106

67107
/* wait for SIGNAL1. It should timeout here as the signal
68108
* though triggered, gets cleared in the previous step.
69109
*/
70110
evt = osSignalWait(SIGNAL1, TIMEOUT);
71-
zassert_equal(evt.status, osEventTimeout, "");
111+
zassert_equal(evt.status, osEventTimeout, "signal timeout failed");
112+
osThreadTerminate(id1);
72113
}
73114

74115
void test_signal_events_signalled(void)
75116
{
76117
osThreadId id1, id2;
77118
osEvent evt;
119+
int signals;
78120

79121
id1 = osThreadCreate(osThread(Thread_1), osThreadGetId());
80122
zassert_true(id1 != NULL, "Thread creation failed");
81123

82124
id2 = osThreadCreate(osThread(Thread_2), osThreadGetId());
83125
zassert_true(id2 != NULL, "Thread creation failed");
84126

85-
/* wait for a signal */
127+
/* wait for multiple signals */
86128
evt = osSignalWait(SIGNAL, TIMEOUT);
87-
zassert_equal(evt.status, osEventSignal, "");
88-
zassert_equal((evt.value.signals & SIGNAL), SIGNAL, "");
129+
zassert_equal(evt.status, osEventSignal,
130+
"wait signal returned unexpected error");
131+
zassert_equal((evt.value.signals & SIGNAL), SIGNAL,
132+
"wait signal failed unexpectedly");
133+
134+
signals = osSignalClear(osThreadGetId(), SIGNAL);
135+
zassert_not_equal(signals, 0x80000000, "clear signal failed");
136+
137+
/* Set any single signal */
138+
signals = osSignalSet(osThreadGetId(), SIGNAL1);
139+
zassert_not_equal(signals, 0x80000000, "set any signal failed");
140+
141+
/* wait for any single signal flag */
142+
evt = osSignalWait(0, TIMEOUT);
143+
zassert_equal(evt.status, osEventSignal, "wait for single flag failed");
144+
zassert_equal(evt.value.signals, SIGNAL1,
145+
"wait single flag returned invalid value");
146+
147+
/* validate by passing invalid parameters */
148+
zassert_equal(osSignalSet(NULL, 0), 0x80000000,
149+
"NULL signal set unexpectedly");
150+
zassert_equal(osSignalClear(NULL, 0), 0x80000000,
151+
"NULL signal cleared unexpectedly");
152+
/* cannot wait for Flag mask with MSB set */
153+
zassert_equal(osSignalWait((int32_t)0x80010000, 0).status, osErrorValue,
154+
"signal wait passed unexpectedly");
155+
zassert_equal(osSignalSet(osThreadGetId(), (int32_t)0x80010000),
156+
0x80000000, "signal set unexpectedly");
157+
zassert_equal(osSignalClear(osThreadGetId(), (int32_t)0x80010000),
158+
0x80000000, "signal cleared unexpectedly");
159+
160+
test_multiple_signal_flags(osThreadGetId());
161+
}
162+
163+
/* IRQ offload function handler to set signal flag */
164+
static void offload_function(void *param)
165+
{
166+
u32_t tid = (u32_t)param;
167+
int signals;
168+
169+
/* Make sure we're in IRQ context */
170+
zassert_true(_is_in_isr(), "Not in IRQ context!");
171+
172+
signals = osSignalSet((osThreadId)tid, ISR_SIGNAL);
173+
zassert_not_equal(signals, 0x80000000, "signal set failed in ISR");
174+
}
175+
176+
void test_signal_from_isr(void const *thread_id)
177+
{
178+
/**TESTPOINT: Offload to IRQ context*/
179+
irq_offload(offload_function, (void *)thread_id);
180+
}
181+
182+
osThreadDef(test_signal_from_isr, osPriorityHigh, 1, 0);
183+
184+
void test_signal_events_isr(void)
185+
{
186+
osThreadId id;
187+
osEvent evt;
188+
189+
id = osThreadCreate(osThread(test_signal_from_isr), osThreadGetId());
190+
zassert_true(id != NULL, "Thread creation failed");
191+
evt = osSignalWait(ISR_SIGNAL, TIMEOUT);
192+
zassert_equal(evt.status, osEventSignal,
193+
"signal wait failed unexpectedly");
194+
zassert_equal((evt.value.signals & ISR_SIGNAL),
195+
ISR_SIGNAL, "unexpected signal wait value");
89196
}

0 commit comments

Comments
 (0)