/**
   * Verify a ViewFileSystem wrapped over multiple federated NameNodes will dispatch the XAttr
   * operations to the correct NameNode.
   */
  @Test
  public void testXAttrOnMountEntry() throws Exception {
    // Set XAttrs on the first namespace and verify they are correct
    fsView.setXAttr(mountOnNn1, name1, value1);
    fsView.setXAttr(mountOnNn1, name2, value2);
    assertEquals(2, fsView.getXAttrs(mountOnNn1).size());
    assertArrayEquals(value1, fsView.getXAttr(mountOnNn1, name1));
    assertArrayEquals(value2, fsView.getXAttr(mountOnNn1, name2));
    // Double-check by getting the XAttrs using FileSystem
    // instead of ViewFileSystem
    assertArrayEquals(value1, fHdfs.getXAttr(targetTestRoot, name1));
    assertArrayEquals(value2, fHdfs.getXAttr(targetTestRoot, name2));

    // Paranoid check: verify the other namespace does not
    // have XAttrs set on the same path.
    assertEquals(0, fsView.getXAttrs(mountOnNn2).size());
    assertEquals(0, fHdfs2.getXAttrs(targetTestRoot2).size());

    // Remove the XAttr entries on the first namespace
    fsView.removeXAttr(mountOnNn1, name1);
    fsView.removeXAttr(mountOnNn1, name2);
    assertEquals(0, fsView.getXAttrs(mountOnNn1).size());
    assertEquals(0, fHdfs.getXAttrs(targetTestRoot).size());

    // Now set XAttrs on the second namespace
    fsView.setXAttr(mountOnNn2, name1, value1);
    fsView.setXAttr(mountOnNn2, name2, value2);
    assertEquals(2, fsView.getXAttrs(mountOnNn2).size());
    assertArrayEquals(value1, fsView.getXAttr(mountOnNn2, name1));
    assertArrayEquals(value2, fsView.getXAttr(mountOnNn2, name2));
    assertArrayEquals(value1, fHdfs2.getXAttr(targetTestRoot2, name1));
    assertArrayEquals(value2, fHdfs2.getXAttr(targetTestRoot2, name2));

    fsView.removeXAttr(mountOnNn2, name1);
    fsView.removeXAttr(mountOnNn2, name2);
    assertEquals(0, fsView.getXAttrs(mountOnNn2).size());
    assertEquals(0, fHdfs2.getXAttrs(targetTestRoot2).size());
  }