public void TestExtNoFailureOnQueuedNewContextValue()

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);
    }