7#define CHECK(condition) \
10 fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, #condition); \
32 uint32_t now_ms, uint32_t budget_ms) {
36 CHECK(budget_ms > 0 && budget_ms <= f->expected_budget);
52 result.sampled_at_ms = now_ms;
71 .devices = {{10,
true}, {11,
true}},
72 .probe_timeout_ms = 100,
73 .retry_interval_ms = 20,
74 .heartbeat_interval_ms = 1000,
75 .battery_interval_ms = 200,
76 .battery_max_age_ms = 300,
77 .callback_budget_ms = 1,
79 .probe_max_attempts = 2,
80 .publication_max_attempts = 2};
85 memset(f, 0,
sizeof(*f));
101 setup(&t, &f, &c, 0);
114 CHECK(f.
sent.devices[0].device_id == 10 && f.
sent.devices[0].complete);
122 for (
unsigned i = 0; i <
sizeof(results) /
sizeof(results[0]); ++i) {
127 setup(&t, &f, &c, 0);
133 CHECK(f.
sent.devices[0].reply.result == results[i]);
134 CHECK(f.
sent.devices[0].reply.diagnostic == 42);
147 setup(&t, &f, &c, 0);
156 unsigned calls = f.
calls[0];
170 setup(&t, &f, &c, 0);
194 setup(&t, &f, &c, 0);
210 const uint32_t intervals[] = {500, 1000};
211 for (
unsigned i = 0; i < 2; ++i) {
216 setup(&t, &f, &c, 5);
241 uint32_t
start = UINT32_MAX - 50U;
267 setup(&t, &f, &c, 0);
305 setup(&t, &f, &c, 0);
350 setup(&t, &f, &c, 0);
358 setup(&t, &f, &c, 0);
367 setup(&t, &f, &c, 0);
397 for (
unsigned i = 0; i < 13; ++i) {
451 setup(&t, &f, &c, 0);
473 setup(&t, &f, &c, 0);
486 const uint32_t starts[] = {0, UINT32_MAX - 20U};
487 for (
unsigned n = 0;
n < 2; ++
n) {
495 uint32_t
start = starts[
n];
507 CHECK(status->probes_complete && status->deadline_expired);
510 CHECK(status->devices[1].reply.diagnostic ==
512 CHECK(status->devices[1].attempts == 1);
535 setup(&t, &f, &c, 0);
547 setup(&t, &f, &c, 0);
553 setup(&t, &f, &c, 0);
565 setup(&t, &f, &c, 0);
595 puts(
"17 self-test test groups passed");
static board_spi_device_t devices[BOARD_SPI_COUNT]
static emmc_status_t probe(emmc_log_t *log, uint32_t k, bool *valid, uint32_t *session)
static const emmc_port_t port
static void start(gnss_frame_parser_t *p, uint8_t byte)
*brief user defined string literal for JSON values *sa std::size_t n
bool self_test_init(self_test_t *t, const self_test_config_t *config, const self_test_port_t *port, void *context, uint32_t now_ms)
void self_test_tick(self_test_t *t, uint32_t now_ms)
bool self_test_reset(self_test_t *t, uint32_t now_ms)
const self_test_status_t * self_test_status(const self_test_t *t)
static self_test_reply_t reply(self_test_result_t result, int32_t diagnostic)
#define SELF_TEST_DIAG_BAD_REPLY
#define SELF_TEST_MAX_DEVICES
#define SELF_TEST_DIAG_STALE_BATTERY
#define SELF_TEST_DIAG_SESSION_TIMEOUT
@ SELF_TEST_NOT_CONFIGURED
@ SELF_TEST_NOT_IMPLEMENTED
unsigned publication_calls
uint32_t last_probe_budget
self_test_battery_t battery
self_test_reply_t publication
unsigned calls[SELF_TEST_MAX_DEVICES]
uint8_t attempts[SELF_TEST_MAX_DEVICES]
self_test_reply_t replies[SELF_TEST_MAX_DEVICES]
idle_battery_state_t battery
uint32_t heartbeat_interval_ms
uint32_t session_timeout_ms
self_test_device_t devices[SELF_TEST_MAX_DEVICES]
uint32_t callback_budget_ms
uint32_t retry_interval_ms
uint32_t battery_interval_ms
uint32_t probe_timeout_ms
uint8_t publication_max_attempts
uint32_t battery_max_age_ms
uint8_t probe_max_attempts
self_test_reply_t(* probe)(void *context, uint16_t device_id, uint8_t attempt, uint32_t now_ms, uint32_t budget_ms)
self_test_result_t result
static void test_pass_and_inventory(void)
static void test_reset_and_copied_dependencies(void)
static void test_pending_timeout_and_fairness(void)
static void test_full_inventory_budget(void)
static void test_failure_completes_after_three_attempts(void)
static self_test_battery_t battery(void *context, uint32_t now_ms, uint32_t budget_ms)
static void test_invalid_inputs(void)
static void test_terminal_results(void)
static void test_publication_retry_and_recovery(void)
static void test_timeout_retry(void)
static void test_probe_retry_bounds_and_recovery(void)
static self_test_reply_t probe(void *context, uint16_t id, uint8_t attempt, uint32_t now_ms, uint32_t budget_ms)
static void test_wraparound(void)
static void test_heartbeat_boundaries_and_gap(void)
static void test_session_deadline(void)
static self_test_config_t config(void)
static void test_malformed_driver_results(void)
static self_test_reply_t publish_status(void *context, const self_test_status_t *status, uint32_t budget_ms)
static void test_deadline_retry_and_unstarted(void)
static void test_battery_validity(void)
static void test_missing_and_optional(void)