@Test
public void getNameNodeServiceAddr() throws IOException {

  HdfsConfiguration conf = new HdfsConfiguration();
  
  // One nameservice with two NNs
  final String NS1_NN1_HOST = "ns1-nn1.example.com:8020";
  final String NS1_NN1_HOST_SVC = "ns1-nn2.example.com:8021";
  final String NS1_NN2_HOST = "ns1-nn1.example.com:8020";
  final String NS1_NN2_HOST_SVC = "ns1-nn2.example.com:8021";
 
  conf.set(DFS_NAMESERVICES, "ns1");
  conf.set(DFSUtil.addKeySuffixes(DFS_HA_NAMENODES_KEY_PREFIX, "ns1"),"nn1,nn2"); 
  conf.set(DFSUtil.addKeySuffixes(
      DFS_NAMENODE_RPC_ADDRESS_KEY, "ns1", "nn1"), NS1_NN1_HOST);
  conf.set(DFSUtil.addKeySuffixes(
      DFS_NAMENODE_RPC_ADDRESS_KEY, "ns1", "nn2"), NS1_NN2_HOST);
  // The rpc address is used if no service address is defined
  assertEquals(NS1_NN1_HOST, DFSUtil.getNamenodeServiceAddr(conf, null, "nn1"));
  assertEquals(NS1_NN2_HOST, DFSUtil.getNamenodeServiceAddr(conf, null, "nn2"));
  // A nameservice is specified explicitly
  assertEquals(NS1_NN1_HOST, DFSUtil.getNamenodeServiceAddr(conf, "ns1", "nn1"));
  assertEquals(null, DFSUtil.getNamenodeServiceAddr(conf, "invalid", "nn1"));
  
  // The service addrs are used when they are defined
  conf.set(DFSUtil.addKeySuffixes(
      DFS_NAMENODE_SERVICE_RPC_ADDRESS_KEY, "ns1", "nn1"), NS1_NN1_HOST_SVC);
  conf.set(DFSUtil.addKeySuffixes(
      DFS_NAMENODE_SERVICE_RPC_ADDRESS_KEY, "ns1", "nn2"), NS1_NN2_HOST_SVC);
  assertEquals(NS1_NN1_HOST_SVC, DFSUtil.getNamenodeServiceAddr(conf, null, "nn1"));
  assertEquals(NS1_NN2_HOST_SVC, DFSUtil.getNamenodeServiceAddr(conf, null, "nn2"));
  // We can determine the nameservice ID, there's only one listed
  assertEquals("ns1", DFSUtil.getNamenodeNameServiceId(conf));
  assertEquals("ns1", DFSUtil.getSecondaryNameServiceId(conf));
}