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 override void Handle(DhtEngine engine, Node node) { base.Handle(engine, node); var m = new PingResponse(engine.RoutingTable.LocalNode.Id, TransactionId); engine.MessageLoop.EnqueueSend(m, node.EndPoint); }
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); } }; SendQueryTask task = new SendQueryTask(engine, ping, node); task.Completed += delegate { handle.Set(); }; task.Execute(); Assert.IsTrue(handle.WaitOne(3000, false), "#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 void BucketRefreshTest() { List<Node> nodes = new List<Node>(); for (int i = 0; i < 5; i++) nodes.Add(new Node(NodeId.Create(), new IPEndPoint(IPAddress.Any, i))); engine.TimeOut = TimeSpan.FromMilliseconds(25); engine.BucketRefreshTimeout = TimeSpan.FromMilliseconds(75); engine.MessageLoop.QuerySent += delegate(object o, SendQueryEventArgs e) { DhtEngine.MainLoop.Queue(delegate { if (!e.TimedOut) return; Node current = nodes.Find(delegate(Node n) { return n.EndPoint.Port.Equals(e.EndPoint.Port); }); if (current == null) return; if (e.Query is Ping) { PingResponse r = new PingResponse(current.Id, e.Query.TransactionId); listener.RaiseMessageReceived(r, current.EndPoint); } else if (e.Query is FindNode) { FindNodeResponse response = new FindNodeResponse(current.Id, e.Query.TransactionId); response.Nodes = ""; listener.RaiseMessageReceived(response, current.EndPoint); } }); }; engine.Add(nodes); engine.Start(); System.Threading.Thread.Sleep(500); foreach (Bucket b in engine.RoutingTable.Buckets) { Assert.IsTrue(b.LastChanged > DateTime.UtcNow.AddSeconds(-2)); Assert.IsTrue(b.Nodes.Exists(delegate(Node n) { return n.LastSeen > DateTime.UtcNow.AddMilliseconds(-900); })); } }
public void PingTimeout() { engine.TimeOut = TimeSpan.FromHours(1); // Send ping Ping ping = new Ping(node.Id); ping.TransactionId = transactionId; ManualResetEvent handle = new ManualResetEvent(false); SendQueryTask task = new SendQueryTask(engine, ping, node); task.Completed += delegate { handle.Set(); }; task.Execute(); // Receive response PingResponse response = new PingResponse(node.Id, transactionId); listener.RaiseMessageReceived(response, node.EndPoint); Assert.IsTrue(handle.WaitOne(1000, true), "#0"); engine.TimeOut = TimeSpan.FromMilliseconds(75); DateTime lastSeen = node.LastSeen; // Time out a ping ping = new Ping(node.Id); ping.TransactionId = (BEncodedString)"ab"; task = new SendQueryTask(engine, ping, node, 4); task.Completed += delegate { handle.Set(); }; handle.Reset(); task.Execute(); handle.WaitOne(); Assert.AreEqual(4, node.FailedCount, "#1"); Assert.AreEqual(NodeState.Bad, node.State, "#2"); Assert.AreEqual(lastSeen, node.LastSeen, "#3"); }
public void PingResponseEncode() { PingResponse m = new PingResponse(infohash, transactionId); Compare(m, "d1:rd2:id20:mnopqrstuvwxyz123456e1:t2:aa1:y1:re"); }
public void NodeReplaceTest() { engine.TimeOut = TimeSpan.FromMilliseconds(25); ManualResetEvent handle = new ManualResetEvent(false); Bucket b = new Bucket(); for (int i = 0; i < Bucket.MaxCapacity; i++) { Node n = new Node(NodeId.Create(), new IPEndPoint(IPAddress.Any, i)); n.LastSeen = DateTime.UtcNow; b.Add(n); } b.Nodes[3].LastSeen = DateTime.UtcNow.AddDays(-5); b.Nodes[1].LastSeen = DateTime.UtcNow.AddDays(-4); b.Nodes[5].LastSeen = DateTime.UtcNow.AddDays(-3); engine.MessageLoop.QuerySent += delegate(object o, SendQueryEventArgs e) { if (!e.TimedOut) return; b.Nodes.Sort(); if ((e.EndPoint.Port == 3 && nodeCount == 0) || (e.EndPoint.Port == 1 && nodeCount == 1) || (e.EndPoint.Port == 5 && nodeCount == 2)) { Node n = b.Nodes.Find(delegate(Node no) { return no.EndPoint.Port == e.EndPoint.Port; }); n.Seen(); PingResponse response = new PingResponse(n.Id, e.Query.TransactionId); DhtEngine.MainLoop.Queue(delegate { //System.Threading.Thread.Sleep(100); Console.WriteLine("Faking the receive"); listener.RaiseMessageReceived(response, node.EndPoint); }); nodeCount++; } }; ReplaceNodeTask task = new ReplaceNodeTask(engine, b, null); // FIXME: Need to assert that node 0.0.0.0:0 is the one which failed - i.e. it should be replaced task.Completed += delegate(object o, TaskCompleteEventArgs e) { handle.Set(); }; task.Execute(); Assert.IsTrue(handle.WaitOne(4000, false), "#10"); }