@Test
public void testDetermineCacheVisibilities() throws IOException {

  fs.setPermission(TEST_VISIBILITY_PARENT_DIR,
      new FsPermission((short)00777));
  fs.setPermission(TEST_VISIBILITY_CHILD_DIR,
      new FsPermission((short)00777));
  fs.setWorkingDirectory(TEST_VISIBILITY_CHILD_DIR);
  Job job = Job.getInstance(conf);
  Path relativePath = new Path(SECOND_CACHE_FILE);
  Path wildcardPath = new Path("*");
  Map<URI, FileStatus> statCache = new HashMap<>();
  Configuration jobConf;
  job.addCacheFile(firstCacheFile.toUri());
  job.addCacheFile(relativePath.toUri());
  jobConf = job.getConfiguration();
  // skip test if scratch dir is not PUBLIC
  assumeTrue(TEST_VISIBILITY_PARENT_DIR + " is not public",
      ClientDistributedCacheManager.isPublic(
          jobConf, TEST_VISIBILITY_PARENT_DIR.toUri(), statCache));
  ClientDistributedCacheManager.determineCacheVisibilities(jobConf,
      statCache);
  // We use get() instead of getBoolean() so we can tell the difference
  // between wrong and missing
  assertEquals("The file paths were not found to be publicly visible "
      + "even though the full path is publicly accessible",
      "true,true", jobConf.get(MRJobConfig.CACHE_FILE_VISIBILITIES));
  checkCacheEntries(statCache, null, firstCacheFile, relativePath);
  job = Job.getInstance(conf);
  job.addCacheFile(wildcardPath.toUri());
  jobConf = job.getConfiguration();
  statCache.clear();
  ClientDistributedCacheManager.determineCacheVisibilities(jobConf,
      statCache);
  // We use get() instead of getBoolean() so we can tell the difference
  // between wrong and missing
  assertEquals("The file path was not found to be publicly visible "
      + "even though the full path is publicly accessible",
      "true", jobConf.get(MRJobConfig.CACHE_FILE_VISIBILITIES));
  checkCacheEntries(statCache, null, wildcardPath.getParent());
  Path qualifiedParent = fs.makeQualified(TEST_VISIBILITY_PARENT_DIR);
  fs.setPermission(TEST_VISIBILITY_PARENT_DIR,
      new FsPermission((short)00700));
  job = Job.getInstance(conf);
  job.addCacheFile(firstCacheFile.toUri());
  job.addCacheFile(relativePath.toUri());
  jobConf = job.getConfiguration();
  statCache.clear();
  ClientDistributedCacheManager.determineCacheVisibilities(jobConf,
      statCache);
  // We use get() instead of getBoolean() so we can tell the difference
  // between wrong and missing
  assertEquals("The file paths were found to be publicly visible "
      + "even though the parent directory is not publicly accessible",
      "false,false", jobConf.get(MRJobConfig.CACHE_FILE_VISIBILITIES));
  checkCacheEntries(statCache, qualifiedParent,
      firstCacheFile, relativePath);
  job = Job.getInstance(conf);
  job.addCacheFile(wildcardPath.toUri());
  jobConf = job.getConfiguration();
  statCache.clear();
  ClientDistributedCacheManager.determineCacheVisibilities(jobConf,
      statCache);
  // We use get() instead of getBoolean() so we can tell the difference
  // between wrong and missing
  assertEquals("The file path was found to be publicly visible "
      + "even though the parent directory is not publicly accessible",
      "false", jobConf.get(MRJobConfig.CACHE_FILE_VISIBILITIES));
  checkCacheEntries(statCache, qualifiedParent, wildcardPath.getParent());
}