Ejemplo n.º 1
0
        public void SendPing()
        {
            engine.Add(node);
            engine.TimeOut = TimeSpan.FromMilliseconds(75);
            ManualResetEvent handle = new ManualResetEvent(false);

            engine.MessageLoop.QuerySent += delegate(object o, SendQueryEventArgs e) {
                if (!e.TimedOut && e.Query is Ping)
                {
                    handle.Set();
                }

                if (!e.TimedOut || !(e.Query is Ping))
                {
                    return;
                }

                PingResponse response = new PingResponse(node.Id, e.Query.TransactionId);
                listener.RaiseMessageReceived(response, e.EndPoint);
            };

            Assert.AreEqual(NodeState.Unknown, node.State, "#1");

            DateTime lastSeen = node.LastSeen;

            Assert.IsTrue(handle.WaitOne(1000, false), "#1a");
            Node nnnn = node;

            node = engine.RoutingTable.FindNode(nnnn.Id);
            Assert.IsTrue(lastSeen < node.LastSeen, "#2");
            Assert.AreEqual(NodeState.Good, node.State, "#3");
        }
Ejemplo n.º 2
0
        public void SendQueryTaskSucceed()
        {
            engine.TimeOut = TimeSpan.FromMilliseconds(25);

            Ping ping = new Ping(engine.LocalId);

            ping.TransactionId            = transactionId;
            engine.MessageLoop.QuerySent += delegate(object o, SendQueryEventArgs e)
            {
                if (e.TimedOut)
                {
                    counter++;
                    PingResponse response = new PingResponse(node.Id, transactionId);
                    listener.RaiseMessageReceived(response, node.EndPoint);
                }
            };

            ;
            Assert.IsTrue(engine.SendQueryAsync(ping, node).Wait(3000), "#1");
            System.Threading.Thread.Sleep(200);
            Assert.AreEqual(1, counter, "#2");
            Node n = engine.RoutingTable.FindNode(this.node.Id);

            Assert.IsNotNull(n, "#3");
            Assert.IsTrue(n.LastSeen > DateTime.UtcNow.AddSeconds(-2));
        }
Ejemplo n.º 3
0
        public async Task SendQueryTaskSucceed()
        {
            var ping = new Ping(engine.LocalId)
            {
                TransactionId = transactionId
            };

            listener.MessageSent += (data, endpoint) => {
                engine.MessageLoop.DhtMessageFactory.TryDecodeMessage(BEncodedValue.Decode <BEncodedDictionary> (data), out DhtMessage message);
                if (message is Ping && message.TransactionId.Equals(ping.TransactionId))
                {
                    counter++;
                    PingResponse response = new PingResponse(node.Id, transactionId);
                    listener.RaiseMessageReceived(response, node.EndPoint);
                }
            };

            Assert.IsFalse(node.LastSeen < TimeSpan.FromSeconds(2));
            Assert.IsFalse((await engine.SendQueryAsync(ping, node).WithTimeout(3000)).TimedOut, "#1");
            Assert.AreEqual(1, counter, "#2");
            Node n = engine.RoutingTable.FindNode(node.Id);

            Assert.IsNotNull(n, "#3");
            Assert.IsTrue(n.LastSeen < TimeSpan.FromSeconds(2));
        }
Ejemplo n.º 4
0
        public void ErrorReceived()
        {
            int failedCount    = 0;
            var pingSuccessful = new TaskCompletionSource <bool> ();

            var ping = new Ping(node.Id)
            {
                TransactionId = transactionId
            };

            engine.MessageLoop.QuerySent += (o, e) => {
                // This ping should not time out.
                if (e.Query.TransactionId.Equals(ping.TransactionId))
                {
                    pingSuccessful.TrySetResult(!e.TimedOut && e.Response == null && e.Error != null);
                }
            };

            listener.MessageSent += (data, endpoint) => {
                engine.MessageLoop.DhtMessageFactory.TryDecodeMessage(BEncodedValue.Decode <BEncodedDictionary> (data), out DhtMessage message);

                // This TransactionId should be registered and it should be pending a response.
                if (!DhtMessageFactory.IsRegistered(ping.TransactionId) || engine.MessageLoop.PendingQueries != 1)
                {
                    pingSuccessful.TrySetResult(false);
                }

                if (message.TransactionId.Equals(ping.TransactionId))
                {
                    listener.RaiseMessageReceived(new ErrorMessage(ping.TransactionId, ErrorCode.ServerError, "Ooops"), node.EndPoint);
                    failedCount++;
                }
            };

            // Send the ping
            var task = engine.SendQueryAsync(ping, node);

            // The query should complete, and the message should not have timed out.
            Assert.IsTrue(task.Wait(100000), "#1");
            Assert.IsTrue(pingSuccessful.Task.Wait(1000), "#2");
            Assert.IsTrue(pingSuccessful.Task.Result, "#3");
            Assert.IsFalse(DhtMessageFactory.IsRegistered(ping.TransactionId), "#4");
            Assert.AreEqual(0, engine.MessageLoop.PendingQueries, "#5");
            Assert.AreEqual(1, failedCount, "#6");
        }
Ejemplo n.º 5
0
        public void SendQueryTaskSucceed()
        {
            var ping = new Ping(engine.LocalId)
            {
                TransactionId = transactionId
            };

            listener.MessageSent += (message, endpoint) => {
                if (message is Ping && message.TransactionId.Equals(ping.TransactionId))
                {
                    counter++;
                    PingResponse response = new PingResponse(node.Id, transactionId);
                    listener.RaiseMessageReceived(response, node.EndPoint);
                }
            };

            Assert.IsFalse(node.LastSeen < TimeSpan.FromSeconds(2));
            Assert.IsTrue(engine.SendQueryAsync(ping, node).Wait(3000), "#1");
            Assert.AreEqual(1, counter, "#2");
            Node n = engine.RoutingTable.FindNode(node.Id);

            Assert.IsNotNull(n, "#3");
            Assert.IsTrue(n.LastSeen < TimeSpan.FromSeconds(2));
        }