@Test
  public void createTempFolderDefault() throws Exception {
    System2 system = mock(System2.class);
    tempFolderProvider = new GlobalTempFolderProvider(system);
    File userHome = temp.newFolder();

    when(system.envVariable("SONAR_USER_HOME")).thenReturn(null);
    when(system.property("user.home")).thenReturn(userHome.getAbsolutePath().toString());

    // if nothing is defined, it will be in {user.home}/.sonar/.sonartmp
    File defaultSonarHome = new File(userHome.getAbsolutePath(), ".sonar");
    File workingDir =
        new File(defaultSonarHome, CoreProperties.GLOBAL_WORKING_DIRECTORY_DEFAULT_VALUE)
            .getAbsoluteFile();
    try {
      TempFolder tempFolder =
          tempFolderProvider.provide(new GlobalProperties(Collections.<String, String>emptyMap()));
      tempFolder.newDir();
      tempFolder.newFile();
      assertThat(getCreatedTempDir(workingDir)).exists();
      assertThat(getCreatedTempDir(workingDir).list()).hasSize(2);
    } finally {
      FileUtils.deleteQuietly(workingDir);
    }
  }
  @Test
  public void createTempFolderProps() throws Exception {
    File workingDir = temp.newFolder();

    TempFolder tempFolder =
        tempFolderProvider.provide(
            new GlobalProperties(
                ImmutableMap.of(
                    CoreProperties.GLOBAL_WORKING_DIRECTORY, workingDir.getAbsolutePath())));
    tempFolder.newDir();
    tempFolder.newFile();
    assertThat(getCreatedTempDir(workingDir)).exists();
    assertThat(getCreatedTempDir(workingDir).list()).hasSize(2);

    FileUtils.deleteQuietly(workingDir);
  }
  @Test
  public void createTempFolderSonarHome() throws Exception {
    // with sonar home, it will be in {sonar.home}/.sonartmp
    File sonarHome = temp.newFolder();
    File workingDir =
        new File(sonarHome, CoreProperties.GLOBAL_WORKING_DIRECTORY_DEFAULT_VALUE)
            .getAbsoluteFile();

    TempFolder tempFolder =
        tempFolderProvider.provide(
            new GlobalProperties(ImmutableMap.of("sonar.userHome", sonarHome.getAbsolutePath())));
    tempFolder.newDir();
    tempFolder.newFile();
    assertThat(getCreatedTempDir(workingDir)).exists();
    assertThat(getCreatedTempDir(workingDir).list()).hasSize(2);

    FileUtils.deleteQuietly(sonarHome);
  }
  @Test
  public void dotWorkingDir() throws IOException {
    File sonarHome = temp.getRoot();
    String globalWorkDir = ".";
    GlobalProperties globalProperties =
        new GlobalProperties(
            ImmutableMap.of(
                "sonar.userHome",
                sonarHome.getAbsolutePath(),
                CoreProperties.GLOBAL_WORKING_DIRECTORY,
                globalWorkDir));

    TempFolder tempFolder = tempFolderProvider.provide(globalProperties);
    File newFile = tempFolder.newFile();
    assertThat(newFile.getParentFile().getParentFile().getAbsolutePath())
        .isEqualTo(sonarHome.getAbsolutePath());
    assertThat(newFile.getParentFile().getName()).startsWith(".sonartmp_");
  }
  @Test
  public void cleanUpOld() throws IOException {
    long creationTime = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(100);
    File workingDir = temp.newFolder();

    for (int i = 0; i < 3; i++) {
      File tmp = new File(workingDir, ".sonartmp_" + i);
      tmp.mkdirs();
      setFileCreationDate(tmp, creationTime);
    }

    tempFolderProvider.provide(
        new GlobalProperties(
            ImmutableMap.of(
                CoreProperties.GLOBAL_WORKING_DIRECTORY, workingDir.getAbsolutePath())));
    // this also checks that all other temps were deleted
    assertThat(getCreatedTempDir(workingDir)).exists();

    FileUtils.deleteQuietly(workingDir);
  }