private static void verifyBackOffWithDoneSending(SenderThreadsBackOffManager manager,
int backOffTimes,
long expectedMilliseconds,
Integer doneSendingAfter,
boolean... expectedBackOffResult) throws InterruptedException {
int limit = backOffTimes + (doneSendingAfter == null ? 0 : 1);
int reduce = 0;
long start = new Long(System.nanoTime());
for (int i = 0; i < limit; ++i) {
if (doneSendingAfter != null && i == doneSendingAfter) {
manager.onDoneSending();
reduce = 1;
continue;
}
boolean done = manager.backOffCurrentSenderThread();
assertEquals(done, expectedBackOffResult[i - reduce]);
}
int elapsed = (int)((double)(System.nanoTime() - start) / 1000000.0);
assertTrue(String.format("BackOff lasted %d which is less than expected %d", elapsed, expectedMilliseconds), elapsed >= expectedMilliseconds);
assertTrue(String.format("BackOff lasted %d which is more than expected %d", elapsed, expectedMilliseconds), elapsed <= expectedMilliseconds + 2000);
}