@SuppressWarnings({"checkstyle:CyclomaticComplexity", "checkstyle:FinalParameters"})
  protected static int send(
      final String customerId, final byte[] bytes, final HttpPost httpPost, final HttpHost proxy,
      CloseableHttpClient httpClient, final ResponseHandler responseHandler
  ) {
    int statusCode = DEFAULT_STATUS_CODE;
    if (bytes != null && bytes.length > 0 && httpPost != null && customerId != null) {

      // add the body to the request
      final MultipartEntityBuilder builder = MultipartEntityBuilder.create();
      builder.setMode(HttpMultipartMode.LEGACY);
      builder.addTextBody("cid", customerId);
      builder.addBinaryBody("file", bytes, ContentType.DEFAULT_BINARY, "filename");
      httpPost.setEntity(builder.build());
      httpPost.addHeader("api-version", "phone-home-v1");

      // set the HTTP config
      RequestConfig config = RequestConfig.custom()
          .setConnectTimeout(Timeout.ofMilliseconds(REQUEST_TIMEOUT_MS))
          .setConnectionRequestTimeout(Timeout.ofMilliseconds(REQUEST_TIMEOUT_MS))
          .setResponseTimeout(Timeout.ofMilliseconds(REQUEST_TIMEOUT_MS))
          .build();

      CloseableHttpResponse response = null;

      try {
        if (proxy != null) {
          log.debug("setting proxy to {}", proxy);
          config = RequestConfig.copy(config).setProxy(proxy).build();
          httpPost.setConfig(config);
          final DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
          if (httpClient == null) {
            httpClient = HttpClientBuilder
                .create()
                .setRoutePlanner(routePlanner)
                .setDefaultRequestConfig(config)
                .build();
          }
        } else {
          if (httpClient == null) {
            httpClient = HttpClientBuilder.create().setDefaultRequestConfig(config).build();
          }
        }

        response = httpClient.execute(httpPost);
        if (responseHandler != null) {
          responseHandler.handle(response);
        }

        // send request
        log.debug("POST request returned {}", new StatusLine(response).toString());
        statusCode = response.getCode();
      } catch (IOException e) {
        log.error("Could not submit metrics to Confluent: {}", e.getMessage());
      } finally {
        if (httpClient != null) {
          try {
            httpClient.close();
          } catch (IOException e) {
            log.warn("could not close http client", e);
          }
        }
        if (response != null) {
          try {
            response.close();
          } catch (IOException e) {
            log.warn("could not close http response", e);
          }
        }
      }
    } else {
      statusCode = HttpStatus.SC_BAD_REQUEST;
    }
    return statusCode;
  }
@Test
  public void testSubmitInvalidAnonymousUser() {
    // Given
    HttpPost p = new HttpPost(SECURE_LIVE_TEST_ENDPOINT);
    byte[] anyData = "anyData".getBytes(StandardCharsets.UTF_8);
    int randomIndex = ThreadLocalRandom.current().nextInt(CustomerIdExamples.INVALID_ANONYMOUS_IDS.size());
    String invalidCustomerId = CustomerIdExamples.INVALID_ANONYMOUS_IDS.get(randomIndex);

    // When/Then
    assertNotEquals("customerId=" + invalidCustomerId,
                    HttpStatus.SC_OK, WebClient.send(invalidCustomerId, anyData, p, null));
  }