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