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