@Test
  public void testCreateDefaultSettingsWithProxy() {
    // given
    File settingsXML = new File(Paths.Setting.settingsXMLPath);
    settingsXML.deleteOnExit();

    File installationData = new File(Paths.Setting.installationDataXMLPath);
    installationData.deleteOnExit();

    EnvironmentContext environmentContext = new EnvironmentContext();
    environmentContext.setSettingsXMLPath(Paths.Setting.settingsXMLPath);
    environmentContext.setInstallationDataXMLPath(Paths.Setting.installationDataXMLPath);

    // when
    EnvironmentData environmentData =
        new EnvironmentDataManager(environmentContext).createDefaultSettingsWithProxy();
    ClientSettings clientSettings = environmentData.getClientSettings();
    List<ProgramSettings> programsSettings =
        new ArrayList<ProgramSettings>(environmentData.getProgramsSettings());

    // then
    assertThat(clientSettings)
        .as("createEnvironmentDataWithProxy() should create client's settings")
        .isNotNull();
    assertThat(clientSettings.getPathToClientDirectory())
        .as("createEnvironmentDataWithProxy() should create client's directory")
        .isNotNull()
        .isEqualTo(environmentContext.getDefaultPathToClientDirectory());
    assertThat(clientSettings.getPathToClient())
        .as("createEnvironmentDataWithProxy() should create client's executable")
        .isNotNull()
        .isEqualTo(environmentContext.getDefaultPathToClient());
    assertThat(clientSettings.getPathToInstaller())
        .as("createEnvironmentDataWithProxy() should create installer's path")
        .isNotNull()
        .isEqualTo(environmentContext.getDefaultPathToInstaller());
    assertThat(clientSettings.getProxyAddress())
        .as("createEnvironmentDataWithProxy() should create proxy's address")
        .isNotNull()
        .isEqualTo(environmentContext.getDefaultProxyAddress());
    assertThat(clientSettings.getProxyPort())
        .as("createEnvironmentDataWithProxy() should create proxy's port")
        .isNotNull()
        .isEqualTo(environmentContext.getDefaultProxyPort());

    assertThat(programsSettings)
        .as("createEnvironmentDataWithProxy() should not create any program's settings")
        .isNotNull()
        .isEmpty();
  }
  @SuppressWarnings("null")
  @Test
  public void testGetEnvironmentData() throws IOException {
    // given
    File settingsXML = new File(Paths.Setting.settingsXMLPath);
    Files.write(CorrectXMLExamples.clientConfiguration, settingsXML, Charsets.UTF_8);
    settingsXML.deleteOnExit();

    File installationData = new File(Paths.Setting.installationDataXMLPath);
    Files.write(CorrectXMLExamples.installationData, installationData, Charsets.UTF_8);
    installationData.deleteOnExit();

    EnvironmentContext environmentContext = new EnvironmentContext();
    environmentContext.setSettingsXMLPath(Paths.Setting.settingsXMLPath);
    environmentContext.setInstallationDataXMLPath(Paths.Setting.installationDataXMLPath);

    EnvironmentData environmentData = null;
    boolean exceptionThrown = false;

    // when
    try {
      environmentData = new EnvironmentDataManager(environmentContext).getEnvironmentData();
    } catch (ClientEnvironmentException e) {
      exceptionThrown = true;
    }

    // then
    assertThat(exceptionThrown)
        .as(
            "getEnvironmentData() should not throw exception while attempting to obtain data from legitimate sources")
        .isFalse();
    assertThat(environmentData)
        .as("getEnvironmentData() should return result properly")
        .isNotNull();
    assertThat(environmentData.getClientSettings())
        .as("getEnvironmentData() result should contain valid client settings")
        .isNotNull();
    assertThat(environmentData.getProgramsSettings())
        .as("getEnvironmentData() result should contain valid programs' settings")
        .isNotNull()
        .isNotEmpty();
    assertThat(environmentData.getInstallationsData())
        .as(
            "getEnvironmentData() result should contain valid installation data when it's available")
        .isNotNull()
        .isNotEmpty();
  }
  @Test
  public void testAvailabilityFilter() {
    // given
    SortedSet<ProgramSettings> programsSettings = getProgramsSettings();
    SortedSet<Program> installationData = getInstallationData();
    EnvironmentData environmentData = new EnvironmentData(null, programsSettings);
    environmentData.setInstallationsData(installationData);

    // when
    SortedSet<Program> registeredPrograms =
        new AvailabilityFilter(environmentData).getRegisteredPrograms();

    // then
    assertThat(registeredPrograms)
        .as("Constructor should properly obtain registered programs")
        .isNotNull()
        .hasSize(1)
        .isEqualTo(getRegisteredPrograms(programsSettings, installationData));
  }
  @Test
  public void testFindAvailableToInstallForExistingPrograms() {
    // given
    SortedSet<ProgramSettings> programsSettings = getProgramsSettings();
    SortedSet<Program> installationData = getInstallationData();
    EnvironmentData environmentData = new EnvironmentData(null, programsSettings);
    environmentData.setInstallationsData(installationData);

    // when
    SortedSet<Program> availableToInstall =
        new AvailabilityFilter(environmentData)
            .findProgramsAvailableToInstallOrInstalledWithDefinedSettings(
                getProgramsAvailableOnServers());

    // then
    assertThat(availableToInstall)
        .as(
            "availableToInstall(SortedSet<Program>) should remove program installed but not available on servers, and add programs available on servers but not installed")
        .isNotNull()
        .hasSize(1);
  }
  @Test
  public void testSetEnvironmentData() throws ClientEnvironmentException, IOException {
    // given
    File settingsXML = new File(Paths.Setting.settingsXMLPath);
    settingsXML.deleteOnExit();

    File installationData = new File(Paths.Setting.installationDataXMLPath);
    installationData.deleteOnExit();

    EnvironmentContext environmentContext = new EnvironmentContext();
    environmentContext.setSettingsXMLPath(Paths.Setting.settingsXMLPath);
    environmentContext.setInstallationDataXMLPath(Paths.Setting.installationDataXMLPath);

    EnvironmentDataManager environmentDataService = new EnvironmentDataManager(environmentContext);

    // when
    environmentDataService.setEnvironmentData(environmentData());
    EnvironmentData savedEnvironmentData = environmentDataService.getEnvironmentData();
    ClientSettings savedClientSettings = savedEnvironmentData.getClientSettings();
    List<ProgramSettings> savedProgramsSettings =
        new ArrayList<ProgramSettings>(savedEnvironmentData.getProgramsSettings());

    // then
    assertThat(savedClientSettings)
        .as("setEnvironmentData(EnvironmentData) should save client's settings")
        .isNotNull();
    assertThat(savedClientSettings.getPathToClientDirectory())
        .as("setEnvironmentData(EnvironmentData) should save client's directory")
        .isNotNull()
        .isEqualTo(Paths.Library.clientDir);
    assertThat(savedClientSettings.getPathToClient())
        .as("setEnvironmentData(EnvironmentData) should save client's executable")
        .isNotNull()
        .isEqualTo(Paths.Library.clientPath);
    assertThat(savedClientSettings.getPathToInstaller())
        .as("setEnvironmentData(EnvironmentData) should save installer's path")
        .isNotNull()
        .isEqualTo(Paths.Library.installerPath);
    ;

    assertThat(savedProgramsSettings)
        .as("setEnvironmentData(EnvironmentData) should save installation data")
        .isNotNull()
        .hasSize(2);
    assertThat(savedProgramsSettings.get(0).getProgramName())
        .as("setEnvironmentData(EnvironmentData) should save program's name")
        .isNotNull()
        .isEqualTo(Values.ProgramSettings.programName);
    assertThat(savedProgramsSettings.get(0).getPathToProgramDirectory())
        .as("setEnvironmentData(EnvironmentData) should save program's directory")
        .isNotNull()
        .isEqualTo(Paths.Installations.Program.programDir);
    assertThat(savedProgramsSettings.get(0).getPathToProgram())
        .as("setEnvironmentData(EnvironmentData) should save path to program")
        .isNotNull()
        .isEqualTo(Paths.Installations.Program.programPath);
    assertThat(savedProgramsSettings.get(0).getServerAddress())
        .as("setEnvironmentData(EnvironmentData) should save server's address")
        .isNotNull()
        .isEqualTo(Values.ProgramSettings.serverAddress);
    assertThat(savedProgramsSettings.get(0).isDevelopmentVersion())
        .as("setEnvironmentData(EnvironmentData) should save development version")
        .isTrue();
  }