diff --git a/tests/lib/edge_impulse/prj.conf b/tests/lib/edge_impulse/prj.conf index bebe9d8ae2f..903146c049d 100644 --- a/tests/lib/edge_impulse/prj.conf +++ b/tests/lib/edge_impulse/prj.conf @@ -1,4 +1,5 @@ # Tests +CONFIG_ZTEST_SHUFFLE=y CONFIG_ZTEST_NEW_API=y CONFIG_ZTEST=y diff --git a/tests/lib/edge_impulse/src/edge_impulse_zip/edge-impulse-sdk/ei_run_classifier_mock.cpp b/tests/lib/edge_impulse/src/edge_impulse_zip/edge-impulse-sdk/ei_run_classifier_mock.cpp index 4f4f173ca3b..69d3dd797c4 100644 --- a/tests/lib/edge_impulse/src/edge_impulse_zip/edge-impulse-sdk/ei_run_classifier_mock.cpp +++ b/tests/lib/edge_impulse/src/edge_impulse_zip/edge-impulse-sdk/ei_run_classifier_mock.cpp @@ -7,6 +7,12 @@ #include #include +static size_t prediction_idx; + +void ei_run_classifier_mock_init(void) +{ + prediction_idx = 0; +} /* Input data must be ascending sequence of floats. Difference between * subsequent elements of input sequence equals 1. The first element @@ -44,7 +50,6 @@ EI_IMPULSE_ERROR run_classifier(signal_t *signal, ei_impulse_result_t *result, bool debug) { - static size_t prediction_idx = 0; ARG_UNUSED(debug); /* Test getting data. */ diff --git a/tests/lib/edge_impulse/src/edge_impulse_zip/ei_run_classifier_mock.h b/tests/lib/edge_impulse/src/edge_impulse_zip/ei_run_classifier_mock.h new file mode 100644 index 00000000000..d8fb715c4a3 --- /dev/null +++ b/tests/lib/edge_impulse/src/edge_impulse_zip/ei_run_classifier_mock.h @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2023 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause + */ + +#ifndef _EI_RUN_CLASSIFIER_MOCK_H_ +#define _EI_RUN_CLASSIFIER_MOCK_H_ + +void ei_run_classifier_mock_init(void); + +#endif /* _EI_RUN_CLASSIFIER_MOCK_H_ */ diff --git a/tests/lib/edge_impulse/src/main.cpp b/tests/lib/edge_impulse/src/main.cpp index 6367df06cf1..c70d52dfc1e 100644 --- a/tests/lib/edge_impulse/src/main.cpp +++ b/tests/lib/edge_impulse/src/main.cpp @@ -8,12 +8,16 @@ #include #include #include +#include #define EI_TEST_SEM_TIMEOUT K_MSEC(200 + (10 * EI_MOCK_BUSY_WAIT_TIME / 1000)) #define EI_TEST_ISR_WINDOW_SHIFT 2 #define EI_TEST_THREAD_WINDOW_SHIFT 2 #define EI_TEST_WINDOW_SHIFT_CB 1 +#define TEST_THREAD_SLEEP_MS 10 +static size_t timer_fn_calls; + static atomic_t rerun_in_cb; static size_t prediction_idx; @@ -141,6 +145,13 @@ static void result_ready_cb(int err) static void *test_init(void) { + static bool init_once; + + if (init_once) { + return NULL; + } + init_once = true; + zassert_equal(ei_wrapper_get_frame_size(), EI_CLASSIFIER_RAW_SAMPLES_PER_FRAME, "Wrong frame size"); zassert_equal(ei_wrapper_get_window_size(), EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE, @@ -369,14 +380,13 @@ ZTEST(suite0, test_data_after_start) static void test_thread_fn(void) { - static const size_t sleep_ms = 10; int err; for (size_t i = 0; i <= EI_TEST_THREAD_WINDOW_SHIFT; i++) { err = add_input_data(prediction_idx, 0); zassert_ok(err, "Cannot add input data"); - k_sleep(K_MSEC(sleep_ms)); + k_sleep(K_MSEC(TEST_THREAD_SLEEP_MS)); } } @@ -399,19 +409,20 @@ ZTEST(suite0, test_data_thread) zassert_ok(err, "Cannot start prediction"); err = k_sem_take(&test_sem, EI_TEST_SEM_TIMEOUT); zassert_ok(err, "Cannot take semaphore"); + err = k_thread_join(&thread, K_MSEC(TEST_THREAD_SLEEP_MS * 777)); + zassert_ok(err, "Thread still running"); } void timer_fn(struct k_timer *timer) { - static size_t calls = 0; int err; err = add_input_data(prediction_idx, 0); zassert_ok(err, "Cannot add input data"); - calls++; + timer_fn_calls++; - if (calls > EI_TEST_ISR_WINDOW_SHIFT) { + if (timer_fn_calls > EI_TEST_ISR_WINDOW_SHIFT) { k_timer_stop(timer); } } @@ -419,6 +430,7 @@ void timer_fn(struct k_timer *timer) ZTEST(suite0, test_data_isr) { static const size_t period_ms = 10; + timer_fn_calls = 0; static K_TIMER_DEFINE(test_timer, timer_fn, NULL); int err; @@ -434,11 +446,16 @@ ZTEST(suite0, test_data_isr) static void setup_fn(void *unused) { ARG_UNUSED(unused); + bool cancelled; int err = ei_wrapper_clear_data(&cancelled); + prediction_idx = 0; + ei_run_classifier_mock_init(); zassert_false(cancelled, "Prediction was not cancelled"); zassert_ok(err, "Cannot clear data"); + err = k_sem_take(&test_sem, K_MSEC(20)); + zassert_true(err, "Unhandled prediction result"); } ZTEST_SUITE(suite0, NULL, test_init, setup_fn, NULL, NULL);