From f1f711963b8e5f0b2b5a9d80a522cbd616a153a9 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 4 Jun 2022 21:15:40 -0400 Subject: Add and test QPDFLogger class --- libtests/CMakeLists.txt | 1 + libtests/logger.cc | 109 +++++++++++++++++++++++++++++++++++++++ libtests/qtest/logger.test | 33 ++++++++++++ libtests/qtest/logger/exp-stderr | 7 +++ libtests/qtest/logger/exp-stdout | 6 +++ 5 files changed, 156 insertions(+) create mode 100644 libtests/logger.cc create mode 100644 libtests/qtest/logger.test create mode 100644 libtests/qtest/logger/exp-stderr create mode 100644 libtests/qtest/logger/exp-stdout (limited to 'libtests') 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 + +#include +#include +#include + +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("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("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("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 -- cgit v1.2.3-54-g00ecf