Skip to content

Commit 1e6d804

Browse files
committed
Add unit tests for new batch operation classes
1 parent 16993a1 commit 1e6d804

File tree

3 files changed

+141
-1
lines changed

3 files changed

+141
-1
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package org.openpdf.text.pdf;
2+
3+
import org.junit.jupiter.api.Test;
4+
import org.openpdf.text.Document;
5+
import org.openpdf.text.Paragraph;
6+
7+
import java.io.FileOutputStream;
8+
import java.io.IOException;
9+
import java.nio.file.Files;
10+
import java.nio.file.Path;
11+
import java.util.List;
12+
import java.util.concurrent.Callable;
13+
14+
import static org.junit.jupiter.api.Assertions.*;
15+
16+
class PdfBatchUtilsTest {
17+
18+
private static Path tinyPdf(String prefix) throws Exception {
19+
Path p = Files.createTempFile(prefix, ".pdf");
20+
var doc = new Document();
21+
try (var out = new FileOutputStream(p.toFile())) {
22+
PdfWriter.getInstance(doc, out);
23+
doc.open();
24+
doc.add(new Paragraph("Hello OpenPDF"));
25+
doc.close();
26+
}
27+
return p;
28+
}
29+
30+
31+
@Test
32+
void runBatch_usesVirtualThreads() {
33+
// We don't create any executors here; runBatch does that internally.
34+
var tasks = List.of(
35+
(Callable<Integer>) () -> {
36+
assertTrue(Thread.currentThread().isVirtual(), "Task should run on a virtual thread");
37+
return 1;
38+
},
39+
(Callable<Integer>) () -> {
40+
assertTrue(Thread.currentThread().isVirtual(), "Task should run on a virtual thread");
41+
return 2;
42+
},
43+
(Callable<Integer>) () -> {
44+
assertTrue(Thread.currentThread().isVirtual(), "Task should run on a virtual thread");
45+
return 3;
46+
}
47+
);
48+
49+
var result = PdfBatchUtils.runBatch(tasks, v -> {}, t -> fail(t));
50+
assertTrue(result.isAllSuccessful(), "All tasks should succeed");
51+
assertEquals(3, result.successes.size());
52+
assertEquals(0, result.failures.size());
53+
}
54+
55+
@Test
56+
void batchMerge_createsOutput_and_runsOnVirtualThreads() throws Exception {
57+
// Prepare inputs
58+
Path a = tinyPdf("a-");
59+
Path b = tinyPdf("b-");
60+
Path merged = Files.createTempFile("merged-", ".pdf");
61+
62+
// Use the batch API which internally uses virtual threads.
63+
var jobs = List.of(new PdfBatchUtils.MergeJob(List.of(a, b), merged));
64+
65+
var result = PdfBatchUtils.batchMerge(jobs,
66+
// onSuccess: simple sanity checks per job
67+
out -> {
68+
assertTrue(Files.exists(out), "Merged PDF should exist");
69+
try {
70+
assertTrue(Files.size(out) > 0, "Merged PDF should be non-empty");
71+
} catch (IOException e) {
72+
throw new RuntimeException(e);
73+
}
74+
},
75+
t -> fail(t)
76+
);
77+
78+
assertTrue(result.isAllSuccessful(), "Merge job should succeed");
79+
80+
// Cleanup
81+
Files.deleteIfExists(a);
82+
Files.deleteIfExists(b);
83+
Files.deleteIfExists(merged);
84+
}
85+
}

openpdf-html/src/main/java/org/openpdf/html/Html2PdfBatchUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ public static Path renderHtmlString(String html, String baseUri, Path output,
167167
ITextRenderer renderer = new ITextRenderer();
168168
SharedContext sc = renderer.getSharedContext();
169169
// Slightly safer resource loading if you need custom schemes:
170-
//sc.setUserAgentCallback(renderer.getOutputDevice().getUserAgentCallback());
170+
sc.setUserAgentCallback(renderer.getOutputDevice().getSharedContext().getUserAgentCallback());
171171

172172
if (rendererCustomizer != null) rendererCustomizer.accept(renderer);
173173

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package org.openpdf.html;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import java.nio.file.Files;
6+
import java.nio.file.Path;
7+
import java.util.List;
8+
import java.util.Optional;
9+
10+
import static org.junit.jupiter.api.Assertions.*;
11+
12+
class Html2PdfBatchUtilsTest {
13+
14+
@Test
15+
void testBatchHtmlStringsRunsOnVirtualThreads() throws Exception {
16+
String html = "<html><body><h1>Hello PDF Batch test</h1></body></html>";
17+
18+
Path out1 = Files.createTempFile("vt-batch-1-", ".pdf");
19+
Path out2 = Files.createTempFile("vt-batch-2-", ".pdf");
20+
Path out3 = Files.createTempFile("vt-batch-3-", ".pdf");
21+
22+
// Assert virtual-thread execution from inside each batch task.
23+
var vtAssertCustomizer = Html2PdfBatchUtils.setDpi(96).andThen(renderer ->
24+
assertTrue(Thread.currentThread().isVirtual(), "Batch task should run on a virtual thread")
25+
);
26+
27+
var jobs = List.of(
28+
new Html2PdfBatchUtils.HtmlStringJob(
29+
html, null, out1,
30+
Optional.of(Html2PdfBatchUtils.CSS_A4_20MM),
31+
Optional.of(vtAssertCustomizer)
32+
),
33+
new Html2PdfBatchUtils.HtmlStringJob(
34+
html, null, out2,
35+
Optional.of(Html2PdfBatchUtils.CSS_A4_20MM),
36+
Optional.of(vtAssertCustomizer)
37+
),
38+
new Html2PdfBatchUtils.HtmlStringJob(
39+
html, null, out3,
40+
Optional.of(Html2PdfBatchUtils.CSS_A4_20MM),
41+
Optional.of(vtAssertCustomizer)
42+
)
43+
);
44+
45+
var result = Html2PdfBatchUtils.batchHtmlStrings(jobs, p -> {}, t -> fail(t));
46+
47+
assertTrue(result.isAllSuccessful(), "All batch jobs should succeed");
48+
49+
for (Path p : List.of(out1, out2, out3)) {
50+
assertTrue(Files.exists(p), "PDF should exist: " + p);
51+
assertTrue(Files.size(p) > 0, "PDF should be non-empty: " + p);
52+
Files.deleteIfExists(p);
53+
}
54+
}
55+
}

0 commit comments

Comments
 (0)