@Test
public void testThrottle() throws Exception {

  final Configuration conf = new Configuration();
  conf.setDouble(DFS_NAMENODE_REENCRYPT_THROTTLE_LIMIT_HANDLER_RATIO_KEY,
      0.5);
  final ReencryptionHandler rh = mockReencryptionhandler(conf);
  // mock StopWatches so all = 30s, locked = 20s. With ratio = .5, throttle
  // should wait for 30 * 0.5 - 20 = 5s.
  final StopWatch mockAll = Mockito.mock(StopWatch.class);
  Mockito.when(mockAll.now(TimeUnit.MILLISECONDS)).thenReturn((long) 30000);
  Mockito.when(mockAll.reset()).thenReturn(mockAll);
  final StopWatch mockLocked = Mockito.mock(StopWatch.class);
  Mockito.when(mockLocked.now(TimeUnit.MILLISECONDS))
      .thenReturn((long) 20000);
  Mockito.when(mockLocked.reset()).thenReturn(mockLocked);
  final BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
  Whitebox.setInternalState(rh, "throttleTimerAll", mockAll);
  Whitebox.setInternalState(rh, "throttleTimerLocked", mockLocked);
  Whitebox.setInternalState(rh, "taskQueue", queue);
  final StopWatch sw = new StopWatch().start();
  rh.getTraverser().throttle();
  sw.stop();
  assertTrue("should have throttled for at least 8 second",
      sw.now(TimeUnit.MILLISECONDS) > 8000);
  assertTrue("should have throttled for at most 12 second",
      sw.now(TimeUnit.MILLISECONDS) < 12000);
}