@Test
public void testScheduleFixedRateCallable() throws Exception {

    assertThat(submitted.getCount()).isZero();
    assertThat(running.getCount()).isZero();
    assertThat(completed.getCount()).isZero();
    assertThat(duration.getCount()).isZero();
    assertThat(scheduledOnce.getCount()).isZero();
    assertThat(scheduledRepetitively.getCount()).isZero();
    assertThat(scheduledOverrun.getCount()).isZero();
    assertThat(percentOfPeriod.getCount()).isZero();
    CountDownLatch countDownLatch = new CountDownLatch(1);
    ScheduledFuture<?> theFuture = instrumentedScheduledExecutor.scheduleAtFixedRate(() -> {
        assertThat(submitted.getCount()).isZero();
        assertThat(running.getCount()).isEqualTo(1);
        assertThat(scheduledOnce.getCount()).isEqualTo(0);
        assertThat(scheduledRepetitively.getCount()).isEqualTo(1);
        try {
            TimeUnit.MILLISECONDS.sleep(50);
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        }
        countDownLatch.countDown();
    }, 10L, 10L, TimeUnit.MILLISECONDS);
    TimeUnit.MILLISECONDS.sleep(100); // Give some time for the task to be run
    countDownLatch.await(5, TimeUnit.SECONDS); // Don't cancel until it didn't complete once
    theFuture.cancel(true);
    TimeUnit.MILLISECONDS.sleep(200);         // Wait while the task is cancelled
    assertThat(submitted.getCount()).isZero();
    assertThat(running.getCount()).isZero();
    assertThat(completed.getCount()).isNotEqualTo(0);
    assertThat(duration.getCount()).isNotEqualTo(0);
    assertThat(duration.getSnapshot().size()).isNotEqualTo(0);
    assertThat(scheduledOnce.getCount()).isZero();
    assertThat(scheduledRepetitively.getCount()).isEqualTo(1);
    assertThat(scheduledOverrun.getCount()).isNotEqualTo(0);
    assertThat(percentOfPeriod.getCount()).isNotEqualTo(0);
}