Use real media schema and validate duplicate download ownership
This commit is contained in:
1 parent
ec70908733
commit
439011ce60
2 files changed
+14
-5
No files matched your search
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user