|
|
|
|
@ -6,11 +6,12 @@
|
|
|
|
|
* пробуждение), clamp min_sleep и re-entry в wake_all_waiters. |
|
|
|
|
* |
|
|
|
|
* Интервалы задаются через standby_set_intervals_ms() (быстрые: 100-300мс). |
|
|
|
|
* Время продвигается через uasync_poll(ua, -1) (до ближайшего таймера) |
|
|
|
|
* и uasync_poll(ua, X) (частичное ожидание). |
|
|
|
|
* Тестовые часы ждут ближайший таймер или заданный интервал; |
|
|
|
|
* callbacks и смену фаз выполняет настоящий uasync. |
|
|
|
|
*/ |
|
|
|
|
#include "standby.h" |
|
|
|
|
#include "debug_config.h" |
|
|
|
|
#include "../../../../tests/test_clock.h" |
|
|
|
|
#include <stdio.h> |
|
|
|
|
#include <string.h> |
|
|
|
|
|
|
|
|
|
@ -72,12 +73,13 @@ static void reset_standby(void) {
|
|
|
|
|
|
|
|
|
|
/* продвинуть время до ближайшего таймера (фаза переключится) */ |
|
|
|
|
static void run_to_next_phase(void) { |
|
|
|
|
uasync_poll(g_ua, -1); |
|
|
|
|
test_clock_next_timer(g_ua); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int main(void) { |
|
|
|
|
debug_config_init(); |
|
|
|
|
debug_set_level(DEBUG_LEVEL_INFO); |
|
|
|
|
test_clock_init(1000); |
|
|
|
|
|
|
|
|
|
g_ua = uasync_create(); |
|
|
|
|
if (!g_ua) { printf("uasync_create failed\n"); return 1; } |
|
|
|
|
@ -133,7 +135,7 @@ int main(void) {
|
|
|
|
|
run_to_next_phase(); /* → SLEEP */ |
|
|
|
|
CHECK(standby_get_sleep_tb() > 0, "wait(SLEEP): in sleep"); |
|
|
|
|
standby_wait(NULL, wait_cb); |
|
|
|
|
uasync_poll(g_ua, -1); /* конец сна */ |
|
|
|
|
run_to_next_phase(); /* конец сна */ |
|
|
|
|
uasync_poll(g_ua, 0); |
|
|
|
|
CHECK(g_wait_calls == 1, "wait(SLEEP): fired at sleep end"); |
|
|
|
|
standby_set_enabled(NULL, 0); |
|
|
|
|
@ -144,7 +146,7 @@ int main(void) {
|
|
|
|
|
run_to_next_phase(); /* → SLEEP */ |
|
|
|
|
void* h = standby_wait(NULL, wait_cb); |
|
|
|
|
standby_wait_cancel(h); |
|
|
|
|
uasync_poll(g_ua, -1); /* конец сна */ |
|
|
|
|
run_to_next_phase(); /* конец сна */ |
|
|
|
|
uasync_poll(g_ua, 0); |
|
|
|
|
CHECK(g_wait_calls == 0, "wait_cancel: cb not called"); |
|
|
|
|
standby_set_enabled(NULL, 0); |
|
|
|
|
@ -170,7 +172,7 @@ int main(void) {
|
|
|
|
|
CHECK(standby_get_sleep_tb() > 0, "notify(<min_sleep): still sleeping"); |
|
|
|
|
|
|
|
|
|
/* ── 13. notify в SLEEP после min_sleep → раннее пробуждение ── */ |
|
|
|
|
uasync_poll(g_ua, 2000); /* +200ms → прошло min_sleep(100ms) */ |
|
|
|
|
test_clock_run_for(g_ua, 2000); /* +200ms → прошло min_sleep(100ms) */ |
|
|
|
|
standby_notify_network_activity(); |
|
|
|
|
CHECK(standby_get_sleep_tb() == 0, "notify(>min_sleep): woke → sleep_tb 0"); |
|
|
|
|
CHECK(standby_get_active_remaining_tb() > 0, "notify(>min_sleep): woke → active_remaining > 0"); |
|
|
|
|
@ -181,7 +183,7 @@ int main(void) {
|
|
|
|
|
standby_set_enabled(NULL, 1); |
|
|
|
|
run_to_next_phase(); /* → SLEEP */ |
|
|
|
|
standby_wait(NULL, wait_cb); |
|
|
|
|
uasync_poll(g_ua, 2000); /* +200ms → min_sleep прошёл */ |
|
|
|
|
test_clock_run_for(g_ua, 2000); /* +200ms → min_sleep прошёл */ |
|
|
|
|
standby_notify_network_activity(); |
|
|
|
|
uasync_poll(g_ua, 0); |
|
|
|
|
CHECK(g_wait_calls == 1, "early wake: waiter fired immediately"); |
|
|
|
|
@ -194,7 +196,7 @@ int main(void) {
|
|
|
|
|
standby_set_switch_callback(switch_cb, NULL); |
|
|
|
|
standby_set_enabled(NULL, 1); |
|
|
|
|
run_to_next_phase(); /* → SLEEP */ |
|
|
|
|
uasync_poll(g_ua, 2000); /* +200ms */ |
|
|
|
|
test_clock_run_for(g_ua, 2000); /* +200ms */ |
|
|
|
|
standby_notify_network_activity(); |
|
|
|
|
CHECK(standby_get_sleep_tb() > 0, "clamp: min_sleep==sleep → notify ignored"); |
|
|
|
|
standby_set_enabled(NULL, 0); |
|
|
|
|
@ -204,7 +206,7 @@ int main(void) {
|
|
|
|
|
standby_set_enabled(NULL, 1); |
|
|
|
|
run_to_next_phase(); /* → SLEEP */ |
|
|
|
|
standby_wait(NULL, reentry_cb); |
|
|
|
|
uasync_poll(g_ua, 2000); /* +200ms → min_sleep прошёл */ |
|
|
|
|
test_clock_run_for(g_ua, 2000); /* +200ms → min_sleep прошёл */ |
|
|
|
|
standby_notify_network_activity(); /* раннее пробуждение → wake_all_waiters */ |
|
|
|
|
CHECK(g_reentry_calls == 1, "re-entry: wake fired waiter once (no infinite loop)"); |
|
|
|
|
CHECK(standby_is_enabled() == 1, "re-entry: still enabled after early wake"); |
|
|
|
|
@ -238,5 +240,6 @@ int main(void) {
|
|
|
|
|
printf("=== standby unit test: %d checks, %d failures ===\n", g_checks, g_failures); |
|
|
|
|
if (g_failures == 0) printf("PASS\n"); |
|
|
|
|
else printf("FAIL\n"); |
|
|
|
|
test_clock_finish(); |
|
|
|
|
return g_failures ? 1 : 0; |
|
|
|
|
} |
|
|
|
|
|