Example #1
0
        public async Task DeleteBeforeHashing()
        {
            using var tmpDir = TempDir.Create();
            using var engine = new ClientEngine(new EngineSettingsBuilder(EngineSettingsBuilder.CreateForTests())
            {
                AutoSaveLoadFastResume = true,
                CacheDirectory         = tmpDir.Path,
            }.ToSettings());

            var first  = new TaskCompletionSource <object> ();
            var second = new TaskCompletionSource <object> ();

            var torrent = TestRig.CreatePrivate();
            var path    = engine.Settings.GetFastResumePath(torrent.InfoHash);

            Directory.CreateDirectory(Path.GetDirectoryName(path));
            File.WriteAllBytes(path, new FastResume(torrent.InfoHash, new MutableBitField(torrent.Pieces.Count).SetAll(true), new MutableBitField(torrent.Pieces.Count)).Encode());
            var manager = await engine.AddAsync(torrent, "savedir");

            await engine.ChangePieceWriterAsync(new TestWriter {
                FilesThatExist = new System.Collections.Generic.List <ITorrentFileInfo> (manager.Files)
            });

            Assert.IsTrue(manager.HashChecked);
            manager.Engine.DiskManager.GetHashAsyncOverride = (torrent, pieceIndex, dest) => {
                first.SetResult(null);
                second.Task.Wait();
                new byte[20].CopyTo(dest);
                return(Task.FromResult(true));
            };
            var hashCheckTask = manager.HashCheckAsync(false);
            await first.Task.WithTimeout();

            Assert.IsFalse(File.Exists(path));

            second.SetResult(null);
            await hashCheckTask.WithTimeout();

            Assert.IsTrue(File.Exists(path));
        }