[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