private static async Task RunPruning(PruningTestBlockchain chain, int time, bool onlyFirstRuns) { chain.FullPruner.WaitHandle.Reset(); chain.PruningTrigger.Prune += Raise.Event <EventHandler <PruningTriggerEventArgs> >(); for (int i = 0; i < Reorganization.MaxDepth + 2; i++) { await chain.AddBlock(true); } HashSet <byte[]> allItems = chain.DbProvider.StateDb.GetAllValues().ToHashSet(Bytes.EqualityComparer); bool pruningFinished = chain.FullPruner.WaitHandle.WaitOne(TimeSpan.FromSeconds(1)); await chain.AddBlock(true); if (!onlyFirstRuns || time == 0) { pruningFinished.Should().BeTrue(); await WriteFileStructure(chain); chain.PruningDb.InnerDbName.Should().Be($"State{time + 1}"); HashSet <byte[]> currentItems = chain.DbProvider.StateDb.GetAllValues().ToHashSet(Bytes.EqualityComparer); currentItems.IsSubsetOf(allItems).Should().BeTrue(); currentItems.Count.Should().BeGreaterThan(0); } }
public async Task prune_on_disk_only_once() { using PruningTestBlockchain chain = await PruningTestBlockchain.Create(new PruningConfig { FullPruningMinimumDelayHours = 10 }); for (int i = 0; i < 3; i++) { await RunPruning(chain, i, true); } }
public async Task prune_on_disk_multiple_times() { using PruningTestBlockchain chain = await PruningTestBlockchain.Create(new PruningConfig { FullPruningMinimumDelayHours = 0 }); for (int i = 0; i < 3; i++) { await RunPruning(chain, i, false); } }
private static async Task WriteFileStructure(PruningTestBlockchain chain) { string stateDbPath = Path.Combine(chain.TempDirectory.Path, "state"); foreach (string directory in Directory.EnumerateDirectories(stateDbPath)) { await TestContext.Out.WriteLineAsync(directory); } foreach (string file in Directory.EnumerateFiles(stateDbPath)) { await TestContext.Out.WriteLineAsync(file); } }