From 46cc2e05df97cef04118ea1fde880b52f3d919ba Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Tue, 20 May 2025 12:05:18 +0100 Subject: [PATCH] Add additional unit tests for utils and EE (#3557) ## Summary - add tests for LicenseKeyChecker - expand GeneralUtils coverage - cover extra PdfUtils functionality - merge PdfUtilsMoreTest into PdfUtilsTest ## Testing - `./gradlew test --no-daemon` - `./gradlew build spotlessApply --no-daemon` --- .../SPDF/EE/LicenseKeyCheckerTest.java | 77 +++++++++++++++++++ .../utils/GeneralUtilsAdditionalTest.java | 41 ++++++++++ .../software/SPDF/utils/PdfUtilsTest.java | 73 ++++++++++++++++++ 3 files changed, 191 insertions(+) create mode 100644 src/test/java/stirling/software/SPDF/EE/LicenseKeyCheckerTest.java create mode 100644 src/test/java/stirling/software/SPDF/utils/GeneralUtilsAdditionalTest.java diff --git a/src/test/java/stirling/software/SPDF/EE/LicenseKeyCheckerTest.java b/src/test/java/stirling/software/SPDF/EE/LicenseKeyCheckerTest.java new file mode 100644 index 000000000..90754ee04 --- /dev/null +++ b/src/test/java/stirling/software/SPDF/EE/LicenseKeyCheckerTest.java @@ -0,0 +1,77 @@ +package stirling.software.SPDF.EE; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.io.TempDir; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import stirling.software.SPDF.EE.KeygenLicenseVerifier.License; +import stirling.software.SPDF.model.ApplicationProperties; + +@ExtendWith(MockitoExtension.class) +class LicenseKeyCheckerTest { + + @Mock private KeygenLicenseVerifier verifier; + + @Test + void premiumDisabled_skipsVerification() { + ApplicationProperties props = new ApplicationProperties(); + props.getPremium().setEnabled(false); + props.getPremium().setKey("dummy"); + + LicenseKeyChecker checker = new LicenseKeyChecker(verifier, props); + + assertEquals(License.NORMAL, checker.getPremiumLicenseEnabledResult()); + verifyNoInteractions(verifier); + } + + @Test + void directKey_verified() { + ApplicationProperties props = new ApplicationProperties(); + props.getPremium().setEnabled(true); + props.getPremium().setKey("abc"); + when(verifier.verifyLicense("abc")).thenReturn(License.PRO); + + LicenseKeyChecker checker = new LicenseKeyChecker(verifier, props); + + assertEquals(License.PRO, checker.getPremiumLicenseEnabledResult()); + verify(verifier).verifyLicense("abc"); + } + + @Test + void fileKey_verified(@TempDir Path temp) throws IOException { + Path file = temp.resolve("license.txt"); + Files.writeString(file, "filekey"); + + ApplicationProperties props = new ApplicationProperties(); + props.getPremium().setEnabled(true); + props.getPremium().setKey("file:" + file.toString()); + when(verifier.verifyLicense("filekey")).thenReturn(License.ENTERPRISE); + + LicenseKeyChecker checker = new LicenseKeyChecker(verifier, props); + + assertEquals(License.ENTERPRISE, checker.getPremiumLicenseEnabledResult()); + verify(verifier).verifyLicense("filekey"); + } + + @Test + void missingFile_resultsNormal(@TempDir Path temp) { + Path file = temp.resolve("missing.txt"); + ApplicationProperties props = new ApplicationProperties(); + props.getPremium().setEnabled(true); + props.getPremium().setKey("file:" + file.toString()); + + LicenseKeyChecker checker = new LicenseKeyChecker(verifier, props); + + assertEquals(License.NORMAL, checker.getPremiumLicenseEnabledResult()); + verifyNoInteractions(verifier); + } +} diff --git a/src/test/java/stirling/software/SPDF/utils/GeneralUtilsAdditionalTest.java b/src/test/java/stirling/software/SPDF/utils/GeneralUtilsAdditionalTest.java new file mode 100644 index 000000000..4a48cdb0f --- /dev/null +++ b/src/test/java/stirling/software/SPDF/utils/GeneralUtilsAdditionalTest.java @@ -0,0 +1,41 @@ +package stirling.software.SPDF.utils; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class GeneralUtilsAdditionalTest { + + @Test + void testConvertSizeToBytes() { + assertEquals(1024L, GeneralUtils.convertSizeToBytes("1KB")); + assertEquals(1024L * 1024, GeneralUtils.convertSizeToBytes("1MB")); + assertEquals(1024L * 1024 * 1024, GeneralUtils.convertSizeToBytes("1GB")); + assertEquals(100L * 1024 * 1024, GeneralUtils.convertSizeToBytes("100")); + assertNull(GeneralUtils.convertSizeToBytes("invalid")); + assertNull(GeneralUtils.convertSizeToBytes(null)); + } + + @Test + void testFormatBytes() { + assertEquals("512 B", GeneralUtils.formatBytes(512)); + assertEquals("1.00 KB", GeneralUtils.formatBytes(1024)); + assertEquals("1.00 MB", GeneralUtils.formatBytes(1024L * 1024)); + assertEquals("1.00 GB", GeneralUtils.formatBytes(1024L * 1024 * 1024)); + } + + @Test + void testURLHelpersAndUUID() { + assertTrue(GeneralUtils.isValidURL("https://example.com")); + assertFalse(GeneralUtils.isValidURL("htp:/bad")); + assertFalse(GeneralUtils.isURLReachable("http://localhost")); + assertFalse(GeneralUtils.isURLReachable("ftp://example.com")); + + assertTrue(GeneralUtils.isValidUUID("123e4567-e89b-12d3-a456-426614174000")); + assertFalse(GeneralUtils.isValidUUID("not-a-uuid")); + + assertFalse(GeneralUtils.isVersionHigher(null, "1.0")); + assertTrue(GeneralUtils.isVersionHigher("2.0", "1.9")); + assertFalse(GeneralUtils.isVersionHigher("1.0", "1.0.1")); + } +} diff --git a/src/test/java/stirling/software/SPDF/utils/PdfUtilsTest.java b/src/test/java/stirling/software/SPDF/utils/PdfUtilsTest.java index a03564ee9..b8994faee 100644 --- a/src/test/java/stirling/software/SPDF/utils/PdfUtilsTest.java +++ b/src/test/java/stirling/software/SPDF/utils/PdfUtilsTest.java @@ -5,12 +5,17 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Collections; import java.util.HashSet; import java.util.Set; import org.apache.pdfbox.cos.COSName; +import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDResources; import org.apache.pdfbox.pdmodel.common.PDRectangle; @@ -18,6 +23,10 @@ import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import org.junit.jupiter.api.Test; import org.mockito.Mockito; +import stirling.software.SPDF.model.ApplicationProperties; +import stirling.software.SPDF.service.CustomPDFDocumentFactory; +import stirling.software.SPDF.service.PdfMetadataService; + public class PdfUtilsTest { @Test @@ -49,4 +58,68 @@ public class PdfUtilsTest { assertTrue(PdfUtils.hasImagesOnPage(page)); } + + @Test + void testPageCountComparators() throws Exception { + PDDocument doc1 = new PDDocument(); + doc1.addPage(new PDPage()); + doc1.addPage(new PDPage()); + doc1.addPage(new PDPage()); + PdfUtils utils = new PdfUtils(); + assertTrue(utils.pageCount(doc1, 2, "greater")); + + PDDocument doc2 = new PDDocument(); + doc2.addPage(new PDPage()); + doc2.addPage(new PDPage()); + doc2.addPage(new PDPage()); + assertTrue(utils.pageCount(doc2, 3, "equal")); + + PDDocument doc3 = new PDDocument(); + doc3.addPage(new PDPage()); + doc3.addPage(new PDPage()); + assertTrue(utils.pageCount(doc3, 5, "less")); + + PDDocument doc4 = new PDDocument(); + doc4.addPage(new PDPage()); + assertThrows(IllegalArgumentException.class, () -> utils.pageCount(doc4, 1, "bad")); + } + + @Test + void testPageSize() throws Exception { + PDDocument doc = new PDDocument(); + PDPage page = new PDPage(PDRectangle.A4); + doc.addPage(page); + PDRectangle rect = page.getMediaBox(); + String expected = rect.getWidth() + "x" + rect.getHeight(); + PdfUtils utils = new PdfUtils(); + assertTrue(utils.pageSize(doc, expected)); + } + + @Test + void testOverlayImage() throws Exception { + PDDocument doc = new PDDocument(); + doc.addPage(new PDPage(PDRectangle.A4)); + ByteArrayOutputStream pdfOut = new ByteArrayOutputStream(); + doc.save(pdfOut); + doc.close(); + + BufferedImage image = new BufferedImage(10, 10, BufferedImage.TYPE_INT_RGB); + Graphics2D g = image.createGraphics(); + g.setColor(Color.RED); + g.fillRect(0, 0, 10, 10); + g.dispose(); + ByteArrayOutputStream imgOut = new ByteArrayOutputStream(); + javax.imageio.ImageIO.write(image, "png", imgOut); + + PdfMetadataService meta = + new PdfMetadataService(new ApplicationProperties(), "label", false, null); + CustomPDFDocumentFactory factory = new CustomPDFDocumentFactory(meta); + + byte[] result = + PdfUtils.overlayImage( + factory, pdfOut.toByteArray(), imgOut.toByteArray(), 0, 0, false); + try (PDDocument resultDoc = factory.load(result)) { + assertEquals(1, resultDoc.getNumberOfPages()); + } + } }