]> arthur.barton.de Git - bup.git/blob - lib/bup/t/tbloom.py
467a1ccdcb1626dd70c11646438b5480853d63f2
[bup.git] / lib / bup / t / tbloom.py
1 import errno, platform, tempfile
2 from bup import bloom
3 from bup.helpers import *
4 from wvtest import *
5
6 bup_tmp = os.path.realpath('../../../t/tmp')
7 mkdirp(bup_tmp)
8
9 @wvtest
10 def test_bloom():
11     initial_failures = wvfailure_count()
12     tmpdir = tempfile.mkdtemp(dir=bup_tmp, prefix='bup-tbloom-')
13     hashes = [os.urandom(20) for i in range(100)]
14     class Idx:
15         pass
16     ix = Idx()
17     ix.name='dummy.idx'
18     ix.shatable = ''.join(hashes)
19     for k in (4, 5):
20         b = bloom.create(tmpdir + '/pybuptest.bloom', expected=100, k=k)
21         b.add_idx(ix)
22         WVPASSLT(b.pfalse_positive(), .1)
23         b.close()
24         b = bloom.ShaBloom(tmpdir + '/pybuptest.bloom')
25         all_present = True
26         for h in hashes:
27             all_present &= b.exists(h)
28         WVPASS(all_present)
29         false_positives = 0
30         for h in [os.urandom(20) for i in range(1000)]:
31             if b.exists(h):
32                 false_positives += 1
33         WVPASSLT(false_positives, 5)
34         os.unlink(tmpdir + '/pybuptest.bloom')
35
36     tf = tempfile.TemporaryFile()
37     b = bloom.create('bup.bloom', f=tf, expected=100)
38     WVPASSEQ(b.rwfile, tf)
39     WVPASSEQ(b.k, 5)
40
41     # Test large (~1GiB) filter.  This may fail on s390 (31-bit
42     # architecture), and anywhere else where the address space is
43     # sufficiently limited.
44     tf = tempfile.TemporaryFile()
45     skip_test = False
46     try:
47         b = bloom.create('bup.bloom', f=tf, expected=2**28, delaywrite=False)
48     except EnvironmentError, ex:
49         (ptr_width, linkage) = platform.architecture()
50         if ptr_width == '32bit' and ex.errno == errno.ENOMEM:
51             WVMSG('skipping large bloom filter test (mmap probably failed) '
52                   + str(ex))
53             skip_test = True
54         else:
55             raise
56     if not skip_test:
57         WVPASSEQ(b.k, 4)
58     if wvfailure_count() == initial_failures:
59         subprocess.call(['rm', '-rf', tmpdir])