From 4b4003d0fdc09a257a0841ad965b22533ed87a0d Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Mon, 11 Nov 2024 19:43:15 +0100 Subject: [PATCH] abort_download() is OK in any state --- src/piece_picker.cpp | 2 -- test/test_piece_picker.cpp | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/piece_picker.cpp b/src/piece_picker.cpp index e7e10040f3..6e81a0fc17 100644 --- a/src/piece_picker.cpp +++ b/src/piece_picker.cpp @@ -3829,8 +3829,6 @@ namespace { TORRENT_ASSERT(info.peer == nullptr || info.peer->in_use); TORRENT_ASSERT(info.piece_index == block.piece_index); - TORRENT_ASSERT(info.state != block_info::state_none); - if (info.state != block_info::state_requested) return; piece_pos const& p = m_piece_map[block.piece_index]; diff --git a/test/test_piece_picker.cpp b/test/test_piece_picker.cpp index ddee1db746..d643c9f3e4 100644 --- a/test/test_piece_picker.cpp +++ b/test/test_piece_picker.cpp @@ -324,6 +324,38 @@ TORRENT_TEST(piece_block) TEST_CHECK(!(piece_block(zero, 1) < piece_block(zero, 1))); } +TORRENT_TEST(abort_download_states) +{ + auto p = setup_picker("1111111", " ", "7110000", ""); + + //aborting a block that isn't being downloaded is a no-op + TEST_CHECK(p->is_requested({3_piece, 0}) == false); + p->abort_download({3_piece, 0}, tmp_peer); + p->abort_download({3_piece, 1}, tmp_peer); + TEST_CHECK(p->is_requested({3_piece, 0}) == false); + + // aborting a block that's downloading + p->mark_as_downloading({3_piece, 0}, tmp_peer); + TEST_CHECK(p->is_downloaded({3_piece, 0}) == false); + p->abort_download({3_piece, 0}, tmp_peer); + p->abort_download({3_piece, 1}, tmp_peer); + TEST_CHECK(p->is_downloaded({3_piece, 0}) == false); + + // aborting a block that's finished is a no-op + p->mark_as_writing({3_piece, 0}, tmp_peer); + TEST_CHECK(p->is_downloaded({3_piece, 0}) == true); + p->abort_download({3_piece, 0}, tmp_peer); + p->abort_download({3_piece, 1}, tmp_peer); + TEST_CHECK(p->is_downloaded({3_piece, 0}) == true); + + // aborting a block that's written is a no-op + p->mark_as_finished({3_piece, 0}, tmp_peer); + TEST_CHECK(p->is_finished({3_piece, 0}) == true); + p->abort_download({3_piece, 0}, tmp_peer); + p->abort_download({3_piece, 1}, tmp_peer); + TEST_CHECK(p->is_finished({3_piece, 0}) == true); +} + TORRENT_TEST(abort_download) { // test abort_download