Exemplo n.º 1
0
        public void Bonded_count_is_tracked()
        {
            NodeBucket nodeBucket = new NodeBucket(1, 16);

            nodeBucket.AddNode(_node);
            nodeBucket.AddNode(_node2);
            nodeBucket.AddNode(_node3);
            nodeBucket.BondedItemsCount.Should().Be(3);
        }
Exemplo n.º 2
0
        public void Limits_the_bucket_size()
        {
            NodeBucket nodeBucket = new NodeBucket(1, 16);

            AddNodes(nodeBucket, 32);

            nodeBucket.BondedItemsCount.Should().Be(16);
            nodeBucket.BondedItems.Should().HaveCount(16);
        }
Exemplo n.º 3
0
        public void Newly_added_can_be_retrieved_as_bonded()
        {
            NodeBucket nodeBucket = new NodeBucket(1, 16);

            nodeBucket.AddNode(_node);
            nodeBucket.AddNode(_node2);
            nodeBucket.AddNode(_node3);
            nodeBucket.BondedItems.Should().HaveCount(3);
        }
Exemplo n.º 4
0
    public void RefreshNode(Node node)
    {
        CheckInitialization();

        int        distanceFromMaster = _nodeDistanceCalculator.CalculateDistance(MasterNode !.IdHash.Bytes, node.IdHash.Bytes);
        NodeBucket bucket             = Buckets[distanceFromMaster > 0 ? distanceFromMaster - 1 : 0];

        bucket.RefreshNode(node);
    }
Exemplo n.º 5
0
    public void ReplaceNode(Node nodeToRemove, Node nodeToAdd)
    {
        CheckInitialization();

        int        distanceFromMaster = _nodeDistanceCalculator.CalculateDistance(MasterNode !.IdHash.Bytes, nodeToAdd.IdHash.Bytes);
        NodeBucket bucket             = Buckets[distanceFromMaster > 0 ? distanceFromMaster - 1 : 0];

        bucket.ReplaceNode(nodeToRemove, nodeToAdd);
    }
Exemplo n.º 6
0
        private static void AddNodes(NodeBucket nodeBucket, int count)
        {
            for (int i = 0; i < count; i++)
            {
                Node node = new Node(
                    TestItem.PublicKeys[i],
                    IPAddress.Broadcast.ToString(),
                    30000);

                nodeBucket.AddNode(node);
            }
        }
Exemplo n.º 7
0
        public void Can_refresh(int nodesInTheBucket)
        {
            NodeBucket nodeBucket = new NodeBucket(1, 16);

            AddNodes(nodeBucket, nodesInTheBucket);

            Node existing1 = nodeBucket.BondedItems.First().Node;

            nodeBucket.RefreshNode(existing1);

            nodeBucket.BondedItems.Should().HaveCount(Math.Min(nodeBucket.BucketSize, nodesInTheBucket));
        }
Exemplo n.º 8
0
    public NodeAddResult AddNode(Node node)
    {
        CheckInitialization();

        if (_logger.IsTrace)
        {
            _logger.Trace($"Adding node to NodeTable: {node}");
        }
        int        distanceFromMaster = _nodeDistanceCalculator.CalculateDistance(MasterNode !.IdHash.Bytes, node.IdHash.Bytes);
        NodeBucket bucket             = Buckets[distanceFromMaster > 0 ? distanceFromMaster - 1 : 0];

        return(bucket.AddNode(node));
    }
Exemplo n.º 9
0
    public NodeTable(
        INodeDistanceCalculator?nodeDistanceCalculator,
        IDiscoveryConfig?discoveryConfig,
        INetworkConfig?networkConfig,
        ILogManager?logManager)
    {
        _logger                 = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));
        _networkConfig          = networkConfig ?? throw new ArgumentNullException(nameof(networkConfig));
        _discoveryConfig        = discoveryConfig ?? throw new ArgumentNullException(nameof(discoveryConfig));
        _nodeDistanceCalculator = nodeDistanceCalculator ?? throw new ArgumentNullException(nameof(nodeDistanceCalculator));

        Buckets = new NodeBucket[_discoveryConfig.BucketsCount];
        for (int i = 0; i < Buckets.Length; i++)
        {
            Buckets[i] = new NodeBucket(i, _discoveryConfig.BucketSize);
        }
    }
Exemplo n.º 10
0
        public void Throws_when_replacing_non_existing(int nodesInTheBucket)
        {
            NodeBucket nodeBucket = new NodeBucket(1, 16);

            AddNodes(nodeBucket, nodesInTheBucket);

            Node node = new Node(
                TestItem.PublicKeyA,
                IPAddress.Broadcast.ToString(),
                30001);

            Node nonExisting = new Node(
                TestItem.PublicKeyA,
                IPAddress.Broadcast.ToString(),
                30002);

            Assert.Throws <InvalidOperationException>(() => nodeBucket.ReplaceNode(nonExisting, node));
        }
Exemplo n.º 11
0
        public void Can_replace_existing_when_full()
        {
            NodeBucket nodeBucket = new NodeBucket(1, 16);

            AddNodes(nodeBucket, 32);

            Node node = new Node(
                TestItem.PublicKeyA,
                IPAddress.Broadcast.ToString(),
                30001);

            Node existing = nodeBucket.BondedItems.First().Node;

            nodeBucket.ReplaceNode(existing, node);
            nodeBucket.BondedItemsCount.Should().Be(16);
            nodeBucket.BondedItems.Should().HaveCount(16);
            nodeBucket.BondedItems.Should().Contain(bi => bi.Node == node);
            nodeBucket.BondedItems.Should().NotContain(bi => bi.Node == existing);
        }
Exemplo n.º 12
0
        public void Distance_is_set_properly()
        {
            NodeBucket nodeBucket = new NodeBucket(1, 16);

            nodeBucket.Distance.Should().Be(1);
        }