/* 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.digidoc4j.ContainerBuilder.BDOC_CONTAINER_TYPE; import static org.digidoc4j.ContainerBuilder.DDOC_CONTAINER_TYPE; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import org.apache.commons.io.IOUtils; import org.digidoc4j.impl.DigiDoc4JTestHelper; import org.digidoc4j.testutils.RestrictedFileWritingRule; import org.digidoc4j.testutils.RestrictedFileWritingRule.FileWritingRestrictedException; import org.digidoc4j.testutils.TestDataBuilder; import org.junit.Rule; import org.junit.Test; import eu.europa.esig.dss.MimeType; public class FileWritingOperationsTest extends DigiDoc4JTestHelper { private static final String tslCacheDirectoryPath = System.getProperty("java.io.tmpdir") + File.separator + "dss-cache-tsl" + File.separator; private static final String TEST_BDOC_CONTAINER = "testFiles/one_signature.bdoc"; private static final String TEST_DDOC_CONTAINER = "testFiles/ddoc_for_testing.ddoc"; private static final String TEST_LARGE_BDOC_CONTAINER = "testFiles/valid-containers/bdoc-ts-with-large-data-file.bdoc"; @Rule public RestrictedFileWritingRule rule = new RestrictedFileWritingRule(new File(tslCacheDirectoryPath).getPath()); private static Configuration configuration = new Configuration(Configuration.Mode.TEST); @Test(expected = FileWritingRestrictedException.class) public void writingToFileIsNotAllowed() throws IOException { File.createTempFile("test", "test"); } @Test public void openingExistingContainer_shouldNotStoreDataFilesOnDisk_byDefault() throws Exception { Container container = open(TEST_BDOC_CONTAINER, BDOC_CONTAINER_TYPE); TestDataBuilder.signContainer(container); assertSavingContainer(container); } @Test public void openingExistingDDocContainer_shouldNotStoreDataFilesOnDisk_byDefault() throws Exception { Container container = open(TEST_DDOC_CONTAINER, DDOC_CONTAINER_TYPE); TestDataBuilder.signContainer(container, DigestAlgorithm.SHA1); assertSavingContainer(container); } @Test public void creatingNewContainer_shouldNotStoreDataFilesOnDisk_byDefault() throws Throwable { Container container = createWithTestFiles(BDOC_CONTAINER_TYPE); TestDataBuilder.signContainer(container); assertSavingContainer(container); } @Test public void creatingNewDDocContainer_shouldNotStoreDataFilesOnDisk_byDefault() throws Throwable { Container container = createWithTestFiles(DDOC_CONTAINER_TYPE); TestDataBuilder.signContainer(container, DigestAlgorithm.SHA1); assertSavingContainer(container); } @Test public void creatingDataFiles_shouldNotStoreDataFilesOnDisk_byDefault() throws Exception { Container container = createContainerWithDataFiles(BDOC_CONTAINER_TYPE); assertEquals(3, container.getDataFiles().size()); TestDataBuilder.signContainer(container); assertSavingContainer(container); } @Test public void creatingDataFilesForDDoc_shouldNotStoreDataFilesOnDisk_byDefault() throws Exception { Container container = createContainerWithDataFiles(DDOC_CONTAINER_TYPE); assertEquals(3, container.getDataFiles().size()); TestDataBuilder.signContainer(container, DigestAlgorithm.SHA1); assertSavingContainer(container); } @Test(expected = FileWritingRestrictedException.class) public void creatingLargeDataFile_shouldStoreFileOnDisk() throws Throwable { InputStream dataFileInputStream = new ByteArrayInputStream(new byte[]{1, 2, 3}); try { DataFile dataFile = new LargeDataFile(dataFileInputStream, "stream-file.txt", MimeType.TEXT.getMimeTypeString()); assertFalse("Did not create a temporary file", true); } catch (Exception e) { throw e.getCause(); } } @Test(expected = FileWritingRestrictedException.class) public void openingExistingContainer_withStoringDataFilesOnDisk() throws Exception { configuration.setMaxFileSizeCachedInMemoryInMB(0); Container container = openWithConfiguration(TEST_BDOC_CONTAINER, BDOC_CONTAINER_TYPE); assertEquals(1, container.getDataFiles().size()); } @Test(expected = FileWritingRestrictedException.class) public void openingExistingContainer_withLarge2MbFile_shouldStoreDataFilesOnDisk() throws Exception { configuration.setMaxFileSizeCachedInMemoryInMB(1); Container container = openWithConfiguration(TEST_LARGE_BDOC_CONTAINER, BDOC_CONTAINER_TYPE); assertEquals(1, container.getDataFiles().size()); } @Test public void openingExistingContainer_withLarge2MbFile_shouldNotStoreDataFilesOnDisk() throws Exception { configuration.setMaxFileSizeCachedInMemoryInMB(4); Container container = openWithConfiguration(TEST_LARGE_BDOC_CONTAINER, BDOC_CONTAINER_TYPE); assertEquals(1, container.getDataFiles().size()); } private Container open(String containerPath, String type) { return ContainerBuilder. aContainer(type). fromExistingFile(containerPath). build(); } private Container openWithConfiguration(String containerPath, String type) { return ContainerBuilder. aContainer(type). fromExistingFile(containerPath). withConfiguration(configuration). build(); } private Container createWithTestFiles(String type) { InputStream dataFileInputStream = new ByteArrayInputStream(new byte[]{1, 2, 3}); File pdfFile = new File("testFiles/special-char-files/dds_acrobat.pdf"); return ContainerBuilder. aContainer(type). withDataFile(dataFileInputStream, "test-stream.txt", MimeType.TEXT.getMimeTypeString()). withDataFile("testFiles/test.txt", MimeType.TEXT.getMimeTypeString()). withDataFile(pdfFile, MimeType.PDF.getMimeTypeString()). build(); } private Container createContainerWithDataFiles(String type) { DataFile pathDataFile = new DataFile("testFiles/test.txt", MimeType.TEXT.getMimeTypeString()); DataFile byteDataFile = new DataFile(new byte[]{1, 2, 3}, "byte-file.txt", MimeType.TEXT.getMimeTypeString()); InputStream dataFileInputStream = new ByteArrayInputStream(new byte[]{1, 2, 3}); DataFile streamDataFile = new DataFile(dataFileInputStream, "stream-file.txt", MimeType.TEXT.getMimeTypeString()); return ContainerBuilder. aContainer(type). withDataFile(pathDataFile). withDataFile(byteDataFile). withDataFile(streamDataFile). build(); } private void assertSavingContainer(Container container) throws IOException { container.validate(); InputStream inputStream = container.saveAsStream(); assertContainerStream(inputStream); } private void assertContainerStream(InputStream inputStream) throws IOException { byte[] containerBytes = IOUtils.toByteArray(inputStream); assertTrue(containerBytes.length > 0); } }