private bool Add(Node node, bool raiseNodeAdded)
        {
            if (node == null)
            {
                throw new ArgumentNullException("node");
            }

            Bucket bucket = buckets.Find(delegate(Bucket b) { return(b.CanContain(node)); });

            if (bucket != null && bucket.Nodes.Contains(node))
            {
                return(false);
            }

            bool added = bucket.Add(node);

            if (!added && bucket.CanContain(LocalNode))
            {
                if (Split(bucket))
                {
                    return(Add(node, raiseNodeAdded));
                }
            }

            return(added);
        }
Exemple #2
0
        public async Task NodeReplaceTest()
        {
            int    nodeCount = 0;
            Bucket b         = new Bucket();

            for (int i = 0; i < Bucket.MaxCapacity; i++)
            {
                Node n = new Node(NodeId.Create(), new IPEndPoint(IPAddress.Any, i));
                n.Seen();
                b.Add(n);
            }

            b.Nodes[3].Seen(TimeSpan.FromDays(5));
            b.Nodes[1].Seen(TimeSpan.FromDays(4));
            b.Nodes[5].Seen(TimeSpan.FromDays(3));

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

                b.Nodes.Sort((l, r) => l.LastSeen.CompareTo(r.LastSeen));
                if ((endpoint.Port == 3 && nodeCount == 0) ||
                    (endpoint.Port == 1 && nodeCount == 1) ||
                    (endpoint.Port == 5 && nodeCount == 2))
                {
                    Node n = b.Nodes.Find(no => no.EndPoint.Port == endpoint.Port);
                    n.Seen();
                    PingResponse response = new PingResponse(n.Id, message.TransactionId);
                    listener.RaiseMessageReceived(response, node.EndPoint);
                    nodeCount++;
                }
            };

            ReplaceNodeTask task = new ReplaceNodeTask(engine, b, null);
            await task.Execute().WithTimeout(4000);
        }
        public void NodeReplaceTest()
        {
            int    nodeCount = 0;
            Bucket b         = new Bucket();

            for (int i = 0; i < Bucket.MaxCapacity; i++)
            {
                Node n = new Node(NodeId.Create(), new IPEndPoint(IPAddress.Any, i));
                n.Seen();
                b.Add(n);
            }

            b.Nodes[3].Seen(TimeSpan.FromDays(5));
            b.Nodes[1].Seen(TimeSpan.FromDays(4));
            b.Nodes[5].Seen(TimeSpan.FromDays(3));

            listener.MessageSent += (message, endpoint) => {
                b.Nodes.Sort((l, r) => l.LastSeen.CompareTo(r.LastSeen));
                if ((endpoint.Port == 3 && nodeCount == 0) ||
                    (endpoint.Port == 1 && nodeCount == 1) ||
                    (endpoint.Port == 5 && nodeCount == 2))
                {
                    Node n = b.Nodes.Find(delegate(Node no) { return(no.EndPoint.Port == endpoint.Port); });
                    n.Seen();
                    PingResponse response = new PingResponse(n.Id, message.TransactionId);
                    listener.RaiseMessageReceived(response, node.EndPoint);
                    nodeCount++;
                }
            };

            ReplaceNodeTask task = new ReplaceNodeTask(engine, b, null);

            Assert.IsTrue(task.Execute().Wait(4000), "#10");
        }
        bool Add(Node node, bool raiseNodeAdded)
        {
            if (node == null)
            {
                throw new ArgumentNullException(nameof(node));
            }

            Bucket bucket = Buckets.Find(b => b.CanContain(node)) !;

            if (bucket.Nodes.Contains(node))
            {
                return(false);
            }

            bool added = bucket.Add(node);

            if (!added && bucket.CanContain(LocalNode))
            {
                if (Split(bucket))
                {
                    return(Add(node, raiseNodeAdded));
                }
            }

            return(added);
        }
Exemple #5
0
        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");
        }