org.digidoc4j.ConfigurationTest.java Source code

Java tutorial

Introduction

Here is the source code for org.digidoc4j.ConfigurationTest.java

Source

/* DigiDoc4J library
*
* This software is released under either the GNU Library General Public
* License (see LICENSE.LGPL).
*
* Note that the only valid version of the LGPL license as far as this
* project is concerned is the original GNU Library General Public License
* Version 2.1, February 1999
*/

package org.digidoc4j;

import org.apache.commons.io.FileUtils;
import org.digidoc4j.exceptions.ConfigurationException;
import org.digidoc4j.exceptions.DigiDoc4JException;
import org.digidoc4j.exceptions.TslCertificateSourceInitializationException;
import org.digidoc4j.exceptions.TslKeyStoreNotFoundException;
import org.digidoc4j.impl.bdoc.BDocContainer;
import org.digidoc4j.impl.bdoc.tsl.TSLCertificateSourceImpl;
import org.digidoc4j.impl.bdoc.tsl.TslLoader;
import org.digidoc4j.testutils.TSLHelper;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.rules.TemporaryFolder;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.attribute.FileTime;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

import static org.digidoc4j.Configuration.*;
import static org.digidoc4j.Configuration.Mode.PROD;
import static org.digidoc4j.Configuration.Mode.TEST;
import static org.digidoc4j.ContainerBuilder.BDOC_CONTAINER_TYPE;
import static org.hamcrest.core.IsCollectionContaining.hasItem;
import static org.junit.Assert.*;

import eu.europa.esig.dss.DSSUtils;
import eu.europa.esig.dss.tsl.Condition;
import eu.europa.esig.dss.tsl.KeyUsageBit;
import eu.europa.esig.dss.tsl.ServiceInfo;
import eu.europa.esig.dss.x509.CertificateToken;

public class ConfigurationTest {
    private static final String SIGN_OCSP_REQUESTS = "SIGN_OCSP_REQUESTS";
    private static final String OCSP_PKCS12_CONTAINER = "DIGIDOC_PKCS12_CONTAINER";
    private static final String OCSP_PKCS_12_PASSWD = "DIGIDOC_PKCS12_PASSWD";
    private Configuration configuration;

    @Rule
    public ExpectedException expectedException = ExpectedException.none();

    @Rule
    public TemporaryFolder testFolder = new TemporaryFolder();

    @Before
    public void setUp() {
        System.clearProperty("digidoc4j.mode");
        configuration = new Configuration(TEST);
    }

    @Test
    public void getTSLLocationWhenNotFileURL() {
        Configuration configuration = new Configuration();
        String tslLocation = "URL:test";
        configuration.setTslLocation(tslLocation);

        assertEquals(tslLocation, configuration.getTslLocation());
    }

    @Test
    public void TSLIsLoadedOnlyOnceForGlobalConfiguration() {
        TSLCertificateSource tsl = configuration.getTSL();
        assertEquals(tsl, configuration.getTSL());
    }

    @Test
    public void addTSL() throws IOException, CertificateException {
        TSLCertificateSource tsl = configuration.getTSL();
        int numberOfTSLCertificates = tsl.getCertificates().size();
        addFromFileToTSLCertificate("testFiles/Juur-SK.pem.crt");

        assertEquals(numberOfTSLCertificates + 1, configuration.getTSL().getCertificates().size());
    }

    @Test
    public void addingCertificateToTsl() throws Exception {
        TSLCertificateSource certificateSource = new TSLCertificateSourceImpl();
        addFromFileToTSLCertificate("testFiles/Juur-SK.pem.crt", certificateSource);
        CertificateToken certificateToken = certificateSource.getCertificates().get(0);
        assertThat(certificateToken.getKeyUsageBits(), hasItem(KeyUsageBit.nonRepudiation));
        assertTrue(certificateToken.checkKeyUsage(KeyUsageBit.nonRepudiation));
        ServiceInfo serviceInfo = certificateToken.getAssociatedTSPS().iterator().next();
        assertEquals("http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision",
                serviceInfo.getStatus().get(0).getStatus());
        assertEquals("http://uri.etsi.org/TrstSvc/Svctype/CA/QC", serviceInfo.getType());
        Map<String, List<Condition>> qualifiersAndConditions = serviceInfo.getQualifiersAndConditions();
        assertTrue(qualifiersAndConditions
                .containsKey("http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/QCWithSSCD"));
    }

    @Test
    public void clearTSLLoadsFromConfiguration() {
        TSLCertificateSource tsl = configuration.getTSL();
        int numberOfTSLCertificates = tsl.getCertificates().size();
        configuration.setTSL(null);

        assertEquals(numberOfTSLCertificates, configuration.getTSL().getCertificates().size());
    }

    @Test
    public void setTSL() throws IOException, CertificateException {
        TSLCertificateSource trustedListsCertificateSource = new TSLCertificateSourceImpl();
        FileInputStream fileInputStream = new FileInputStream("testFiles/Juur-SK.pem.crt");
        X509Certificate certificate = DSSUtils.loadCertificate(fileInputStream).getCertificate();
        trustedListsCertificateSource.addTSLCertificate(certificate);

        configuration.setTSL(trustedListsCertificateSource);
        fileInputStream.close();

        assertEquals(1, configuration.getTSL().getCertificates().size());
    }

    @SuppressWarnings("ConstantConditions")
    @Test
    public void clearTSLCache() throws Exception {
        Configuration myConfiguration = new Configuration(TEST);
        File fileCacheDirectory = TslLoader.fileCacheDirectory;
        if (fileCacheDirectory.exists()) {
            FileUtils.cleanDirectory(fileCacheDirectory);
        }

        TSLCertificateSource tslCertificateSource = myConfiguration.getTSL();
        tslCertificateSource.refresh();
        waitOneSecond();
        File oldCachedFile = fileCacheDirectory.listFiles()[0];
        FileTime oldCachedFileDate = (FileTime) Files.getAttribute(oldCachedFile.toPath(), "basic:creationTime");

        tslCertificateSource.invalidateCache();
        myConfiguration.setTSL(null);
        tslCertificateSource = myConfiguration.getTSL();
        tslCertificateSource.refresh();

        File newCachedFile = fileCacheDirectory.listFiles()[0];
        FileTime newCachedFileDate = (FileTime) Files.getAttribute(newCachedFile.toPath(), "basic:creationTime");

        assertTrue(newCachedFileDate.compareTo(oldCachedFileDate) > 0);
    }

    @Test
    public void getTsl_whenCacheIsNotExpired_shouldUseCachedTsl() throws Exception {
        deleteTSLCache();
        configuration.setTslCacheExpirationTime(10000L);
        TSLCertificateSource tsl = configuration.getTSL();
        tsl.refresh();
        long lastModified = getCacheModificationTime();
        waitOneSecond();
        TSLCertificateSource newTsl = configuration.getTSL();
        newTsl.refresh();
        long newModificationTime = getCacheModificationTime();
        assertEquals(lastModified, newModificationTime);
        assertSame(tsl, newTsl);
    }

    @Test
    public void getTsl_whenCacheIsExpired_shouldDownloadNewTsl() throws Exception {
        deleteTSLCache();
        configuration.setTslCacheExpirationTime(500L);
        TSLCertificateSource tsl = configuration.getTSL();
        tsl.refresh();
        long lastModified = getCacheModificationTime();
        waitOneSecond();
        TSLCertificateSource newTsl = configuration.getTSL();
        newTsl.refresh();
        long newModificationTime = getCacheModificationTime();
        assertTrue(lastModified < newModificationTime);
        assertSame(tsl, newTsl);
    }

    @Test
    public void lotlValidationFailsWithWrongCertsInKeystore() {
        Configuration myConfiguration = new Configuration(PROD);
        myConfiguration.setTslKeyStoreLocation("keystore/test-keystore.jks");
        try {
            myConfiguration.getTSL();
        } catch (TslCertificateSourceInitializationException e) {
            assertEquals("Not ETSI compliant signature. The signature is not valid.", e.getMessage());
        }
    }

    @Test
    public void addedTSLIsValid() throws IOException, CertificateException {
        addFromFileToTSLCertificate("testFiles/Juur-SK.pem.crt");
        addFromFileToTSLCertificate("testFiles/EE_Certification_Centre_Root_CA.pem.crt");
        addFromFileToTSLCertificate("testFiles/ESTEID-SK_2011.pem.crt");
        addFromFileToTSLCertificate("testFiles/SK_OCSP_RESPONDER_2011.pem.cer");
        addFromFileToTSLCertificate("testFiles/SK_TSA.pem.crt");
        Container container = ContainerOpener.open("testFiles/test.asice", configuration);
        ValidationResult verify = container.validate();
        assertTrue(verify.isValid());
    }

    private void addFromFileToTSLCertificate(String fileName) throws IOException, CertificateException {
        TSLCertificateSource tsl = configuration.getTSL();
        addFromFileToTSLCertificate(fileName, tsl);
    }

    private void addFromFileToTSLCertificate(String fileName, TSLCertificateSource tsl) throws IOException {
        FileInputStream fileInputStream = new FileInputStream(fileName);
        X509Certificate certificate = DSSUtils.loadCertificate(fileInputStream).getCertificate();
        tsl.addTSLCertificate(certificate);
        fileInputStream.close();
    }

    @Test
    @Ignore("Ignored as this functionality is not used in DDS but this test is broken due to DDS forks custom revocation handling.")
    public void policyFileIsReadFromNonDefaultFileLocation() {
        configuration.setValidationPolicy("moved_constraint.xml");
        ContainerOpener.open("testFiles/asics_for_testing.bdoc", configuration);
    }

    @Test
    //@Ignore("RIA VPN")
    //This test succeeds only in RIA VPN
    public void TSLIsLoadedAfterSettingNewTSLLocation() {
        Configuration configuration = new Configuration(TEST);
        configuration.setTslLocation("https://demo.sk.ee/TSL/tl-mp-test-EE.xml");
        BDocContainer container = (BDocContainer) ContainerBuilder.aContainer(BDOC_CONTAINER_TYPE)
                .withConfiguration(configuration).build();
        container.getConfiguration().getTSL();
        assertEquals(6, container.getConfiguration().getTSL().getCertificates().size());

        configuration.setTslLocation("http://10.0.25.57/tsl/trusted-test-mp.xml");
        container = (BDocContainer) ContainerBuilder.aContainer(BDOC_CONTAINER_TYPE)
                .withConfiguration(configuration).build();
        assertNotEquals(5, container.getConfiguration().getTSL().getCertificates().size());
    }

    @Test(expected = DigiDoc4JException.class)
    public void TSLFileNotFoundThrowsException() {
        Configuration configuration = new Configuration();
        configuration.setTslLocation("file:test-tsl/NotExisting.xml");
        BDocContainer container = (BDocContainer) ContainerBuilder.aContainer(BDOC_CONTAINER_TYPE)
                .withConfiguration(configuration).build();
        container.getConfiguration().getTSL().refresh();
    }

    @Test(expected = DigiDoc4JException.class)
    public void TSLConnectionFailureThrowsException() {
        Configuration configuration = new Configuration();
        configuration.setTslLocation("http://127.0.0.1/tsl/incorrect.xml");
        BDocContainer container = (BDocContainer) ContainerBuilder.aContainer(BDOC_CONTAINER_TYPE)
                .withConfiguration(configuration).build();
        container.getConfiguration().getTSL().refresh();
    }

    @Test
    public void testLoadConfiguration() throws Exception {
        BDocContainer container = (BDocContainer) ContainerBuilder.aContainer(BDOC_CONTAINER_TYPE)
                .withConfiguration(new Configuration(Configuration.Mode.TEST)).build();
        assertFalse(container.getConfiguration().isBigFilesSupportEnabled());
        container.getConfiguration().loadConfiguration("testFiles/digidoc_test_conf.yaml");
        assertTrue(container.getConfiguration().isBigFilesSupportEnabled());
        assertEquals(8192, container.getConfiguration().getMaxDataFileCachedInMB());
    }

    @Test
    public void whenTSLLocationIsMalformedURLNoErrorIsRaisedAndThisSameValueIsReturned() throws Exception {
        Configuration configuration = new Configuration();
        String tslLocation = "file://C:\\";
        configuration.setTslLocation(tslLocation);

        assertEquals(tslLocation, configuration.getTslLocation());
    }

    @Test
    public void getTSLLocationFileDoesNotExistReturnsUrlPath() {
        Configuration configuration = new Configuration();
        String tslLocation = ("file:conf/does-not-exist.xml");
        configuration.setTslLocation(tslLocation);

        assertEquals(configuration.getTslLocation(), tslLocation);
    }

    @Test
    public void setTslLocation() throws Exception {
        configuration.setTslLocation("tslLocation");
        assertEquals("tslLocation", configuration.getTslLocation());
    }

    @Test
    public void getTslLocationFromConfigurationFile() throws Exception {
        configuration.loadConfiguration("testFiles/digidoc_test_conf.yaml");
        assertEquals("file:conf/test_TSLLocation", configuration.getTslLocation());
    }

    @Test
    public void setTslLocationOverwritesConfigurationFile() throws Exception {
        configuration.loadConfiguration("testFiles/digidoc_test_conf.yaml");
        configuration.setTslLocation("tslLocation");
        assertEquals("tslLocation", configuration.getTslLocation());
    }

    @Test
    public void setTspSource() throws Exception {
        configuration.setTspSource("tspSource");
        assertEquals("tspSource", configuration.getTspSource());
    }

    @Test
    public void setValidationPolicy() throws Exception {
        configuration.setValidationPolicy("policy");
        assertEquals("policy", configuration.getValidationPolicy());
    }

    @Test
    public void setOcspSource() throws Exception {
        configuration.setOcspSource("ocsp_source");
        assertEquals("ocsp_source", configuration.getOcspSource());
    }

    @Test
    public void defaultOCSPAccessCertificateFile() {
        assertNull(configuration.getOCSPAccessCertificateFileName());
        assertNull(getJDigiDocConfValue(configuration, OCSP_PKCS12_CONTAINER));
    }

    @Test
    public void getOCSPAccessCertificateFileFromConfigurationFile() {
        configuration.loadConfiguration("testFiles/digidoc_test_conf.yaml");
        assertEquals("conf/OCSP_access_certificate_test_file_name",
                configuration.getOCSPAccessCertificateFileName());
        assertEquals("conf/OCSP_access_certificate_test_file_name",
                getJDigiDocConfValue(configuration, OCSP_PKCS12_CONTAINER));
    }

    @Test
    public void getOCSPAccessCertificateFileFromStream() throws FileNotFoundException {
        FileInputStream stream = new FileInputStream("testFiles/digidoc_test_conf.yaml");
        configuration.loadConfiguration(stream);
        assertEquals("conf/OCSP_access_certificate_test_file_name",
                configuration.getOCSPAccessCertificateFileName());
        assertEquals("conf/OCSP_access_certificate_test_file_name",
                getJDigiDocConfValue(configuration, OCSP_PKCS12_CONTAINER));
    }

    @Test
    public void setOCSPAccessCertificateFileNameOverwritesConfigurationFile() {
        configuration.loadConfiguration("testFiles/digidoc_test_conf.yaml");
        configuration.setOCSPAccessCertificateFileName("New File");
        assertEquals("New File", configuration.getOCSPAccessCertificateFileName());
        assertEquals("New File", getJDigiDocConfValue(configuration, OCSP_PKCS12_CONTAINER));
    }

    @Test
    public void defaultOCSPAccessCertificatePassword() {
        assertEquals(0, configuration.getOCSPAccessCertificatePassword().length);
        assertNull(getJDigiDocConfValue(configuration, OCSP_PKCS_12_PASSWD));
    }

    @Test
    public void getOCSPAccessCertificatePasswordFromConfigurationFile() throws Exception {
        configuration.loadConfiguration("testFiles/digidoc_test_conf.yaml");
        assertArrayEquals("OCSP_test_password".toCharArray(), configuration.getOCSPAccessCertificatePassword());
        assertEquals("OCSP_test_password", getJDigiDocConfValue(configuration, OCSP_PKCS_12_PASSWD));
    }

    @Test
    public void setOCSPAccessCertificatePasswordOverwritesConfigurationFile() {
        configuration.loadConfiguration("testFiles/digidoc_test_conf.yaml");
        char[] newPassword = "New password".toCharArray();
        configuration.setOCSPAccessCertificatePassword(newPassword);
        assertArrayEquals(newPassword, configuration.getOCSPAccessCertificatePassword());
        assertEquals("New password", getJDigiDocConfValue(configuration, OCSP_PKCS_12_PASSWD));
    }

    @Test
    public void signingOcspRequest_ShouldBeDisabled_InProdByDefault() throws Exception {
        Configuration configuration = new Configuration(Mode.PROD);
        assertFalse(configuration.hasToBeOCSPRequestSigned());
        assertEquals("false", getJDigiDocConfValue(configuration, SIGN_OCSP_REQUESTS));
    }

    @Test
    public void signingOcspRequest_ShouldBeDisabled_InTestByDefault() throws Exception {
        Configuration configuration = new Configuration(Mode.TEST);
        assertFalse(configuration.hasToBeOCSPRequestSigned());
        assertEquals("false", getJDigiDocConfValue(configuration, SIGN_OCSP_REQUESTS));
    }

    @Test
    public void disableSigningOcspRequestsInProd() throws Exception {
        Configuration configuration = new Configuration(Mode.PROD);
        configuration.setSignOCSPRequests(false);
        assertFalse(configuration.hasToBeOCSPRequestSigned());
        assertEquals("false", getJDigiDocConfValue(configuration, SIGN_OCSP_REQUESTS));
    }

    @Test
    public void enableSigningOcspRequestsInTest() throws Exception {
        Configuration configuration = new Configuration(Mode.TEST);
        configuration.setSignOCSPRequests(true);
        assertTrue(configuration.hasToBeOCSPRequestSigned());
        assertEquals("true", getJDigiDocConfValue(configuration, SIGN_OCSP_REQUESTS));
    }

    @Test
    public void loadDisableSigningOcspRequestFromConfFileInProd() throws Exception {
        Configuration configuration = new Configuration(Mode.PROD);
        configuration.loadConfiguration("testFiles/digidoc_test_all_optional_settings.yaml");
        assertFalse(configuration.hasToBeOCSPRequestSigned());
        assertEquals("false", getJDigiDocConfValue(configuration, SIGN_OCSP_REQUESTS));
    }

    @Test
    public void loadDisableSigningOcspRequestFromConfFile() throws Exception {
        File confFile = createConfFileWithParameter("SIGN_OCSP_REQUESTS: false");
        Configuration configuration = new Configuration();
        configuration.loadConfiguration(confFile.getPath());
        assertFalse(configuration.hasToBeOCSPRequestSigned());
        assertEquals("false", getJDigiDocConfValue(configuration, SIGN_OCSP_REQUESTS));
    }

    @Test
    public void loadEnableSigningOcspRequestFromConfFile() throws Exception {
        File confFile = createConfFileWithParameter("SIGN_OCSP_REQUESTS: true");
        Configuration configuration = new Configuration();
        configuration.loadConfiguration(confFile.getPath());
        assertTrue(configuration.hasToBeOCSPRequestSigned());
        assertEquals("true", getJDigiDocConfValue(configuration, SIGN_OCSP_REQUESTS));
    }

    @Test
    public void defaultOcspSource() throws Exception {
        assertEquals("http://demo.sk.ee/ocsp", configuration.getOcspSource());
    }

    @Test
    public void defaultProductionConfiguration() throws Exception {
        Configuration configuration = new Configuration(PROD);
        assertEquals("https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl-mp.xml",
                configuration.getTslLocation());
    }

    @Test
    public void defaultConstructorWithSetSystemProperty() throws Exception {
        System.setProperty("digidoc4j.mode", "TEST");
        Configuration configuration = new Configuration();
        assertEquals("https://demo.sk.ee/TSL/tl-mp-test-EE.xml", configuration.getTslLocation());
    }

    @Test
    public void setMaxDataFileCached() throws Exception {
        configuration = new Configuration();
        long maxDataFileCached = 12345;
        configuration.enableBigFilesSupport(maxDataFileCached);
        assertEquals(maxDataFileCached, configuration.getMaxDataFileCachedInMB());
        assertEquals(maxDataFileCached * ONE_MB_IN_BYTES, configuration.getMaxDataFileCachedInBytes());
    }

    @Test
    public void setMaxDataFileCachedToNoCaching() {
        configuration = new Configuration();
        long maxDataFileCached = CACHE_NO_DATA_FILES;
        configuration.enableBigFilesSupport(maxDataFileCached);
        assertEquals(CACHE_NO_DATA_FILES, configuration.getMaxDataFileCachedInMB());
        assertEquals(CACHE_NO_DATA_FILES, configuration.getMaxDataFileCachedInBytes());
    }

    @Test
    public void setMaxDataFileCachedToAllCaching() {
        configuration = new Configuration();
        long maxDataFileCached = CACHE_ALL_DATA_FILES;
        configuration.enableBigFilesSupport(maxDataFileCached);
        assertEquals(CACHE_ALL_DATA_FILES, configuration.getMaxDataFileCachedInMB());
        assertEquals(CACHE_ALL_DATA_FILES, configuration.getMaxDataFileCachedInBytes());
    }

    @Test
    public void maxDataFileCachedNotAllowedValue() {
        configuration = new Configuration();
        long oldValue = 4096;
        configuration.enableBigFilesSupport(oldValue);
        configuration.enableBigFilesSupport(-2);
        assertEquals(oldValue, configuration.getMaxDataFileCachedInMB());
    }

    @Test
    public void maxDataFileCachedNotAllowedValueFromFile() {
        configuration = new Configuration();
        String fileName = "testFiles/digidoc_test_conf_max_datafile_cached_invalid.yaml";

        expectedException.expect(ConfigurationException.class);
        expectedException
                .expectMessage("Configuration parameter DIGIDOC_MAX_DATAFILE_CACHED should be greater or equal "
                        + "-1 but the actual value is: -2.");

        configuration.loadConfiguration(fileName);
    }

    @Test
    public void defaultConstructorWithUnSetSystemProperty() throws Exception {
        Configuration configuration = new Configuration();
        assertEquals("https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl-mp.xml",
                configuration.getTslLocation());
    }

    @Test
    public void generateJDigiDocConfig() throws Exception {
        Hashtable<String, String> jDigiDocConf = configuration.loadConfiguration("digidoc4j.yaml");
        configuration.getJDigiDocConfiguration();

        assertEquals("jar://certs/ESTEID-SK.crt", jDigiDocConf.get("DIGIDOC_CA_1_CERT2"));
        assertEquals("jar://certs/KLASS3-SK OCSP 2006.crt", jDigiDocConf.get("DIGIDOC_CA_1_OCSP2_CERT_1"));
        assertEquals("jar://certs/EID-SK OCSP 2006.crt", jDigiDocConf.get("DIGIDOC_CA_1_OCSP13_CERT_1"));
        assertEquals("jar://certs/TEST Juur-SK.crt", jDigiDocConf.get("DIGIDOC_CA_1_CERT19"));
        assertEquals(DEFAULT_SECURITY_PROVIDER, jDigiDocConf.get("DIGIDOC_SECURITY_PROVIDER"));
        assertEquals(DEFAULT_SECURITY_PROVIDER_NAME, jDigiDocConf.get("DIGIDOC_SECURITY_PROVIDER_NAME"));
        assertEquals("false", jDigiDocConf.get("DATAFILE_HASHCODE_MODE"));
        assertEquals(DEFAULT_CANONICALIZATION_FACTORY_IMPLEMENTATION,
                jDigiDocConf.get("CANONICALIZATION_FACTORY_IMPL"));
        assertEquals("-1", jDigiDocConf.get("DIGIDOC_MAX_DATAFILE_CACHED"));
        assertEquals("false", jDigiDocConf.get(SIGN_OCSP_REQUESTS));
        assertEquals("jar://certs/KLASS3-SK OCSP.crt", jDigiDocConf.get("DIGIDOC_CA_1_OCSP2_CERT"));
    }

    @Test
    public void loadsJDigiDocSecurityProviderFromFile() throws Exception {
        Hashtable<String, String> jDigiDocConf = configuration
                .loadConfiguration("testFiles/digidoc_test_conf.yaml");
        assertEquals("org.bouncycastle.jce.provider.BouncyCastleProvider1",
                jDigiDocConf.get("DIGIDOC_SECURITY_PROVIDER"));
    }

    @Test
    public void loadsJDigiDocCacheDirectoryFromFile() throws Exception {
        Hashtable<String, String> jDigiDocConf = configuration
                .loadConfiguration("testFiles/digidoc_test_conf.yaml");
        assertEquals("/test_cache_dir", jDigiDocConf.get("DIGIDOC_DF_CACHE_DIR"));
    }

    @Test
    public void defaultJDigiDocCacheDirectory() throws Exception {
        Hashtable<String, String> jDigiDocConf = configuration
                .loadConfiguration("testFiles/digidoc_test_conf_without_cache_dir.yaml");
        assertNull(jDigiDocConf.get("DIGIDOC_DF_CACHE_DIR"));
    }

    @SuppressWarnings("NumericOverflow")
    @Test
    public void loadsMaxDataFileCachedFromFile() throws Exception {
        Hashtable<String, String> jDigiDocConf = configuration
                .loadConfiguration("testFiles/digidoc_test_conf.yaml");

        assertEquals("8192", jDigiDocConf.get("DIGIDOC_MAX_DATAFILE_CACHED"));
        assertEquals(8192, configuration.getMaxDataFileCachedInMB());
        assertEquals(8192 * ONE_MB_IN_BYTES, configuration.getMaxDataFileCachedInBytes());
    }

    @Test
    public void settingNonExistingConfigurationFileThrowsError() throws Exception {
        expectedException.expect(ConfigurationException.class);
        expectedException.expectMessage("File testFiles/not_exists.yaml not found in classpath.");

        configuration.loadConfiguration("testFiles/not_exists.yaml");
    }

    @Test
    public void digiDocSecurityProviderDefaultValue() throws Exception {
        Hashtable<String, String> jDigiDocConf = configuration.loadConfiguration("digidoc4j.yaml");
        assertEquals(DEFAULT_SECURITY_PROVIDER, jDigiDocConf.get("DIGIDOC_SECURITY_PROVIDER"));
    }

    @Test
    public void digiDocSecurityProviderDefaultName() throws Exception {
        Hashtable<String, String> jDigiDocConf = configuration.loadConfiguration("digidoc4j.yaml");
        assertEquals(DEFAULT_SECURITY_PROVIDER_NAME, jDigiDocConf.get("DIGIDOC_SECURITY_PROVIDER_NAME"));
    }

    @Test
    public void asksValueOfNonExistingParameter() throws Exception {
        Hashtable<String, String> jDigiDocConf = configuration.loadConfiguration("digidoc4j.yaml");
        assertNull(jDigiDocConf.get("DIGIDOC_PROXY_HOST"));
    }

    @Test
    public void digidocMaxDataFileCachedParameterIsNotANumber() throws Exception {
        String fileName = "testFiles/digidoc_test_conf_invalid_max_data_file_cached.yaml";
        expectedException.expect(ConfigurationException.class);
        expectedException.expectMessage("Configuration parameter DIGIDOC_MAX_DATAFILE_CACHED"
                + " should have an integer value but the actual value is: 8192MB.");

        configuration.loadConfiguration(fileName);
    }

    @Test
    public void digidocSignOcspRequestIsNotABoolean() throws Exception {
        String fileName = "testFiles/digidoc_test_conf_invalid_sign_ocsp_request.yaml";
        expectedException.expect(ConfigurationException.class);
        expectedException.expectMessage("Configuration parameter SIGN_OCSP_REQUESTS should be set to true or false"
                + " but the actual value is: NonBooleanValue.");

        configuration.loadConfiguration(fileName);
    }

    @Test
    public void digidocKeyUsageCheckIsNotABoolean() throws Exception {
        String fileName = "testFiles/digidoc_test_conf_invalid_key_usage.yaml";
        expectedException.expect(ConfigurationException.class);
        expectedException.expectMessage("Configuration parameter KEY_USAGE_CHECK should be set to true or false"
                + " but the actual value is: NonBooleanValue.");

        configuration.loadConfiguration(fileName);
    }

    @Test
    public void digidocUseLocalTslIsNotABoolean() throws Exception {
        String fileName = "testFiles/digidoc_test_conf_invalid_use_local_tsl.yaml";
        expectedException.expect(ConfigurationException.class);
        expectedException
                .expectMessage("Configuration parameter DIGIDOC_USE_LOCAL_TSL should be set to true or false"
                        + " but the actual value is: NonBooleanValue.");

        configuration.loadConfiguration(fileName);
    }

    @Test
    public void digidocDataFileHashcodeModeIsNotABoolean() throws Exception {
        String fileName = "testFiles/digidoc_test_conf_invalid_datafile_hashcode_mode.yaml";
        expectedException.expect(ConfigurationException.class);
        expectedException
                .expectMessage("Configuration parameter DATAFILE_HASHCODE_MODE should be set to true or false"
                        + " but the actual value is: NonBooleanValue.");

        configuration.loadConfiguration(fileName);
    }

    @Test
    public void missingOCSPSEntryThrowsException() throws Exception {
        String fileName = "testFiles/digidoc_test_conf_ocsps_no_entry.yaml";
        expectedException.expect(ConfigurationException.class);
        expectedException
                .expectMessage("No OCSPS entry found or OCSPS entry is empty. Configuration from: " + fileName);

        configuration.loadConfiguration(fileName);
        configuration.getJDigiDocConfiguration();
    }

    @Test
    public void emptyOCSPSEntryThrowsException() throws Exception {
        String fileName = "testFiles/digidoc_test_conf_ocsps_empty.yaml";
        expectedException.expect(ConfigurationException.class);
        expectedException
                .expectMessage("No OCSPS entry found or OCSPS entry is empty. Configuration from: " + fileName);

        configuration.loadConfiguration(fileName);
        configuration.getJDigiDocConfiguration();
    }

    @Test
    public void OCSPWithoutCaCnValueThrowsException() throws Exception {
        String fileName = "testFiles/digidoc_test_conf_ocsps_no_ca_cn.yaml";
        expectedException.expect(ConfigurationException.class);
        expectedException.expectMessage("Configuration from " + fileName + " contains error(s):\n"
                + "OCSPS list entry 2 does not have an entry for CA_CN or the entry is empty\n");

        configuration.loadConfiguration(fileName);
        configuration.getJDigiDocConfiguration();
    }

    @Test
    public void OCSPWithEmptySubEntriesThrowsException() throws Exception {
        String fileName = "testFiles/digidoc_test_conf_ocsps_empty_sub_entries.yaml";
        String expectedErrorMessage = "Configuration from " + fileName + " contains error(s):\n"
                + "OCSPS list entry 3 does not have an entry for CA_CN or the entry is empty\n"
                + "OCSPS list entry 4 does not have an entry for CA_CERT or the entry is empty\n"
                + "OCSPS list entry 5 does not have an entry for CN or the entry is empty\n"
                + "OCSPS list entry 8 does not have an entry for URL or the entry is empty\n";
        expectedException.expect(ConfigurationException.class);
        expectedException.expectMessage(expectedErrorMessage);

        configuration.loadConfiguration(fileName);
        configuration.getJDigiDocConfiguration();
    }

    @Test
    public void OCSPWithMissingSubEntriesThrowsException() throws Exception {
        String fileName = "testFiles/digidoc_test_conf_ocsps_missing_sub_entries.yaml";
        String expectedErrorMessage = "Configuration from " + fileName + " contains error(s):\n"
                + "OCSPS list entry 3 does not have an entry for CN or the entry is empty\n"
                + "OCSPS list entry 4 does not have an entry for URL or the entry is empty\n"
                + "OCSPS list entry 5 does not have an entry for CA_CERT or the entry is empty\n"
                + "OCSPS list entry 8 does not have an entry for CA_CN or the entry is empty\n";
        expectedException.expect(ConfigurationException.class);
        expectedException.expectMessage(expectedErrorMessage);

        configuration.loadConfiguration(fileName);
        configuration.getJDigiDocConfiguration();
    }

    @Test
    public void OCSPWithMissingOcspsCertsEntryThrowsException() throws Exception {
        String fileName = "testFiles/digidoc_test_conf_ocsps_missing_certs_entry.yaml";
        String expectedErrorMessage = "Configuration from " + fileName + " contains error(s):\n"
                + "OCSPS list entry 3 does not have an entry for CERTS or the entry is empty\n";
        expectedException.expect(ConfigurationException.class);
        expectedException.expectMessage(expectedErrorMessage);

        configuration.loadConfiguration(fileName);
        configuration.getJDigiDocConfiguration();
    }

    @Test
    public void OCSPWithEmptyOcspsCertsEntryThrowsException() throws Exception {
        String fileName = "testFiles/digidoc_test_conf_ocsps_empty_certs_entry.yaml";
        String expectedErrorMessage = "Configuration from " + fileName + " contains error(s):\n"
                + "OCSPS list entry 2 does not have an entry for CERTS or the entry is empty\n";
        expectedException.expect(ConfigurationException.class);
        expectedException.expectMessage(expectedErrorMessage);

        configuration.loadConfiguration(fileName);
        configuration.getJDigiDocConfiguration();
    }

    @Test
    public void configurationFileIsNotYamlFormatThrowsException() throws Exception {
        String fileName = "testFiles/test.txt";
        String expectedErrorMessage = "Configuration from " + fileName + " is not correctly formatted";
        expectedException.expect(ConfigurationException.class);
        expectedException.expectMessage(expectedErrorMessage);

        configuration.loadConfiguration(fileName);
    }

    @Test
    public void configurationStreamIsNotYamlFormatThrowsException() throws Exception {
        String fileName = "testFiles/test.txt";
        String expectedErrorMessage = "Configuration from stream is not correctly formatted";
        expectedException.expect(ConfigurationException.class);
        expectedException.expectMessage(expectedErrorMessage);

        FileInputStream stream = new FileInputStream(fileName);
        configuration.loadConfiguration(stream);
        stream.close();
    }

    @Test
    public void isOCSPSigningConfigurationAvailableWhenItIsNotAvailable() throws Exception {
        assertFalse(configuration.isOCSPSigningConfigurationAvailable());
    }

    @Test
    public void isOCSPSigningConfigurationAvailableWhenItIsAvailable() throws Exception {
        configuration.setOCSPAccessCertificateFileName("test.p12");
        configuration.setOCSPAccessCertificatePassword("aaa".toCharArray());

        assertTrue(configuration.isOCSPSigningConfigurationAvailable());
    }

    @Test
    public void isOCSPSigningConfigurationAvailableWhenFileIsAvailable() throws Exception {
        configuration.setOCSPAccessCertificateFileName("test.p12");
        assertFalse(configuration.isOCSPSigningConfigurationAvailable());
    }

    @Test
    public void isOCSPSigningConfigurationAvailableWhenPasswordIsAvailable() throws Exception {
        configuration.setOCSPAccessCertificatePassword("aaa".toCharArray());
        assertFalse(configuration.isOCSPSigningConfigurationAvailable());
    }

    @Test
    public void getTspSourceFromConfigurationFile() throws Exception {
        configuration.loadConfiguration("testFiles/digidoc_test_conf.yaml");
        assertEquals("http://tsp.source.test/HttpTspServer", configuration.getTspSource());
    }

    @Test
    public void getValidationPolicyFromConfigurationFile() throws Exception {
        configuration.loadConfiguration("testFiles/digidoc_test_conf.yaml");
        assertEquals("conf/test_validation_policy.xml", configuration.getValidationPolicy());
    }

    @Test
    public void getOcspSourceFromConfigurationFile() throws Exception {
        configuration.loadConfiguration("testFiles/digidoc_test_conf.yaml");
        assertEquals("http://www.openxades.org/cgi-bin/test_ocsp_source.cgi", configuration.getOcspSource());
    }

    @Test
    public void getTslKeystoreLocationFromConfigurationFile() throws Exception {
        configuration.loadConfiguration("testFiles/digidoc_test_conf.yaml");
        assertEquals("keystore", configuration.getTslKeyStoreLocation());
    }

    @Test(expected = TslKeyStoreNotFoundException.class)
    public void exceptionIsThrownWhenTslKeystoreIsNotFound() throws IOException {
        Configuration conf = new Configuration(PROD);
        conf.setTslKeyStoreLocation("not/existing/path");
        conf.getTSL().refresh();
    }

    @Test
    public void testDefaultTslKeystoreLocation() throws Exception {
        Configuration conf = new Configuration(PROD);
        assertEquals("keystore/keystore.jks", conf.getTslKeyStoreLocation());
    }

    @Test
    public void testDefaultTestTslKeystoreLocation() throws Exception {
        Configuration conf = new Configuration(TEST);
        assertEquals("keystore/test-keystore.jks", conf.getTslKeyStoreLocation());
    }

    @Test
    public void testDefaultTslKeystorePassword() throws Exception {
        Configuration conf = new Configuration(PROD);
        assertEquals("digidoc4j-password", conf.getTslKeyStorePassword());
    }

    @Test
    public void getTslKeystorePasswordFromConfigurationFile() throws Exception {
        configuration.loadConfiguration("testFiles/digidoc_test_conf.yaml");
        assertEquals("password", configuration.getTslKeyStorePassword());
    }

    @Test
    public void setTslCacheExpirationTime() throws Exception {
        configuration.setTslCacheExpirationTime(1337);
        assertEquals(1337, configuration.getTslCacheExpirationTime());
    }

    @Test
    public void defaultTslCacheExpirationTime_shouldBeOneDay() throws Exception {
        long oneDayInMs = 1000 * 60 * 60 * 24;
        assertEquals(oneDayInMs, configuration.getTslCacheExpirationTime());
        assertEquals(oneDayInMs, new Configuration(Mode.PROD).getTslCacheExpirationTime());
    }

    @Test
    public void getTslCacheExpirationTimeFromConfigurationFile() throws Exception {
        configuration.loadConfiguration("testFiles/digidoc_test_conf.yaml");
        assertEquals(1776, configuration.getTslCacheExpirationTime());
    }

    @Test
    public void defaultProxyConfiguration_shouldNotBeSet() throws Exception {
        assertFalse(configuration.isNetworkProxyEnabled());
        assertNull(configuration.getHttpProxyHost());
        assertNull(configuration.getHttpProxyPort());
        assertNull(configuration.getHttpProxyUser());
        assertNull(configuration.getHttpProxyPassword());
    }

    @Test
    public void getProxyConfigurationFromConfigurationFile() throws Exception {
        configuration.loadConfiguration("testFiles/digidoc_test_conf.yaml");
        assertTrue(configuration.isNetworkProxyEnabled());
        assertEquals("cache.noile.ee", configuration.getHttpProxyHost());
        assertEquals(8080, configuration.getHttpProxyPort().longValue());
        assertEquals("proxyMan", configuration.getHttpProxyUser());
        assertEquals("proxyPass", configuration.getHttpProxyPassword());

    }

    @Test
    public void getInvalidProxyConfigurationFromConfigurationFile() throws Exception {
        expectedException.expect(ConfigurationException.class);
        expectedException.expectMessage(
                "Configuration parameter HTTP_PROXY_PORT should have an integer value but the actual value is: notA_number.");
        configuration.loadConfiguration("testFiles/digidoc_test_conf_invalid_key_usage.yaml");
    }

    @Test
    public void defaultSslConfiguration_shouldNotBeSet() throws Exception {
        assertFalse(configuration.isSslConfigurationEnabled());
        assertNull(configuration.getSslKeystorePath());
        assertNull(configuration.getSslKeystoreType());
        assertNull(configuration.getSslKeystorePassword());
        assertNull(configuration.getSslTruststorePath());
        assertNull(configuration.getSslTruststoreType());
        assertNull(configuration.getSslTruststorePassword());
    }

    @Test
    public void getSslConfigurationFromConfigurationFile() throws Exception {
        configuration.loadConfiguration("testFiles/digidoc_test_all_optional_settings.yaml");
        assertTrue(configuration.isSslConfigurationEnabled());
        assertEquals("sslKeystorePath", configuration.getSslKeystorePath());
        assertEquals("sslKeystoreType", configuration.getSslKeystoreType());
        assertEquals("sslKeystorePassword", configuration.getSslKeystorePassword());
        assertEquals("sslTruststorePath", configuration.getSslTruststorePath());
        assertEquals("sslTruststoreType", configuration.getSslTruststoreType());
        assertEquals("sslTruststorePassword", configuration.getSslTruststorePassword());
    }

    @Test
    public void loadMultipleCAsFromConfigurationFile() throws Exception {
        Hashtable<String, String> jDigiDocConf = configuration
                .loadConfiguration("testFiles/digidoc_test_conf_two_cas" + ".yaml");
        configuration.getJDigiDocConfiguration();

        assertEquals("AS Sertifitseerimiskeskus", jDigiDocConf.get("DIGIDOC_CA_1_NAME"));
        assertEquals("jar://certs/ESTEID-SK.crt", jDigiDocConf.get("DIGIDOC_CA_1_CERT2"));
        assertEquals("Second CA", jDigiDocConf.get("DIGIDOC_CA_2_NAME"));
        assertEquals("jar://certs/CA_2_CERT_3.crt", jDigiDocConf.get("DIGIDOC_CA_2_CERT3"));
        assertEquals("jar://certs/CA_2_OCSP_1_SECOND_CERT", jDigiDocConf.get("DIGIDOC_CA_2_OCSP1_CERT_1"));
    }

    @Test
    public void missingCA_shouldNotThrowException() throws Exception {
        String fileName = "testFiles/digidoc_test_conf_no_ca.yaml";
        configuration.loadConfiguration(fileName);
    }

    @Test
    public void missingCA_shouldThrowException_whenUsingDDoc() throws Exception {
        String fileName = "testFiles/digidoc_test_conf_no_ca.yaml";
        String expectedErrorMessage = "Configuration from " + fileName + " contains error(s):\n"
                + "Empty or no DIGIDOC_CAS entry";
        expectedException.expect(ConfigurationException.class);
        expectedException.expectMessage(expectedErrorMessage);

        configuration.loadConfiguration(fileName);
        configuration.getJDigiDocConfiguration();
    }

    @Test
    public void emptyCAThrowsException() throws Exception {
        String fileName = "testFiles/digidoc_test_conf_empty_ca.yaml";
        String expectedErrorMessage = "Configuration from " + fileName + " contains error(s):\n"
                + "Empty or no DIGIDOC_CA for entry 1";

        expectedException.expect(ConfigurationException.class);
        expectedException.expectMessage(expectedErrorMessage);

        configuration.loadConfiguration(fileName);
        configuration.getJDigiDocConfiguration();
    }

    @Test
    public void isTestMode() throws Exception {
        Configuration configuration = new Configuration(TEST);
        assertTrue(configuration.isTest());
    }

    @Test
    public void isNotTestMode() throws Exception {
        Configuration configuration = new Configuration(PROD);
        assertFalse(configuration.isTest());
    }

    @Test
    public void verifyAllOptionalConfigurationSettingsAreLoadedFromFile() throws Exception {
        configuration.setTslLocation("Set TSL location");
        configuration.setTspSource("Set TSP source");
        configuration.setOCSPAccessCertificateFileName("Set OCSP access certificate file name");
        configuration.setOCSPAccessCertificatePassword("Set password".toCharArray());
        configuration.setOcspSource("Set OCSP source");
        configuration.setValidationPolicy("Set validation policy");

        configuration.loadConfiguration("testFiles/digidoc_test_all_optional_settings.yaml");

        assertEquals("123876", getJDigiDocConfValue(configuration, "DIGIDOC_MAX_DATAFILE_CACHED"));
        assertEquals("TEST_DIGIDOC_NOTARY_IMPL", getJDigiDocConfValue(configuration, "DIGIDOC_NOTARY_IMPL"));
        assertEquals("TEST_DIGIDOC_OCSP_SIGN_CERT_SERIAL",
                getJDigiDocConfValue(configuration, "DIGIDOC_OCSP_SIGN_CERT_SERIAL"));
        assertEquals("TEST_DIGIDOC_SECURITY_PROVIDER",
                getJDigiDocConfValue(configuration, "DIGIDOC_SECURITY_PROVIDER"));
        assertEquals("TEST_DIGIDOC_SECURITY_PROVIDER_NAME",
                getJDigiDocConfValue(configuration, "DIGIDOC_SECURITY_PROVIDER_NAME"));
        assertEquals("TEST_DIGIDOC_TSLFAC_IMPL", getJDigiDocConfValue(configuration, "DIGIDOC_TSLFAC_IMPL"));
        assertEquals("false", getJDigiDocConfValue(configuration, "DIGIDOC_USE_LOCAL_TSL"));
        assertEquals("false", getJDigiDocConfValue(configuration, "KEY_USAGE_CHECK"));
        assertEquals("false", getJDigiDocConfValue(configuration, SIGN_OCSP_REQUESTS));
        assertEquals("TEST_DIGIDOC_DF_CACHE_DIR", getJDigiDocConfValue(configuration, "DIGIDOC_DF_CACHE_DIR"));
        assertEquals("TEST_DIGIDOC_FACTORY_IMPL", getJDigiDocConfValue(configuration, "DIGIDOC_FACTORY_IMPL"));
        assertEquals("TEST_CANONICALIZATION_FACTORY_IMPL",
                getJDigiDocConfValue(configuration, "CANONICALIZATION_FACTORY_IMPL"));
        assertEquals("false", getJDigiDocConfValue(configuration, "DATAFILE_HASHCODE_MODE"));
        assertEquals("TEST_DIGIDOC_PKCS12_CONTAINER", configuration.configuration.get("OCSPAccessCertificateFile"));
        assertEquals("TEST_DIGIDOC_PKCS12_PASSWD",
                configuration.configuration.get("OCSPAccessCertificatePassword"));
        assertEquals("TEST_OCSP_SOURCE", configuration.configuration.get("ocspSource"));
        assertEquals("TEST_TSP_SOURCE", configuration.configuration.get("tspSource"));
        assertEquals("TEST_VALIDATION_POLICY", configuration.configuration.get("validationPolicy"));
        assertEquals("TEST_TSL_LOCATION", configuration.configuration.get("tslLocation"));

        configuration.setTslLocation("Set TSL location");
        configuration.setTspSource("Set TSP source");
        configuration.setOCSPAccessCertificateFileName("Set OCSP access certificate file name");
        configuration.setOCSPAccessCertificatePassword("Set password".toCharArray());
        configuration.setOcspSource("Set OCSP source");
        configuration.setValidationPolicy("Set validation policy");

        assertEquals("Set TSL location", configuration.getTslLocation());
        assertEquals("Set TSP source", configuration.getTspSource());
        assertEquals("Set OCSP access certificate file name", configuration.getOCSPAccessCertificateFileName());
        assertEquals("Set password", configuration.configuration.get("OCSPAccessCertificatePassword"));
        assertEquals("Set OCSP source", configuration.getOcspSource());
        assertEquals("Set validation policy", configuration.getValidationPolicy());

    }

    @Test
    public void getDefaultConnectionTimeout() throws Exception {
        assertEquals(1000, configuration.getConnectionTimeout());
        assertEquals(1000, configuration.getSocketTimeout());
    }

    @Test
    public void loadConnectionTimeoutFromFile() throws Exception {
        configuration.loadConfiguration("testFiles/digidoc_test_conf_connection_timeout.yaml");
        assertEquals(4000, configuration.getConnectionTimeout());
        assertEquals(2000, configuration.getSocketTimeout());
    }

    @Test
    public void setConnectionTimeoutFromCode() throws Exception {
        configuration.loadConfiguration("testFiles/digidoc_test_conf_connection_timeout.yaml");
        configuration.setConnectionTimeout(2000);
        configuration.setSocketTimeout(5000);
        assertEquals(2000, configuration.getConnectionTimeout());
        assertEquals(5000, configuration.getSocketTimeout());
    }

    @Test
    public void revocationAndTimestampDelta_shouldBeOneDay() throws Exception {
        int oneDayInMinutes = 24 * 60;
        assertEquals(oneDayInMinutes, configuration.getRevocationAndTimestampDeltaInMinutes());
    }

    @Test
    public void testSettingRevocationAndTimestampDelta() throws Exception {
        int twoDaysInMinutes = 48 * 60;
        configuration.setRevocationAndTimestampDeltaInMinutes(twoDaysInMinutes);
        assertEquals(twoDaysInMinutes, configuration.getRevocationAndTimestampDeltaInMinutes());
    }

    @Test
    public void testLoadingRevocationAndTimestampDeltaFromConf() throws Exception {
        configuration.loadConfiguration("testFiles/digidoc_test_all_optional_settings.yaml");
        assertEquals(1337, configuration.getRevocationAndTimestampDeltaInMinutes());
    }

    @Test
    public void getTruestedTerritories_defaultTesting_shouldBeNull() throws Exception {
        assertNull(configuration.getTrustedTerritories());
    }

    @Test
    public void getTrustedTerritories_defaultProd() throws Exception {
        Configuration configuration = new Configuration(PROD);
        List<String> trustedTerritories = configuration.getTrustedTerritories();
        assertNotNull(trustedTerritories);
        assertTrue(trustedTerritories.contains("EE"));
        assertTrue(trustedTerritories.contains("BE"));
        assertTrue(trustedTerritories.contains("NO"));
        assertFalse(trustedTerritories.contains("DE"));
        assertFalse(trustedTerritories.contains("HR"));
    }

    @Test
    public void setTrustedTerritories() throws Exception {
        configuration.setTrustedTerritories("AR", "US", "CA");
        List<String> trustedTerritories = configuration.getTrustedTerritories();
        assertEquals(3, trustedTerritories.size());
        assertEquals("AR", trustedTerritories.get(0));
        assertEquals("US", trustedTerritories.get(1));
        assertEquals("CA", trustedTerritories.get(2));
    }

    @Test
    public void loadTrustedTerritoriesFromConf() throws Exception {
        configuration.loadConfiguration("testFiles/digidoc_test_all_optional_settings.yaml");
        List<String> trustedTerritories = configuration.getTrustedTerritories();
        assertEquals(3, trustedTerritories.size());
        assertEquals("NZ", trustedTerritories.get(0));
        assertEquals("AU", trustedTerritories.get(1));
        assertEquals("BR", trustedTerritories.get(2));
    }

    private File createConfFileWithParameter(String parameter) throws IOException {
        File confFile = testFolder.newFile();
        FileUtils.writeStringToFile(confFile, parameter);
        String defaultConfParameters = "\n" + "DIGIDOC_CAS:\n" + "- DIGIDOC_CA:\n"
                + "    NAME: AS Sertifitseerimiskeskus\n" + "    TRADENAME: SK\n" + "    CERTS:\n"
                + "      - jar://certs/EID-SK.crt\n" + "    OCSPS:\n" + "      - OCSP:\n"
                + "        CA_CN: ESTEID-SK\n" + "        CA_CERT: jar://certs/ESTEID-SK 2007.crt\n"
                + "        CN: ESTEID-SK 2007 OCSP RESPONDER\n" + "        CERTS:\n"
                + "         - jar://certs/ESTEID-SK 2007 OCSP.crt\n" + "        URL: http://ocsp.sk.ee";
        FileUtils.writeStringToFile(confFile, defaultConfParameters, true);
        return confFile;
    }

    private String getJDigiDocConfValue(Configuration configuration, String key) {
        return configuration.getJDigiDocConfiguration().get(key);
    }

    private void waitOneSecond() throws InterruptedException {
        Thread.sleep(1000L); //Waiting is necessary to check changes in the cached files modification time
    }

    private long getCacheModificationTime() {
        return TSLHelper.getCacheLastModificationTime();
    }

    private void deleteTSLCache() {
        TSLHelper.deleteTSLCache();
    }

}