test_keyauxdb.c

来自「基于DHT的对等协议」· C语言 代码 · 共 112 行

C
112
字号
#include <keyauxdb.h>#include <crypt.h>#include <assert.h>const char *dbfile = "test_keyauxdb.db";vec<chordID> keys;vec<u_int32_t> auxs;chordIDmake_randomID (){  chordID ID;  unsigned rand = random()>>1;  str ids = strbuf () << rand;  char id[sha1::hashsize];  sha1_hash (id, ids, ids.len());  mpz_set_rawmag_be (&ID, id, sizeof (id));  // For big endian  return ID;}voidadd_random_key (keyauxdb &kdb){  static int orecno = 0;  chordID k = make_randomID ();  u_int32_t aux = random_getword ();  int recno = kdb.addkey (k, aux);  assert (recno = orecno + 1);  keys.push_back (k);  auxs.push_back (aux);  orecno = recno;}voidtest_read_range (keyauxdb &kdb, u_int32_t base, u_int32_t bound){  u_int32_t n (1);  const keyaux_t *v = kdb.getkeys (base, bound, &n);  if (keys.size () == 0 || keys.size () < base) {    assert (n == 0);    assert (v == NULL);    return;  }  u_int32_t avail = keys.size () - base;  if (avail < bound) {    assert (n == avail);    if (avail == 0)      assert (v == NULL);  } else {    assert (n == bound);  }  for (size_t i = 0; i < n; i++) {    chordID k;    u_int32_t a;    keyaux_unmarshall (&v[i], &k, &a);    if (k != keys[base + i]) {      fatal << "k = " << k 	    << "; keys[" << base << " + " << i << "] = " 	    << keys[base + i] << "\n";    }    assert (a == auxs[base + i]);  }}intmain (int argc, char *argv[]){  unlink (dbfile);  keyauxdb kdb (dbfile);  /* Empty reads */  test_read_range (kdb, 0, 0);  test_read_range (kdb, 5, 1000);  /* Inserts */  for (size_t i = 0; i < 100; i++) {    add_random_key (kdb);  }  /* Read past end */  test_read_range (kdb, 100, 3);  test_read_range (kdb, 101, 3);  /* Series of interleaved read/inserts */  u_int32_t base[]  = {0, 1,  32, 90, 98, 99, 0};  u_int32_t bound[] = {4, 10, 25, 30,  1,  7, 1000};  for (size_t dx = 0; dx < sizeof(base)/sizeof(u_int32_t); dx++) {    test_read_range (kdb, base[dx], bound[dx]);    add_random_key (kdb);  }  /* Bulk insert/reads */  for (size_t i = 0; i < 20000; i++) {    add_random_key (kdb);    if (i % 100 == 0)       test_read_range (kdb, 	  random_getword () % keys.size (),	  random_getword () % keys.size ());  }  test_read_range (kdb, 0, 10000);  unlink (dbfile);  return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?