Bit.Bcrdt.Testing
11.0.0-pre-10
dotnet add package Bit.Bcrdt.Testing --version 11.0.0-pre-10
NuGet\Install-Package Bit.Bcrdt.Testing -Version 11.0.0-pre-10
<PackageReference Include="Bit.Bcrdt.Testing" Version="11.0.0-pre-10" />
<PackageVersion Include="Bit.Bcrdt.Testing" Version="11.0.0-pre-10" />
<PackageReference Include="Bit.Bcrdt.Testing" />
paket add Bit.Bcrdt.Testing --version 11.0.0-pre-10
#r "nuget: Bit.Bcrdt.Testing, 11.0.0-pre-10"
#:package Bit.Bcrdt.Testing@11.0.0-pre-10
#addin nuget:?package=Bit.Bcrdt.Testing&version=11.0.0-pre-10&prerelease
#tool nuget:?package=Bit.Bcrdt.Testing&version=11.0.0-pre-10&prerelease
Bit.Bcrdt.Testing
Test support for bit Bcrdt: the tools its own suite uses to try to break convergence. Framework-neutral - it works from MSTest, xUnit or NUnit.
dotnet add package Bit.Bcrdt.Testing
An adversarial network
BcrdtSimulatedNetwork connects replicas through a deterministic, seeded network that loses, duplicates, delays and
reorders messages, partitions peers and takes them offline - and runs the real sync protocol over it, so a test of
"edit for an hour on a plane, then reconnect" is a test of the production code path.
using var network = new BcrdtSimulatedNetwork(new BcrdtSimulatedNetworkOptions
{
Seed = seed,
DropProbability = 0.25,
DuplicateProbability = 0.25,
MaxLatencySteps = 5,
});
BcrdtSimulatedPeer[] peers = network.AddPeers(4);
peers[0].GoOffline();
peers[0].Doc.GetText("body").Insert(0, "written offline");
peers[1].Doc.GetText("body").Insert(0, "written online");
peers[0].GoOnline();
network.Flush();
network.SynchronizeAll();
BcrdtConvergenceHarness.AssertConverged(network);
Random operations
BcrdtOperationGenerator applies random transactions - text, arrays, maps, formatting and nested types, as
BcrdtOperationGeneratorOptions selects - and returns a description of each, so a failure can say what happened:
var generator = new BcrdtOperationGenerator(seed);
string applied = generator.ApplyRandomTransaction(peers[2].Doc);
BcrdtConvergenceHarness.AssertConverged compares replicas' contents and AssertStructurallyIdentical their block
structure, and both describe the divergence when they fail. Print the seed with every failure: a randomized test you
cannot replay is an anecdote, not a test.
Fuzzing the wire format
BcrdtUpdateCorrupter turns a valid update into every truncation, single-byte mutations, insertions and plain
garbage. A rejected payload must raise BcrdtFormatException and leave the document exactly as it was:
foreach (byte[] corrupted in BcrdtUpdateCorrupter.Truncations(update))
{
// apply to a fresh replica; assert it is either applied or rejected cleanly, never left half-applied
}
The full guide is in the Bcrdt README.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. net11.0 is compatible. |
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 11.0.0-pre-10 | 34 | 10/20/2026 |