C#: tests kill the replay-details and unreliable non-write mutants
Some checks failed
CultMesh QUIC native / Build win32-x64 (pull_request) Has been skipped
CultMesh QUIC native / Build linux-x64 (pull_request) Has been skipped
CultMesh QUIC native / Release native binaries (pull_request) Has been skipped
CultMesh QUIC native / Verify committed binaries match SHA256SUMS (pull_request) Has been cancelled
CultMesh portability and performance / ubuntu-latest reactive semantics and leases (pull_request) Has been cancelled

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Libby 2026-11-08 16:45:29 +00:00
commit 48cf3b3323
2 changed files with 37 additions and 0 deletions

View file

@ -231,6 +231,9 @@ namespace GameCult.Networking.Tests
receipt.SendUnreliable(HelloOf(BothFrames)); // not a write: answered with nothing on the unreliable channel
receipt.Send(running.PutOf("r1", KeyA, "one"));
Assert.That(receipt.Next<CultNetWriteAdmittedMessage>().MessageId, Is.EqualTo("r1"), "nothing else was sent ahead of the receipt");
receipt.Send(running.PutOf("r2", KeyA, "two"));
Assert.That(receipt.Next<CultNetWriteAdmittedMessage>().MessageId, Is.EqualTo("r2"));
receipt.ExpectNothingMore("the unreliable hello was answered with nothing");
using var legacy = running.Connect();
legacy.Send(HelloOf());

View file

@ -1171,5 +1171,39 @@ namespace GameCult.Networking.Tests
GC.KeepAlive(session);
Assert.That(growth, Is.LessThan(8L * 1024 * 1024));
}
// A remembered refusal is replayed with the details its code carries: the schema id of an unowned write, no details
// at all for the routing refusal.
[Test]
public void AReplayedRefusalCarriesTheDetailsOfItsCodeAndNoOthers()
{
var session = new CultNetWriteReceiptSession();
var sent = new List<ICultNetSchemaMessage>();
CultNetReceiptedWrite Write(string id) => new(session, sent.Add, "put", id, "schema.v1", "note:1", [1]);
var unowned = Write("u1");
Assert.That(unowned.Begin(), Is.True);
unowned.Refused(CultNetErrorMessage.ForUnownedSchema(new CultNetUnownedSchemaException("schema.v1", new CultRecordKey("note:1"))));
Assert.That(Write("u1").Begin(), Is.False);
var routed = Write("g1");
Assert.That(routed.Begin(), Is.True);
routed.Refused(new CultNetErrorMessage
{
Error = CultNetDatabaseServer.RoutingRefusalText,
RoutingHint = new CultNetShardRoutingHint { Reason = "not_primary" }
});
Assert.That(Write("g1").Begin(), Is.False);
var unownedAgain = (CultNetErrorV1Message)sent[1];
Assert.That(unownedAgain.Code, Is.EqualTo("unowned_schema"));
Assert.That(unownedAgain.Details!.Field, Is.EqualTo("schemaId"));
Assert.That(unownedAgain.Details.Value, Is.EqualTo("schema.v1"));
Assert.That(unownedAgain.Error, Is.EqualTo(((CultNetErrorV1Message)sent[0]).Error));
var routedAgain = (CultNetErrorV1Message)sent[3];
Assert.That(routedAgain.Details, Is.Null);
Assert.That(routedAgain.RoutingHint!.Reason, Is.EqualTo("not_primary"));
Assert.That(routedAgain.Error, Is.EqualTo(CultNetDatabaseServer.RoutingRefusalText));
}
}
}