  @Test
  public void decrypt_locksAndUnlocksTheReconnectLockWhenLoginError() throws Exception {

    when(keySet.get(activeKeyUuid))
      .thenReturn(firstActiveKey);

    when(firstActiveKey.decrypt(any(byte[].class), any(byte[].class)))
      .thenThrow(new ProviderException("function 'C_GenerateRandom' returns 0x30"));
    reset(writeLock);
    doThrow(new RuntimeException()).when(encryptionService)
      .reconnect(any(Exception.class));

    try {
      subject.decrypt(new EncryptedValue(activeKeyUuid, "an encrypted value".getBytes(UTF_8), "a nonce".getBytes(UTF_8)));
    } catch (final IllegalBlockSizeException | RuntimeException e) {
      // expected
    }

    verify(readLock, times(2)).lock();
    verify(readLock, times(2)).unlock();

    verify(writeLock, times(1)).lock();
    verify(writeLock, times(1)).unlock();
  }