@Test
public 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();
}