Skip to content

Commit a5bde70

Browse files
nashifAnas Nashif
authored andcommitted
tests: add ringbuffer api test and combine original test
We already have a test for ring buffers, this combines it with an API test. Signed-off-by: Anas Nashif <[email protected]>
1 parent 8375fb7 commit a5bde70

File tree

7 files changed

+255
-72
lines changed

7 files changed

+255
-72
lines changed

tests/kernel/common/prj.conf

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
CONFIG_ZTEST=y
2-
CONFIG_RING_BUFFER=y
32
CONFIG_PRINTK=y
43
CONFIG_SYS_LOG=y
54
CONFIG_ENTROPY_GENERATOR=y

tests/kernel/common/src/main.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ extern void atomic_test(void);
1515
extern void bitfield_test(void);
1616
extern void intmath_test(void);
1717
extern void printk_test(void);
18-
extern void ring_buffer_test(void);
1918
extern void slist_test(void);
2019
extern void dlist_test(void);
2120
extern void rand32_test(void);
@@ -45,7 +44,6 @@ void test_main(void)
4544
#ifdef CONFIG_PRINTK
4645
ztest_unit_test(printk_test),
4746
#endif
48-
ztest_unit_test(ring_buffer_test),
4947
ztest_unit_test(slist_test),
5048
ztest_unit_test(dlist_test),
5149
ztest_unit_test(rand32_test),

tests/kernel/common/src/ring_buf.c

Lines changed: 0 additions & 69 deletions
This file was deleted.

tests/sys/ringbuffer/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE)
2+
project(NONE)
3+
4+
FILE(GLOB app_sources src/*.c)
5+
target_sources(app PRIVATE ${app_sources})

tests/sys/ringbuffer/prj.conf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
CONFIG_ZTEST=y
2+
CONFIG_IRQ_OFFLOAD=y
3+
CONFIG_RING_BUFFER=y

tests/sys/ringbuffer/src/main.c

Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
/*
2+
* Copyright (c) 2016 Intel Corporation
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
#include <ztest.h>
18+
#include <irq_offload.h>
19+
#include <ring_buffer.h>
20+
#include <logging/sys_log.h>
21+
22+
/**
23+
* @addtogroup t_ringbuffer
24+
* @{
25+
* @defgroup t_ringbuffer_api test_ringbuffer_api
26+
* @brief TestPurpose: verify zephyr ring buffer API functionality
27+
* - API coverage
28+
* -# SYS_RING_BUF_DECLARE_POW2
29+
* -# SYS_RING_BUF_DECLARE_SIZE
30+
* -# sys_ring_buf_init
31+
* -# sys_ring_buf_is_empty
32+
* -# sys_ring_buf_space_get
33+
* -# sys_ring_buf_put
34+
* -# sys_ring_buf_get
35+
* @}
36+
*/
37+
38+
SYS_RING_BUF_DECLARE_POW2(ring_buf1, 8);
39+
40+
#define TYPE 1
41+
#define VALUE 2
42+
#define INITIAL_SIZE 2
43+
44+
45+
#define RINGBUFFER_SIZE 5
46+
#define DATA_MAX_SIZE 3
47+
#define POW 2
48+
49+
50+
void ring_buffer_main_test(void)
51+
{
52+
int ret, put_count, i;
53+
u32_t getdata[6];
54+
u8_t getsize, getval;
55+
u16_t gettype;
56+
int dsize = INITIAL_SIZE;
57+
char rb_data[] = "ABCDEFGHIJKLMNOPQRSTUVWX";
58+
put_count = 0;
59+
60+
while (1) {
61+
ret = sys_ring_buf_put(&ring_buf1, TYPE, VALUE,
62+
(u32_t *)rb_data, dsize);
63+
if (ret == -EMSGSIZE) {
64+
SYS_LOG_DBG("ring buffer is full");
65+
break;
66+
}
67+
SYS_LOG_DBG("inserted %d chunks, %d remaining", dsize,
68+
sys_ring_buf_space_get(&ring_buf1));
69+
dsize = (dsize + 1) % SIZE32_OF(rb_data);
70+
put_count++;
71+
}
72+
73+
getsize = INITIAL_SIZE - 1;
74+
ret = sys_ring_buf_get(&ring_buf1, &gettype, &getval, getdata, &getsize);
75+
if (ret != -EMSGSIZE) {
76+
SYS_LOG_DBG("Allowed retreival with insufficient destination buffer space");
77+
zassert_true((getsize == INITIAL_SIZE), "Correct size wasn't reported back to the caller");
78+
}
79+
80+
for (i = 0; i < put_count; i++) {
81+
getsize = SIZE32_OF(getdata);
82+
ret = sys_ring_buf_get(&ring_buf1, &gettype, &getval, getdata,
83+
&getsize);
84+
zassert_true((ret == 0), "Couldn't retrieve a stored value");
85+
SYS_LOG_DBG("got %u chunks of type %u and val %u, %u remaining",
86+
getsize, gettype, getval,
87+
sys_ring_buf_space_get(&ring_buf1));
88+
89+
zassert_true((memcmp((char *)getdata, rb_data, getsize * sizeof(u32_t)) == 0),
90+
"data corrupted");
91+
zassert_true((gettype == TYPE), "type information corrupted");
92+
zassert_true((getval == VALUE), "value information corrupted");
93+
}
94+
95+
getsize = SIZE32_OF(getdata);
96+
ret = sys_ring_buf_get(&ring_buf1, &gettype, &getval, getdata,
97+
&getsize);
98+
zassert_true((ret == -EAGAIN), "Got data out of an empty buffer");
99+
}
100+
101+
/**TESTPOINT: init via SYS_RING_BUF_DECLARE_POW2*/
102+
SYS_RING_BUF_DECLARE_POW2(ringbuf_pow2, POW);
103+
104+
/**TESTPOINT: init via SYS_RING_BUF_DECLARE_SIZE*/
105+
SYS_RING_BUF_DECLARE_SIZE(ringbuf_size, RINGBUFFER_SIZE);
106+
107+
static struct ring_buf ringbuf, *pbuf;
108+
109+
static u32_t buffer[RINGBUFFER_SIZE];
110+
111+
static struct {
112+
u8_t length;
113+
u8_t value;
114+
u16_t type;
115+
u32_t buffer[DATA_MAX_SIZE];
116+
} data[] = {
117+
{ 0, 32, 1, {} },
118+
{ 1, 76, 54, { 0x89ab } },
119+
{ 3, 0xff, 0xffff, { 0x0f0f, 0xf0f0, 0xff00 } }
120+
};
121+
122+
/*entry of contexts*/
123+
static void tringbuf_put(void *p)
124+
{
125+
int index = (int)p;
126+
/**TESTPOINT: ring buffer put*/
127+
int ret = sys_ring_buf_put(pbuf, data[index].type, data[index].value,
128+
data[index].buffer, data[index].length);
129+
130+
zassert_equal(ret, 0, NULL);
131+
}
132+
133+
static void tringbuf_get(void *p)
134+
{
135+
u16_t type;
136+
u8_t value, size32 = DATA_MAX_SIZE;
137+
u32_t rx_data[DATA_MAX_SIZE];
138+
int ret, index = (int)p;
139+
140+
/**TESTPOINT: ring buffer get*/
141+
ret = sys_ring_buf_get(pbuf, &type, &value, rx_data, &size32);
142+
zassert_equal(ret, 0, NULL);
143+
zassert_equal(type, data[index].type, NULL);
144+
zassert_equal(value, data[index].value, NULL);
145+
zassert_equal(size32, data[index].length, NULL);
146+
zassert_equal(memcmp(rx_data, data[index].buffer, size32), 0, NULL);
147+
}
148+
149+
/*test cases*/
150+
void test_ringbuffer_init(void)
151+
{
152+
/**TESTPOINT: init via sys_ring_buf_init*/
153+
sys_ring_buf_init(&ringbuf, RINGBUFFER_SIZE, buffer);
154+
zassert_true(sys_ring_buf_is_empty(&ringbuf), NULL);
155+
zassert_equal(sys_ring_buf_space_get(&ringbuf), RINGBUFFER_SIZE - 1, NULL);
156+
}
157+
158+
void test_ringbuffer_declare_pow2(void)
159+
{
160+
zassert_true(sys_ring_buf_is_empty(&ringbuf_pow2), NULL);
161+
zassert_equal(sys_ring_buf_space_get(&ringbuf_pow2), (1 << POW) - 1, NULL);
162+
}
163+
164+
void test_ringbuffer_declare_size(void)
165+
{
166+
zassert_true(sys_ring_buf_is_empty(&ringbuf_size), NULL);
167+
zassert_equal(sys_ring_buf_space_get(&ringbuf_size), RINGBUFFER_SIZE - 1,
168+
NULL);
169+
}
170+
171+
void test_ringbuffer_put_get_thread(void)
172+
{
173+
pbuf = &ringbuf;
174+
tringbuf_put((void *)0);
175+
tringbuf_put((void *)1);
176+
tringbuf_get((void *)0);
177+
tringbuf_get((void *)1);
178+
tringbuf_put((void *)2);
179+
zassert_false(sys_ring_buf_is_empty(pbuf), NULL);
180+
tringbuf_get((void *)2);
181+
zassert_true(sys_ring_buf_is_empty(pbuf), NULL);
182+
}
183+
184+
void test_ringbuffer_put_get_isr(void)
185+
{
186+
pbuf = &ringbuf;
187+
irq_offload(tringbuf_put, (void *)0);
188+
irq_offload(tringbuf_put, (void *)1);
189+
irq_offload(tringbuf_get, (void *)0);
190+
irq_offload(tringbuf_get, (void *)1);
191+
irq_offload(tringbuf_put, (void *)2);
192+
zassert_false(sys_ring_buf_is_empty(pbuf), NULL);
193+
irq_offload(tringbuf_get, (void *)2);
194+
zassert_true(sys_ring_buf_is_empty(pbuf), NULL);
195+
}
196+
197+
void test_ringbuffer_put_get_thread_isr(void)
198+
{
199+
pbuf = &ringbuf;
200+
tringbuf_put((void *)0);
201+
irq_offload(tringbuf_put, (void *)1);
202+
tringbuf_get((void *)0);
203+
irq_offload(tringbuf_get, (void *)1);
204+
tringbuf_put((void *)2);
205+
irq_offload(tringbuf_get, (void *)2);
206+
}
207+
208+
void test_ringbuffer_pow2_put_get_thread_isr(void)
209+
{
210+
pbuf = &ringbuf_pow2;
211+
tringbuf_put((void *)0);
212+
irq_offload(tringbuf_put, (void *)1);
213+
tringbuf_get((void *)0);
214+
irq_offload(tringbuf_get, (void *)1);
215+
tringbuf_put((void *)1);
216+
irq_offload(tringbuf_get, (void *)1);
217+
}
218+
219+
void test_ringbuffer_size_put_get_thread_isr(void)
220+
{
221+
pbuf = &ringbuf_size;
222+
tringbuf_put((void *)0);
223+
irq_offload(tringbuf_put, (void *)1);
224+
tringbuf_get((void *)0);
225+
irq_offload(tringbuf_get, (void *)1);
226+
tringbuf_put((void *)2);
227+
irq_offload(tringbuf_get, (void *)2);
228+
}
229+
230+
/*test case main entry*/
231+
void test_main(void)
232+
{
233+
ztest_test_suite(test_ringbuffer_api,
234+
ztest_unit_test(test_ringbuffer_init),/*keep init first!*/
235+
ztest_unit_test(test_ringbuffer_declare_pow2),
236+
ztest_unit_test(test_ringbuffer_declare_size),
237+
ztest_unit_test(test_ringbuffer_put_get_thread),
238+
ztest_unit_test(test_ringbuffer_put_get_isr),
239+
ztest_unit_test(test_ringbuffer_put_get_thread_isr),
240+
ztest_unit_test(test_ringbuffer_pow2_put_get_thread_isr),
241+
ztest_unit_test(test_ringbuffer_size_put_get_thread_isr),
242+
ztest_unit_test(ring_buffer_main_test));
243+
ztest_run_test_suite(test_ringbuffer_api);
244+
}

tests/sys/ringbuffer/testcase.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
tests:
2+
ringbuffer_api:
3+
tags: system

0 commit comments

Comments
 (0)