Ejemplo n.º 1
0
        public void TestExtPreserveContextOnLateConnect(bool useHeavyContext)
        {
            var context = useHeavyContext
        ? RdContextBasicTest.TestKeyHeavy.Instance
        : (RdContext <string>)RdContextBasicTest.TestKeyLight.Instance;

            context.RegisterOn(ClientProtocol.Serializers);
            context.RegisterOn(ServerProtocol.Contexts);

            var serverModel = new InterningRoot1(LifetimeDefinition.Lifetime, ServerProtocol);
            var clientModel = new InterningRoot1(LifetimeDefinition.Lifetime, ClientProtocol);

            var serverExt = serverModel.GetOrCreateExtension("test", () => new InterningExt());

            var fireValues = new[] { "a", "b", "c" };

            ServerWire.AutoTransmitMode = false;
            ClientWire.AutoTransmitMode = false;

            foreach (var fireValue in fireValues)
            {
                context.Value        = fireValue;
                serverExt.Root.Value = new InterningExtRootModel();
                context.Value        = null;
            }

            var numReceives      = 0;
            var receivedContexts = new HashSet <string>();

            var clientExt = clientModel.GetOrCreateExtension("test", () => new InterningExt());

            clientExt.Root.AdviseNotNull(LifetimeDefinition.Lifetime, _ =>
            {
                numReceives++;
                receivedContexts.Add(context.Value);
            });

            ClientWire.AutoTransmitMode = true;
            ServerWire.AutoTransmitMode = true;
            ClientWire.TransmitAllMessages();
            ServerWire.TransmitAllMessages();

            Assert.AreEqual(3, numReceives);
            Assert.AreEqual(fireValues, receivedContexts);
        }
Ejemplo n.º 2
0
        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)
                {
                    context.Value        = fireValue;
                    serverExt.Root.Value = new InterningExtRootModel();
                    context.Value        = null;
                }

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

                Thread.Sleep(500);

                clientExt.Root.AdviseNotNull(LifetimeDefinition.Lifetime, _ =>
                {
                    numReceives++;
                    receivedContexts.Add(context.Value);
                });
            });

            SpinWait.SpinUntil(() => numReceives == 3, TimeSpan.FromMilliseconds(5_000));

            Assert.AreEqual(3, numReceives);
            Assert.AreEqual(fireValues, receivedContexts);
        }