Skip to content

Commit 33a0b24

Browse files
committed
add ringbuffer tests
1 parent 2982a1a commit 33a0b24

File tree

2 files changed

+70
-1
lines changed

2 files changed

+70
-1
lines changed

test/test_c_minilib_error.d/meson.build

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,18 @@ test_c_minilib_error_with_backtrace_exe = executable('test_c_minilib_error_with_
2525
include_directories: include_directories('../../include'),
2626
)
2727

28-
test('test_c_minilib_error_with_backtrace', test_c_minilib_error_with_backtrace_exe)
28+
test('test_c_minilib_error_with_backtrace', test_c_minilib_error_with_backtrace_exe)
29+
30+
test_c_minilib_error_ringbuffer_name = 'test_c_minilib_error_ringbuffer.c'
31+
32+
test_c_minilib_error_ringbuffer_exe = executable('test_c_minilib_error_ringbuffer',
33+
sources: [
34+
sources,
35+
test_c_minilib_error_ringbuffer_name,
36+
test_runner.process(test_c_minilib_error_ringbuffer_name),
37+
],
38+
dependencies: test_dependencies,
39+
include_directories: include_directories('../../include'),
40+
)
41+
42+
test('test_c_minilib_error_ringbuffer', test_c_minilib_error_ringbuffer_exe)
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#include "c_minilib_error.h"
2+
#include "common.h"
3+
#include <unity.h>
4+
5+
void test_ring_buffer_wraparound(void) {
6+
// Configure ring buffer to small size for testing
7+
cme_configure(
8+
&(struct cme_Settings){.ring_size = 4, .is_ring_growable = false});
9+
cme_init();
10+
11+
// Allocate exactly `ring_size` errors
12+
struct cme_Error *errs[4];
13+
for (int i = 0; i < 4; ++i) {
14+
char msg[32];
15+
snprintf(msg, sizeof(msg), "Error %d", i);
16+
errs[i] = cme_error_create(100 + i, "wrap.c", "wrap_func", i, msg);
17+
TEST_ASSERT_NOT_NULL(errs[i]);
18+
TEST_ASSERT_EQUAL(100 + i, errs[i]->code);
19+
TEST_ASSERT_EQUAL_STRING(msg, errs[i]->msg);
20+
}
21+
22+
// Allocate one more to cause wraparound
23+
struct cme_Error *wrap_err =
24+
cme_error_create(200, "wrap.c", "wrap_func", 999, "WRAPPED");
25+
TEST_ASSERT_NOT_NULL(wrap_err);
26+
27+
// It should overwrite the first error (errs[0])
28+
TEST_ASSERT_EQUAL_PTR(wrap_err, errs[0]);
29+
TEST_ASSERT_EQUAL(200, wrap_err->code);
30+
TEST_ASSERT_EQUAL_STRING("WRAPPED", wrap_err->msg);
31+
32+
cme_destroy();
33+
}
34+
35+
void test_ring_buffer_isolation_between_slots(void) {
36+
cme_configure(
37+
&(struct cme_Settings){.ring_size = 2, .is_ring_growable = false});
38+
cme_init();
39+
40+
struct cme_Error *e1 = cme_error_create(1, "iso.c", "func", 1, "E1");
41+
struct cme_Error *e2 = cme_error_create(2, "iso.c", "func", 2, "E2");
42+
43+
// Ensure different slots
44+
TEST_ASSERT_NOT_NULL(e1);
45+
TEST_ASSERT_NOT_NULL(e2);
46+
TEST_ASSERT_NOT_EQUAL(e1, e2);
47+
48+
// E1 and E2 contain isolated data
49+
TEST_ASSERT_EQUAL(1, e1->code);
50+
TEST_ASSERT_EQUAL_STRING("E1", e1->msg);
51+
TEST_ASSERT_EQUAL(2, e2->code);
52+
TEST_ASSERT_EQUAL_STRING("E2", e2->msg);
53+
54+
cme_destroy();
55+
}

0 commit comments

Comments
 (0)