public static <T> T createRMProxy(final Configuration configuration,
      final Class<T> protocol) throws IOException {
    ClientRMProxy<T> clientRMProxy = new ClientRMProxy<>();
    return createRMProxy(configuration, protocol, clientRMProxy);
  }
@Test
  void testProxyUserCorrectUGI() throws Exception {
    final YarnConfiguration conf = new YarnConfiguration();
    conf.setBoolean(YarnConfiguration.RM_HA_ENABLED, true);
    conf.set(YarnConfiguration.RM_HA_IDS, "rm1,rm2");
    conf.set(HAUtil.addSuffix(YarnConfiguration.RM_HOSTNAME, "rm1"),
        "0.0.0.0");
    conf.set(HAUtil.addSuffix(YarnConfiguration.RM_HOSTNAME, "rm2"),
        "0.0.0.0");
    conf.setLong(YarnConfiguration.CLIENT_FAILOVER_MAX_ATTEMPTS, 2);
    conf.setLong(YarnConfiguration.RESOURCEMANAGER_CONNECT_MAX_WAIT_MS, 2);
    conf.setLong(
        YarnConfiguration.RESOURCEMANAGER_CONNECT_RETRY_INTERVAL_MS, 2);

    // Replace the RPC implementation with one that will capture the current UGI
    conf.setClass(YarnConfiguration.IPC_RPC_IMPL,
        UGICapturingHadoopYarnProtoRPC.class, YarnRPC.class);

    UserGroupInformation realUser = UserGroupInformation.getCurrentUser();
    UserGroupInformation proxyUser =
        UserGroupInformation.createProxyUserForTesting("proxy", realUser,
            new String[]{"group1"});

    // Create the RMProxy using the proxyUser
    ApplicationClientProtocol rmProxy = proxyUser.doAs(
        new PrivilegedExceptionAction<ApplicationClientProtocol>() {
          @Override
          public ApplicationClientProtocol run() throws Exception {
            return ClientRMProxy.createRMProxy(conf,
                ApplicationClientProtocol.class);
          }
        });

    // It was in a doAs, so the UGI should be correct
    assertUGI();

    // Try to use the RMProxy, which should trigger the RPC again
    GetNewApplicationRequest request =
        Records.newRecord(GetNewApplicationRequest.class);
    UGICapturingHadoopYarnProtoRPC.lastCurrentUser = null;
    try {
      rmProxy.getNewApplication(request);
    } catch (IOException ioe) {
      // ignore - RMs are not running so this is expected to fail
    }

    // This time it was outside a doAs, but make sure the UGI was still correct
    assertUGI();
  }