public void CreateChunkedFile()
    {
        Assert.False(File.Exists(_fileName));

        var chunkedFile = new ChunkedFileStream(_fileName, 3, _chunksData, (buffer, offset, length) => null);

        Assert.True(File.Exists(_fileName));
        chunkedFile.Dispose();
    }
    public void SaveValidFileSinglePass()
    {
        int chunk = 0;

        ChunkedFileStream.HashFunction hashFunction = (buffer, offset, length) => _chunksData.Chunks[chunk++].Hash;

        using (var chunkedFile = new ChunkedFileStream(_fileName, 3, _chunksData, hashFunction))
        {
            Assert.AreEqual(0, chunkedFile.VerifiedLength);
            Assert.AreEqual(3, chunkedFile.RemainingLength);

            chunkedFile.Write(new byte[] { 1, 2, 3 }, 0, 3);

            Assert.AreEqual(3, chunkedFile.VerifiedLength);
            Assert.AreEqual(0, chunkedFile.RemainingLength);
        }
    }
    public void SaveInvalidSecondPass()
    {
        int sequence = 0;

        ChunkedFileStream.HashFunction hashFunction = (buffer, offset, length) =>
        {
            switch (sequence++)
            {
            case 0:
                return(_chunksData.Chunks[0].Hash);

            case 1:
                return(_invalidHash);

            case 2:
                return(_chunksData.Chunks[1].Hash);

            default:
                throw new IndexOutOfRangeException(sequence.ToString());
            }
        };

        using (var chunkedFile = new ChunkedFileStream(_fileName, 3, _chunksData, hashFunction))
        {
            Assert.AreEqual(0, chunkedFile.VerifiedLength);
            Assert.AreEqual(3, chunkedFile.RemainingLength);

            chunkedFile.Write(new byte[] { 1, 2 }, 0, 2);

            Assert.AreEqual(2, chunkedFile.VerifiedLength);
            Assert.AreEqual(1, chunkedFile.RemainingLength);

            Assert.Throws <InvalidChunkDataException>(() => chunkedFile.Write(new byte[] { 3 }, 0, 1), "Should reject those bytes");

            Assert.AreEqual(2, chunkedFile.VerifiedLength);
            Assert.AreEqual(1, chunkedFile.RemainingLength);

            chunkedFile.Write(new byte[] { 3 }, 0, 1);

            Assert.AreEqual(3, chunkedFile.VerifiedLength);
            Assert.AreEqual(0, chunkedFile.RemainingLength);
        }
    }
    public void SaveValidFileTwoPasses()
    {
        int sequence = 0;

        ChunkedFileStream.HashFunction hashFunction = (buffer, offset, length) => _chunksData.Chunks[sequence++].Hash;

        using (var chunkedFile = new ChunkedFileStream(_fileName, 3, _chunksData, hashFunction))
        {
            Assert.AreEqual(0, chunkedFile.VerifiedLength);
            Assert.AreEqual(3, chunkedFile.RemainingLength);

            chunkedFile.Write(new byte[] { 1, 2 }, 0, 2);

            Assert.AreEqual(2, chunkedFile.VerifiedLength);
            Assert.AreEqual(1, chunkedFile.RemainingLength);

            chunkedFile.Write(new byte[] { 3 }, 0, 1);

            Assert.AreEqual(3, chunkedFile.VerifiedLength);
            Assert.AreEqual(0, chunkedFile.RemainingLength);
        }

        Assert.AreEqual(3, new FileInfo(_fileName).Length);
    }