public void CreateDecorator_FileNotUsable_ReseedsFromEntropy()
        {
            var decorator = new SeedFileDecorator(_mockProvider, _mockFile);

            decorator.InitializePRNG();

            _mockProvider.Received(1).InitializePRNG();
            _mockFile.DidNotReceive().Read(Arg.Any <byte[]>(), Arg.Any <int>(), Arg.Any <int>());
        }
        public void CreateDecorator_FileHasEntropy_ReseedsFromFile()
        {
            _mockFile.Length.Returns(64);

            var decorator = new SeedFileDecorator(_mockProvider, _mockFile);

            decorator.InitializePRNG();

            _mockProvider.DidNotReceive().InitializePRNG();
            _mockFile.Received().Read(Arg.Any <byte[]>(), Arg.Any <int>(), Arg.Any <int>());

            // Finally, assert that the new seed was generated and placed in the file
            _mockFile.Received().Seek(0, SeekOrigin.Begin);
            _mockFile.Received().Write(Arg.Any <byte[]>(), 0, 64);
            _mockFile.Received().Flush();
        }
        public void CreateDecorator_SeedsFromFile_ReturnsData()
        {
            _mockFile.Length.Returns(64);

            var generator   = new FortunaGenerator();
            var accumulator = new FortunaAccumulator(new EntropyEventScheduler(), Enumerable.Empty <IEntropyProvider>());

            var decorator = new SeedFileDecorator(new PRNGFortunaProvider(generator, accumulator), _mockFile);

            decorator.InitializePRNG();

            var data = new byte[1024];

            decorator.GetBytes(data);

            Assert.NotEqual((IEnumerable <byte>)data, new byte[1024]);
        }
        public async Task CreateDecoratorAsync_FileHasEntropy_ReseedsFromFile()
        {
            _mockFile.Length.Returns(64);

            var decorator = new SeedFileDecorator(_mockProvider, _mockFile);
            await decorator.InitializePRNGAsync();

            await _mockProvider.DidNotReceive().InitializePRNGAsync();

            await _mockFile.Received().ReadAsync(Arg.Any <byte[]>(), Arg.Any <int>(), Arg.Any <int>(), Arg.Any <CancellationToken>());

            // Finally, assert that the new seed was generated and placed in the file
            _mockFile.Received().Seek(0, SeekOrigin.Begin);
            await _mockFile.Received().WriteAsync(Arg.Any <byte[]>(), 0, 64, Arg.Any <CancellationToken>());

            await _mockFile.Received().FlushAsync(Arg.Any <CancellationToken>());
        }