diff --git a/docling-serve/docling-serve-client/src/test/java/ai/docling/serve/client/AbstractDoclingServeClientTests.java b/docling-serve/docling-serve-client/src/test/java/ai/docling/serve/client/AbstractDoclingServeClientTests.java index 030aff33..b5b690a1 100644 --- a/docling-serve/docling-serve-client/src/test/java/ai/docling/serve/client/AbstractDoclingServeClientTests.java +++ b/docling-serve/docling-serve-client/src/test/java/ai/docling/serve/client/AbstractDoclingServeClientTests.java @@ -38,6 +38,7 @@ import java.util.TreeSet; import java.util.concurrent.Flow.Subscriber; import java.util.concurrent.atomic.AtomicReference; +import java.util.regex.Pattern; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; @@ -102,6 +103,13 @@ abstract class AbstractDoclingServeClientTests { private static final Logger LOG = LoggerFactory.getLogger(AbstractDoclingServeClientTests.class); + // docling-serve names extracted images after a hash of their content, which changes whenever the + // rendered image bytes do (e.g. across docling-serve versions), so ZIP entry names are compared + // with the hash replaced by a placeholder. + private static final String IMAGE_HASH_PLACEHOLDER = ""; + private static final Pattern IMAGE_ARTIFACT_HASH = Pattern.compile("(?<=^artifacts/image_\\d{6}_)[0-9a-f]{64}(?=\\.png$)"); + private static final String FIRST_IMAGE_ARTIFACT_ENTRY = "artifacts/image_000000_%s.png".formatted(IMAGE_HASH_PLACEHOLDER); + protected static final DoclingServeContainer doclingContainer = new DoclingServeContainer( DoclingServeContainerConfig.builder() .image(DoclingServeContainerConfig.DOCLING_IMAGE) @@ -462,7 +470,10 @@ static void assertZipArchiveEntries(InputStream inputStream, Set expecte try (ZipInputStream zipInputStream = new ZipInputStream(inputStream)) { ZipEntry entry; while ((entry = zipInputStream.getNextEntry()) != null) { - actualEntries.add(entry.getName()); + var normalizedName = IMAGE_ARTIFACT_HASH + .matcher(entry.getName()) + .replaceFirst(IMAGE_HASH_PLACEHOLDER); + actualEntries.add(normalizedName); LOG.info("Found entry in ZIP: {} (size: {} bytes)", entry.getName(), entry.getSize()); zipInputStream.closeEntry(); } @@ -1004,7 +1015,7 @@ void shouldConvertSingleFileSourceWithZipTargetAndReferencedImageExportModeAsync assertThat(((ZipArchiveConvertDocumentResponse) response).getFileName()).isEqualTo("converted_docs.zip"); assertThat(((ZipArchiveConvertDocumentResponse) response).getInputStream()).isNotNull(); assertZipArchiveEntries(((ZipArchiveConvertDocumentResponse) response).getInputStream(), Set - .of("2408.09869.md", "artifacts/", "artifacts/image_000000_4f05ea6de89ce20493a5d9cc2305a4feb948c7bb794d7b81ee29554ec56b8445.png")); + .of("2408.09869.md", "artifacts/", FIRST_IMAGE_ARTIFACT_ENTRY)); } @Test @@ -1058,7 +1069,7 @@ void shouldConvertMultipleFileSourcesWithReferencedImageExportModeAsync() { assertThat(((ZipArchiveConvertDocumentResponse) response).getFileName()).isEqualTo("converted_docs.zip"); assertThat(((ZipArchiveConvertDocumentResponse) response).getInputStream()).isNotNull(); assertZipArchiveEntries(((ZipArchiveConvertDocumentResponse) response).getInputStream(), Set - .of("2408.09869.md", "story.md", "artifacts/", "artifacts/image_000000_4f05ea6de89ce20493a5d9cc2305a4feb948c7bb794d7b81ee29554ec56b8445.png")); + .of("2408.09869.md", "story.md", "artifacts/", FIRST_IMAGE_ARTIFACT_ENTRY)); } @Test @@ -1114,7 +1125,7 @@ void shouldConvertMultipleFileSourcesWithInBodyTargetAndReferencedImageExportMod assertThat(((ZipArchiveConvertDocumentResponse) response).getFileName()).isEqualTo("converted_docs.zip"); assertThat(((ZipArchiveConvertDocumentResponse) response).getInputStream()).isNotNull(); assertZipArchiveEntries(((ZipArchiveConvertDocumentResponse) response).getInputStream(), Set - .of("2408.09869.md", "story.md", "artifacts/", "artifacts/image_000000_4f05ea6de89ce20493a5d9cc2305a4feb948c7bb794d7b81ee29554ec56b8445.png")); + .of("2408.09869.md", "story.md", "artifacts/", FIRST_IMAGE_ARTIFACT_ENTRY)); } @Test diff --git a/docling-testcontainers/src/main/java/ai/docling/testcontainers/serve/config/DoclingServeContainerConfig.java b/docling-testcontainers/src/main/java/ai/docling/testcontainers/serve/config/DoclingServeContainerConfig.java index ac307c35..0c13d8ed 100644 --- a/docling-testcontainers/src/main/java/ai/docling/testcontainers/serve/config/DoclingServeContainerConfig.java +++ b/docling-testcontainers/src/main/java/ai/docling/testcontainers/serve/config/DoclingServeContainerConfig.java @@ -30,7 +30,7 @@ public interface DoclingServeContainerConfig { /** * Represents the version identifier for the docling-serve container image. */ - String DOCLING_IMAGE_VERSION = "v1.29.0"; + String DOCLING_IMAGE_VERSION = "v1.35.0"; /** * Default image name