/* 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.impl.bdoc.tsl;
import static org.digidoc4j.Configuration.Mode.TEST;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.List;
import org.digidoc4j.Configuration;
import org.digidoc4j.testutils.TSLHelper;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import eu.europa.esig.dss.tsl.TSLValidationModel;
import eu.europa.esig.dss.tsl.TSLValidationSummary;
import eu.europa.esig.dss.tsl.service.TSLRepository;
import eu.europa.esig.dss.tsl.service.TSLValidationJob;
import eu.europa.esig.dss.validation.policy.rules.Indication;
public class TslLoaderTest {
private Configuration configuration;
private TslLoader tslLoader;
@Before
public void setUp() throws Exception {
configuration = new Configuration(TEST);
tslLoader = createTslLoader(configuration);
TslLoader.invalidateCache();
}
@Test
public void loadAndValidateProdTsl() throws Exception {
Configuration configuration = new Configuration(Configuration.Mode.PROD);
TslLoader tslLoader = createTslLoader(configuration);
tslLoader.setCheckSignature(true);
tslLoader.prepareTsl();
TSLValidationJob tslValidationJob = tslLoader.getTslValidationJob();
tslValidationJob.refresh();
TSLRepository tslRepository = tslLoader.getTslRepository();
assertTslValid(tslRepository);
}
@Test
public void loadTsl_whenCacheIsNotExpired_shouldUseCachedTsl() throws Exception {
configuration.setTslCacheExpirationTime(10000L);
tslLoader = createTslLoader(configuration);
long lastModified = getTslAndReturnCacheModificationTime();
waitOneSecond();
long newModificationTime = getTslAndReturnCacheModificationTime();
assertEquals(lastModified, newModificationTime);
}
@Test
public void loadTsl_whenCacheIsExpired_shouldDownloadNewTsl() throws Exception {
configuration.setTslCacheExpirationTime(500L);
tslLoader = createTslLoader(configuration);
long lastModified = getTslAndReturnCacheModificationTime();
waitOneSecond();
long newModificationTime = getTslAndReturnCacheModificationTime();
assertTrue(lastModified < newModificationTime);
}
@Test
public void loadTsl_forAllCountries_byDefault() throws Exception {
Configuration configuration = new Configuration(Configuration.Mode.PROD);
TSLRepository tslRepository = loadTsl(configuration);
assertCountryLoaded(tslRepository, "EE");
assertCountryLoaded(tslRepository, "FR");
assertCountryLoaded(tslRepository, "ES");
}
@Test
public void loadTsl_forOneContry() throws Exception {
Configuration configuration = new Configuration(Configuration.Mode.PROD);
configuration.setTrustedTerritories("EE");
TSLRepository tslRepository = loadTsl(configuration);
assertCountryLoaded(tslRepository, "EE");
assertCountryNotLoaded(tslRepository, "FR");
}
@Test
public void loadTsl_forTwoCountries() throws Exception {
Configuration configuration = new Configuration(Configuration.Mode.PROD);
configuration.setTrustedTerritories("EE", "ES");
TSLRepository tslRepository = loadTsl(configuration);
assertCountryLoaded(tslRepository, "EE");
assertCountryLoaded(tslRepository, "ES");
assertCountryNotLoaded(tslRepository, "FR");
}
@Test
public void loadTestTsl_shouldContainTestTerritory() throws Exception {
Configuration configuration = new Configuration(Configuration.Mode.TEST);
TSLRepository tslRepository = loadTsl(configuration);
assertCountryLoaded(tslRepository, "EE_T");
}
/**
* Ignore countries with invalid TSL: DE (Germany) and HR (Croatia)
*/
@Test
public void loadTsl_withoutCountryHr_byDefault() throws Exception {
Configuration configuration = new Configuration(Configuration.Mode.PROD);
TSLRepository tslRepository = loadTsl(configuration);
assertCountryLoaded(tslRepository, "EE");
assertCountryLoaded(tslRepository, "FR");
assertCountryLoaded(tslRepository, "NO");
assertCountryNotLoaded(tslRepository, "DE");
assertCountryNotLoaded(tslRepository, "HR");
}
private TslLoader createTslLoader(Configuration configuration) {
TslLoader tslLoader = new TslLoader(configuration);
tslLoader.setCheckSignature(false);
return tslLoader;
}
private TSLRepository loadTsl(Configuration configuration) {
TslLoader tslLoader = createTslLoader(configuration);
tslLoader.prepareTsl();
TSLValidationJob tslValidationJob = tslLoader.getTslValidationJob();
tslValidationJob.refresh();
return tslLoader.getTslRepository();
}
private void assertTslValid(TSLRepository tslRepository) {
List<TSLValidationSummary> summaryList = tslRepository.getSummary();
for (TSLValidationSummary summary : summaryList) {
Indication indication = summary.getIndication();
String country = summary.getCountry();
Assert.assertEquals("TSL is not valid for country " + country, Indication.TOTAL_PASSED, indication);
}
}
private void assertCountryLoaded(TSLRepository tslRepository, String countryIsoCode) {
TSLValidationModel countryTsl = tslRepository.getByCountry(countryIsoCode);
assertNotNull(countryTsl);
assertTrue(countryTsl.getParseResult().getServiceProviders().size() > 0);
}
private void assertCountryNotLoaded(TSLRepository tslRepository, String countryIsoCode) {
TSLValidationModel countryTsl = tslRepository.getByCountry(countryIsoCode);
assertNull(countryTsl);
}
private long getTslAndReturnCacheModificationTime() {
tslLoader.prepareTsl();
tslLoader.getTslValidationJob().refresh();
return TSLHelper.getCacheLastModificationTime();
}
private void waitOneSecond() throws InterruptedException {
Thread.sleep(1000L); //Waiting is necessary to check changes in the cached files modification time
}
}