@Test
  void testIncrementsFailureCount()
      throws InterruptedException, IOException, SecurityException, NoSuchMethodException {
    HttpCommand command = createCommand();
    HttpResponse response = new HttpResponse(400, null, null);

    handler.shouldRetryRequest(command, response);
    assertEquals(command.getFailureCount(), 1);

    handler.shouldRetryRequest(command, response);
    assertEquals(command.getFailureCount(), 2);

    handler.shouldRetryRequest(command, response);
    assertEquals(command.getFailureCount(), 3);
  }
  @Test
  void testClosesInputStream()
      throws InterruptedException, IOException, SecurityException, NoSuchMethodException {
    HttpCommand command = createCommand();

    HttpResponse response = new HttpResponse(400, null, null);

    InputStream inputStream =
        new InputStream() {
          boolean isOpen = true;

          @Override
          public void close() {
            this.isOpen = false;
          }

          int count = 1;

          @Override
          public int read() throws IOException {
            if (this.isOpen) return (count > -1) ? count-- : -1;
            else return -1;
          }

          @Override
          public int available() throws IOException {
            if (this.isOpen) return count;
            else return 0;
          }
        };
    response.setPayload(Payloads.newInputStreamPayload(inputStream));
    response.getPayload().getContentMetadata().setContentLength(1l);
    assertEquals(response.getPayload().getInput().available(), 1);
    assertEquals(response.getPayload().getInput().read(), 1);

    handler.shouldRetryRequest(command, response);

    assertEquals(response.getPayload().getInput().available(), 0);
    assertEquals(response.getPayload().getInput().read(), -1);
  }
  @Test
  void testDisallowsExcessiveRetries()
      throws InterruptedException, IOException, SecurityException, NoSuchMethodException {
    HttpCommand command = createCommand();
    HttpResponse response = new HttpResponse(400, null, null);

    assertEquals(handler.shouldRetryRequest(command, response), true); // Failure 1

    assertEquals(handler.shouldRetryRequest(command, response), true); // Failure 2

    assertEquals(handler.shouldRetryRequest(command, response), true); // Failure 3

    assertEquals(handler.shouldRetryRequest(command, response), true); // Failure 4

    assertEquals(handler.shouldRetryRequest(command, response), true); // Failure 5

    assertEquals(handler.shouldRetryRequest(command, response), false); // Failure 6
  }