Use real media schema and validate duplicate download ownership

This commit is contained in:
evgeny committed 2026-10-22 15:13:14 +02:00
1 parent ec70908733
commit 439011ce60
2 files changed
+14 -5

No files matched your search

+11 -5
View File
@@ -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);
+3
View File
@@ -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;