From 439011ce606125e1d209b68dbf04c996fe7cb8a2 Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 22 Oct 2026 15:13:14 +0200 Subject: [PATCH] Use real media schema and validate duplicate download ownership --- tests/test_media_delivery_download.c | 16 +++++++++++----- tests/test_media_download_timeout.c | 3 +++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/tests/test_media_delivery_download.c b/tests/test_media_delivery_download.c index a29f004a..40d4fa4c 100644 --- a/tests/test_media_delivery_download.c +++ b/tests/test_media_delivery_download.c @@ -78,6 +78,9 @@ static void test_cleanup(void) { #include "../src/utun_instance.h" static struct UTUN_INSTANCE* make_minimal_instance(sqlite3* db) { + if (media_index_init(db) || media_index_set_base(db, g_temp_dir)) { + DEBUG_ERROR(DEBUG_CATEGORY_MEDIA, "download test media schema initialization failed"); exit(1); + } struct UTUN_INSTANCE* inst = u_calloc(1, sizeof(*inst)); if (!inst) return NULL; inst->ua = g_ua; @@ -104,6 +107,7 @@ static struct media_download* make_test_dl(sqlite3* db, struct UTUN_INSTANCE* in make_uuid(dl->media_id); dl->num_blocks = num_blocks; snprintf(dl->dest_path, sizeof(dl->dest_path), "%s/test.bin", g_temp_dir); + snprintf(dl->media_base, sizeof(dl->media_base), "%s", g_temp_dir); dl->blocks = u_calloc((size_t)num_blocks, sizeof(struct media_download_block)); dl->block_sigs = u_calloc((size_t)num_blocks, 64); for (int i = 0; i < num_blocks; i++) { @@ -455,10 +459,11 @@ static void test_query_resp_assign(void) { /* ── 12. дедуп ── */ -static void dedup_done_cb(void* arg, int err) { (void)arg; (void)err; } +static int dedup_callbacks; +static void dedup_done_cb(void* arg, int err) { (void)arg; (void)err; dedup_callbacks++; } static void test_dedup(void) { - TEST("duplicate start ignored"); { + TEST("duplicate start rejected without callback"); { sqlite3* db = NULL; sqlite3_open(":memory:", &db); struct UTUN_INSTANCE* inst = make_minimal_instance(db); struct media_download* dl = make_test_dl(db, inst, 1); @@ -467,11 +472,12 @@ static void test_dedup(void) { struct media_index_result r; memset(&r, 0, sizeof(r)); memcpy(r.media_id, dl->media_id, 16); r.num_blocks = 1; r.file_size = CHUNK_SIZE; r.block_size = CHUNK_SIZE; - int rc = media_download_start(inst, 0x1234, &r, "/tmp/x.bin", "/tmp", 0xAAA, dedup_done_cb, NULL, NULL, NULL); - /* rc == 0 (не ошибка), новая запись не создана (дедуп) */ + r.block_ids = dl->blocks[0].block_id; r.block_sigs = dl->block_sigs; dedup_callbacks = 0; + int rc = media_download_start(inst, 0x1234, &r, dl->dest_path, g_temp_dir, 0xAAA, dedup_done_cb, NULL, NULL, NULL); + /* Отказ сохраняет аргумент callback у вызывающего, текущая загрузка не меняется. */ int count = 0; if (inst->md.downloads) { struct ll_entry* e = inst->md.downloads->head; while (e) { count++; e = e->next; } } - if (rc == 0 && count == 1) OK(); else FAIL("rc=%d count=%d", rc, count); + if (rc == -1 && count == 1 && !dedup_callbacks) OK(); else FAIL("rc=%d count=%d callbacks=%d", rc, count, dedup_callbacks); free_test_dl(inst, dl); sqlite3_close(db); u_free(inst); diff --git a/tests/test_media_download_timeout.c b/tests/test_media_download_timeout.c index 4b72107f..c54481d2 100644 --- a/tests/test_media_download_timeout.c +++ b/tests/test_media_download_timeout.c @@ -42,6 +42,9 @@ static struct UTUN_INSTANCE* make_minimal(void) { inst->node_id = 0xDEADBEEFDEADBEEFULL; sqlite3* db = NULL; sqlite3_open(":memory:", &db); inst->topo_sqlite_db = db; + if (media_index_init(db) || media_index_set_base(db, "/tmp")) { + DEBUG_ERROR(DEBUG_CATEGORY_MEDIA, "timeout test media schema initialization failed"); exit(1); + } for (int i = 0; i < 32; i++) inst->my_ed25519_privkey[i] = (uint8_t)(rand() & 0xFF); memset(inst->my_ed25519_pubkey, 0xDD, 32); inst->md.inst = inst; inst->md.db = db; inst->md.self_node_id = inst->node_id; inst->md.initialized = 1;