public void testReaper() throws Exception {
// test set+readback of interval
TransactionReaper.create(100);
TransactionReaper reaper = TransactionReaper.transactionReaper();
assertEquals(100, reaper.checkingPeriod());
Reapable reapable = new MockReapable(new Uid());
Reapable reapable2 = new MockReapable(new Uid());
Reapable reapable3 = new MockReapable(new Uid());
ReaperElement reaperElement = new ReaperElement(reapable, 30);
ReaperElement reaperElement2 = new ReaperElement(reapable2, 20);
ReaperElement reaperElement3 = new ReaperElement(reapable3, 10);
// test that ordering is by timeout, regardless of insertion order
SortedSet sortedSet = new TreeSet();
sortedSet.add(reaperElement);
sortedSet.add(reaperElement3);
sortedSet.add(reaperElement2);
assertEquals(sortedSet.first(), reaperElement3);
assertEquals(sortedSet.last(), reaperElement);
// test insertion of timeout=0 is a nullop
assertTrue(reaper.insert(reapable, 0));
assertEquals(0, reaper.numberOfTransactions());
assertEquals(0, reaper.numberOfTimeouts());
assertFalse(reaper.remove(reapable));
// test that duplicate insertion fails
assertTrue(reaper.insert(reapable, 10));
assertFalse(reaper.insert(reapable, 10));
assertEquals(1, reaper.numberOfTransactions());
assertEquals(1, reaper.numberOfTimeouts());
assertTrue(reaper.remove(reapable));
assertEquals(0, reaper.numberOfTransactions());
assertEquals(0, reaper.numberOfTimeouts());
// test that timeout change fails
assertTrue(reaper.insert(reapable, 10));
assertFalse(reaper.insert(reapable, 20));
assertEquals(1, reaper.numberOfTransactions());
assertEquals(1, reaper.numberOfTimeouts());
assertEquals(10, reaper.getTimeout(reapable));
assertTrue(reaper.remove(reapable));
assertEquals(0, reaper.numberOfTransactions());
assertEquals(0, reaper.numberOfTimeouts());
// test reaping
reaper.insert(reapable, 1); // seconds
reaper.insert(reapable2, 5);
assertEquals(2, reaper.numberOfTransactions());
assertEquals(2, reaper.numberOfTimeouts());
reaper.check();
assertEquals(2, reaper.numberOfTransactions());
Thread.sleep(2*1000);
reaper.check();
assertEquals(1, reaper.numberOfTransactions());
assertEquals(1, reaper.numberOfTimeouts());
Thread.sleep(4*1000);
reaper.check();
assertEquals(0, reaper.numberOfTransactions());
assertEquals(0, reaper.numberOfTimeouts());
}