audiocore: Add unit tests for audiocore

Signed-off-by: Matthias Blankertz <matthias@blankertz.org>
This commit is contained in:
2024-06-01 17:27:58 +02:00
parent 910774cbe6
commit 23a9c3f507
2 changed files with 181 additions and 6 deletions

View File

@@ -8,8 +8,10 @@
void core1_main(void)
{
if (!i2s_init(shared_context.out_pin, shared_context.sideset_base, shared_context.samplerate))
if (!i2s_init(shared_context.out_pin, shared_context.sideset_base, shared_context.samplerate)) {
multicore_fifo_push_blocking(MP_EIO);
return;
}
multicore_fifo_push_blocking(0);
uint32_t cmd;

View File

@@ -3,17 +3,190 @@
#include "audiocore.h"
#include "i2s.h"
#include "py/mperrno.h"
#include "unity.h"
struct audiocore_shared_context shared_context;
bool i2s_init(int out_pin, int sideset_base, int samplerate) {}
static bool i2s_init_return;
static bool i2s_initialized = false;
static unsigned multicore_fifo_push_last;
void i2s_deinit(void) {}
static unsigned (*multicore_fifo_pop_blocking_cb)(void);
void multicore_fifo_push_blocking(unsigned val) {}
bool i2s_init(int out_pin, int sideset_base, int samplerate)
{
TEST_ASSERT_FALSE(i2s_initialized);
if (i2s_init_return)
i2s_initialized = true;
return i2s_init_return;
}
unsigned multicore_fifo_pop_blocking(void) {}
void i2s_deinit(void)
{
TEST_ASSERT_TRUE(i2s_initialized);
i2s_initialized = false;
}
void test_something(void) { TEST_ASSERT_TRUE(1); }
void multicore_fifo_push_blocking(unsigned val) { multicore_fifo_push_last = val; }
unsigned multicore_fifo_pop_blocking(void)
{
if (multicore_fifo_pop_blocking_cb)
return multicore_fifo_pop_blocking_cb();
return 0;
}
void test_audiocore_handles_i2sinit_failure(void)
{
i2s_init_return = false;
core1_main();
TEST_ASSERT_EQUAL(multicore_fifo_push_last, MP_EIO);
}
unsigned audiocore_init_deinit_pop_cb(void)
{
TEST_ASSERT_EQUAL(0, multicore_fifo_push_last);
TEST_ASSERT_TRUE(i2s_initialized);
return AUDIOCORE_CMD_SHUTDOWN;
}
void test_audiocore_init_deinit(void)
{
multicore_fifo_pop_blocking_cb = &audiocore_init_deinit_pop_cb;
i2s_init_return = true;
core1_main();
TEST_ASSERT_EQUAL(0, multicore_fifo_push_last);
TEST_ASSERT_FALSE(i2s_initialized);
}
void test_audiocore_buffer_space(void)
{
// empty ring buffer
shared_context.audio_buffer_read = shared_context.audio_buffer_write = 0;
TEST_ASSERT_EQUAL(AUDIO_BUFFER_SIZE - 1, audiocore_get_audio_buffer_space());
shared_context.audio_buffer_read = shared_context.audio_buffer_write = 23;
TEST_ASSERT_EQUAL(AUDIO_BUFFER_SIZE - 1, audiocore_get_audio_buffer_space());
shared_context.audio_buffer_read = shared_context.audio_buffer_write = AUDIO_BUFFER_SIZE - 1;
TEST_ASSERT_EQUAL(AUDIO_BUFFER_SIZE - 1, audiocore_get_audio_buffer_space());
// full ring buffer
shared_context.audio_buffer_write = 0;
shared_context.audio_buffer_read = 1;
TEST_ASSERT_EQUAL(0, audiocore_get_audio_buffer_space());
shared_context.audio_buffer_write = AUDIO_BUFFER_SIZE - 1;
shared_context.audio_buffer_read = 0;
TEST_ASSERT_EQUAL(0, audiocore_get_audio_buffer_space());
// write > read
shared_context.audio_buffer_write = 10;
shared_context.audio_buffer_read = 0;
TEST_ASSERT_EQUAL(AUDIO_BUFFER_SIZE - 1 - 10, audiocore_get_audio_buffer_space());
// write < read
shared_context.audio_buffer_write = 0;
shared_context.audio_buffer_read = 10;
TEST_ASSERT_EQUAL(9, audiocore_get_audio_buffer_space());
}
void test_audiocore_buffer_avail(void)
{
// empty ring buffer
shared_context.audio_buffer_read = shared_context.audio_buffer_write = 0;
TEST_ASSERT_EQUAL(0, audiocore_get_audio_buffer_avail());
shared_context.audio_buffer_read = shared_context.audio_buffer_write = 23;
TEST_ASSERT_EQUAL(0, audiocore_get_audio_buffer_avail());
shared_context.audio_buffer_read = shared_context.audio_buffer_write = AUDIO_BUFFER_SIZE - 1;
TEST_ASSERT_EQUAL(0, audiocore_get_audio_buffer_avail());
// full ring buffer
shared_context.audio_buffer_write = 0;
shared_context.audio_buffer_read = 1;
TEST_ASSERT_EQUAL(AUDIO_BUFFER_SIZE - 1, audiocore_get_audio_buffer_avail());
shared_context.audio_buffer_write = AUDIO_BUFFER_SIZE - 1;
shared_context.audio_buffer_read = 0;
TEST_ASSERT_EQUAL(AUDIO_BUFFER_SIZE - 1, audiocore_get_audio_buffer_avail());
// write > read
shared_context.audio_buffer_write = 10;
shared_context.audio_buffer_read = 0;
TEST_ASSERT_EQUAL(10, audiocore_get_audio_buffer_avail());
// write < read
shared_context.audio_buffer_write = 0;
shared_context.audio_buffer_read = 10;
TEST_ASSERT_EQUAL(AUDIO_BUFFER_SIZE - 10, audiocore_get_audio_buffer_avail());
}
static unsigned fill_buffer_helper(void)
{
uint32_t test_data[100];
uint32_t ctr = 0;
unsigned avail, filled = 0;
while ((avail = audiocore_get_audio_buffer_space()) > 0) {
const unsigned todo = avail > 100 ? 100 : avail;
for (unsigned i = 0; i < todo; ++i)
test_data[i] = ctr++;
audiocore_audio_buffer_put(test_data, todo);
filled += todo;
}
return filled;
}
void test_audiocore_buffer_put(void)
{
shared_context.audio_buffer_read = shared_context.audio_buffer_write = 0;
TEST_ASSERT_EQUAL(AUDIO_BUFFER_SIZE - 1, fill_buffer_helper());
for (unsigned i = 0; i < AUDIO_BUFFER_SIZE - 1; ++i) {
TEST_ASSERT_EQUAL(i, shared_context.audio_buffer[i]);
}
// test wraparound fill
shared_context.audio_buffer_read = shared_context.audio_buffer_write = AUDIO_BUFFER_SIZE - 10;
TEST_ASSERT_EQUAL(AUDIO_BUFFER_SIZE - 1, fill_buffer_helper());
for (unsigned i = 0; i < AUDIO_BUFFER_SIZE - 1; ++i) {
TEST_ASSERT_EQUAL(i, shared_context.audio_buffer[(i + AUDIO_BUFFER_SIZE - 10) % AUDIO_BUFFER_SIZE]);
}
}
static unsigned get_buffer_helper(void)
{
uint32_t test_data[100];
uint32_t ctr = 0;
unsigned avail, gotten = 0;
while ((avail = audiocore_get_audio_buffer_avail()) > 0) {
const unsigned todo = avail > 100 ? 100 : avail;
audiocore_audio_buffer_get(test_data, todo);
for (unsigned i = 0; i < todo; ++i)
TEST_ASSERT_EQUAL(ctr++, test_data[i]);
gotten += todo;
}
return gotten;
}
void test_audiocore_buffer_get(void)
{
shared_context.audio_buffer_read = 0;
shared_context.audio_buffer_write = AUDIO_BUFFER_SIZE - 1;
for (unsigned i = 0; i < AUDIO_BUFFER_SIZE - 1; ++i)
shared_context.audio_buffer[i] = i;
TEST_ASSERT_EQUAL(AUDIO_BUFFER_SIZE - 1, get_buffer_helper());
// test wraparound read
shared_context.audio_buffer_read = 10;
shared_context.audio_buffer_write = 9;
for (unsigned i = 0; i < AUDIO_BUFFER_SIZE - 1; ++i)
shared_context.audio_buffer[(i + 10) % AUDIO_BUFFER_SIZE] = i;
TEST_ASSERT_EQUAL(AUDIO_BUFFER_SIZE - 1, get_buffer_helper());
}