private static void assertFiles(
      String dirPath, Set<String> expectedFiles, boolean excludeNonExistingFiles)
      throws IOException {
    LogTransaction.waitForDeletions();

    File dir = new File(dirPath).getCanonicalFile();
    File[] files = dir.listFiles();
    if (files != null) {
      for (File file : files) {
        if (file.isDirectory()) continue;

        String filePath = file.getPath();
        assertTrue(
            String.format("%s not in [%s]", filePath, expectedFiles),
            expectedFiles.contains(filePath));
        expectedFiles.remove(filePath);
      }
    }

    if (excludeNonExistingFiles) {
      for (String filePath : expectedFiles) {
        File file = new File(filePath);
        if (!file.exists()) expectedFiles.remove(filePath);
      }
    }

    assertTrue(expectedFiles.toString(), expectedFiles.isEmpty());
  }
  // Check either that a temporary file is expected to exist (in the existingFiles) or that
  // it does not exist any longer (on Windows we need to check File.exists() because a list
  // might return a file as existing even if it does not)
  private static void assertFiles(Iterable<String> existingFiles, Set<File> temporaryFiles) {
    for (String filePath : existingFiles) {
      File file = new File(filePath);
      assertTrue(filePath, temporaryFiles.contains(file));
      temporaryFiles.remove(file);
    }

    for (File file : temporaryFiles) {
      if (!file.exists()) temporaryFiles.remove(file);
    }

    assertTrue(temporaryFiles.toString(), temporaryFiles.isEmpty());
  }