[Libreoffice-commits] .: 2 commits - sal/cppunittester sal/inc
Caolán McNamara
caolan at kemper.freedesktop.org
Fri Jul 1 01:10:17 PDT 2011
sal/cppunittester/cppunittester.cxx | 100 +++++++++++++++++++----------
sal/inc/cppunittester/protectorfactory.hxx | 22 ++++--
sal/inc/sal/cppunit.h | 12 +++
3 files changed, 92 insertions(+), 42 deletions(-)
New commits:
commit cdb04bb015275f739ebcb0f79445bbb5bae01cb9
Author: Caolán McNamara <caolanm at redhat.com>
Date: Thu Jun 30 15:59:34 2011 +0100
extend CppUnit::Protector for context-less protection
diff --git a/sal/inc/cppunittester/protectorfactory.hxx b/sal/inc/cppunittester/protectorfactory.hxx
index c309dbe..916f89f 100644
--- a/sal/inc/cppunittester/protectorfactory.hxx
+++ b/sal/inc/cppunittester/protectorfactory.hxx
@@ -32,14 +32,20 @@
#include "sal/types.h"
-namespace CppUnit { class Protector; }
-
-namespace cppunittester {
-
-// The type of CppUnit::Protector factory functions that can be plugged into
-// cppunittester:
-extern "C" typedef CppUnit::Protector * SAL_CALL ProtectorFactory();
-
+#include <cppunit/Protector.h>
+
+namespace cppunittester
+{
+ class LibreOfficeProtector : public CppUnit::Protector
+ {
+ public:
+ virtual bool protect(CppUnit::Functor const & functor) = 0;
+ using CppUnit::Protector::protect;
+ };
+
+ // The type of CppUnit::Protector factory functions that can be plugged into
+ // cppunittester:
+ extern "C" typedef LibreOfficeProtector * SAL_CALL ProtectorFactory();
}
#endif
diff --git a/sal/inc/sal/cppunit.h b/sal/inc/sal/cppunit.h
index d0b3e60..41c465d 100644
--- a/sal/inc/sal/cppunit.h
+++ b/sal/inc/sal/cppunit.h
@@ -35,6 +35,18 @@
#include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/plugin/TestPlugIn.h>
+#include <cppunit/Protector.h>
+
+namespace cppunittester
+{
+ class LibreOfficeProtecter : public CppUnit::Protector
+ {
+ public:
+ virtual bool protect(CppUnit::Functor const & functor) = 0;
+ using CppUnit::Protector::protect;
+ };
+}
+
#undef CPPUNIT_PLUGIN_EXPORT
#define CPPUNIT_PLUGIN_EXPORT extern "C" SAL_DLLPUBLIC_EXPORT
commit d0a8f0e6b201d78b09868c9cc41aaac5f62c894d
Author: Caolán McNamara <caolanm at redhat.com>
Date: Thu Jun 30 15:59:09 2011 +0100
rearrange the cppunittester to allow makeFixture time exceptions catchable
diff --git a/sal/cppunittester/cppunittester.cxx b/sal/cppunittester/cppunittester.cxx
index 96d2347..0aa45ec 100644
--- a/sal/cppunittester/cppunittester.cxx
+++ b/sal/cppunittester/cppunittester.cxx
@@ -37,7 +37,6 @@
#include <iostream>
#include <limits>
#include <string>
-
#include "cppunittester/protectorfactory.hxx"
#include "osl/module.h"
#include "osl/module.hxx"
@@ -58,6 +57,8 @@
#include "cppunit/plugin/PlugInManager.h"
#include "cppunit/portability/Stream.h"
+#include "boost/noncopyable.hpp"
+
namespace {
void usageFailure() {
@@ -84,6 +85,39 @@ std::string convertLazy(rtl::OUString const & s16) {
: static_cast< std::string::size_type >(s8.getLength())));
}
+//Allow the whole uniting testing framework to be run inside a "Protector"
+//which knows about uno exceptions, so it can print the content of the
+//exception before falling over and dying
+class CPPUNIT_API ProtectedFixtureFunctor : public CppUnit::Functor, private boost::noncopyable
+{
+private:
+ const std::string &testlib;
+ const std::string &args;
+ CppUnit::TestResult &result;
+public:
+ ProtectedFixtureFunctor(const std::string& testlib_, const std::string &args_, CppUnit::TestResult &result_)
+ : testlib(testlib_)
+ , args(args_)
+ , result(result_)
+ {
+ }
+ bool run() const
+ {
+ CppUnit::PlugInManager manager;
+ manager.load(testlib, args);
+ CppUnit::TestRunner runner;
+ runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
+ CppUnit::TestResultCollector collector;
+ result.addListener(&collector);
+ runner.run(result);
+ CppUnit::CompilerOutputter(&collector, CppUnit::stdCErr()).write();
+ return collector.wasSuccessful();
+ }
+ virtual bool operator()() const
+ {
+ return run();
+ }
+};
}
SAL_IMPLEMENT_MAIN() {
@@ -95,12 +129,26 @@ SAL_IMPLEMENT_MAIN() {
#endif
CppUnit::TestResult result;
+ cppunittester::LibreOfficeProtector *throw_protector = 0;
+ std::string args;
+ std::string testlib;
sal_uInt32 index = 0;
- for (; index < rtl_getAppCommandArgCount(); index += 3) {
- if (!getArgument(index).equalsAsciiL(
- RTL_CONSTASCII_STRINGPARAM("--protector")))
+ while (index < rtl_getAppCommandArgCount())
+ {
+ rtl::OUString arg = getArgument(index);
+ if (!arg.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("--protector")))
{
- break;
+ if (testlib.empty())
+ {
+ testlib = rtl::OUStringToOString(arg, osl_getThreadTextEncoding()).getStr();
+ args += testlib;
+ }
+ {
+ args += ' ';
+ args += rtl::OUStringToOString(arg, osl_getThreadTextEncoding()).getStr();
+ }
+ ++index;
+ continue;
}
if (rtl_getAppCommandArgCount() - index < 3) {
usageFailure();
@@ -109,45 +157,29 @@ SAL_IMPLEMENT_MAIN() {
rtl::OUString sym(getArgument(index + 2));
oslGenericFunction fn = (new osl::Module(lib, SAL_LOADMODULE_GLOBAL))
->getFunctionSymbol(sym);
- CppUnit::Protector * p = fn == 0
+ throw_protector = fn == 0
? 0
: (*reinterpret_cast< cppunittester::ProtectorFactory * >(fn))();
- if (p == 0) {
+ if (throw_protector == 0) {
std::cerr
<< "Failure instantiating protector \"" << convertLazy(lib)
<< "\", \"" << convertLazy(sym) << '"' << std::endl;
std::exit(EXIT_FAILURE);
}
- result.pushProtector(p);
- }
- if (rtl_getAppCommandArgCount() - index < 1) {
- usageFailure();
+ result.pushProtector(throw_protector);
+ index+=3;
}
- std::string testlib;
- {
- rtl::OUString path;
- rtl_getAppCommandArg(index, &path.pData);
- testlib = rtl::OUStringToOString(path, osl_getThreadTextEncoding()).getStr();
- }
- std::string args = testlib;
- for (sal_uInt32 i = index + 1; i < rtl_getAppCommandArgCount(); ++i)
- {
- rtl::OUString arg;
- rtl_getAppCommandArg(i, &arg.pData);
- args += ' ';
- args += rtl::OUStringToOString(arg, osl_getThreadTextEncoding()).getStr();
- }
+ bool ok = false;
+ ProtectedFixtureFunctor tests(testlib, args, result);
+ //if the unoprotector was given on the command line, use it to catch
+ //and report the error message of exceptions
+ if (throw_protector)
+ ok = throw_protector->protect(tests);
+ else
+ ok = tests.run();
- CppUnit::PlugInManager manager;
- manager.load(testlib, args);
- CppUnit::TestRunner runner;
- runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
- CppUnit::TestResultCollector collector;
- result.addListener(&collector);
- runner.run(result);
- CppUnit::CompilerOutputter(&collector, CppUnit::stdCErr()).write();
- return collector.wasSuccessful() ? EXIT_SUCCESS : EXIT_FAILURE;
+ return ok ? EXIT_SUCCESS : EXIT_FAILURE;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list