PeerGroup: fix a regression that stopped Bloom filters being sent when a key is added, and add a unit test covering that behaviour.

Resolves issue 524.
This commit is contained in:
Mike Hearn
2014-02-23 13:12:26 +01:00
parent 249df81e5d
commit b52faae013
2 changed files with 27 additions and 1 deletions

View File

@@ -805,11 +805,12 @@ public class PeerGroup extends AbstractExecutionThreadService implements Transac
BloomFilter filter = new BloomFilter(lastBloomFilterElementCount, bloomFilterFPRate, bloomFilterTweak, bloomFlags);
for (PeerFilterProvider p : peerFilterProviders)
filter.merge(p.getBloomFilter(lastBloomFilterElementCount, bloomFilterFPRate, bloomFilterTweak));
bloomFilter = filter;
boolean changed = !filter.equals(bloomFilter);
boolean send = false;
bloomFilter = filter;
switch (mode) {
case SEND_IF_CHANGED: send = changed; break;
case DONT_SEND: send = false; break;

View File

@@ -540,4 +540,29 @@ public class PeerGroupTest extends TestWithPeerGroup {
assertTrue(p3.lastReceivedFilter.contains(key.getPubKey()));
assertTrue(p3.lastReceivedFilter.contains(outpoint.bitcoinSerialize()));
}
@Test
public void testBloomResendOnNewKey() throws Exception {
// Check that when we add a new key to the wallet, the Bloom filter is re-calculated and re-sent.
peerGroup.startAndWait();
// Create a couple of peers.
InboundMessageQueuer p1 = connectPeer(1);
InboundMessageQueuer p2 = connectPeer(2);
BloomFilter f1 = p1.lastReceivedFilter;
BloomFilter f2 = p2.lastReceivedFilter;
final ECKey key = new ECKey();
wallet.addKey(key);
peerGroup.waitForJobQueue();
BloomFilter f3 = (BloomFilter) outbound(p1);
BloomFilter f4 = (BloomFilter) outbound(p2);
assertTrue(outbound(p1) instanceof MemoryPoolMessage);
assertTrue(outbound(p2) instanceof MemoryPoolMessage);
assertNotEquals(f1, f3);
assertNotEquals(f2, f4);
assertEquals(f3, f4);
assertTrue(f3.contains(key.getPubKey()));
assertTrue(f3.contains(key.getPubKeyHash()));
assertFalse(f1.contains(key.getPubKey()));
assertFalse(f1.contains(key.getPubKeyHash()));
}
}