From 04dc53672a507a54e52a6b9cb7b84faa7dd1e490 Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 22 Oct 2026 20:43:51 +0200 Subject: [PATCH] Add regression for media availability group isolation --- tests/Makefile.am | 6 ++++++ tests/test_media_replication.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 tests/test_media_replication.c diff --git a/tests/Makefile.am b/tests/Makefile.am index 94332614..10d52628 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -901,6 +901,12 @@ test_media_query_CFLAGS = $(test_media_delivery_download_CFLAGS) test_media_query_LDADD = $(LIBUTUN) $(CRYPTO_LIBS) $(COMMON_LIBS) test_media_query_LDFLAGS = -Wl,--wrap=etcp_route_send -Wl,--wrap=RAND_bytes +check_PROGRAMS += test_media_replication +test_media_replication_SOURCES = test_media_replication.c media_delivery_fixture.h +test_media_replication_CFLAGS = $(test_media_delivery_download_CFLAGS) +test_media_replication_LDADD = $(LIBUTUN) $(CRYPTO_LIBS) $(COMMON_LIBS) +test_media_replication_LDFLAGS = -Wl,--wrap=etcp_route_send -Wl,--wrap=RAND_bytes + if OS_LINUX check_PROGRAMS += test_media_blocks test_media_blocks_SOURCES = test_media_blocks.c media_delivery_fixture.h diff --git a/tests/test_media_replication.c b/tests/test_media_replication.c new file mode 100644 index 00000000..b7490c0e --- /dev/null +++ b/tests/test_media_replication.c @@ -0,0 +1,30 @@ +/* Репликация: настоящие обработчики media/SQLite, управляемый транспорт и ошибки. */ +#include "media_delivery_fixture.h" + +static sqlite3_int64 scalar(sqlite3* db, const char* sql) { + sqlite3_stmt* st = NULL; REQUIRE(sqlite3_prepare_v2(db, sql, -1, &st, NULL) == SQLITE_OK); + REQUIRE(sqlite3_step(st) == SQLITE_ROW); + sqlite3_int64 value = sqlite3_column_int64(st, 0); + REQUIRE(sqlite3_finalize(st) == SQLITE_OK); return value; +} + +/* Группа сообщения задаётся router; другое значение внутри HAVE не даёт записать чужую группу. */ +static void test_group_boundary(void) { + struct UTUN_INSTANCE* a = instance(SERVER); + a->md.is_supernode = 1; + struct packet p = {.from = CLIENT, .to = SERVER, .group = GROUP, .len = MEDIA_HAVE_BLOCK_SIZE}; + struct media_pkt_have_block* hb = (struct media_pkt_have_block*)p.data; + hb->subcmd = MEDIA_SUBCMD_HAVE_BLOCK; hb->group_id = GROUP + 1; hb->block_id[0] = 1; hb->timestamp = 1; + receive(a, &p); + REQUIRE(scalar(a->md.db, "SELECT COUNT(*) FROM block_availability WHERE group_id=112") == 0); + destroy(a); reset(); +} + +int main(void) { + debug_config_init(); debug_set_level(DEBUG_LEVEL_ERROR); + ua = uasync_create(); REQUIRE(ua); + test_group_boundary(); + uasync_destroy(ua, 0); + DEBUG_ERROR(DEBUG_CATEGORY_DEBUG, "media replication regressions: PASS"); + return 0; +}