2
1
mirror of https://github.com/qpdf/qpdf.git synced 2024-11-11 07:30:57 +00:00

Add test for exception handling

There have been issues reported where exceptions are not thrown
properly across shared library/DLL boundaries, so add a test
specifically to ensure that exceptions are caught as thrown.
This commit is contained in:
Jay Berkenbilt 2019-02-07 19:21:26 -05:00
parent ae65cdcce2
commit fc2e491f74
3 changed files with 59 additions and 0 deletions

View File

@ -178,6 +178,16 @@ $td->runtest("check final version",
{$td->STRING => "test 54 done\n", $td->EXIT_STATUS => 0}, {$td->STRING => "test 54 done\n", $td->EXIT_STATUS => 0},
$td->NORMALIZE_NEWLINES); $td->NORMALIZE_NEWLINES);
show_ntests();
# ----------
$td->notify("--- Exceptions ---");
$n_tests += 1;
$td->runtest("check exception handling",
{$td->COMMAND => "test_driver 61 -"},
{$td->FILE => "exceptions.out", $td->EXIT_STATUS => 0},
$td->NORMALIZE_NEWLINES);
show_ntests(); show_ntests();
# ---------- # ----------
$td->notify("--- Dangling Refs ---"); $td->notify("--- Dangling Refs ---");

View File

@ -0,0 +1,5 @@
Caught QPDFExc as expected
Caught QPDFSystemError as expected
Caught logic_error as expected
Caught runtime_error as expected
test 61 done

View File

@ -16,6 +16,7 @@
#include <qpdf/Pl_Buffer.hh> #include <qpdf/Pl_Buffer.hh>
#include <qpdf/Pl_Flate.hh> #include <qpdf/Pl_Flate.hh>
#include <qpdf/QPDFWriter.hh> #include <qpdf/QPDFWriter.hh>
#include <qpdf/QPDFSystemError.hh>
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
#include <algorithm> #include <algorithm>
@ -269,6 +270,10 @@ void runtest(int n, char const* filename1, char const* arg2)
pdf.processMemoryFile((std::string(filename1) + ".pdf").c_str(), pdf.processMemoryFile((std::string(filename1) + ".pdf").c_str(),
p, size); p, size);
} }
else if (n == 61)
{
// Ignore filename argument entirely
}
else if (n % 2 == 0) else if (n % 2 == 0)
{ {
if (n % 4 == 0) if (n % 4 == 0)
@ -2046,6 +2051,45 @@ void runtest(int n, char const* filename1, char const* arg2)
w.setStaticID(true); w.setStaticID(true);
w.write(); w.write();
} }
else if (n == 61)
{
// Test to make sure exceptions can be caught properly across
// shared library boundaries.
pdf.setAttemptRecovery(false);
pdf.setSuppressWarnings(true);
try
{
pdf.processMemoryFile("empty", "", 0);
}
catch (QPDFExc& e)
{
std::cout << "Caught QPDFExc as expected" << std::endl;
}
try
{
QUtil::safe_fopen("/does/not/exist", "r");
}
catch (QPDFSystemError& e)
{
std::cout << "Caught QPDFSystemError as expected" << std::endl;
}
try
{
QUtil::int_to_string_base(0, 12);
}
catch (std::logic_error& e)
{
std::cout << "Caught logic_error as expected" << std::endl;
}
try
{
QUtil::toUTF8(0xffffffff);
}
catch (std::runtime_error& e)
{
std::cout << "Caught runtime_error as expected" << std::endl;
}
}
else else
{ {
throw std::runtime_error(std::string("invalid test ") + throw std::runtime_error(std::string("invalid test ") +