@Parameterized.Parameters(name = "{index}: caKeyType={0}, certKeyType={1}, keyPassword={2}, "
    + "validateServerHostnames={3}, testCase={4}")
  public static List<Object[]> data() {
    List<Object[]> params = new ArrayList<>();
    for (X509KeyType caKeyType : X509KeyType.values()) {
      for (X509KeyType certKeyType : X509KeyType.values()) {
        for (String keyPassword : new String[] { "", "pa$$w0rd" }) {
          // we want to run with and without validating hostnames. we encode the expected success
          // criteria in the TestCase config. See below.
          for (boolean validateServerHostnames : new Boolean[] { true, false }) {
            // fail for non-verifiable certs or certs with bad hostnames when validateServerHostname
            // is true. otherwise succeed.
            params.add(new Object[] { caKeyType, certKeyType, keyPassword, false,
              validateServerHostnames, CertConfig.NON_VERIFIABLE_CERT });
            params.add(new Object[] { caKeyType, certKeyType, keyPassword, !validateServerHostnames,
              validateServerHostnames, CertConfig.VERIFIABLE_CERT_WITH_BAD_HOST });
            params.add(new Object[] { caKeyType, certKeyType, keyPassword, true,
              validateServerHostnames, CertConfig.GOOD_CERT });
          }
        }
      }
    }
    return params;
  }
Comprehensively tests all permutations of certificate and host verification on the client side.
Tests each permutation of that against each value of {@link CertConfig}, i.e. passing a bad cert,
etc. See inline comments in {@link #data()} below for what the expectations are
hbase-server/src/test/java/org/apache/hadoop/hbase/security/TestMutualTlsClientSide.java