/* 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 static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.databene.contiperf.PerfTest;
import org.databene.contiperf.junit.ContiPerfRule;
import org.digidoc4j.exceptions.DigiDoc4JException;
import org.digidoc4j.impl.ddoc.ConfigManagerInitializer;
import org.digidoc4j.signers.PKCS12SignatureToken;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import ee.sk.digidoc.DigiDocException;
import ee.sk.digidoc.SignedDoc;
import ee.sk.digidoc.factory.DigiDocFactory;
import ee.sk.utils.ConfigManager;
@Ignore
public class PerformanceTest {
private static final Configuration configuration = new Configuration(Configuration.Mode.TEST);
private static final ConfigManagerInitializer configManagerInitializer = new ConfigManagerInitializer();
@Rule
public ContiPerfRule performanceTestRule = new ContiPerfRule();
@Rule
public TemporaryFolder testFolder = new TemporaryFolder();
private Container container;
private SignedDoc jDigidocContainer;
@Before
public void setUp() throws Exception {
configuration.getTSL().refresh();
configManagerInitializer.initConfigManager(configuration);
container = openContainer("testFiles/valid-containers/valid-bdoc-tm.bdoc", configuration);
jDigidocContainer = openContainerWithJdigidoc("testFiles/valid-containers/valid-bdoc-tm.bdoc");
}
@Test
@PerfTest(invocations = 1000, threads = 1)
public void validateTestBDocTmSignatures() throws Exception {
assertContainerValid("testFiles/valid-containers/valid-bdoc-tm.bdoc");
}
@Test
@PerfTest(invocations = 1000, threads = 1)
public void validateTestBDocTmWithJDigidoc() throws Exception {
assertContainerValidWithJDigiDoc("testFiles/valid-containers/valid-bdoc-tm.bdoc");
}
@Test
@PerfTest(invocations = 1000, threads = 20)
public void validateTestBDocTmSignaturesInThreads() throws Exception {
assertContainerValid("testFiles/valid-containers/valid-bdoc-tm.bdoc");
assertContainerValid("testFiles/valid-containers/IB-4185_bdoc21_TM_mimetype_with_BOM.bdoc");
validateInvalidContainer("testFiles/invalid-containers/bdoc-tm-ocsp-revoked.bdoc", "The certificate is revoked! [RevocationReason=CRLReason: unspecified, CertificateId=971CC1FCEBC3990405253C90BB6AB3D64F7B8478584DAAF6C5E1A4B2CF1D2C48, RevocationTime=2016-04-12T15:56:01Z]");
}
@Test
@PerfTest(invocations = 1000, threads = 20)
public void validateTestBDocTmWithJDigidocInThreads() throws Exception {
assertContainerValidWithJDigiDoc("testFiles/valid-containers/valid-bdoc-tm.bdoc");
assertContainerValidWithJDigiDoc("testFiles/valid-containers/IB-4185_bdoc21_TM_mimetype_with_BOM.bdoc");
validateInvalidContainerWithJDigidoc("testFiles/invalid-containers/bdoc-tm-ocsp-revoked.bdoc", "ERROR: 91 - Certificate has been revoked!");
}
@Test
@PerfTest(invocations = 1000, threads = 1)
public void validateLargeContainer() throws Exception {
assertContainerValid("testFiles/valid-containers/bdoc-tm-with-large-data-file.bdoc");
}
@Test
@PerfTest(invocations = 1000, threads = 1)
public void validateLargeContainerWithJDigidoc() throws Exception {
assertContainerValidWithJDigiDoc("testFiles/valid-containers/bdoc-tm-with-large-data-file.bdoc");
}
@Test
@PerfTest(invocations = 1, threads = 1)
public void validateBDocWith1000Signatures() throws Exception {
assertContainerValid("testFiles/valid-containers/bdoc-tm-1000-signatures.bdoc");
}
@Test
@PerfTest(invocations = 1, threads = 1)
public void validateBDocWith1000SignaturesWithJDigidoc() throws Exception {
assertContainerValidWithJDigiDoc("testFiles/valid-containers/bdoc-tm-1000-signatures.bdoc");
}
@Test
@PerfTest(invocations = 1000, threads = 1)
public void openBDocTmContainerDetails() throws Exception {
Container container = openContainer("testFiles/valid-containers/valid-bdoc-tm.bdoc", configuration);
assertEquals("test.txt", container.getDataFiles().get(0).getName());
Signature signature = container.getSignatures().get(0);
assertEquals("id-6a5d6671af7a9e0ab9a5e4d49d69800d", signature.getId());
assertEquals(1457964829000L, signature.getTrustedSigningTime().getTime());
assertEquals("ESTEID", signature.getSigningCertificate().getSubjectName(X509Cert.SubjectName.O));
}
@Test
@PerfTest(invocations = 1000, threads = 1)
public void openBDocTmContainerDetailsWithJdigidoc() throws Exception {
SignedDoc container = openContainerWithJdigidoc("testFiles/valid-containers/valid-bdoc-tm.bdoc");
assertEquals("test.txt", container.getDataFile(0).getFileName());
ee.sk.digidoc.Signature signature = container.getSignature(0);
assertEquals("id-6a5d6671af7a9e0ab9a5e4d49d69800d", signature.getId());
assertEquals(1457964829000L, signature.getSignatureProducedAtTime().getTime());
assertEquals("1.2.840.113549.1.9.1=#1609706b6940736b2e6565,CN=TEST of ESTEID-SK 2011,O=AS Sertifitseerimiskeskus,C=EE", signature.getCertID(0).getIssuer());
}
@Test
@PerfTest(invocations = 1000, threads = 20)
public void saveExistingContainerOnDisk() throws Exception {
String path = testFolder.newFile().getPath();
File file = container.saveAsFile(path);
assertTrue(file.exists());
assertTrue(file.length() > 0);
}
@Test
@PerfTest(invocations = 1000, threads = 20)
public void saveExistingContainerOnDiskWithJDigidoc() throws Exception {
File file = testFolder.newFile();
jDigidocContainer.writeToFile(file);
assertTrue(file.exists());
assertTrue(file.length() > 0);
}
@Test
@PerfTest(invocations = 10, threads = 1)
public void loadingTSL() throws Exception {
TSLCertificateSource tsl = new Configuration(Configuration.Mode.PROD).getTSL();
tsl.invalidateCache();
tsl.refresh();
}
@Test
@PerfTest(invocations = 50, threads = 1)
public void createBDocTmSignature() throws Exception {
signContainer(container, SignatureProfile.LT_TM);
}
@Test
@PerfTest(invocations = 50, threads = 1)
public void createAsicSignature() throws Exception {
signContainer(container, SignatureProfile.LT);
}
private void assertContainerValid(String containerPath) {
ValidationResult result = validateContainer(containerPath, configuration);
assertTrue(result.isValid());
}
private ValidationResult validateContainer(String containerPath, Configuration configuration) {
Container container = openContainer(containerPath, configuration);
return container.validate();
}
private void validateInvalidContainer(String containerPath, String expectedError) {
ValidationResult result = validateContainer(containerPath, configuration);
List<DigiDoc4JException> errors = result.getErrors();
assertEquals(1, errors.size());
assertEquals(expectedError, errors.get(0).getMessage());
}
private Container openContainer(String containerPath, Configuration configuration) {
return openContainerBuilder(containerPath).
withConfiguration(configuration).
build();
}
private ContainerBuilder openContainerBuilder(String containerPath) {
return ContainerBuilder.
aContainer(ContainerBuilder.BDOC_CONTAINER_TYPE).
fromExistingFile(containerPath);
}
private void assertContainerValidWithJDigiDoc(String containerFilePath) throws DigiDocException {
List errors = validateContainerWithJDigidoc(containerFilePath);
assertTrue(getJDigiDocErrorMessage(errors), errors.isEmpty());
}
private List validateContainerWithJDigidoc(String containerFilePath) throws DigiDocException {
boolean isBdoc = true;
List errors = new ArrayList();
DigiDocFactory digFac = ConfigManager.instance().getDigiDocFactory();
digFac.readSignedDocOfType(containerFilePath, isBdoc, errors);
return errors;
}
private void validateInvalidContainerWithJDigidoc(String containerFilePath, String expectedError) throws DigiDocException {
List errors = validateContainerWithJDigidoc(containerFilePath);
assertEquals(1, errors.size());
assertEquals(expectedError, errors.get(0).toString());
}
private SignedDoc openContainerWithJdigidoc(String containerFilePath) throws DigiDocException {
boolean isBdoc = true;
List errors = new ArrayList();
DigiDocFactory digFac = ConfigManager.instance().getDigiDocFactory();
return digFac.readSignedDocOfType(containerFilePath, isBdoc, errors);
}
private String getJDigiDocErrorMessage(List errors) {
String msg = "";
for(Object error : errors) {
msg += error.toString() + "; ";
}
return msg;
}
private void signContainer(Container container, SignatureProfile signatureProfile) {
SignatureToken signatureToken = new PKCS12SignatureToken("testFiles/signout.p12", "test".toCharArray());
Signature signature = SignatureBuilder.
aSignature(container).
withSignatureDigestAlgorithm(DigestAlgorithm.SHA256).
withSignatureProfile(signatureProfile).
withSignatureToken(signatureToken).
invokeSigning();
container.addSignature(signature);
}
}