aboutsummaryrefslogtreecommitdiffstats
path: root/libtests
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2022-06-05 03:15:40 +0200
committerJay Berkenbilt <ejb@ql.org>2022-06-18 15:02:55 +0200
commitf1f711963b8e5f0b2b5a9d80a522cbd616a153a9 (patch)
tree9c5bc0bcf39cd6854786f60e68da42ddf90c3f99 /libtests
parentf588d74140b2a86026929aa401c9852ec215d4af (diff)
downloadqpdf-f1f711963b8e5f0b2b5a9d80a522cbd616a153a9.tar.zst
Add and test QPDFLogger class
Diffstat (limited to 'libtests')
-rw-r--r--libtests/CMakeLists.txt1
-rw-r--r--libtests/logger.cc109
-rw-r--r--libtests/qtest/logger.test33
-rw-r--r--libtests/qtest/logger/exp-stderr7
-rw-r--r--libtests/qtest/logger/exp-stdout6
5 files changed, 156 insertions, 0 deletions
diff --git a/libtests/CMakeLists.txt b/libtests/CMakeLists.txt
index 9eb9a490..196cd3eb 100644
--- a/libtests/CMakeLists.txt
+++ b/libtests/CMakeLists.txt
@@ -16,6 +16,7 @@ set(TEST_PROGRAMS
json
json_handler
json_parse
+ logger
lzw
main_from_wmain
matrix
diff --git a/libtests/logger.cc b/libtests/logger.cc
new file mode 100644
index 00000000..f10319f6
--- /dev/null
+++ b/libtests/logger.cc
@@ -0,0 +1,109 @@
+#include <qpdf/assert_test.h>
+
+#include <qpdf/Pl_String.hh>
+#include <qpdf/QPDFLogger.hh>
+#include <stdexcept>
+
+static void
+test1()
+{
+ // Standard behavior
+
+ auto logger = QPDFLogger::defaultLogger();
+
+ logger->info("info to stdout\n");
+ logger->warn("warn to stderr\n");
+ logger->error("error to stderr\n");
+ assert(logger->getSave(true) == nullptr);
+ try {
+ logger->getSave();
+ assert(false);
+ } catch (std::logic_error& e) {
+ *(logger->getInfo()) << "getSave exception: " << e.what() << "\n";
+ }
+ try {
+ logger->saveToStandardOutput();
+ assert(false);
+ } catch (std::logic_error& e) {
+ *(logger->getInfo())
+ << "saveToStandardOutput exception: " << e.what() << "\n";
+ }
+ logger->setWarn(logger->discard());
+ logger->warn("warning not seen\n");
+ logger->setWarn(nullptr);
+ logger->warn("restored warning to stderr\n");
+}
+
+static void
+test2()
+{
+ // First call saveToStandardOutput. Then use info, which then to
+ // go stderr.
+ QPDFLogger l;
+ l.saveToStandardOutput();
+ 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.setInfo(nullptr);
+ l.info("info back to stdout\n");
+}
+
+static void
+test3()
+{
+ // Error/warning
+ QPDFLogger l;
+
+ // Warning follows error when error is set explicitly.
+ std::string errors;
+ auto pl_error = std::make_shared<Pl_String>("errors", nullptr, errors);
+ l.setError(pl_error);
+ l.warn("warn follows error\n");
+ assert(errors == "warn follows error\n");
+ l.error("error too\n");
+ assert(errors == "warn follows error\nerror too\n");
+
+ // Set warnings -- now they're separate
+ std::string warnings;
+ auto pl_warn = std::make_shared<Pl_String>("warnings", nullptr, warnings);
+ l.setWarn(pl_warn);
+ l.warn(std::string("warning now separate\n"));
+ l.error(std::string("new error\n"));
+ assert(warnings == "warning now separate\n");
+ assert(errors == "warn follows error\nerror too\nnew error\n");
+ std::string errors2;
+ pl_error = std::make_shared<Pl_String>("errors", nullptr, errors2);
+ l.setError(pl_error);
+ l.warn("new warning\n");
+ l.error("another new error\n");
+ assert(warnings == "warning now separate\nnew warning\n");
+ assert(errors == "warn follows error\nerror too\nnew error\n");
+ assert(errors2 == "another new error\n");
+
+ // Restore warnings to default -- follows error again
+ l.setWarn(nullptr);
+ l.warn("warning 3\n");
+ l.error("error 3\n");
+ assert(warnings == "warning now separate\nnew warning\n");
+ assert(errors == "warn follows error\nerror too\nnew error\n");
+ assert(errors2 == "another new error\nwarning 3\nerror 3\n");
+
+ // Restore everything to default
+ l.setInfo(nullptr);
+ l.setWarn(nullptr);
+ l.setError(nullptr);
+ l.info("after reset, info to stdout\n");
+ l.warn("after reset, warn to stderr\n");
+ l.error("after reset, error to stderr\n");
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+ return 0;
+}
diff --git a/libtests/qtest/logger.test b/libtests/qtest/logger.test
new file mode 100644
index 00000000..86767eff
--- /dev/null
+++ b/libtests/qtest/logger.test
@@ -0,0 +1,33 @@
+#!/usr/bin/env perl
+require 5.008;
+use warnings;
+use strict;
+
+chdir("logger") or die "chdir testdir failed: $!\n";
+
+require TestDriver;
+
+my $td = new TestDriver('logger');
+
+cleanup();
+
+$td->runtest("logger",
+ {$td->COMMAND => "logger >stdout 2>stderr"},
+ {$td->STRING => "", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("check stdout",
+ {$td->FILE => "stdout"},
+ {$td->FILE => "exp-stdout"},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("check stderr",
+ {$td->FILE => "stderr"},
+ {$td->FILE => "exp-stderr"},
+ $td->NORMALIZE_NEWLINES);
+
+cleanup();
+$td->report(3);
+
+sub cleanup
+{
+ unlink "stdout", "stderr";
+}
diff --git a/libtests/qtest/logger/exp-stderr b/libtests/qtest/logger/exp-stderr
new file mode 100644
index 00000000..5d42c91a
--- /dev/null
+++ b/libtests/qtest/logger/exp-stderr
@@ -0,0 +1,7 @@
+warn to stderr
+error to stderr
+restored warning to stderr
+info to stderr
+info still to stderr
+after reset, warn to stderr
+after reset, error to stderr
diff --git a/libtests/qtest/logger/exp-stdout b/libtests/qtest/logger/exp-stdout
new file mode 100644
index 00000000..a51d446a
--- /dev/null
+++ b/libtests/qtest/logger/exp-stdout
@@ -0,0 +1,6 @@
+info to stdout
+getSave exception: QPDFLogger: requested a null pipeline without null_okay == true
+saveToStandardOutput exception: QPDFLogger: called setSave on standard output after standard output has already been used
+save to stdout
+info back to stdout
+after reset, info to stdout