PdfFileSpecTest.java

package com.itextpdf.kernel.pdf.filespec;

import com.itextpdf.commons.utils.FileUtil;
import com.itextpdf.io.logs.IoLogMessageConstant;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfName;
import com.itextpdf.kernel.utils.CompareTool;
import com.itextpdf.test.ExtendedITextTest;
import com.itextpdf.test.TestUtil;
import com.itextpdf.test.annotations.LogMessage;
import com.itextpdf.test.annotations.LogMessages;

import java.io.InputStream;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

@Tag("IntegrationTest")
public class PdfFileSpecTest extends ExtendedITextTest {

    private static final String SOURCE_FOLDER =
            "./src/test/resources/com/itextpdf/kernel/pdf/filespec/PdfFileSpecTest/";
    private static final String DESTINATION_FOLDER =
            TestUtil.getOutputPath() + "/kernel/pdf/filespec/PdfFileSpecTest/";

    private static final int DUPLICATE_ADDS = 2;
    // 1MB payload
    private static final int PAYLOAD_BYTES = 1024 * 1024;

    @BeforeAll
    public static void beforeClass() {
        createOrClearDestinationFolder(DESTINATION_FOLDER);
    }

    @AfterAll
    public static void afterClass() {
        CompareTool.cleanup(DESTINATION_FOLDER);
    }

    @Test
    @LogMessages(messages = @LogMessage(messageTemplate = IoLogMessageConstant.NAME_ALREADY_EXISTS_IN_THE_NAME_TREE,
            count = 1))
    public void createEmbeddedFileSpecWithByteArraysTest() throws Exception {
        String filename = DESTINATION_FOLDER + "byteArrays.pdf";

        try (PdfDocument pdfDoc = new PdfDocument(CompareTool.createTestPdfWriter(filename))) {
            pdfDoc.addNewPage();

            for (int i = 0; i < DUPLICATE_ADDS; ++i) {
                byte[] payload = new byte[PAYLOAD_BYTES];
                // Make first byte indexed so each payload differs (rules out content-based dedup).
                payload[0] = (byte) (i & 0xFF);

                PdfFileSpec spec = PdfFileSpec.createEmbeddedFileSpec(
                        pdfDoc,
                        payload,
                        "Iteration " + i,
                        "attachment-bytes.bin",
                        new PdfName("application/octet-stream"),
                        null,
                        PdfName.Data
                );
                pdfDoc.addFileAttachment("attachment-bytes.bin", spec);
            }
        }

        Assertions.assertNull(new CompareTool()
                .compareByContent(filename, SOURCE_FOLDER + "cmp_byteArrays.pdf",
                        DESTINATION_FOLDER,
                        "diff_"));
    }

    @Test
    public void createEmbeddedFileSpecWithFilePathTest() throws Exception {
        String filename = DESTINATION_FOLDER + "filePaths.pdf";

        try (PdfDocument pdfDoc = new PdfDocument(CompareTool.createTestPdfWriter(filename))) {
            pdfDoc.addNewPage();

            PdfFileSpec spec = PdfFileSpec.createEmbeddedFileSpec(
                    pdfDoc,
                    SOURCE_FOLDER + "attachment-64.txt",
                    "FileSpec Stream Closing Test",
                    "attachment-64.txt",
                    new PdfName("application/octet-stream"),
                    null,
                    PdfName.Data
            );
            pdfDoc.addFileAttachment("attachment-64.txt", spec);
        }

        Assertions.assertNull(new CompareTool()
                .compareByContent(filename, SOURCE_FOLDER + "cmp_attachment-64.pdf",
                        DESTINATION_FOLDER,
                        "diff_"));
    }

    @Test
    public void createEmbeddedFileSpecWithStreamClosingTest() throws Exception {
        String filename = DESTINATION_FOLDER + "streamClosing.pdf";

        try (PdfDocument pdfDoc = new PdfDocument(CompareTool.createTestPdfWriter(filename))) {
            pdfDoc.addNewPage();

            try (InputStream is = FileUtil.getInputStreamForFile(SOURCE_FOLDER + "attachment-64.txt")) {
                PdfFileSpec spec = PdfFileSpec.createEmbeddedFileSpec(
                        pdfDoc,
                        is,
                        "FileSpec Stream Closing Test",
                        "attachment-64.txt",
                        new PdfName("application/octet-stream"),
                        null,
                        PdfName.Data
                );
                pdfDoc.addFileAttachment("attachment-64.txt", spec);
            }
        }

        Assertions.assertNull(new CompareTool()
                .compareByContent(filename, SOURCE_FOLDER + "cmp_attachment-64.pdf",
                        DESTINATION_FOLDER,
                        "diff_"));
    }
}