Changeset 8699c82


Ignore:
Timestamp:
Nov 24, 2013 11:39:47 PM (6 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
0db1314
Parents:
1d7eedd
Message:

Kad unit tests:

  • Port KBSTest from i2p.zzz.kademlia branch
  • Fix RandomTrimmer? so it always returns true, so it may be used as the trimmer in the unit tests
Location:
core/java
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • core/java/src/net/i2p/kademlia/RandomTrimmer.java

    r1d7eedd r8699c82  
    2727            return true;
    2828        T toRemove = e.get(_ctx.random().nextInt(sz));
    29         return kbucket.remove(toRemove);
     29        kbucket.remove(toRemove);
     30        return true;
    3031    }
    3132}
  • core/java/test/junit/net/i2p/kademlia/KBucketSetTest.java

    r1d7eedd r8699c82  
    99 */
    1010
     11import java.util.List;
    1112import junit.framework.TestCase;
    1213import net.i2p.I2PAppContext;
    1314import net.i2p.data.Hash;
     15import net.i2p.util.Log;
    1416
    1517/**
    16  * Test KBucketSet
     18 * Test KBucketSet.
     19 * Newer tests ported from KBSTest in i2p.zzz.kademlia branch
    1720 *
    1821 * @author comwiz
     22 * @since 0.9.10 moved from net.i2p.router.networkdb.kademlia
    1923 */
    2024
     
    2226        private I2PAppContext context;
    2327        private KBucketSet<Hash> set;
     28        private Hash usHash;
     29        private Log log;
    2430        private static final int K = 8;
    2531        private static final int B = 1;
     
    2733        public void setUp(){
    2834                context = I2PAppContext.getGlobalContext();
    29                 set = new KBucketSet<Hash>(context, Hash.FAKE_HASH, K, B);
     35                log = context.logManager().getLog(KBucketSet.class);
     36                byte[] us = new byte[Hash.HASH_LENGTH];
     37                context.random().nextBytes(us);
     38                usHash = new Hash(us);
     39                // We use the default RandomTrimmer so add() will never fail
     40                set = new KBucketSet<Hash>(context, usHash, K, B);
     41                // tests may be run in any order so prime it
     42                addRandom(1000);
    3043        }
    3144       
    3245        public void testRandom(){
    33                 for (int i = 0; i < 1000; i++) {
    34             byte val[] = new byte[Hash.HASH_LENGTH];
    35             context.random().nextBytes(val);
    36             assertTrue(set.add(new Hash(val)));
    37         }
    38     }
     46                addRandom(1000);
     47        }
     48
     49        private void addRandom(int count) {
     50                for (int i = 0; i < count; i++) {
     51                        byte val[] = new byte[Hash.HASH_LENGTH];
     52                        context.random().nextBytes(val);
     53                        Hash h = new Hash(val);
     54                        // in the highly unlikely chance we randomly generate a hash equal to us
     55                        assertTrue(set.add(h) || h.equals(usHash));
     56                }
     57        }
    3958   
    4059    public void testSelf() {
    4160        // new implementation will never include myself
    42         assertFalse(set.add(Hash.FAKE_HASH));
     61        assertFalse(set.add(usHash));
     62    }
     63
     64    /** @since 0.9.10 */
     65    public void testConcurrent() {
     66        int count = 2500;
     67        int n = 4;
     68        Thread[] threads = new Thread[n];
     69        for (int i = 0; i < n; i++) {
     70            threads[i] = new RTester(count);
     71        }
     72        for (int i = 0; i < n; i++) {
     73            threads[i].start();
     74        }
     75        for (int i = 0; i < n; i++) {
     76            try {
     77                threads[i].join();
     78            } catch (InterruptedException ie) {}
     79        }
     80    }
     81
     82    /** @since 0.9.10 */
     83    private class RTester extends Thread {
     84        private final int _count;
     85        public RTester(int count) {
     86            _count = count;
     87        }
     88        public void run() {
     89            addRandom(_count);
     90        }
     91    }
     92
     93    /** @since 0.9.10 */
     94    public void testAudit() {
     95        int errors = 0;
     96        for (KBucket<Hash> b : set.getBuckets()) {
     97            for (Hash sds : b.getEntries()) {
     98                int range = set.getRange(sds);
     99                if (range < b.getRangeBegin() || range > b.getRangeEnd()) {
     100                    log.error("Hash " + sds + " with range " + range +
     101                              " does not belong in " + b);
     102                    errors++;
     103                }
     104            }
     105        }
     106        assertTrue(errors == 0);
     107    }
     108
     109    /** @since 0.9.10 */
     110    public void testOrder() {
     111        int bits = Hash.HASH_LENGTH * 8;
     112        int errors = 0;
     113        int lastEnd = -1;
     114        for (KBucket<Hash> b : set.getBuckets()) {
     115            int beg = b.getRangeBegin();
     116            if (beg != lastEnd + 1) {
     117                log.error("Out of order: " + b);
     118                errors++;
     119            }
     120            lastEnd = b.getRangeEnd();
     121        }
     122        if (lastEnd != (bits * (1 << (B-1))) - 1) {
     123            log.error("Out of order: last=" + lastEnd);
     124            errors++;
     125        }
     126        assertTrue(errors == 0);
     127    }
     128
     129    /** @since 0.9.10 */
     130    public void testGenRandom() {
     131        int errors = 0;
     132        for (KBucket b : set.getBuckets()) {
     133            for (int j = 0; j < 4000; j++) {
     134                Hash rand = set.generateRandomKey(b);
     135                int range = set.getRange(rand);
     136                if (range < b.getRangeBegin() || range > b.getRangeEnd()) {
     137                    log.error("Generate random key failed range=" + range + " for " + rand + " meant for bucket " + b);
     138                    errors++;
     139                }
     140            }
     141        }
     142        assertTrue(errors == 0);
     143    }
     144
     145    /** @since 0.9.10 */
     146    public void testExplore() {
     147        List<Hash> keys = set.getExploreKeys(-1000);
     148        assertTrue(keys.size() > 0);
     149    }
     150
     151    /** @since 0.9.10 */
     152    public void testClosest() {
     153        byte val[] = new byte[Hash.HASH_LENGTH];
     154        for (int i = 0; i < 23; i++) {
     155            context.random().nextBytes(val);
     156            Hash h = new Hash(val);
     157            List<Hash> c = set.getClosest(h, i);
     158            assertTrue(c.size() == i);
     159        }
    43160    }
    44161}
Note: See TracChangeset for help on using the changeset viewer.