Move the C++ Listener from a patch against cppunit to a usable external module for cppunit.

This commit is contained in:
Robert Collins
2009-10-03 23:33:53 +10:00
parent a0fece2a82
commit 493a10dc91
10 changed files with 178 additions and 164 deletions

View File

@@ -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

View File

@@ -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)

3
NEWS
View File

@@ -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.

5
README
View File

@@ -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
=====

View File

@@ -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).
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 patch, apply it and rebuild your cppunit. Then in your main do
{
// Create the event manager and test controller
CPPUNIT_NS::TestResult controller;
To use the listener, use pkg-config (or your preferred replacement) to get the
cflags and link settings from libcppunit_subunit.pc.
// 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 );
In your test driver main, use SubunitTestProgressListener, as shown in this
example main::
// 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.
{
// 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;
}

View File

@@ -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

View File

@@ -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 &copy );
/// Prevents the use of the copy operator.
void operator =( const SubunitTestProgressListener &copy );
private:
int last_test_failed;
};
CPPUNIT_NS_END
#endif // CPPUNIT_SUBUNITTESTPROGRESSLISTENER_H

View File

@@ -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 &copy );
+
+ /// Prevents the use of the copy operator.
+ void operator =( const SubunitTestProgressListener &copy );
+
+private:
+ int last_test_failed;
+};
+
+
+CPPUNIT_NS_END
+
+#endif // CPPUNIT_SUBUNITTESTPROGRESSLISTENER_H

View File

@@ -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
])

11
libcppunit_subunit.pc.in Normal file
View File

@@ -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}