/* 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.utils;
import static eu.europa.esig.dss.MimeType.ASICE;
import static org.digidoc4j.ContainerBuilder.BDOC_CONTAINER_TYPE;
import static org.digidoc4j.ContainerBuilder.DDOC_CONTAINER_TYPE;
import static org.digidoc4j.utils.Helper.deleteFile;
import static org.digidoc4j.utils.Helper.deserializer;
import static org.digidoc4j.utils.Helper.serialize;
import static org.hamcrest.Matchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.digidoc4j.Container;
import org.digidoc4j.ContainerBuilder;
import org.digidoc4j.ContainerOpener;
import org.digidoc4j.SignatureProfile;
import org.digidoc4j.exceptions.DigiDoc4JException;
import org.junit.AfterClass;
import org.junit.Test;
public class HelperTest {
@AfterClass
public static void cleanup() throws IOException {
deleteFile("extractSignatureThrowsErrorWhenSignatureIsNotFound.zip");
}
@Test
public void testIsXMLFileWhenFileIsNotXMLFile() throws Exception {
assertFalse(Helper.isXMLFile(new File("testFiles/test.txt")));
}
@Test
public void testIsXMLFileWhenFileIsXMLFile() throws Exception {
createXMLFile("testIsXMLFileWhenFileIsXMLFile.xml");
assertTrue(Helper.isXMLFile(new File("testIsXMLFileWhenFileIsXMLFile.xml")));
deleteFile("testIsXMLFileWhenFileIsXMLFile.xml");
}
private void createXMLFile(String fileName) throws IOException {
FileWriter writer = new FileWriter(fileName);
writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?><test></test>");
writer.flush();
writer.close();
}
@Test
public void testIsZIPFileWhenFileIsNotZIPFile() throws Exception {
assertFalse(Helper.isZipFile(new File("testFiles/test.txt")));
}
@Test
public void testIsZIPFileWhenFileIsZIPFile() throws Exception {
FileOutputStream fileOutputStream = new FileOutputStream("test.zip");
ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream);
zipOutputStream.putNextEntry(new ZipEntry("testFiles/test.txt"));
zipOutputStream.closeEntry();
assertTrue(Helper.isZipFile(new File("test.zip")));
fileOutputStream.close();
deleteFile("test.zip");
}
@Test
public void testDeleteFileIfExists() throws Exception {
File file = new File("testDelete.txt");
//noinspection ResultOfMethodCallIgnored
file.createNewFile();
assertTrue(file.exists());
deleteFile("testDelete.txt");
assertFalse(file.exists());
}
@Test
public void testDeleteFileIfNotExists() throws Exception {
deleteFile("testDeleteNotExists.txt");
assertFalse(new File("testDeleteNotExists.txt").exists());
}
@Test
public void extractSignatureS0() throws Exception {
createZIPFile();
assertEquals("A", Helper.extractSignature("extractSignature.zip", 0));
deleteFile("extractSignature.zip");
}
@Test
public void extractSignatureS1() throws Exception {
createZIPFile();
assertEquals("B", Helper.extractSignature("extractSignature.zip", 1));
deleteFile("extractSignature.zip");
}
@Test(expected = IOException.class)
public void extractSignatureThrowsErrorWhenSignatureIsNotFound() throws Exception {
try (
FileOutputStream fileOutputStream = new FileOutputStream("extractSignatureThrowsErrorWhenSignatureIsNotFound.zip");
ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream)) {
ZipEntry zipEntry = new ZipEntry("test");
zipOutputStream.putNextEntry(zipEntry);
zipOutputStream.write(0x42);
zipOutputStream.closeEntry();
}
Helper.extractSignature("extractSignatureThrowsErrorWhenSignatureIsNotFound.zip", 0);
}
private void createZIPFile() throws IOException {
try(FileOutputStream out = new FileOutputStream("extractSignature.zip");
ZipOutputStream zout = new ZipOutputStream(out)) {
ZipEntry signature0 = new ZipEntry("META-INF/signatures0.xml");
zout.putNextEntry(signature0);
zout.write(0x41);
zout.closeEntry();
ZipEntry signature1 = new ZipEntry("META-INF/signatures1.xml");
zout.putNextEntry(signature1);
zout.write(0x42);
zout.closeEntry();
}
}
@Test
public void createUserAgentForBDOC() throws Exception {
String userAgent = Helper.createBDocUserAgent();
assertThat(userAgent, containsString(ASICE.getMimeTypeString()));
}
@Test
public void createUserAgentForDDOC() throws Exception {
String userAgent = Helper.createUserAgent(ContainerBuilder.aContainer(DDOC_CONTAINER_TYPE).build());
assertThat(userAgent, containsString("DDOC"));
}
@Test
public void createUserAgentSignatureProfileForBDOC() {
String userAgent = Helper.createBDocUserAgent(SignatureProfile.LTA);
assertThat(userAgent, containsString("signatureProfile: ASiC_E_BASELINE_LTA"));
}
@Test
public void createUserAgentForUnknownSignatureProfile() {
String userAgent = Helper.createBDocUserAgent();
assertThat(userAgent, containsString("signatureProfile: ASiC_E"));
}
@Test
public void createUserAgentSignatureProfileForBDocTm() throws Exception {
String userAgent = Helper.createBDocUserAgent(SignatureProfile.LT_TM);
assertThat(userAgent, containsString("signatureProfile: ASiC_E_BASELINE_LT_TM"));
}
@Test
public void createUserAgentSignatureProfileForBDocTs() throws Exception {
String userAgent = Helper.createBDocUserAgent(SignatureProfile.LT);
assertThat(userAgent, containsString("signatureProfile: ASiC_E_BASELINE_LT"));
}
@Test
public void createUserAgentSignatureProfileForDDOC() {
Container container = ContainerBuilder.aContainer(DDOC_CONTAINER_TYPE).build();
String userAgent = Helper.createUserAgent(container);
assertThat(userAgent, containsString("signatureProfile: LT_TM"));
}
@Test
public void createUserAgentSignatureVersionForDDOC() {
Container container = ContainerBuilder.aContainer(DDOC_CONTAINER_TYPE).build();
String userAgent = Helper.createUserAgent(container);
assertThat(userAgent, containsString("format: DDOC/1.3"));
}
@Test
public void createUserAgentSignatureVersionForBDOC() {
String userAgent = Helper.createBDocUserAgent();
assertThat(userAgent, containsString("format: application/vnd.etsi.asic-e+zip"));
}
@Test (expected = DigiDoc4JException.class)
public void deserializeThrowsException() {
deserializer(null);
}
@Test (expected = DigiDoc4JException.class)
public void serializeThrowsException() {
serialize(ContainerBuilder.aContainer().build(), null);
}
}