@Test
public void testPreserve() {

  try {
    FileSystem fs = FileSystem.get(config);
    EnumSet<FileAttribute> attributes = EnumSet.noneOf(FileAttribute.class);
    Path path = new Path("/tmp/abc");
    Path src = new Path("/tmp/src");
    fs.mkdirs(path);
    fs.mkdirs(src);
    FileStatus srcStatus = fs.getFileStatus(src);
    FsPermission noPerm = new FsPermission((short) 0);
    fs.setPermission(path, noPerm);
    fs.setOwner(path, "nobody", "nobody");
    DistCpUtils.preserve(fs, path, srcStatus, attributes);
    FileStatus target = fs.getFileStatus(path);
    Assert.assertEquals(target.getPermission(), noPerm);
    Assert.assertEquals(target.getOwner(), "nobody");
    Assert.assertEquals(target.getGroup(), "nobody");
    attributes.add(FileAttribute.PERMISSION);
    DistCpUtils.preserve(fs, path, srcStatus, attributes);
    target = fs.getFileStatus(path);
    Assert.assertEquals(target.getPermission(), srcStatus.getPermission());
    Assert.assertEquals(target.getOwner(), "nobody");
    Assert.assertEquals(target.getGroup(), "nobody");
    attributes.add(FileAttribute.GROUP);
    attributes.add(FileAttribute.USER);
    DistCpUtils.preserve(fs, path, srcStatus, attributes);
    target = fs.getFileStatus(path);
    Assert.assertEquals(target.getPermission(), srcStatus.getPermission());
    Assert.assertEquals(target.getOwner(), srcStatus.getOwner());
    Assert.assertEquals(target.getGroup(), srcStatus.getGroup());
    fs.delete(path, true);
    fs.delete(src, true);
  } catch (IOException e) {
    LOG.error("Exception encountered ", e);
    Assert.fail("Preserve test failure");
  }
}