public void Enqueue_Block_Increases_QueueSize()
        {
            var logger        = Substitute.For <ILogger>();
            var asyncProvider = Substitute.For <IAsyncProvider>();
            var blockQueue    = new BlockQueueProcessor(asyncProvider, (_, token) => Task.CompletedTask);

            var block = new Block();

            block.ToBytes();

            Assert.True(block.BlockSize.HasValue);

            var size = block.BlockSize.Value;


            Assert.True(blockQueue.TryEnqueue(block));

            Assert.Equal(size, blockQueue.QueueSizeBytes);
        }
        public void Dequeue_Block_Decreases_QueueSize()
        {
            var logger        = Substitute.For <ILogger>();
            var asyncProvider = Substitute.For <IAsyncProvider>();
            Func <Block, CancellationToken, Task> callback = (_, token) => Task.CompletedTask;

            Func <Block, CancellationToken, Task> blockQueueCallback = null;

            // Intercept the block queue callback being provided to the queuer.
            // We do this so it can be manually invoked later.
            asyncProvider
            .When(provider => provider.CreateAndRunAsyncDelegateDequeuer(Arg.Any <string>(), Arg.Any <Func <Block, CancellationToken, Task> >()))
            .Do(info =>
            {
                blockQueueCallback = info.ArgAt <Func <Block, CancellationToken, Task> >(1);
            });

            var blockQueue = new BlockQueueProcessor(asyncProvider, callback);

            var block = new Block();

            block.ToBytes();

            Assert.True(block.BlockSize.HasValue);

            long size = block.BlockSize.Value;

            Assert.True(blockQueue.TryEnqueue(block));

            Assert.Equal(size, blockQueue.QueueSizeBytes);

            // Invoke the block queue callback and test that it reduces the queue size.
            blockQueueCallback(block, CancellationToken.None);

            Assert.Equal(0, blockQueue.QueueSizeBytes);
        }