in rd-net/Test.RdFramework/Contexts/DelayedContextWithExtTest.cs [27:102]
public void TestExtNoFailureOnQueuedNewContextValue(bool useHeavyContext)
{
var context = useHeavyContext
? RdContextBasicTest.TestKeyHeavy.Instance
: (RdContext<string>) RdContextBasicTest.TestKeyLight.Instance;
ServerWire.AutoTransmitMode = true;
ClientWire.AutoTransmitMode = true;
var barrierRegister = new Barrier(2);
var barrier0 = new Barrier(2);
var barrier1 = new Barrier(2);
var barrier2 = new Barrier(2);
var fireValues = new[] { "a", "b", "c" };
ServerProtocol.Scheduler.Queue(() =>
{
barrierRegister.SignalAndWait();
context.RegisterOn(ServerProtocol.Contexts);
var serverModel = new InterningRoot1(LifetimeDefinition.Lifetime, ServerProtocol);
ServerWire.TransmitAllMessages();
barrier0.SignalAndWait(); // root model also uses ext semantics, so make sure both ends have created it and processed its connection message
var serverExt = serverModel.GetOrCreateExtension("test", () => new InterningExt());
foreach (var fireValue in fireValues)
{
using (context.UpdateValue(fireValue))
{
serverExt.Root.Value = new InterningExtRootModel();
}
}
barrier1.SignalAndWait();
});
var numReceives = 0;
var receivedContexts = new HashSet<string>();
ClientProtocol.Scheduler.Queue(() =>
{
context.RegisterOn(ClientProtocol.Serializers);
barrierRegister.SignalAndWait();
var clientModel = new InterningRoot1(LifetimeDefinition.Lifetime, ClientProtocol);
barrier0.SignalAndWait();
barrier1.SignalAndWait();
ServerProtocol.Scheduler.Queue(() => barrier2.SignalAndWait());
barrier2.SignalAndWait();
var clientExt = clientModel.GetOrCreateExtension("test", () => new InterningExt());
var task = new Task(() => {});
task.Start(ServerProtocol.Scheduler.AsTaskScheduler());
task.Wait();
clientExt.Root.AdviseNotNull(LifetimeDefinition.Lifetime, _ =>
{
numReceives++;
receivedContexts.Add(context.Value);
});
});
SpinWait.SpinUntil(() => numReceives == 3, Debugger.IsAttached ? TimeSpan.FromDays(1) : TimeSpan.FromMilliseconds(5_000));
Assert.AreEqual(3, numReceives);
Assert.AreEqual(fireValues, receivedContexts);
}