diff options
| author | Robert Collins <robertc@robertcollins.net> | 2009-10-03 23:33:53 +1000 |
|---|---|---|
| committer | Robert Collins <robertc@robertcollins.net> | 2009-10-03 23:33:53 +1000 |
| commit | 493a10dc9146e4ea9dd98ca69fe658a8139f35fc (patch) | |
| tree | 6b8b21aa693bd783626ca3cec772fd1f987b678c | |
| parent | a0fece2a82603e4cc7037313795b08e937e8a758 (diff) | |
| download | subunit-git-493a10dc9146e4ea9dd98ca69fe658a8139f35fc.tar.gz | |
Move the C++ Listener from a patch against cppunit to a usable external module for cppunit.
| -rw-r--r-- | .bzrignore | 2 | ||||
| -rw-r--r-- | Makefile.am | 11 | ||||
| -rw-r--r-- | NEWS | 3 | ||||
| -rw-r--r-- | README | 5 | ||||
| -rw-r--r-- | c++/README | 59 | ||||
| -rw-r--r-- | c++/SubunitTestProgressListener.cpp | 63 | ||||
| -rw-r--r-- | c++/SubunitTestProgressListener.h | 56 | ||||
| -rw-r--r-- | c++/cppunit-subunit-1.10.2.patch | 134 | ||||
| -rw-r--r-- | configure.ac | 4 | ||||
| -rw-r--r-- | libcppunit_subunit.pc.in | 11 |
10 files changed, 181 insertions, 167 deletions
@@ -21,10 +21,12 @@ py-compile .libs *.lo libsubunit.la +libcppunit_subunit.la subunit-0.0.1.tar.gz libtool stamp-h1 libsubunit.pc +libcppunit_subunit.pc config.log config.status Makefile diff --git a/Makefile.am b/Makefile.am index f6a4eff..58068e1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -39,6 +39,9 @@ ACLOCAL_AMFLAGS = -I m4 SUBUNIT_CFLAGS = -Wall -Werror -Wextra -Wstrict-prototypes -Wmissing-prototypes \ -Wwrite-strings -Wno-variadic-macros -I$(top_srcdir)/c/include AM_CFLAGS = $(SUBUNIT_CFLAGS) +SUBUNIT_CXXFLAGS = -Wall -Werror -Wextra -Wwrite-strings -Wno-variadic-macros \ + -I$(top_srcdir)/c/include +AM_CXXFLAGS = $(SUBUNIT_CXXFLAGS) include_subunitdir = $(includedir)/subunit @@ -67,9 +70,11 @@ pkgpython_PYTHON = \ python/subunit/test_results.py lib_LTLIBRARIES = libsubunit.la +lib_LTLIBRARIES += libcppunit_subunit.la include_subunit_HEADERS = \ - c/include/subunit/child.h + c/include/subunit/child.h \ + c++/SubunitTestProgressListener.h check_PROGRAMS = \ c/tests/test_child @@ -81,6 +86,10 @@ libsubunit_la_SOURCES = \ c/lib/child.c \ c/include/subunit/child.h +libcppunit_subunit_la_SOURCES = \ + c++/SubunitTestProgressListener.cpp \ + c++/SubunitTestProgressListener.h + tests_LDADD = @CHECK_LIBS@ $(top_builddir)/libsubunit.la c_tests_test_child_CFLAGS = $(SUBUNIT_CFLAGS) @CHECK_CFLAGS@ c_tests_test_child_LDADD = $(tests_LDADD) @@ -13,6 +13,9 @@ subunit release notes IMPROVEMENTS: + * CPPUnit is now directly supported: subunit builds a cppunit listener + ``libcppunit-subunit``. + * INSTALLDIRS can be set to control the perl MakeMaker 'INSTALLDIRS' viarable when installing. @@ -18,7 +18,6 @@ subunit reuses iso8601 by Michael Twomey, distributed under an MIT style licence - see python/iso8601/LICENSE for details. - Subunit ------- @@ -86,8 +85,8 @@ more details. C++ === -C++ uses the C bindings and includes a patch for cppunit. See 'c++/README' for -details. +The C library is includable and usable directly from C++. A TestListener for +CPPUnit is included in the Subunit distribution. See 'c++/README' for details. shell ===== @@ -18,32 +18,33 @@ # Currently there are no native C++ bindings for subunit. However the C library -can be used from C++ safely. There is also a patch for cppunit -(http://cppunit.sourceforge.net/) to enable reporting via subunit -(cppunit-subunit-1.10.2.patch). - -To use the patch, apply it and rebuild your cppunit. Then in your main do -{ - // Create the event manager and test controller - CPPUNIT_NS::TestResult controller; - - // Add a listener that collects test result - // so we can get the overall status. - // note this isn't needed for subunit... - CPPUNIT_NS::TestResultCollector result; - controller.addListener( &result ); - - // Add a listener that print test activity in subunit format. - CPPUNIT_NS::SubunitTestProgressListener progress; - controller.addListener( &progress ); - - // Add the top suite to the test runner - CPPUNIT_NS::TestRunner runner; - runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() ); - runner.run( controller ); - - return result.wasSuccessful() ? 0 : 1; -} - - -See the c/README for documentation on the C bindings for subunit. +can be used from C++ safely. A CPPUnit listener is built as part of Subunit to +allow CPPUnit users to simply get Subunit output. + +To use the listener, use pkg-config (or your preferred replacement) to get the +cflags and link settings from libcppunit_subunit.pc. + +In your test driver main, use SubunitTestProgressListener, as shown in this +example main:: + + { + // Create the event manager and test controller + CPPUNIT_NS::TestResult controller; + + // Add a listener that collects test result + // so we can get the overall status. + // note this isn't needed for subunit... + CPPUNIT_NS::TestResultCollector result; + controller.addListener( &result ); + + // Add a listener that print test activity in subunit format. + CPPUNIT_NS::SubunitTestProgressListener progress; + controller.addListener( &progress ); + + // Add the top suite to the test runner + CPPUNIT_NS::TestRunner runner; + runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() ); + runner.run( controller ); + + return result.wasSuccessful() ? 0 : 1; + } diff --git a/c++/SubunitTestProgressListener.cpp b/c++/SubunitTestProgressListener.cpp new file mode 100644 index 0000000..76cd9e1 --- /dev/null +++ b/c++/SubunitTestProgressListener.cpp @@ -0,0 +1,63 @@ +/* Subunit test listener for cppunit (http://cppunit.sourceforge.net). + * Copyright (C) 2006 Robert Collins <robertc@robertcollins.net> + * + * Licensed under either the Apache License, Version 2.0 or the BSD 3-clause + * license at the users choice. A copy of both licenses are available in the + * project source as Apache-2.0 and BSD. You may not use this file except in + * compliance with one of these two licences. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under these licenses is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the license you chose for the specific language governing permissions + * and limitations under that license. + */ + +#include <cppunit/Exception.h> +#include <cppunit/Test.h> +#include <cppunit/TestFailure.h> +#include <cppunit/TextOutputter.h> +#include <iostream> + +// Have to be able to import the public interface without config.h. +#include "SubunitTestProgressListener.h" +#include "config.h" +#include "subunit/child.h" + + +CPPUNIT_NS_BEGIN + + +void +SubunitTestProgressListener::startTest( Test *test ) +{ + subunit_test_start(test->getName().c_str()); + last_test_failed = false; +} + +void +SubunitTestProgressListener::addFailure( const TestFailure &failure ) +{ + std::ostringstream capture_stream; + TextOutputter outputter(NULL, capture_stream); + outputter.printFailureLocation(failure.sourceLine()); + outputter.printFailureDetail(failure.thrownException()); + + if (failure.isError()) + subunit_test_error(failure.failedTestName().c_str(), + capture_stream.str().c_str()); + else + subunit_test_fail(failure.failedTestName().c_str(), + capture_stream.str().c_str()); + last_test_failed = true; +} + +void +SubunitTestProgressListener::endTest( Test *test) +{ + if (!last_test_failed) + subunit_test_pass(test->getName().c_str()); +} + + +CPPUNIT_NS_END diff --git a/c++/SubunitTestProgressListener.h b/c++/SubunitTestProgressListener.h new file mode 100644 index 0000000..5206d83 --- /dev/null +++ b/c++/SubunitTestProgressListener.h @@ -0,0 +1,56 @@ +/* Subunit test listener for cppunit (http://cppunit.sourceforge.net). + * Copyright (C) 2006 Robert Collins <robertc@robertcollins.net> + * + * Licensed under either the Apache License, Version 2.0 or the BSD 3-clause + * license at the users choice. A copy of both licenses are available in the + * project source as Apache-2.0 and BSD. You may not use this file except in + * compliance with one of these two licences. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under these licenses is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the license you chose for the specific language governing permissions + * and limitations under that license. + */ +#ifndef CPPUNIT_SUBUNITTESTPROGRESSLISTENER_H +#define CPPUNIT_SUBUNITTESTPROGRESSLISTENER_H + +#include <cppunit/TestListener.h> + + +CPPUNIT_NS_BEGIN + + +/*! + * \brief TestListener that outputs subunit + * (http://www.robertcollins.net/unittest/subunit) compatible output. + * \ingroup TrackingTestExecution + */ +class CPPUNIT_API SubunitTestProgressListener : public TestListener +{ +public: + + SubunitTestProgressListener() {} + + void startTest( Test *test ); + + void addFailure( const TestFailure &failure ); + + void endTest( Test *test ); + +private: + /// Prevents the use of the copy constructor. + SubunitTestProgressListener( const SubunitTestProgressListener © ); + + /// Prevents the use of the copy operator. + void operator =( const SubunitTestProgressListener © ); + +private: + int last_test_failed; +}; + + +CPPUNIT_NS_END + +#endif // CPPUNIT_SUBUNITTESTPROGRESSLISTENER_H + diff --git a/c++/cppunit-subunit-1.10.2.patch b/c++/cppunit-subunit-1.10.2.patch deleted file mode 100644 index b3c353b..0000000 --- a/c++/cppunit-subunit-1.10.2.patch +++ /dev/null @@ -1,134 +0,0 @@ -diff -u cppunit-1.10.2/src/cppunit/Makefile.am cppunit-1.10.2/src/cppunit/Makefile.am ---- cppunit-1.10.2/src/cppunit/Makefile.am -+++ cppunit-1.10.2/src/cppunit/Makefile.am -@@ -28,6 +28,7 @@ - ProtectorChain.cpp \ - SourceLine.cpp \ - StringTools.cpp \ -+ SubunitTestProgressListener.cpp \ - SynchronizedObject.cpp \ - Test.cpp \ - TestAssert.cpp \ -@@ -74,0 +76,2 @@ -+ -+LIBRARY_LIBADD = $(LIBS) ---- cppunit-1.10.2.orig/src/cppunit/SubunitTestProgressListener.cpp -+++ cppunit-1.10.2/src/cppunit/SubunitTestProgressListener.cpp -@@ -0,0 +1,50 @@ -+#include <cppunit/Exception.h> -+#include <cppunit/Test.h> -+#include <cppunit/TestFailure.h> -+#include <cppunit/SubunitTestProgressListener.h> -+#include <cppunit/TextOutputter.h> -+#include <iostream> -+ -+#include "config.h" -+#ifdef HAVE_LIBSUBUNIT -+#include <subunit/child.h> -+ -+ -+CPPUNIT_NS_BEGIN -+ -+ -+void -+SubunitTestProgressListener::startTest( Test *test ) -+{ -+ subunit_test_start(test->getName().c_str()); -+ last_test_failed = false; -+} -+ -+void -+SubunitTestProgressListener::addFailure( const TestFailure &failure ) -+{ -+ std::ostringstream capture_stream; -+ TextOutputter outputter(NULL, capture_stream); -+ outputter.printFailureLocation(failure.sourceLine()); -+ outputter.printFailureDetail(failure.thrownException()); -+ -+ if (failure.isError()) -+ subunit_test_error(failure.failedTestName().c_str(), -+ capture_stream.str().c_str()); -+ else -+ subunit_test_fail(failure.failedTestName().c_str(), -+ capture_stream.str().c_str()); -+ last_test_failed = true; -+} -+ -+void -+SubunitTestProgressListener::endTest( Test *test) -+{ -+ if (!last_test_failed) -+ subunit_test_pass(test->getName().c_str()); -+} -+ -+ -+CPPUNIT_NS_END -+ -+#endif ---- cppunit-1.10.2.orig/configure.in -+++ cppunit-1.10.2/configure.in -@@ -65,6 +65,8 @@ - # check for doxygen - BB_ENABLE_DOXYGEN - -+# check for subunit -+AC_CHECK_LIB(subunit, subunit_test_start) - - # Check for headers - # Note that the fourth argument to AC_CHECK_HEADERS is non-empty to force ---- cppunit-1.10.2.orig/include/cppunit/Makefile.am -+++ cppunit-1.10.2/include/cppunit/Makefile.am -@@ -15,6 +15,7 @@ - Portability.h \ - Protector.h \ - SourceLine.h \ -+ SubunitTestProgressListener.h \ - SynchronizedObject.h \ - Test.h \ - TestAssert.h \ -only in patch2: -unchanged: ---- cppunit-1.10.2.orig/include/cppunit/SubunitTestProgressListener.h -+++ cppunit-1.10.2/include/cppunit/SubunitTestProgressListener.h -@@ -0,0 +1,41 @@ -+#ifndef CPPUNIT_SUBUNITTESTPROGRESSLISTENER_H -+#define CPPUNIT_SUBUNITTESTPROGRESSLISTENER_H -+ -+#include <cppunit/TestListener.h> -+ -+ -+CPPUNIT_NS_BEGIN -+ -+ -+/*! -+ * \brief TestListener that outputs subunit -+ * (http://www.robertcollins.net/unittest/subunit) compatible output. -+ * \ingroup TrackingTestExecution -+ */ -+class CPPUNIT_API SubunitTestProgressListener : public TestListener -+{ -+public: -+ -+ SubunitTestProgressListener() {} -+ -+ void startTest( Test *test ); -+ -+ void addFailure( const TestFailure &failure ); -+ -+ void endTest( Test *test ); -+ -+private: -+ /// Prevents the use of the copy constructor. -+ SubunitTestProgressListener( const SubunitTestProgressListener © ); -+ -+ /// Prevents the use of the copy operator. -+ void operator =( const SubunitTestProgressListener © ); -+ -+private: -+ int last_test_failed; -+}; -+ -+ -+CPPUNIT_NS_END -+ -+#endif // CPPUNIT_SUBUNITTESTPROGRESSLISTENER_H diff --git a/configure.ac b/configure.ac index f950717..76a91a4 100644 --- a/configure.ac +++ b/configure.ac @@ -18,6 +18,7 @@ AC_SUBST([SUBUNIT_MICRO_VERSION]) AC_SUBST([SUBUNIT_VERSION]) AC_USE_SYSTEM_EXTENSIONS AC_PROG_CC +AC_PROG_CXX AM_PROG_CC_C_O AC_PROG_INSTALL AC_PROG_LN_S @@ -46,11 +47,14 @@ AC_FUNC_REALLOC # Easier memory management. # C unit testing. PKG_CHECK_MODULES([CHECK], [check >= 0.9.4]) +# C++ unit testing. +PKG_CHECK_MODULES([CPPUNIT], [cppunit]) # Output files AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([libsubunit.pc + libcppunit_subunit.pc Makefile perl/Makefile.PL ]) diff --git a/libcppunit_subunit.pc.in b/libcppunit_subunit.pc.in new file mode 100644 index 0000000..98982c7 --- /dev/null +++ b/libcppunit_subunit.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: cppunit subunit listener +Description: Subunit output listener for the CPPUnit test library. +URL: http://launchpad.net/subunit +Version: @VERSION@ +Libs: -L${libdir} -lsubunit +Cflags: -I${includedir} |
