# HG changeset patch # User Michael Johnson # Date 1678777474 28800 # Mon Mar 13 23:04:34 2023 -0800 # Node ID 4a51478c1069d81a8801324f9aa4e555d8d38ef0 # Parent d2224bc6ff1f8bccfa4053e74a726203a479e082 Add more testing around disposal of RngSeeder sources diff --git a/src/Mocks/DisposableRng.cs b/src/Mocks/DisposableRng.cs new file mode 100644 --- /dev/null +++ b/src/Mocks/DisposableRng.cs @@ -0,0 +1,20 @@ +using System; + +namespace RandN; + +public sealed class DisposableRng : ICryptoRng, IDisposable +{ + private readonly IRng _wrapped; + + public DisposableRng(IRng wrapped) => _wrapped = wrapped; + + public Boolean Disposed { get; private set; } + + public void Dispose() => Disposed = true; + + public void Fill(Span buffer) => _wrapped.Fill(buffer); + + public UInt32 NextUInt32() => _wrapped.NextUInt32(); + + public UInt64 NextUInt64() => _wrapped.NextUInt64(); +} diff --git a/src/Tests/Compat/RandomNumberGeneratorShimTests.cs b/src/Tests/Compat/RandomNumberGeneratorShimTests.cs --- a/src/Tests/Compat/RandomNumberGeneratorShimTests.cs +++ b/src/Tests/Compat/RandomNumberGeneratorShimTests.cs @@ -78,7 +78,7 @@ [Fact] public void Disposal() { - var rng = new DisposableRng(); + var rng = new DisposableRng(new StepRng(10)); var shim = RandomNumberGeneratorShim.Create(rng); shim.Dispose(); Assert.True(rng.Disposed); @@ -93,17 +93,4 @@ Assert.Throws(() => rng.GetBytes(null!)); Assert.Throws(() => rng.GetNonZeroBytes(null!)); } - - private sealed class DisposableRng : ICryptoRng, IDisposable - { - public Boolean Disposed { get; private set; } - - public void Dispose() => Disposed = true; - - public void Fill(Span buffer) => buffer.Fill(0); - - public UInt32 NextUInt32() => 0; - - public UInt64 NextUInt64() => 0; - } } diff --git a/src/Tests/RngSeederTests.cs b/src/Tests/RngSeederTests.cs --- a/src/Tests/RngSeederTests.cs +++ b/src/Tests/RngSeederTests.cs @@ -9,27 +9,29 @@ public void CryptoRng() { var rngFactory = new StepRng.Factory(increment: 0); - var rngSeeder = RngSeeder.Create(rngFactory); + using var rngSeeder = RngSeeder.Create(rngFactory); var rng = rngSeeder.Create(); - Assert.NotNull(rng); - rngSeeder.Dispose(); + Assert.IsType(rng); } [Fact] public void SequentialSeedStaticRng() { - var seedSource = new StepRng(0); + var seedSource = new DisposableRng(new StepRng(0)); var rngFactory = new StepRng.Factory(increment: 0); - using var rngSeeder = RngSeeder.Create(rngFactory, seedSource); - - for (UInt64 i = 0; i < 10; i++) + using (var rngSeeder = RngSeeder.Create(rngFactory, seedSource)) { - var rng = rngSeeder.Create(); - Assert.Equal(i, rng.NextUInt64()); - Assert.Equal(i, rng.NextUInt64()); - Assert.Equal(i, rng.NextUInt64()); - Assert.Equal(i, rng.NextUInt64()); + for (UInt64 i = 0; i < 10; i++) + { + var rng = rngSeeder.Create(); + Assert.IsType(rng); + Assert.Equal(i, rng.NextUInt64()); + Assert.Equal(i, rng.NextUInt64()); + Assert.Equal(i, rng.NextUInt64()); + Assert.Equal(i, rng.NextUInt64()); + } } + Assert.True(seedSource.Disposed); } [Fact] @@ -43,4 +45,4 @@ Assert.Throws(() => RngSeeder.Create(null!, null!)); Assert.Throws(() => RngSeeder.Create(null!)); } -} \ No newline at end of file +}