import org.junit.Assert; import org.junit.Test; import org.junit.BeforeClass; import bloomtime.Bloomtime; import java.io.File; import java.util.BitSet; import java.util.Set; import java.util.Map; import java.util.HashMap; import java.util.Random; import java.util.LinkedList; import com.google.protobuf.ByteString; import jelectrum.BloomLayerCake; public class BloomtimeTest { private static Bloomtime bloom; @BeforeClass public static void loadMap() throws Exception { new File("/var/ssd/clash/test").mkdirs(); File f = new File("/var/ssd/clash/test/bloomtime-test"); f.delete(); bloom = new Bloomtime(f, 8192, 1048576, 4); } @Test public void testDetRandom() { ByteString b = TestUtil.randomByteString(); Assert.assertEquals(bloom.getHashIndexes(b), bloom.getHashIndexes(b)); Assert.assertEquals(4, bloom.getHashIndexes(b).size()); System.out.println(bloom.getHashIndexes(b)); } @Test public void testConsistentRandom() { ByteString b = ByteString.copyFrom(new String("this is a test string").getBytes()); Assert.assertEquals(bloom.getHashIndexes(b), bloom.getHashIndexes(b)); Assert.assertEquals(4, bloom.getHashIndexes(b).size()); Set<Integer> v = bloom.getHashIndexes(b); Assert.assertTrue(v.contains(532709)); Assert.assertTrue(v.contains(955831)); Assert.assertTrue(v.contains(246865)); Assert.assertTrue(v.contains(593366)); } @Test public void testBasicBloom() { ByteString b = TestUtil.randomByteString(); bloom.saveEntry(901, b); Set<Integer> v = bloom.getMatchingSlices(b); System.out.println(v); Assert.assertTrue( v.contains(901)); } @Test public void testSliceRange() { ByteString b = TestUtil.randomByteString(); bloom.saveEntry(800, b); Set<Integer> v = bloom.getMatchingSlices(b); Assert.assertTrue( v.contains(800)); Assert.assertEquals(0, bloom.getMatchingSlices(b,0,800).size()); Assert.assertEquals(1, bloom.getMatchingSlices(b,800,808).size()); Assert.assertEquals(1, bloom.getMatchingSlices(b,801,808).size()); Assert.assertEquals(0, bloom.getMatchingSlices(b,808,8192).size()); Assert.assertTrue(bloom.getMatchingSlices(b,800,808).contains(800)); Assert.assertTrue(bloom.getMatchingSlices(b,805,808).contains(800)); } @Test public void testFullerBloom() { Random rnd = new Random(); HashMap<ByteString, Integer> correct_map = new HashMap<>(); for(int i=0; i<100000; i++) { int slice = rnd.nextInt(8192); ByteString b = TestUtil.randomByteString(); bloom.saveEntry(slice,b); correct_map.put(b, slice); } Assert.assertEquals(100000, correct_map.size()); for(Map.Entry<ByteString, Integer> me : correct_map.entrySet()) { ByteString b = me.getKey(); int slice = me.getValue(); Set<Integer> v = bloom.getMatchingSlices(b); Assert.assertTrue( v.contains(slice)); } ByteString b = TestUtil.randomByteString(); bloom.saveEntry(901, b); Set<Integer> v = bloom.getMatchingSlices(b); System.out.println(v); Assert.assertTrue( v.contains(901)); } @Test public void testLayerCake() throws Exception { BloomLayerCake cake = new BloomLayerCake(new File("/var/ssd/clash/test/bloom")); Random rnd = new Random(); for(int i=0; i<75000; i+=rnd.nextInt(8192)+1) { LinkedList<String> addrs = new LinkedList<String>(); for(int j=0; j<8; j++) addrs.add(TestUtil.randomHash().toString()); cake.addAddresses(i, addrs); } LinkedList<String> addrs = new LinkedList<String>(); String addr = TestUtil.randomHash().toString(); addrs.add(addr); cake.addAddresses(5, addrs); cake.addAddresses(3506, addrs); cake.addAddresses(740021, addrs); cake.flush(); System.out.println("--------test layer"); Set<Integer> v = cake.getBlockHeightsForAddress(addr); Assert.assertTrue(v.size() >= 3); Assert.assertTrue(v.contains(5)); Assert.assertTrue(v.contains(3506)); Assert.assertTrue(v.contains(740021)); System.out.println("--------test layer"); } }