org.digidoc4j.ContainerTest.java Source code

Java tutorial

Introduction

Here is the source code for org.digidoc4j.ContainerTest.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.codec.binary.Base64;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.digidoc4j.exceptions.DigiDoc4JException;
import org.digidoc4j.exceptions.InvalidSignatureException;
import org.digidoc4j.exceptions.TslCertificateSourceInitializationException;
import org.digidoc4j.impl.bdoc.BDocContainer;
import org.digidoc4j.impl.ddoc.DDocContainer;
import org.digidoc4j.impl.DigiDoc4JTestHelper;
import org.digidoc4j.signers.PKCS12SignatureToken;
import org.digidoc4j.testutils.TestDataBuilder;
import org.digidoc4j.utils.Helper;
import org.junit.*;
import org.junit.rules.TemporaryFolder;
import org.xml.sax.SAXException;

import java.io.*;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.cert.CertificateEncodingException;
import java.util.List;

import static org.apache.commons.codec.binary.Base64.encodeBase64String;
import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual;
import static org.digidoc4j.Configuration.Mode.TEST;
import static org.digidoc4j.Container.DocumentType.DDOC;
import static org.digidoc4j.ContainerBuilder.BDOC_CONTAINER_TYPE;
import static org.digidoc4j.ContainerBuilder.DDOC_CONTAINER_TYPE;
import static org.digidoc4j.SignatureProfile.B_BES;
import static org.digidoc4j.SignatureProfile.LT;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertNotNull;

public class ContainerTest extends DigiDoc4JTestHelper {
    public static final String TEXT_MIME_TYPE = "text/plain";

    public static final String CERTIFICATE = "MIIFEzCCA/ugAwIBAgIQSXxaK/qTYahTT77Z9I56EjANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaX"
            + "RzZWVyaW1pc2tlc2t1czEfMB0GA1UEAwwWVEVTVCBvZiBFU1RFSUQtU0sgMjAxMTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMB4XDTE0"
            + "MDQxNzExNDUyOVoXDTE2MDQxMjIwNTk1OVowgbQxCzAJBgNVBAYTAkVFMQ8wDQYDVQQKDAZFU1RFSUQxGjAYBgNVBAsMEWRpZ2l0YWwgc2"
            + "lnbmF0dXJlMTEwLwYDVQQDDCjFvcOVUklOw5xXxaBLWSxNw4RSw5wtTMOWw5ZaLDExNDA0MTc2ODY1MRcwFQYDVQQEDA7FvcOVUklOw5xX"
            + "xaBLWTEWMBQGA1UEKgwNTcOEUsOcLUzDlsOWWjEUMBIGA1UEBRMLMTE0MDQxNzY4NjUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAo"
            + "IBAQChn9qVaA+x3RkDBrD5ujwfnreK5/Nb+Nvo9Vg5OLMn3JKUoUhFX6A/q5lBUylK/CU/lNRTv/kicqnu1aCyAiW0XVYk8jrOI1wRbHey"
            + "BMq/5gVm/vbbRtMi/XGLkgMZ5UDxY0QZfmu8wlRJ8164zRNocuUJLLXWOB6vda2RRXC3Cix4TDvQwGmPrQQJ8dzDIJEkLS7NCLBTcndm7b"
            + "uQegRc043gKMjUmRhGZEzF4oJa4pMfXqeSa+PUtrNyNNNQaOwTH29R8aFfGU2xorVvxoUieNipyWMEz8BTUGwwIceapWi77loBV/VQfStX"
            + "nQNu/s6BC04ss43O6sK70MB1qlRZAgMBAAGjggFmMIIBYjAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIGQDCBmQYDVR0gBIGRMIGOMIGLBg"
            + "orBgEEAc4fAwEBMH0wWAYIKwYBBQUHAgIwTB5KAEEAaQBuAHUAbAB0ACAAdABlAHMAdABpAG0AaQBzAGUAawBzAC4AIABPAG4AbAB5ACAA"
            + "ZgBvAHIAIAB0AGUAcwB0AGkAbgBnAC4wIQYIKwYBBQUHAgEWFWh0dHA6Ly93d3cuc2suZWUvY3BzLzAdBgNVHQ4EFgQUEjVsOkaNOGG0Gl"
            + "cF4icqxL0u4YcwIgYIKwYBBQUHAQMEFjAUMAgGBgQAjkYBATAIBgYEAI5GAQQwHwYDVR0jBBgwFoAUQbb+xbGxtFMTjPr6YtA0bW0iNAow"
            + "RQYDVR0fBD4wPDA6oDigNoY0aHR0cDovL3d3dy5zay5lZS9yZXBvc2l0b3J5L2NybHMvdGVzdF9lc3RlaWQyMDExLmNybDANBgkqhkiG9w"
            + "0BAQUFAAOCAQEAYTJLbScA3+Xh/s29Qoc0cLjXW3SVkFP/U71/CCIBQ0ygmCAXiQIp/7X7JonY4aDz5uTmq742zZgq5FA3c3b4NtRzoiJX"
            + "FUWQWZOPE6Ep4Y07Lpbn04sypRKbVEN9TZwDy3elVq84BcX/7oQYliTgj5EaUvpe7MIvkK4DWwrk2ffx9GRW+qQzzjn+OLhFJbT/QWi81Q"
            + "2CrX34GmYGrDTC/thqr5WoPELKRg6a0v3mvOCVtfIxJx7NKK4B6PGhuTl83hGzTc+Wwbaxwjqzl/SUwCNd2R8GV8EkhYH8Kay3Ac7Qx3ag"
            + "rJJ6H8j+h+nCKLjIdYImvnznKyR0N2CRc/zQ+g==";

    private PKCS12SignatureToken PKCS12_SIGNER;

    @Rule
    public TemporaryFolder testFolder = new TemporaryFolder();
    File tempFile;

    @Before
    public void setUp() throws Exception {
        PKCS12_SIGNER = new PKCS12SignatureToken("testFiles/signout.p12", "test".toCharArray());
        tempFile = testFolder.newFile("tempFile.txt");
    }

    @AfterClass
    public static void deleteTemporaryFiles() {
        try {
            DirectoryStream<Path> directoryStream = Files.newDirectoryStream(Paths.get("."));
            for (Path item : directoryStream) {
                String fileName = item.getFileName().toString();
                if ((fileName.endsWith("bdoc") || fileName.endsWith("ddoc")) && fileName.startsWith("test"))
                    Files.deleteIfExists(item);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void createBDocContainersByDefault() {
        assertTrue(createContainer() instanceof BDocContainer);
    }

    @Test
    public void createBDocContainer() {
        assertTrue(createBDoc() instanceof BDocContainer);
    }

    private Container createBDoc() {
        Container container = ContainerBuilder.aContainer(BDOC_CONTAINER_TYPE).build();
        return container;
    }

    @Test
    public void createDDocContainer() {
        assertTrue(createDDoc() instanceof DDocContainer);
    }

    @Test
    public void openBDocContainerWhenTheFileIsAZipAndTheExtensionIsBDoc() {
        assertTrue(
                ContainerOpener.open("testFiles/zip_file_without_asics_extension.bdoc") instanceof BDocContainer);
    }

    @Test
    public void openDDocContainerForAllOtherFiles() {
        assertTrue(ContainerOpener.open("testFiles/changed_digidoc_test.ddoc") instanceof DDocContainer);
    }

    @Test
    public void testAddOneFileToContainerForBDoc() throws Exception {
        Container container = createContainer();
        container.addDataFile("testFiles/test.txt", TEXT_MIME_TYPE);
        List<DataFile> dataFiles = container.getDataFiles();
        assertEquals(1, dataFiles.size());
        assertEquals("test.txt", dataFiles.get(0).getName());
        assertEquals(TEXT_MIME_TYPE, dataFiles.get(0).getMediaType());
    }

    @Test
    public void testRemovesOneFileFromContainerWhenFileExistsForBDoc() throws Exception {
        Container bDocContainer = createContainer();
        bDocContainer.addDataFile("testFiles/test.txt", TEXT_MIME_TYPE);
        bDocContainer.removeDataFile("test.txt");
        assertEquals(0, bDocContainer.getDataFiles().size());
    }

    @Test
    public void testCreateBDocContainerSpecifiedByDocumentTypeForBDoc() throws Exception {
        Container asicContainer = createBDoc();
        asicContainer.addDataFile("testFiles/test.txt", TEXT_MIME_TYPE);
        TestDataBuilder.signContainer(asicContainer);
        asicContainer.save("test.bdoc");
        assertTrue(Helper.isZipFile(new File("test.bdoc")));
    }

    @Test
    public void testCreateDDocContainer() throws Exception {
        Container dDocContainer = createDDoc();
        dDocContainer.addDataFile("testFiles/test.txt", TEXT_MIME_TYPE);
        dDocContainer.sign(PKCS12_SIGNER);
        dDocContainer.save("testCreateDDocContainer.ddoc");

        assertTrue(Helper.isXMLFile(new File("testCreateDDocContainer.ddoc")));
    }

    @Test
    public void testAddOneFileToContainerForDDoc() throws Exception {
        Container container = createDDoc();
        container.addDataFile("testFiles/test.txt", TEXT_MIME_TYPE);
        List<DataFile> dataFiles = container.getDataFiles();
        assertEquals(1, dataFiles.size());
        assertEquals("test.txt", dataFiles.get(0).getName());
        assertEquals(TEXT_MIME_TYPE, dataFiles.get(0).getMediaType());
    }

    @Test
    public void testRemovesOneFileFromContainerWhenFileExistsForDDoc() throws Exception {
        Container container = createDDoc();
        container.addDataFile("testFiles/test.txt", TEXT_MIME_TYPE);
        container.save("testRemovesOneFileFromContainerWhenFileExistsFor.ddoc");

        Container container1 = ContainerOpener.open("testRemovesOneFileFromContainerWhenFileExistsFor.ddoc");
        container1.removeDataFile("testFiles/test.txt");
        assertEquals(0, container1.getDataFiles().size());
    }

    @Test
    public void addLargeFileToBDoc() throws Exception {
        DataFile dataFile = new LargeDataFile(new ByteArrayInputStream(new byte[] { 0, 1, 2, 3 }), "large-doc.txt",
                TEXT_MIME_TYPE);
        Container container = createBDoc();
        container.addDataFile(dataFile);
        assertEquals(1, container.getDataFiles().size());
        container.saveAsFile(tempFile.getPath());
        container = ContainerOpener.open(tempFile.getPath());
        assertEquals(1, container.getDataFiles().size());
        assertEquals("large-doc.txt", container.getDataFiles().get(0).getName());
    }

    @Test
    public void addLargeFileToDDoc() throws Exception {
        DataFile dataFile = new DataFile(new ByteArrayInputStream(new byte[] { 0, 1, 2, 3 }), "large-doc.txt",
                TEXT_MIME_TYPE);
        Container container = createDDoc();
        container.addDataFile(dataFile);
        container.sign(PKCS12_SIGNER);
        assertEquals(1, container.getDataFiles().size());
        assertEquals("large-doc.txt", container.getDataFiles().get(0).getName());
        container.saveAsFile(tempFile.getPath());
    }

    @Test
    public void testOpenCreatedDDocFile() throws Exception {
        Container container = createDDoc();
        container.addDataFile("testFiles/test.txt", TEXT_MIME_TYPE);
        container.save("testOpenCreatedDDocFile.ddoc");
        Container containerForReading = ContainerOpener.open("testOpenCreatedDDocFile.ddoc");
        assertEquals(DDOC, containerForReading.getDocumentType());

        assertEquals(1, container.getDataFiles().size());
    }

    @Test(expected = DigiDoc4JException.class)
    public void testOpenInvalidFileReturnsError() {
        ContainerOpener.open("testFiles/test.txt");
    }

    @Test
    public void testValidateDDoc() throws Exception {
        Container dDocContainer = ContainerOpener.open("testFiles/ddoc_for_testing.ddoc");
        assertFalse(dDocContainer.validate().hasErrors());
        assertFalse(dDocContainer.validate().hasWarnings());
    }

    @Test(expected = DigiDoc4JException.class)
    public void testOpenNotExistingFileThrowsException() {
        ContainerOpener.open("noFile.ddoc");
    }

    @Test(expected = DigiDoc4JException.class)
    public void testOpenEmptyFileThrowsException() {
        ContainerOpener.open("emptyFile.ddoc");
    }

    @Test(expected = DigiDoc4JException.class)
    public void testFileTooShortToVerifyIfItIsZipFileThrowsException() {
        ContainerOpener.open("testFiles/tooShortToVerifyIfIsZip.ddoc");
    }

    @Test(expected = DigiDoc4JException.class)
    public void testOpenFromStreamTooShortToVerifyIfIsZip() {
        try {
            FileInputStream stream = new FileInputStream(new File("testFiles/tooShortToVerifyIfIsZip.ddoc"));
            ContainerOpener.open(stream, true);
            IOUtils.closeQuietly(stream);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testAddFileFromStreamToDDoc() throws IOException {
        Container container = createDDoc();
        try (ByteArrayInputStream is = new ByteArrayInputStream(new byte[] { 0x42 })) {
            container.addDataFile(is, "testFromStream.txt", TEXT_MIME_TYPE);
        }
        DataFile dataFile = container.getDataFiles().get(0);

        assertEquals("testFromStream.txt", dataFile.getName());
    }

    @Test
    public void openContainerFromStreamAsBDoc() throws IOException {
        Container container = createContainer();
        container.addDataFile("testFiles/test.txt", "text/plain");
        Signature signature = SignatureBuilder.aSignature(container).withSignatureToken(PKCS12_SIGNER)
                .invokeSigning();
        container.addSignature(signature);
        String containerPath = testFolder.newFile().getPath();
        container.save(containerPath);

        FileInputStream stream = new FileInputStream(containerPath);
        Container containerToTest = ContainerOpener.open(stream, false);
        stream.close();

        assertEquals(1, containerToTest.getSignatures().size());
    }

    @Test
    public void openContainerFromStreamAsDDoc() throws IOException {
        FileInputStream stream = new FileInputStream("testFiles/ddoc_for_testing.ddoc");
        Container container = ContainerOpener.open(stream, false);
        stream.close();

        assertEquals(1, container.getSignatures().size());
    }

    @Test
    public void testGetSignatureFromDDoc() {
        Container container = createDDoc();
        container.addDataFile("testFiles/test.txt", TEXT_MIME_TYPE);
        container.sign(PKCS12_SIGNER);
        List<Signature> signatures = container.getSignatures();

        assertEquals(1, signatures.size());
    }

    @Test(expected = DigiDoc4JException.class)
    public void testAddRawSignatureThrowsException() {
        Container container = createDDoc();
        container.addRawSignature(new byte[] { 0x42 });
    }

    @Test
    public void testAddRawSignatureAsByteArrayForDDoc()
            throws CertificateEncodingException, IOException, SAXException {
        Container container = createDDoc();
        container.addDataFile("testFiles/test.txt", TEXT_MIME_TYPE);
        container.sign(PKCS12_SIGNER);
        byte[] signatureBytes = FileUtils.readFileToByteArray(new File(("testFiles/xades/test-bdoc-tm.xml")));
        container.addRawSignature(signatureBytes);

        assertEquals(2, container.getSignatures().size());
        assertEquals(CERTIFICATE.replaceAll("\\s", ""),
                encodeBase64String(getSigningCertificateAsBytes(container, 1)));
        assertXMLEqual(new String(signatureBytes).trim(),
                new String(container.getSignatures().get(1).getAdESSignature()));
    }

    @Test
    public void throwsErrorWhenCreatesDDOCContainerWithConfiguration() throws Exception {
        Container container = ContainerBuilder.aContainer(DDOC_CONTAINER_TYPE)
                .withConfiguration(Configuration.getInstance()).build();

        assertEquals("DDOC", container.getType());
    }

    @Test
    public void testExtendToForBDOC() {
        Container container = createContainer();
        container.addDataFile("testFiles/test.txt", "text/plain");
        Signature signature = SignatureBuilder.aSignature(container).withSignatureProfile(B_BES)
                .withSignatureToken(PKCS12_SIGNER).invokeSigning();
        container.addSignature(signature);

        container.extendTo(LT);

        assertNotNull(container.getSignature(0).getOCSPCertificate());
    }

    @Test
    public void testExtendToForDDOC() {
        Container container = createDDoc();
        container.addDataFile("testFiles/test.txt", "text/plain");
        container.setSignatureProfile(B_BES);
        container.sign(PKCS12_SIGNER);

        container.extendTo(SignatureProfile.LT_TM);

        assertNotNull(container.getSignature(0).getOCSPCertificate());
    }

    @Test
    public void addRawSignatureToBDocContainer() throws Exception {
        Container container = createBDoc();
        container.addDataFile("testFiles/test.txt", TEXT_MIME_TYPE);
        byte[] signatureBytes = FileUtils.readFileToByteArray(new File("testFiles/xades/valid-bdoc-tm.xml"));
        container.addRawSignature(signatureBytes);
        String containerPath = testFolder.newFile("test-container.bdoc").getPath();
        container.saveAsFile(containerPath);
        container = ContainerOpener.open(containerPath);
        assertEquals(1, container.getSignatures().size());
        assertTrue(container.validate().isValid());
    }

    @Test
    public void addRawSignatureToExistingBDocContainer() throws Exception {
        Container container = TestDataBuilder.createContainerWithFile("testFiles/test.txt");
        TestDataBuilder.signContainer(container);
        byte[] signatureBytes = FileUtils.readFileToByteArray(new File("testFiles/xades/valid-bdoc-tm.xml"));
        container.addRawSignature(signatureBytes);
        String containerPath = testFolder.newFile("test-container.bdoc").getPath();
        container.saveAsFile(containerPath);
        container = ContainerOpener.open(containerPath);
        assertEquals(2, container.getSignatures().size());
        assertTrue(container.validate().isValid());
    }

    @Test(expected = InvalidSignatureException.class)
    public void testAddRawSignatureAsByteArrayForBDoc()
            throws CertificateEncodingException, IOException, SAXException {
        Container container = createBDoc();
        container.addDataFile("testFiles/test.txt", TEXT_MIME_TYPE);
        TestDataBuilder.signContainer(container);
        container.addRawSignature(
                Base64.decodeBase64("fo4aA1PVI//1agzBm2Vcxj7sk9pYQJt+9a7xLFSkfF10RocvGjVPBI65RMqyxGIsje"
                        + "LoeDERfTcjHdNojoK/gEdKtme4z6kvkZzjMjDuJu7krK/3DHBtW3XZleIaWZSWySahUiPNNIuk5ykACUolh+K/UK2aWL3Nh64EWvC8aznLV0"
                        + "M21s7GwTv7+iVXhR/6c3O22saWKWsteGT0/AqfcBRoj13H/NyuZOULqU0PFOhbJtV8RyZgC9n2uYBFsnutt5GPvhP+U93gkmFQ0+iC1a9Ktt"
                        + "j4QH5si35YmRIe0fp8tGDo6li63/tybb+kQ96AIaRe1NxpkKVDBGNi+VNVNA=="));
    }

    @Test
    public void testAddRawSignatureAsStreamArray() throws CertificateEncodingException, IOException {
        Container container = createDDoc();
        container.addDataFile("testFiles/test.txt", TEXT_MIME_TYPE);
        FileInputStream fileInputStream = new FileInputStream("testFiles/xades/test-bdoc-tm.xml");
        container.addRawSignature(fileInputStream);

        assertEquals(1, container.getSignatures().size());
        assertEquals(CERTIFICATE.replaceAll("\\s", ""),
                encodeBase64String(getSigningCertificateAsBytes(container, 0)));
    }

    private byte[] getSigningCertificateAsBytes(Container container, int index)
            throws CertificateEncodingException {
        Signature signature = container.getSignatures().get(index);
        return signature.getSigningCertificate().getX509Certificate().getEncoded();
    }

    @Test
    @Ignore("jDigidoc fails to save a container after a raw signature has been added")
    public void testRemoveSignature() throws IOException {
        Container container = createDDoc();
        container.addDataFile("testFiles/test.txt", TEXT_MIME_TYPE);
        container.sign(PKCS12_SIGNER);
        FileInputStream fileInputStream = new FileInputStream("testFiles/xades/test-bdoc-tm.xml");
        container.addRawSignature(fileInputStream);
        container.save("testRemoveSignature.ddoc");

        Container containerToRemoveSignature = ContainerOpener.open("testRemoveSignature.ddoc");
        containerToRemoveSignature.removeSignature(1);

        assertEquals(1, containerToRemoveSignature.getSignatures().size());
        //todo check is correct signatureXML removed by signing time?
    }

    @Test(expected = DigiDoc4JException.class)
    public void testRemovingNotExistingSignatureThrowsException() {
        Container container = createDDoc();
        container.removeSignature(0);
    }

    @Test
    public void testSigningWithSignerInfo() throws Exception {
        Container container = createContainer();
        container.addDataFile("testFiles/test.txt", TEXT_MIME_TYPE);
        Signature signature = SignatureBuilder.aSignature(container).withCity("myCity")
                .withStateOrProvince("myStateOrProvince").withPostalCode("myPostalCode").withCountry("myCountry")
                .withRoles("myRole / myResolution").withSignatureToken(PKCS12_SIGNER).invokeSigning();
        container.addSignature(signature);

        assertEquals("myCity", signature.getCity());
        assertEquals("myStateOrProvince", signature.getStateOrProvince());
        assertEquals("myPostalCode", signature.getPostalCode());
        assertEquals("myCountry", signature.getCountryName());
        assertEquals(1, signature.getSignerRoles().size());
        assertEquals("myRole / myResolution", signature.getSignerRoles().get(0));
    }

    @Test(expected = TslCertificateSourceInitializationException.class)
    public void testSetConfigurationForBDoc() throws Exception {
        Configuration conf = new Configuration(TEST);
        conf.setTslLocation("pole");
        Container container = ContainerBuilder.aContainer(BDOC_CONTAINER_TYPE).withConfiguration(conf)
                .withDataFile("testFiles/test.txt", TEXT_MIME_TYPE).build();
        SignatureBuilder.aSignature(container).withSignatureToken(PKCS12_SIGNER).invokeSigning();
    }

    @Test
    public void mustBePossibleToCreateAndVerifyContainerWhereDigestAlgorithmIsSHA224() throws Exception {
        Container container = createContainer();
        container.addDataFile("testFiles/test.txt", "text/plain");
        Signature signature = SignatureBuilder.aSignature(container)
                .withSignatureDigestAlgorithm(DigestAlgorithm.SHA224).withSignatureToken(PKCS12_SIGNER)
                .invokeSigning();
        container.addSignature(signature);

        String containerPath = testFolder.newFile().getPath();
        container.saveAsFile(containerPath);
        container = ContainerOpener.open(containerPath);

        assertEquals("http://www.w3.org/2001/04/xmldsig-more#sha224",
                container.getSignature(0).getSignatureMethod());
    }

    @Test
    public void constructorWithConfigurationParameter() throws Exception {
        Container container = ContainerBuilder.aContainer().withConfiguration(Configuration.getInstance()).build();
        assertEquals("BDOC", container.getType());
    }

    @Test
    @Ignore // Fails on Jenkins - need to verify
    public void createContainerWhenAttachmentNameContainsEstonianCharacters() throws Exception {
        Container container = createContainer();
        String s = "testFiles/test_o\u0303a\u0308o\u0308u\u0308.txt";
        container.addDataFile(s, "text/plain");
        container.sign(PKCS12_SIGNER);
        assertEquals(1, container.getDataFiles().size());
        ValidationResult validate = container.validate();
        assertTrue(validate.isValid());
    }

    @Test
    public void containerTypeStringValueForBDOC() throws Exception {
        assertEquals("application/vnd.etsi.asic-e+zip", createContainer().getDocumentType().toString());
    }

    @Test
    public void containerTypeStringValueForDDOC() throws Exception {
        assertEquals("DDOC", createDDoc().getDocumentType().toString());
    }

    @Test
    public void testSigningMultipleFilesInContainer() throws Exception {
        Container container = createContainer();
        container.addDataFile(new ByteArrayInputStream(new byte[] { 1, 2, 3 }), "1.txt", "text/plain");
        container.addDataFile(new ByteArrayInputStream(new byte[] { 1, 2, 3 }), "2.txt", "text/plain");
        container.addDataFile(new ByteArrayInputStream(new byte[] { 1, 2, 3 }), "3.txt", "text/plain");
        TestDataBuilder.signContainer(container);
        container.save(tempFile.getPath());
        assertEquals(3, container.getDataFiles().size());
        assertContainsDataFile("1.txt", container);
        assertContainsDataFile("2.txt", container);
        assertContainsDataFile("3.txt", container);
        Container openedContainer = ContainerOpener.open(tempFile.getPath());
        assertEquals(3, openedContainer.getDataFiles().size());
        assertContainsDataFile("1.txt", openedContainer);
        assertContainsDataFile("2.txt", openedContainer);
        assertContainsDataFile("3.txt", openedContainer);
    }

    private void assertContainsDataFile(String fileName, Container container) {
        for (DataFile file : container.getDataFiles()) {
            if (StringUtils.equals(fileName, file.getName())) {
                return;
            }
        }
        assertFalse("Data file '" + fileName + "' was not found in the container", true);
    }

    private Container createContainer() {
        return ContainerBuilder.aContainer().build();
    }

    private DDocContainer createDDoc() {
        Container container = ContainerBuilder.aContainer(DDOC_CONTAINER_TYPE).build();
        return (DDocContainer) container;
    }
}