diff --git a/tests/test_call.c b/tests/test_call.c index 69d93557..9832584e 100644 --- a/tests/test_call.c +++ b/tests/test_call.c @@ -12,6 +12,7 @@ #include "chat_core.h" #include "chat_sync.h" #include "chat_event.h" +#include "chat_setting.h" #include "member_sync.h" #include "../call/call.h" #include "../dm/dm_core.h" @@ -61,7 +62,7 @@ enum call_phase { P_WAIT_ACCEPTED, /* обе ACTIVE */ P_SEND_MEDIA, /* A: call_send_media (тестовый Opus-кадр) */ P_WAIT_MEDIA, /* B: media_recv_cb получил кадр */ - P_VIDEO_CONFIG, P_VIDEO_SEND, P_VIDEO_HOLD, P_VIDEO_BUSY, P_VIDEO_RESUME, P_VIDEO_SWITCH, P_VIDEO_SWITCH_WAIT, + P_VIDEO_CONFIG, P_VIDEO_SEND, P_VIDEO_HOLD, P_VIDEO_BUSY, P_VIDEO_RESUME, P_VIDEO_RANGE_WAIT, P_VIDEO_SWITCH, P_VIDEO_SWITCH_WAIT, P_HANGUP, /* A: call_hangup */ P_WAIT_ENDED1, /* обе ENDED */ P_CALL2_START, /* A: call_start (2-й звонок) */ @@ -497,6 +498,11 @@ static void call_tick(void* arg) { } break; case P_VIDEO_CONFIG: { + if (strcmp(chat_setting_get(A, "call_video_bitrate_range_kbps"), "300:4000") + || chat_setting_set(A, "call_video_bitrate_range_kbps", "4000:300") != -2 + || strcmp(chat_setting_get(A, "call_video_bitrate_range_kbps"), "300:4000")) { + DEBUG_ERROR(DEBUG_CATEGORY_CALL, "video range default/atomic validation failed"); t->result = 2; break; + } for (unsigned i = 4; i < sizeof(g_video_data); i++) g_video_data[i] = (uint8_t)i; struct call_video_caps caps = {0}; caps.encode[0] = caps.encode[1] = caps.decode[0] = caps.decode[1] = (struct call_video_limit){1280, 720, 30, 1280 * 720 * 30}; @@ -528,15 +534,27 @@ static void call_tick(void* arg) { case P_VIDEO_RESUME: if (!g_video_frames || !g_rate_commands) break; if (g_video_error) { t->result = 2; break; } + // Настройка меняется при незавершённой команде; старый ACK остаётся действительным. + if (chat_setting_set(A, "call_video_bitrate_range_kbps", "300:350")) { t->result = 2; break; } if (g_rate_commands != 1 || g_rate_generation != 1 || g_rate_bps != 400000 || call_video_rate_applied(A, t->call_id, 2, g_rate_request, g_rate_bps) != -1 || call_video_rate_applied(A, t->call_id, 1, g_rate_request + 1, g_rate_bps) != -1 || call_video_rate_applied(A, t->call_id, 1, g_rate_request, g_rate_bps)) { fprintf(stderr, "video rate command/completion mismatch\n"); t->result = 2; break; } + t->phase = P_VIDEO_RANGE_WAIT; break; + case P_VIDEO_RANGE_WAIT: + if (g_rate_commands < 2) break; + if (g_rate_commands != 2 || g_rate_generation != 1 || g_rate_bps != 350000 + || call_video_rate_applied(A, t->call_id, 1, g_rate_request, g_rate_bps)) { + DEBUG_ERROR(DEBUG_CATEGORY_CALL, "video live range change did not converge to 350kbps"); t->result = 2; break; + } + if (chat_setting_set(A, "call_video_bitrate_range_kbps", "500:1000") + || call_video_configure_rate(A, t->call_id, 2, 350000, 400000) != -1 + || chat_setting_set(A, "call_video_bitrate_range_kbps", "300:350")) { t->result = 2; break; } t->phase = P_VIDEO_SWITCH; break; case P_VIDEO_SWITCH: { - if (call_video_configure_rate(A, t->call_id, 2, 400000, 400000) + if (call_video_configure_rate(A, t->call_id, 2, 350000, 400000) || call_video_rate_applied(A, t->call_id, 1, g_rate_request, g_rate_bps) != -1) { t->result = 2; break; } struct call_video_frame f = video_test_frame(t->call_id, 2); if (call_video_send_frame(A, &f) != 1) { t->result = 2; break; } @@ -551,7 +569,7 @@ static void call_tick(void* arg) { // Завершение во время незавершённой сборки/паузы приёма не оставляет callbacks. g_video_ready = 0; { - if (call_video_configure_rate(A, t->call_id, 3, 400000, 400000)) { t->result = 2; break; } + if (call_video_configure_rate(A, t->call_id, 3, 350000, 400000)) { t->result = 2; break; } struct call_video_frame f = video_test_frame(t->call_id, 3); if (call_video_send_frame(A, &f) != 1) { t->result = 2; break; } }