@Test
public void testWarmUpEncryptedKeysWhenAllProvidersFail() throws Exception {

  Configuration conf = new Configuration();
  KMSClientProvider p1 = mock(KMSClientProvider.class);
  String keyName = "key1";
  Mockito.doThrow(new IOException(new AuthorizationException("p1"))).when(p1)
      .warmUpEncryptedKeys(Mockito.anyString());
  KMSClientProvider p2 = mock(KMSClientProvider.class);
  Mockito.doThrow(new IOException(new AuthorizationException("p2"))).when(p2)
      .warmUpEncryptedKeys(Mockito.anyString());
  when(p1.getKMSUrl()).thenReturn("p1");
  when(p2.getKMSUrl()).thenReturn("p2");
  LoadBalancingKMSClientProvider kp = new LoadBalancingKMSClientProvider(
      new KMSClientProvider[] {p1, p2}, 0, conf);
  try {
    kp.warmUpEncryptedKeys(keyName);
    fail("Should fail since both providers threw IOException");
  } catch (Exception e) {
    assertTrue(e.getCause() instanceof IOException);
  }
  Mockito.verify(p1, Mockito.times(1)).warmUpEncryptedKeys(keyName);
  Mockito.verify(p2, Mockito.times(1)).warmUpEncryptedKeys(keyName);
}