//todo deactivated as it crashed the test framework [TestMethod]
        public void OutgoingMessageIsResetOnSocketReset()
        {
            const string hostname             = "127.0.0.1";
            const int    port                 = 10100;
            const string connectionIdentifier = "1";

            var server = new SingleConnectionServer();

            server.StartListening();

            var engine = ExecutionEngineFactory.StartNew(new InMemoryStorageEngine());

            engine.Schedule(() =>
            {
                var unackedMessageQueue = new OutgoingMessageQueue();
                var deliverer           = new OutgoingMessageDeliverer(hostname, port, connectionIdentifier, unackedMessageQueue);

                Roots.Entangle(deliverer);
                Roots.Entangle(unackedMessageQueue);
                deliverer.Send("HELLO WORLD".GetUtf8Bytes());
            });

            Thread.Sleep(1_000);

            server.DisposeConnectedSocket();

            Thread.Sleep(1_000);

            server.GetNodeIdentifier().ShouldBe("1");
            server.GetReceivedMessages().Count.ShouldBe(2);
        }
        public void DetectMinimumCircularDependencyBetweenTwoNodes()
        {
            var a = new Node {
                Name = "A"
            };
            var b = new Node {
                Name = "B"
            };

            a.Edges.Add(b);
            b.Edges.Add(a);

            var roots = new Roots();

            roots.Entangle(a);

            var serializers = new Serializers(new SerializerFactory());
            var stateMaps   = new StateMaps(serializers);
            var persister   = new Persister(new InMemoryStorageEngine(), roots, serializers, stateMaps);

            persister.DetectSerializeAndPersistChanges();

            var circularChain = CircularDependencyDetector.Check(serializers[0], stateMaps, serializers);

            circularChain.IsCircular.ShouldBeTrue();
            circularChain.Path.Count().ShouldBe(3);
            circularChain.ToString().ShouldBe("A->B->A");
        }
        public void DetectCircularDependencyInComplexGraph()
        {
            var a = new Node {
                Name = "A"
            };
            var b = new Node {
                Name = "B"
            };
            var c = new Node {
                Name = "C"
            };
            var d = new Node {
                Name = "D"
            };
            var e = new Node {
                Name = "E"
            };
            var f = new Node {
                Name = "F"
            };
            var g = new Node {
                Name = "G"
            };
            var h = new Node {
                Name = "H"
            };

            a.Add(b);
            a.Add(c);

            c.Add(g);
            c.Add(f);

            g.Add(b);

            b.Add(d);

            d.Add(h);

            d.Add(f);
            f.Add(e);
            e.Add(d);

            var roots = new Roots();

            roots.Entangle(a);

            var serializers = new Serializers(new SerializerFactory());
            var stateMaps   = new StateMaps(serializers);
            var persister   = new Persister(new InMemoryStorageEngine(), roots, serializers, stateMaps);

            persister.DetectSerializeAndPersistChanges();

            var circularChain = CircularDependencyDetector.Check(serializers[0], stateMaps, serializers);

            circularChain.IsCircular.ShouldBe(true);
            circularChain.Path.Count().ShouldBe(4);
            circularChain.ToString().ShouldBe("F->E->D->F");
        }
        public Task Entangle(object toEntangle)
        {
            var tcs = new TaskCompletionSource();

            Scheduler.FireAndForget(() =>
            {
                Roots.Entangle(toEntangle);
                Task.Run(tcs.SetResult);
            });

            return(tcs.Task);
        }
        public void OutgoingConnectionSendsMessageSuccessfully()
        {
            const string hostname             = "127.0.0.1";
            const int    port                 = 10100;
            const string connectionIdentifier = "1";

            var server = new SingleConnectionServer();

            server.StartListening();

            var engine = ExecutionEngineFactory.StartNew(new InMemoryStorageEngine());

            engine.Schedule(() =>
            {
                var unackedMessageQueue = new OutgoingMessageQueue();
                var deliverer           = new OutgoingMessageDeliverer(hostname, port, connectionIdentifier, unackedMessageQueue);

                Roots.Entangle(deliverer);
                Roots.Entangle(unackedMessageQueue);
                deliverer.Send("HELLO WORLD".GetUtf8Bytes());
            });

            Thread.Sleep(1_000);

            server.GetNodeIdentifier().ShouldBe("1");
            server.GetReceivedMessages()[0].Item2.ShouldBe("HELLO WORLD");

            var unackeds = engine.Schedule(() =>
            {
                var q = Roots.Resolve <OutgoingMessageQueue>();
                return(q.GetSyncedUnackedMessages().ToArray());
            }).Result;

            unackeds.Length.ShouldBe(1);
            unackeds[0].Item1.ShouldBe(0);
            unackeds[0].Item2.Array.ToUtf8String().ShouldBe("HELLO WORLD");

            server.AckUntil(0);

            Thread.Sleep(1_000);

            unackeds = engine.Schedule(() =>
            {
                var q = Roots.Resolve <OutgoingMessageQueue>();
                return(q.GetSyncedUnackedMessages().ToArray());
            }).Result;

            unackeds.Length.ShouldBe(0);
        }
Ejemplo n.º 6
0
        public void EmptyMessageQueueCanBeSerializeAndDeserialized()
        {
            var storage = new InMemoryStorageEngine();
            var c       = ExecutionEngineFactory.StartNew(storage);

            c.Schedule(() =>
            {
                var q = new MessageQueue();
                Roots.Entangle(q);
            });

            c.Sync().Wait();

            c.Dispose();

            c = ExecutionEngineFactory.Continue(storage);
            c.Schedule(Roots.Resolve <MessageQueue>);
            c.Sync().Wait();
        }
        public void DetectCircularDependencyOneNodeHavingMultipleOutgoingEdges()
        {
            var a = new Node {
                Name = "A"
            };
            var b = new Node {
                Name = "B"
            };
            var c = new Node {
                Name = "C"
            };
            var d = new Node {
                Name = "D"
            };

            a.Edges.Add(b);
            a.Edges.Add(d);
            b.Edges.Add(c);
            c.Edges.Add(b);

            var roots = new Roots();

            roots.Entangle(a);

            var serializers = new Serializers(new SerializerFactory());
            var stateMaps   = new StateMaps(serializers);
            var persister   = new Persister(new InMemoryStorageEngine(), roots, serializers, stateMaps);

            persister.DetectSerializeAndPersistChanges();

            var circularChain = CircularDependencyDetector.Check(serializers[0], stateMaps, serializers);

            circularChain.IsCircular.ShouldBeTrue();
            circularChain.Path.Count().ShouldBe(3);
            circularChain.ToString().ShouldBe("B->C->B");
        }
Ejemplo n.º 8
0
        public void NonEmptyMessageQueueCanBeSerializeAndDeserialized()
        {
            var storage = new InMemoryStorageEngine();
            var c       = ExecutionEngineFactory.StartNew(storage);

            c.Schedule(() =>
            {
                var q         = new MessageQueue();
                var hello     = new ImmutableByteArray(Encoding.UTF8.GetBytes("hello"));
                var helloTask = new CTask();
                var world     = new ImmutableByteArray(Encoding.UTF8.GetBytes("world"));
                var worldTask = new CTask();
                q.Add(hello, helloTask);
                q.Add(world, worldTask);
                Roots.Entangle(q);
                Roots.Entangle(new CImmutableList <CTask>(new [] { helloTask, worldTask }));
            });

            c.Sync().Wait();

            c.Dispose();

            c = ExecutionEngineFactory.Continue(storage);
            c.Schedule(() =>
            {
                var queue = Roots.Resolve <MessageQueue>();
                var elms  = queue.GetAll().ToArray();
                elms.Length.ShouldBe(2);
                var s1 = Encoding.UTF8.GetString(elms[0].Array);
                s1.ShouldBe("hello");
                var s2 = Encoding.UTF8.GetString(elms[1].Array);
                s2.ShouldBe("world");

                Roots.Resolve <CImmutableList <CTask> >()[0].SignalCompletion();
            }).Wait();

            c.Sync().Wait();
            c.Dispose();

            c = ExecutionEngineFactory.Continue(storage);
            c.Schedule(() =>
            {
                var queue = Roots.Resolve <MessageQueue>();
                var elms  = queue.GetAll().ToArray();
                elms.Length.ShouldBe(1);
                var s1 = Encoding.UTF8.GetString(elms[0].Array);
                s1.ShouldBe("world");

                Roots.Resolve <CImmutableList <CTask> >()[1].SignalCompletion();
            }).Wait();

            c.Sync().Wait();
            c.Dispose();

            c = ExecutionEngineFactory.Continue(storage);
            c.Schedule(() =>
            {
                var queue = Roots.Resolve <MessageQueue>();
                var elms  = queue.GetAll().ToArray();
                elms.Length.ShouldBe(0);
            }).Wait();

            c.Sync().Wait();
            c.Dispose();
        }
Ejemplo n.º 9
0
 public void Entangle(object toEntangle) => Roots.Entangle(toEntangle);