From 8130d50e3b5aa0235a133c3c5a3018ac01afb5e1 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 18 Jun 2022 13:38:36 -0400 Subject: Add C API to QPDFLogger --- libtests/CMakeLists.txt | 8 +++ libtests/logger.cc | 6 +-- libtests/logger_c.c | 108 +++++++++++++++++++++++++++++++++++++ libtests/qtest/logger.test | 16 +++++- libtests/qtest/logger/2pages.pdf | Bin 0 -> 1287 bytes libtests/qtest/logger/attach.pdf | Bin 0 -> 1290 bytes libtests/qtest/logger/c-exp-error | 1 + libtests/qtest/logger/c-exp-info | 2 + libtests/qtest/logger/c-exp-save | Bin 0 -> 799 bytes libtests/qtest/logger/c-exp-save2 | 2 + libtests/qtest/logger/c-exp-stderr | 3 ++ libtests/qtest/logger/c-exp-stdout | 4 ++ libtests/qtest/logger/c-exp-warn | 4 ++ libtests/qtest/logger/normal.pdf | 79 +++++++++++++++++++++++++++ libtests/qtest/logger/warning.pdf | 79 +++++++++++++++++++++++++++ 15 files changed, 307 insertions(+), 5 deletions(-) create mode 100644 libtests/logger_c.c create mode 100644 libtests/qtest/logger/2pages.pdf create mode 100644 libtests/qtest/logger/attach.pdf create mode 100644 libtests/qtest/logger/c-exp-error create mode 100644 libtests/qtest/logger/c-exp-info create mode 100644 libtests/qtest/logger/c-exp-save create mode 100644 libtests/qtest/logger/c-exp-save2 create mode 100644 libtests/qtest/logger/c-exp-stderr create mode 100644 libtests/qtest/logger/c-exp-stdout create mode 100644 libtests/qtest/logger/c-exp-warn create mode 100644 libtests/qtest/logger/normal.pdf create mode 100644 libtests/qtest/logger/warning.pdf (limited to 'libtests') diff --git a/libtests/CMakeLists.txt b/libtests/CMakeLists.txt index 196cd3eb..62ba390e 100644 --- a/libtests/CMakeLists.txt +++ b/libtests/CMakeLists.txt @@ -33,10 +33,18 @@ set(TEST_PROGRAMS runlength sha2 sparse_array) +set(TEST_C_PROGRAMS + logger_c) + foreach(PROG ${TEST_PROGRAMS}) add_executable(${PROG} ${PROG}.cc) target_link_libraries(${PROG} libqpdf_object) endforeach() +foreach(PROG ${TEST_C_PROGRAMS}) + add_executable(${PROG} ${PROG}.c) + target_link_libraries(${PROG} libqpdf_object) + set_property(TARGET ${PROG} PROPERTY LINKER_LANGUAGE CXX) +endforeach() # Since libtests link with the object library and don't use the DLL, # we don't need to (and shouldn't) add the libqpdf target directory to diff --git a/libtests/logger.cc b/libtests/logger.cc index f10319f6..b968422e 100644 --- a/libtests/logger.cc +++ b/libtests/logger.cc @@ -22,7 +22,7 @@ test1() *(logger->getInfo()) << "getSave exception: " << e.what() << "\n"; } try { - logger->saveToStandardOutput(); + logger->saveToStandardOutput(true); assert(false); } catch (std::logic_error& e) { *(logger->getInfo()) @@ -40,12 +40,12 @@ test2() // First call saveToStandardOutput. Then use info, which then to // go stderr. QPDFLogger l; - l.saveToStandardOutput(); + l.saveToStandardOutput(true); l.info(std::string("info to stderr\n")); *(l.getSave()) << "save to stdout\n"; l.setInfo(nullptr); l.info("info still to stderr\n"); - l.setSave(nullptr); + l.setSave(nullptr, false); l.setInfo(nullptr); l.info("info back to stdout\n"); } diff --git a/libtests/logger_c.c b/libtests/logger_c.c new file mode 100644 index 00000000..94815601 --- /dev/null +++ b/libtests/logger_c.c @@ -0,0 +1,108 @@ +#include + +#include + +#include +#include + +#include +#include + +static void +fn(char const* data, size_t len, void* udata) +{ + FILE* f = (FILE*)udata; + fwrite(data, 1, len, f); +} + +static void +do_run(char const* json, int exp_status) +{ + int status = qpdfjob_run_from_json(json); + assert(status == exp_status); +} + +static FILE* +do_fopen(char const* filename) +{ + FILE* f = NULL; +#ifdef _MSC_VER + if (fopen_s(&f, filename, "wb") != 0) { + f = NULL; + } +#else + f = fopen(filename, "wb"); +#endif + if (f == NULL) { + fprintf(stderr, "unable to open %s\n", filename); + exit(2); + } + return f; +} + +int +main() +{ + FILE* info = do_fopen("info"); + FILE* warn = do_fopen("warn"); + FILE* error = do_fopen("error"); + FILE* save = do_fopen("save"); + FILE* save2 = do_fopen("save2"); + qpdflogger_handle l = qpdflogger_default_logger(); + + qpdflogger_set_info(l, qpdf_log_dest_custom, fn, (void*)info); + qpdflogger_set_warn(l, qpdf_log_dest_custom, fn, (void*)warn); + qpdflogger_set_error(l, qpdf_log_dest_custom, fn, (void*)error); + qpdflogger_set_save(l, qpdf_log_dest_custom, fn, (void*)save, 0); + + do_run( + "{\"inputFile\": \"normal.pdf\", \"showNpages\": \"\"}", + qpdf_exit_success); + do_run( + "{\"inputFile\": \"warning.pdf\", \"showNpages\": \"\"}", + qpdf_exit_warning); + do_run( + "{\"inputFile\": \"missing.pdf\", \"showNpages\": \"\"}", + qpdf_exit_error); + do_run( + "{\"inputFile\": \"normal.pdf\"," + " \"staticId\": \"\"," + " \"outputFile\": \"-\"}", + qpdf_exit_success); + + fclose(info); + fclose(warn); + fclose(error); + fclose(save); + + qpdflogger_set_info(l, qpdf_log_dest_stderr, NULL, NULL); + qpdflogger_set_warn(l, qpdf_log_dest_stdout, NULL, NULL); + qpdflogger_set_error(l, qpdf_log_dest_default, NULL, NULL); + qpdflogger_set_save(l, qpdf_log_dest_custom, fn, (void*)save2, 0); + + do_run( + "{\"inputFile\": \"2pages.pdf\", \"showNpages\": \"\"}", + qpdf_exit_success); + do_run( + "{\"inputFile\": \"warning.pdf\", \"showNpages\": \"\"}", + qpdf_exit_warning); + do_run( + + "{\"inputFile\": \"missing.pdf\", \"showNpages\": \"\"}", + qpdf_exit_error); + do_run( + "{\"inputFile\": \"attach.pdf\"," + " \"showAttachment\": \"a\"}", + qpdf_exit_success); + + /* This won't change save since it's already set */ + qpdflogger_save_to_standard_output(l, 1); + do_run( + "{\"inputFile\": \"attach.pdf\"," + " \"showAttachment\": \"a\"}", + qpdf_exit_success); + + qpdflogger_cleanup(&l); + + return 0; +} diff --git a/libtests/qtest/logger.test b/libtests/qtest/logger.test index 86767eff..786af4fb 100644 --- a/libtests/qtest/logger.test +++ b/libtests/qtest/logger.test @@ -24,10 +24,22 @@ $td->runtest("check stderr", {$td->FILE => "exp-stderr"}, $td->NORMALIZE_NEWLINES); +$td->runtest("logger C API", + {$td->COMMAND => "logger_c >stdout 2>stderr"}, + {$td->STRING => "", $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); +foreach my $f (qw(stdout stderr info warn error save save2)) +{ + $td->runtest("check $f (C)", + {$td->FILE => "$f"}, + {$td->FILE => "c-exp-$f"}, + $td->NORMALIZE_NEWLINES); +} + cleanup(); -$td->report(3); +$td->report(11); sub cleanup { - unlink "stdout", "stderr"; + unlink "stdout", "stderr", "info", "warn", "error", "save", "save2"; } diff --git a/libtests/qtest/logger/2pages.pdf b/libtests/qtest/logger/2pages.pdf new file mode 100644 index 00000000..f3e1700d Binary files /dev/null and b/libtests/qtest/logger/2pages.pdf differ diff --git a/libtests/qtest/logger/attach.pdf b/libtests/qtest/logger/attach.pdf new file mode 100644 index 00000000..bbc09588 Binary files /dev/null and b/libtests/qtest/logger/attach.pdf differ diff --git a/libtests/qtest/logger/c-exp-error b/libtests/qtest/logger/c-exp-error new file mode 100644 index 00000000..8e33a38a --- /dev/null +++ b/libtests/qtest/logger/c-exp-error @@ -0,0 +1 @@ +qpdfjob json: open missing.pdf: No such file or directory diff --git a/libtests/qtest/logger/c-exp-info b/libtests/qtest/logger/c-exp-info new file mode 100644 index 00000000..6ed281c7 --- /dev/null +++ b/libtests/qtest/logger/c-exp-info @@ -0,0 +1,2 @@ +1 +1 diff --git a/libtests/qtest/logger/c-exp-save b/libtests/qtest/logger/c-exp-save new file mode 100644 index 00000000..b8c692ed Binary files /dev/null and b/libtests/qtest/logger/c-exp-save differ diff --git a/libtests/qtest/logger/c-exp-save2 b/libtests/qtest/logger/c-exp-save2 new file mode 100644 index 00000000..3d1fe696 --- /dev/null +++ b/libtests/qtest/logger/c-exp-save2 @@ -0,0 +1,2 @@ +quack +quack diff --git a/libtests/qtest/logger/c-exp-stderr b/libtests/qtest/logger/c-exp-stderr new file mode 100644 index 00000000..bfbb2cff --- /dev/null +++ b/libtests/qtest/logger/c-exp-stderr @@ -0,0 +1,3 @@ +2 +1 +qpdfjob json: open missing.pdf: No such file or directory diff --git a/libtests/qtest/logger/c-exp-stdout b/libtests/qtest/logger/c-exp-stdout new file mode 100644 index 00000000..e7566de7 --- /dev/null +++ b/libtests/qtest/logger/c-exp-stdout @@ -0,0 +1,4 @@ +WARNING: warning.pdf: file is damaged +WARNING: warning.pdf (offset 1556): xref not found +WARNING: warning.pdf: Attempting to reconstruct cross-reference table +qpdfjob json: operation succeeded with warnings diff --git a/libtests/qtest/logger/c-exp-warn b/libtests/qtest/logger/c-exp-warn new file mode 100644 index 00000000..e7566de7 --- /dev/null +++ b/libtests/qtest/logger/c-exp-warn @@ -0,0 +1,4 @@ +WARNING: warning.pdf: file is damaged +WARNING: warning.pdf (offset 1556): xref not found +WARNING: warning.pdf: Attempting to reconstruct cross-reference table +qpdfjob json: operation succeeded with warnings diff --git a/libtests/qtest/logger/normal.pdf b/libtests/qtest/logger/normal.pdf new file mode 100644 index 00000000..a7e01f91 --- /dev/null +++ b/libtests/qtest/logger/normal.pdf @@ -0,0 +1,79 @@ +%PDF-1.3 +1 0 obj +<< + /Type /Catalog + /Pages 2 0 R +>> +endobj + +2 0 obj +<< + /Type /Pages + /Kids [ + 3 0 R + ] + /Count 1 +>> +endobj + +3 0 obj +<< + /Type /Page + /Parent 2 0 R + /MediaBox [0 0 612 792] + /Contents 4 0 R + /Resources << + /ProcSet 5 0 R + /Font << + /F1 6 0 R + >> + >> +>> +endobj + +4 0 obj +<< + /Length 44 +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Potato) Tj +ET +endstream +endobj + +5 0 obj +[ + /PDF + /Text +] +endobj + +6 0 obj +<< + /Type /Font + /Subtype /Type1 + /Name /F1 + /BaseFont /Helvetica + /Encoding /WinAnsiEncoding +>> +endobj + +xref +0 7 +0000000000 65535 f +0000000009 00000 n +0000000063 00000 n +0000000135 00000 n +0000000307 00000 n +0000000403 00000 n +0000000438 00000 n +trailer << + /Size 7 + /Root 1 0 R +>> +startxref +556 +%%EOF diff --git a/libtests/qtest/logger/warning.pdf b/libtests/qtest/logger/warning.pdf new file mode 100644 index 00000000..e8a7042c --- /dev/null +++ b/libtests/qtest/logger/warning.pdf @@ -0,0 +1,79 @@ +%PDF-1.3 +1 0 obj +<< + /Type /Catalog + /Pages 2 0 R +>> +endobj + +2 0 obj +<< + /Type /Pages + /Kids [ + 3 0 R + ] + /Count 1 +>> +endobj + +3 0 obj +<< + /Type /Page + /Parent 2 0 R + /MediaBox [0 0 612 792] + /Contents 4 0 R + /Resources << + /ProcSet 5 0 R + /Font << + /F1 6 0 R + >> + >> +>> +endobj + +4 0 obj +<< + /Length 44 +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Potato) Tj +ET +endstream +endobj + +5 0 obj +[ + /PDF + /Text +] +endobj + +6 0 obj +<< + /Type /Font + /Subtype /Type1 + /Name /F1 + /BaseFont /Helvetica + /Encoding /WinAnsiEncoding +>> +endobj + +xref +0 7 +0000000000 65535 f +0000000009 00000 n +0000000063 00000 n +0000000135 00000 n +0000000307 00000 n +0000000403 00000 n +0000000438 00000 n +trailer << + /Size 7 + /Root 1 0 R +>> +startxref +1556 +%%EOF -- cgit v1.2.3-70-g09d2