public void BucketSplitTest()
        {
            Contact dummyContact = new Contact(new VirtualProtocol(), ID.Zero);

            ((VirtualProtocol)dummyContact.Protocol).Node = new Node(dummyContact, new VirtualStorage());
            BucketList bucketList = new BucketList(ID.RandomIDInKeySpace, dummyContact);

            Constants.K.ForEach(() => bucketList.AddContact(new Contact(null, ID.RandomIDInKeySpace)));
            bucketList.AddContact(new Contact(null, ID.RandomIDInKeySpace));
            Assert.IsTrue(bucketList.Buckets.Count > 1, "Bucket should have split into two or more buckets.");
        }
        public void DuplicateIDTest()
        {
            Contact dummyContact = new Contact(new VirtualProtocol(), ID.Zero);

            ((VirtualProtocol)dummyContact.Protocol).Node = new Node(dummyContact, new VirtualStorage());
            BucketList bucketList = new BucketList(ID.RandomIDInKeySpace, dummyContact);
            ID         id         = ID.RandomIDInKeySpace;

            bucketList.AddContact(new Contact(null, id));
            bucketList.AddContact(new Contact(null, id));
            Assert.IsTrue(bucketList.Buckets.Count == 1, "No split should have taken place.");
            Assert.IsTrue(bucketList.Buckets[0].Contacts.Count == 1, "Bucket should have one contact.");
        }
        public void RandomIDDistributionTest()
        {
            Contact dummyContact = new Contact(new VirtualProtocol(), ID.Zero);

            ((VirtualProtocol)dummyContact.Protocol).Node = new Node(dummyContact, new VirtualStorage());
            Random rnd = new Random();

            byte[]     buffer        = new byte[20];
            List <int> contactsAdded = new List <int>();

            100.ForEach(() =>
            {
                rnd.NextBytes(buffer);
                BucketList bucketList = new BucketList(new ID(buffer), dummyContact);

                3200.ForEach(() =>
                {
                    rnd.NextBytes(buffer);
                    Contact contact = new Contact(new VirtualProtocol(), new ID(buffer));
                    ((VirtualProtocol)contact.Protocol).Node = new Node(contact, new VirtualStorage());
                    bucketList.AddContact(contact);
                });

                int contacts = bucketList.Buckets.Sum(b => b.Contacts.Count);
                contactsAdded.Add(contacts);
            });

            Assert.IsTrue(contactsAdded.Average().ApproximatelyEquals(720, 20), "Unexpected distribution.");
            Assert.IsTrue(contactsAdded.Select(n => (double)n).StdDev().ApproximatelyEquals(10, 2), "Bad distribution");
        }
        public void DistributionTestForEachPrefix()
        {
            Contact dummyContact = new Contact(new VirtualProtocol(), ID.Zero);

            ((VirtualProtocol)dummyContact.Protocol).Node = new Node(dummyContact, new VirtualStorage());
            Random        rnd = new Random();
            StringBuilder sb  = new StringBuilder();

            byte[] buffer = new byte[20];

            160.ForEach((i) =>
            {
                BucketList bucketList = new BucketList(new ID(BigInteger.Pow(new BigInteger(2), i)), dummyContact);

                3200.ForEach(() =>
                {
                    rnd.NextBytes(buffer);
                    Contact contact = new Contact(new VirtualProtocol(), new ID(buffer));
                    ((VirtualProtocol)contact.Protocol).Node = new Node(contact, new VirtualStorage());
                    bucketList.AddContact(contact);
                });

                int contacts = bucketList.Buckets.Sum(b => b.Contacts.Count);
                sb.Append(i + "," + contacts + CRLF);
            });

            File.WriteAllText("prefixTest.txt", sb.ToString());
        }
        public void RandomPrefixDistributionTest()
        {
            Contact dummyContact = new Contact(new VirtualProtocol(), ID.Zero);

            ((VirtualProtocol)dummyContact.Protocol).Node = new Node(dummyContact, new VirtualStorage());
            List <int> contactsAdded = new List <int>();

            100.ForEach(() =>
            {
                ID ourID = ID.RandomIDInKeySpace;
                BucketList bucketList = new BucketList(ourID, dummyContact);
                3200.ForEach(() =>
                {
                    ID id = ID.RandomIDInKeySpace;

                    if (id != ourID)
                    {
                        Contact contact = new Contact(new VirtualProtocol(), id);
                        ((VirtualProtocol)contact.Protocol).Node = new Node(contact, new VirtualStorage());
                        bucketList.AddContact(contact);
                    }
                });

                int contacts = bucketList.Buckets.Sum(b => b.Contacts.Count);
                contactsAdded.Add(contacts);
            });

            double avg   = contactsAdded.Average();
            double stdev = contactsAdded.Select(n => (double)n).StdDev();

            Assert.IsTrue(contactsAdded.Average().ApproximatelyEquals(1900, 200), "Unexpected distribution: avg = " + avg);
            Assert.IsTrue(stdev.ApproximatelyEquals(800, 100), "Bad distribution: stdev = " + stdev);
        }
        public void UniqueIDAddTest()
        {
            Contact dummyContact = new Contact(new VirtualProtocol(), ID.Zero);

            ((VirtualProtocol)dummyContact.Protocol).Node = new Node(dummyContact, new VirtualStorage());
            BucketList bucketList = new BucketList(ID.RandomIDInKeySpace, dummyContact);

            Constants.K.ForEach(() => bucketList.AddContact(new Contact(null, ID.RandomIDInKeySpace)));
            Assert.IsTrue(bucketList.Buckets.Count == 1, "No split should have taken place.");
            Assert.IsTrue(bucketList.Buckets[0].Contacts.Count == Constants.K, "K contacts should have been added.");
        }
        public void DistributionTestForEachPrefixWithRandomPrefixDistributedContacts()
        {
            Contact dummyContact = new Contact(new VirtualProtocol(), ID.Zero);

            ((VirtualProtocol)dummyContact.Protocol).Node = new Node(dummyContact, new VirtualStorage());
            StringBuilder sb = new StringBuilder();

            160.ForEach((i) =>
            {
                BucketList bucketList = new BucketList(new ID(BigInteger.Pow(new BigInteger(2), i)), dummyContact);
                Contact contact       = new Contact(new VirtualProtocol(), ID.RandomIDInKeySpace);
                ((VirtualProtocol)contact.Protocol).Node = new Node(contact, new VirtualStorage());
                3200.ForEach(() => bucketList.AddContact(contact));
                int contacts = bucketList.Buckets.Sum(b => b.Contacts.Count);
                sb.Append(i + "," + contacts + CRLF);
            });

            File.WriteAllText("prefixTest.txt", sb.ToString());
        }