]> arthur.barton.de Git - bup.git/blob - test/int/test_bloom.py
Update base_version to 0.34~ for 0.34 development
[bup.git] / test / int / test_bloom.py
1
2 from __future__ import absolute_import, print_function
3 import os
4 import errno, platform, tempfile
5 import logging
6
7 from bup import bloom
8
9 def test_bloom(tmpdir):
10     hashes = [os.urandom(20) for i in range(100)]
11     class Idx:
12         pass
13     ix = Idx()
14     ix.name = b'dummy.idx'
15     ix.shatable = b''.join(hashes)
16     for k in (4, 5):
17         with bloom.create(tmpdir + b'/pybuptest.bloom', expected=100, k=k) as b:
18             b.add_idx(ix)
19             assert b.pfalse_positive() < .1
20         with bloom.ShaBloom(tmpdir + b'/pybuptest.bloom') as b:
21             all_present = True
22             for h in hashes:
23                 all_present &= (b.exists(h) or False)
24             assert all_present
25             false_positives = 0
26             for h in [os.urandom(20) for i in range(1000)]:
27                 if b.exists(h):
28                     false_positives += 1
29             assert false_positives < 5
30         os.unlink(tmpdir + b'/pybuptest.bloom')
31
32     tf = tempfile.TemporaryFile(dir=tmpdir)
33     with bloom.create(b'bup.bloom', f=tf, expected=100) as b:
34         assert b.file == tf
35         assert b.k == 5
36
37     # Test large (~1GiB) filter.  This may fail on s390 (31-bit
38     # architecture), and anywhere else where the address space is
39     # sufficiently limited.
40     tf = tempfile.TemporaryFile(dir=tmpdir)
41     skip_test = False
42     try:
43         with bloom.create(b'bup.bloom', f=tf, expected=2**28,
44                           delaywrite=False) as b:
45             assert b.k == 4
46     except EnvironmentError as ex:
47         (ptr_width, linkage) = platform.architecture()
48         if ptr_width == '32bit' and ex.errno == errno.ENOMEM:
49             logging.getLogger().info('skipping large bloom filter test (mmap probably failed) '
50                   + str(ex))
51         else:
52             raise