Esempio n. 1
0
        public void CanSendTimeoutNow()
        {
            using (var node2Transport = new HttpTransport("node2", _requestsTimeout, CancellationToken.None))
            {
                var node1 = new NodeConnectionInfo {
                    Name = "node1", Uri = new Uri("http://localhost:9079")
                };
                node2Transport.Send(node1, new AppendEntriesRequest
                {
                    From = "node2",
                    ClusterTopologyId = new Guid("355a589b-cadc-463d-a515-5add2ea47205"),
                    Term         = 2,
                    PrevLogIndex = 0,
                    PrevLogTerm  = 0,
                    LeaderCommit = 1,
                    Entries      = new[]
                    {
                        new LogEntry
                        {
                            Term  = 2,
                            Index = 1,
                            Data  = new JsonCommandSerializer().Serialize(new DictionaryCommand.Set
                            {
                                Key   = "a",
                                Value = 2
                            })
                        },
                    }
                });
                MessageContext context;
                var            gotIt = node2Transport.TryReceiveMessage(_timeout, CancellationToken.None, out context);

                Assert.True(gotIt);
                Assert.True(((AppendEntriesResponse)context.Message).Success);

                var mres = new ManualResetEventSlim();
                _raftEngine.StateChanged += state =>
                {
                    if (state == RaftEngineState.CandidateByRequest)
                    {
                        mres.Set();
                    }
                };

                node2Transport.Send(node1, new TimeoutNowRequest
                {
                    Term = 4,
                    From = "node2",
                    ClusterTopologyId = new Guid("355a589b-cadc-463d-a515-5add2ea47205"),
                });

                gotIt = node2Transport.TryReceiveMessage(_timeout, CancellationToken.None, out context);

                Assert.True(gotIt);

                Assert.True(context.Message is NothingToDo);

                Assert.True(mres.Wait(_timeout));
            }
        }
Esempio n. 2
0
        public void CanSendRequestVotesAndGetReply()
        {
            using (var node2Transport = new HttpTransport("node2", _requestsTimeout, CancellationToken.None))
            {
                var node1 = new NodeConnectionInfo {
                    Name = "node1", Uri = new Uri("http://localhost:9079")
                };
                node2Transport.Send(node1, new RequestVoteRequest
                {
                    TrialOnly         = true,
                    From              = "node2",
                    ClusterTopologyId = new Guid("355a589b-cadc-463d-a515-5add2ea47205"),
                    Term              = 3,
                    LastLogIndex      = 2,
                    LastLogTerm       = 2,
                });

                MessageContext context;
                var            gotIt = node2Transport.TryReceiveMessage(_timeout, CancellationToken.None, out context);

                Assert.True(gotIt);

                Assert.True(context.Message is RequestVoteResponse);
            }
        }
Esempio n. 3
0
        public void CanAskIfCanInstallSnapshot()
        {
            using (var node2Transport = new HttpTransport("node2", _requestsTimeout, CancellationToken.None))
            {
                var node1 = new NodeConnectionInfo {
                    Name = "node1", Uri = new Uri("http://localhost:9079")
                };

                node2Transport.Send(node1, new CanInstallSnapshotRequest
                {
                    From = "node2",
                    ClusterTopologyId = new Guid("355a589b-cadc-463d-a515-5add2ea47205"),
                    Term  = 2,
                    Index = 3,
                });


                MessageContext context;
                var            gotIt = node2Transport.TryReceiveMessage(_timeout, CancellationToken.None, out context);

                Assert.True(gotIt);
                var msg = (CanInstallSnapshotResponse)context.Message;
                Assert.True(msg.Success);
            }
        }
Esempio n. 4
0
        public void Should_pass_on_xml()
        {
            XDocument document = new XDocument(new XElement("TEST"));

            with_listener(
                at: "http://localhost:56123/listener/error/",
                that_returns: 500,
                with_body: new XDocument(document),
                ensure: (transport, request) =>
            {
                transport
                .Send(document)
                .Success
                .ShouldBeFalse();
                request
                .Result
                .ShouldEqual(expected_string_representation_of(document));
            }
                );
        }
Esempio n. 5
0
        public async Task WhenCallSend_ThenCallSendWithoutAnyChanges()
        {
            var transportClient = new Mock <ITransportClient <string> >();

            var target = new HttpTransport(transportClient.Object);

            var payload = _fixture.Create <string>();

            await target.Send(payload);

            transportClient.Verify(c => c.Send(payload), Times.Once);
        }
Esempio n. 6
0
        public void CanInstallSnapshot()
        {
            using (var node2Transport = new HttpTransport("node2", _requestsTimeout, CancellationToken.None))
            {
                var node1 = new NodeConnectionInfo {
                    Name = "node1", Uri = new Uri("http://localhost:9079")
                };


                node2Transport.Send(node1, new CanInstallSnapshotRequest
                {
                    From = "node2",
                    ClusterTopologyId = new Guid("355a589b-cadc-463d-a515-5add2ea47205"),
                    Term  = 2,
                    Index = 3,
                });

                MessageContext context;
                var            gotIt = node2Transport.TryReceiveMessage(_timeout, CancellationToken.None, out context);
                Assert.True(gotIt);
                Assert.True(context.Message is CanInstallSnapshotResponse);

                node2Transport.Stream(node1, new InstallSnapshotRequest
                {
                    From = "node2",
                    ClusterTopologyId = new Guid("355a589b-cadc-463d-a515-5add2ea47205"),
                    Term              = 2,
                    Topology          = new Topology(new Guid("355a589b-cadc-463d-a515-5add2ea47205")),
                    LastIncludedIndex = 2,
                    LastIncludedTerm  = 2,
                }, stream =>
                {
                    var streamWriter = new StreamWriter(stream);
                    var data         = new Dictionary <string, int> {
                        { "a", 2 }
                    };
                    new JsonSerializer().Serialize(streamWriter, data);
                    streamWriter.Flush();
                });


                gotIt = node2Transport.TryReceiveMessage(_timeout, CancellationToken.None, out context);

                Assert.True(gotIt);

                var appendEntriesResponse = (InstallSnapshotResponse)context.Message;
                Assert.True(appendEntriesResponse.Success);

                Assert.Equal(2, ((DictionaryStateMachine)_raftEngine.StateMachine).Data["a"]);
            }
        }
Esempio n. 7
0
        public void CanSendEntries()
        {
            using (var node2Transport = new HttpTransport("node2", _requestsTimeout, CancellationToken.None))
            {
                var node1 = new NodeConnectionInfo {
                    Name = "node1", Uri = new Uri("http://localhost:9079")
                };


                node2Transport.Send(node1, new AppendEntriesRequest
                {
                    From = "node2",
                    ClusterTopologyId = new Guid("355a589b-cadc-463d-a515-5add2ea47205"),
                    Term         = 2,
                    PrevLogIndex = 0,
                    PrevLogTerm  = 0,
                    LeaderCommit = 1,
                    Entries      = new LogEntry[]
                    {
                        new LogEntry
                        {
                            Term  = 2,
                            Index = 1,
                            Data  = new JsonCommandSerializer().Serialize(new DictionaryCommand.Set
                            {
                                Key   = "a",
                                Value = 2
                            })
                        },
                    }
                });


                MessageContext context;
                var            gotIt = node2Transport.TryReceiveMessage(_timeout, CancellationToken.None, out context);

                Assert.True(gotIt);

                var appendEntriesResponse = (AppendEntriesResponse)context.Message;
                Assert.True(appendEntriesResponse.Success);

                Assert.Equal(2, ((DictionaryStateMachine)_raftEngine.StateMachine).Data["a"]);
            }
        }