diff --git a/tests/test_media_delivery_download.c b/tests/test_media_delivery_download.c index 31ed6ff0..425ea6f1 100644 --- a/tests/test_media_delivery_download.c +++ b/tests/test_media_delivery_download.c @@ -387,7 +387,8 @@ static void test_overloaded_next_holder(void) { ov.subcmd = MEDIA_SUBCMD_BLOCK_OVERLOADED; memcpy(ov.media_id, dl->media_id, 16); memcpy(ov.block_id, dl->blocks[0].block_id, 16); ov.retry_after_ms = 2000; - media_download_handle_overloaded(inst, (const uint8_t*)&ov, sizeof(ov)); + memcpy(ov.transfer_id, dl->blocks[0].transfer_id, 16); + media_download_handle_overloaded(inst, dl->group_id, 0x1111, (const uint8_t*)&ov, sizeof(ov)); int ok = dl->blocks[0].attempts == 0 && dl->blocks[0].holder_idx == 1 && dl->blocks[0].state == MD_BLK_REQ; if (ok) OK(); else FAIL("attempts=%d hidx=%d state=%d", dl->blocks[0].attempts, dl->blocks[0].holder_idx, dl->blocks[0].state); @@ -413,7 +414,8 @@ static void test_overloaded_wait(void) { struct media_pkt_block_overloaded ov; memset(&ov, 0, sizeof(ov)); ov.subcmd = MEDIA_SUBCMD_BLOCK_OVERLOADED; memcpy(ov.media_id, dl->media_id, 16); memcpy(ov.block_id, dl->blocks[0].block_id, 16); - media_download_handle_overloaded(inst, (const uint8_t*)&ov, sizeof(ov)); + memcpy(ov.transfer_id, dl->blocks[0].transfer_id, 16); + media_download_handle_overloaded(inst, dl->group_id, 0x1111, (const uint8_t*)&ov, sizeof(ov)); int ok = dl->blocks[0].state == MD_BLK_WAIT && dl->blocks[0].attempts == 0; if (ok) OK(); else FAIL("state=%d attempts=%d", dl->blocks[0].state, dl->blocks[0].attempts); @@ -436,10 +438,15 @@ static void test_relay_full(void) { dl->blocks[0].state = MD_BLK_RECV; dl->inflight = 1; - uint64_t nodes[2] = { 0x3333, 0x4444 }; - media_download_handle_relay_full(inst, dl->media_id, dl->blocks[0].block_id, 0, nodes, 2); + uint8_t packet[MEDIA_RELAY_FULL_HDR_SIZE + 2 * sizeof(uint64_t)] = {0}; + struct media_pkt_block_relay_full* full = (struct media_pkt_block_relay_full*)packet; + full->subcmd = MEDIA_SUBCMD_BLOCK_RELAY_FULL; full->num_relay_nodes = 2; + memcpy(full->media_id, dl->media_id, 16); memcpy(full->block_id, dl->blocks[0].block_id, 16); + memcpy(full->transfer_id, dl->blocks[0].transfer_id, 16); + uint64_t nodes[2] = {0x3333, 0x4444}; memcpy(packet + sizeof(*full), nodes, sizeof(nodes)); + media_download_handle_relay_full(inst, dl->group_id, 0x1111, packet, sizeof(packet)); - int ok = dl->blocks[0].num_holders == 3 && dl->blocks[0].state == MD_BLK_REQ; + int ok = dl->blocks[0].num_holders == 2 && dl->blocks[0].state == MD_BLK_REQ; if (ok) OK(); else FAIL("holders=%d state=%d", dl->blocks[0].num_holders, dl->blocks[0].state); free_test_dl(inst, dl); @@ -566,7 +573,8 @@ static void test_overloaded_deadline(void) { add_holder(dl, 0, 0x1111); dl->blocks[0].holder_idx = 0; dl->blocks[0].state = MD_BLK_REQ; dl->inflight = 1; struct media_pkt_block_overloaded ov = {.subcmd = MEDIA_SUBCMD_BLOCK_OVERLOADED, .retry_after_ms = 1000}; memcpy(ov.media_id, dl->media_id, 16); memcpy(ov.block_id, dl->blocks[0].block_id, 16); - media_download_handle_overloaded(inst, (const uint8_t*)&ov, sizeof(ov)); + memcpy(ov.transfer_id, dl->blocks[0].transfer_id, 16); + media_download_handle_overloaded(inst, dl->group_id, 0x1111, (const uint8_t*)&ov, sizeof(ov)); int rc = md_dl_check_stall(dl, get_time_tb()); int ok = !rc && dl->blocks[0].state == MD_BLK_WAIT && dl->blocks[0].wait_reason == MD_WAIT_RETRY && dl->blocks[0].retry_at_tb > get_time_tb() && !dl->blocks[0].attempts && !dl->inflight; diff --git a/tests/test_media_index_regressions.c b/tests/test_media_index_regressions.c index eaedf5a7..0b36d9b6 100644 --- a/tests/test_media_index_regressions.c +++ b/tests/test_media_index_regressions.c @@ -258,14 +258,23 @@ static void pending_deletion(void) { /* Отказ/синхронное завершение/дубликат имеют разные правила владения аргументом. */ uint8_t signatures[128] = {0}; struct media_index_result download = result; download.block_sigs = signatures; int completed = 0; - assert(!media_download_start(inst, 0, &download, destinations[0], root, 0, download_done, &completed, NULL, NULL)); + assert(media_download_start(inst, 0, &download, destinations[0], root, 0, download_done, &completed, NULL, NULL) == -1); + assert(!completed); /* Отсутствующий ключ автора — отказ до принятия владения callback. */ + assert(!media_download_start(inst, 0, &download, destinations[0], root, inst->node_id, + download_done, &completed, NULL, NULL)); assert(completed == 1); /* Нет суперузлов: completion уже вызван, dl освобождён. */ assert(!media_index_delete_channel(db, "0", root)); completed = 0; + sqlite3_stmt* author = NULL; + assert(!sqlite3_prepare_v2(db, "INSERT INTO nodes(node_id,ed25519_pubkey) VALUES(?,?)", -1, &author, NULL)); + assert(!sqlite3_bind_int64(author, 1, (sqlite3_int64)(inst->node_id ^ 0x55))); + assert(!sqlite3_bind_blob(author, 2, inst->my_ed25519_pubkey, 32, SQLITE_STATIC)); + assert(sqlite3_step(author) == SQLITE_DONE && !sqlite3_finalize(author)); assert(!media_download_start(inst, 0, &download, destinations[0], root, inst->node_id ^ 0x55, download_done, &completed, NULL, NULL)); assert(!completed); - assert(media_download_start(inst, 0, &download, destinations[0], root, 0, download_done, &completed, NULL, NULL) == -1); + assert(media_download_start(inst, 0, &download, destinations[0], root, inst->node_id ^ 0x55, + download_done, &completed, NULL, NULL) == -1); assert(!completed && !media_download_cancel(inst, download.media_id, NULL, 0) && completed == 1); assert(!media_index_delete_channel(db, "0", root)); utun_instance_destroy(inst); uasync_destroy(ua, 0);