Hi,

I'd like to do some refactoring, but that always makes me a bit nervous....

I thought I'd try to get coverage testing going. I've not had a lot of success 
with gcov and shared libraries, but it looks like it may be working now.

Anyway, a patch against trunk is attached.

The idea is that you pass the --enable-coverage configure time option, with 
something like:
./configure --prefix=/usr/local/samba --enable-coverage

Do a full, clean build:
make
(note, you may need to disable ccache)

You install (or otherwise make sure you're using the libraries you've just 
built)

You run whatever tests you're trying to evaluate.
./bin/openchangeclient -m
./bin/mapitest
./bin/mapiprofile --list

You run "make coverage":
make coverage

The nice HTML results are in ./covresults:
konqueror covresults/index.html

This is still a bit rough, but I'd like to get some feedback and suggestions 
on it from anyone who is interested.

Fixes for the patch, and suggestions for a set of tests to run (e.g. with the 
buildbot) would also be appreciated.

Brad


Index: configure.ac
===================================================================
--- configure.ac	(revision 1548)
+++ configure.ac	(working copy)
@@ -193,6 +193,13 @@
 AC_PROG_CC
 
 dnl ---------------------------------------------------------------------------
+dnl coverage testing
+dnl ---------------------------------------------------------------------------
+AC_ARG_ENABLE([coverage], AS_HELP_STRING([--enable-coverage],
+                                        [Compile the library with code coverage support (default is NO)]),
+                                        [use_cov=$enableval], [use_cov=no])
+
+dnl ---------------------------------------------------------------------------
 dnl Set up the right compiler options
 dnl ---------------------------------------------------------------------------
 AC_LANG_COMPILER_SUNCC 
@@ -210,8 +217,17 @@
     COMPILER_OPTIONS_CXX="$COMPILER_OPTIONS_SHARED"
 else
 dnl GNU Compiler
-    COMPILER_OPTIONS_SHARED="-O3 -Wall -g3 -fstrict-aliasing -Wp,-D_FORTIFY_SOURCE=2"
-    COMPILER_OPTIONS_C="$COMPILER_OPTIONS_SHARED -Wmissing-prototypes -Wstrict-prototypes"
+    COMPILER_OPTIONS_SHARED="-Wall -g3 -fstrict-aliasing -Wp,-D_FORTIFY_SOURCE=2"
+    if test "x$use_cov" = "xyes"; then
+        COMPILER_OPTIONS_SHARED="-O0 $COMPILER_OPTIONS_SHARED"
+    else
+        COMPILER_OPTIONS_SHARED="-O3 $COMPILER_OPTIONS_SHARED"
+    fi
+    COMPIILER_OPTIONS_C="$COMPILER_OPTIONS_SHARED -Wmissing-prototypes -Wstrict-prototypes"
+    if test "x$use_cov" = "xyes"; then
+        COMPILER_OPTIONS_C="$COMPIILER_OPTIONS_C -fprofile-arcs -ftest-coverage"
+        LDFLAGS="$LDFLAGS -lgcov --coverage"
+    fi
     COMPILER_OPTIONS_CXX="$COMPILER_OPTIONS_SHARED"
 fi
 AC_SUBST(COMPILER_OPTIONS_C)
@@ -641,10 +657,13 @@
 
 	   * OpenChange Documentation:	$enable_doxygen
 
+	   * Coverage Tests:		$use_cov
+
 	   * OpenChange Bindings:
 	     - Perl:			$enable_perlswig
 	     - Python:			$enable_pymapi
 
+
 ===============================================================
 
 ])
Index: Makefile
===================================================================
--- Makefile	(revision 1548)
+++ Makefile	(working copy)
@@ -160,9 +160,13 @@
 
 libmapi-clean::
 	rm -f libmapi/*.o libmapi/*.po
-	rm -f libmapi/tests/*.o, libmapi/tests/*.po
+	rm -f libmapi/*.gcno libmapi/*.gcda libmapi/*.gcov
+	rm -f libmapi/tests/*.o libmapi/tests/*.po
+	rm -f libmapi/tests/*.gcno libmapi/tests/*.gcda
 	rm -f libmapi/socket/*.o libmapi/socket/*.po
-	rm -f libmapi/util/*.o, libmapi/util/*.po
+	rm -f libmapi/socket/*.gcno libmapi/socket/*.gcda
+	rm -f libmapi/util/*.o libmapi/util/*.po
+	rm -f libmapi/util/*.gcno libmapi/util/*.gcda
 	rm -f libmapi/version.h
 ifneq ($(SNAPSHOT), no)
 	rm -f libmapi/utf8_convert.yy.c
@@ -179,6 +183,7 @@
 	rm -f gen_ndr/ndr_property*
 	rm -f gen_ndr/property.h
 	rm -f ndr_mapi.o ndr_mapi.po
+	rm -f ndr_mapi.gcno ndr_mapi.gcda
 	rm -f *~
 	rm -f */*~
 	rm -f */*/*~
@@ -288,7 +293,7 @@
 	libmapi/socket/netif.po				\
 	libmapi/utf8_convert.yy.po
 	@echo "Linking $@"
-	@$(CC) $(DSOOPT) -Wl,-soname,libmapi.$(SHLIBEXT).$(LIBMAPI_SO_VERSION) -o $@ $^ $(LIBS)
+	$(CC) $(DSOOPT) $(CFLAGS) $(LDFLAGS) -Wl,-soname,libmapi.$(SHLIBEXT).$(LIBMAPI_SO_VERSION) -o $@ $^ $(LIBS)
 
 
 libmapi.$(SHLIBEXT).$(LIBMAPI_SO_VERSION): libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
@@ -303,6 +308,7 @@
 
 # Avoid warnings:
 libmapi/utf8_convert.yy.o: CFLAGS=
+libmapi/utf8_convert.yy.po: CFLAGS=
 
 libmapi/proto.h libmapi/proto_private.h:		\
 	libmapi/nspi.c					\
@@ -406,7 +412,7 @@
 bin/libmapixx-test:	libmapi++/tests/test.cpp	\
 		libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
 	@echo "Linking sample application $@"
-	@$(CXX) $(CXXFLAGS) -o $@ $^ $(LIBS)
+	@$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)
 
 clean:: libmapixx-test-clean
 
@@ -480,6 +486,7 @@
 
 libmapiadmin-clean::
 	rm -f libmapiadmin/*.o libmapiadmin/*.po
+	rm -f libmapiadmin/*.gcno libmapiadmin/*.gcda
 ifneq ($(SNAPSHOT), no)
 	rm -f libmapiadmin/proto.h
 	rm -f libmapiadmin/proto_private.h
@@ -525,7 +532,7 @@
 	libmapiadmin/mapiadmin.po 		\
 	libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
 	@echo "Linking $@"
-	@$(CC) $(DSOOPT) -Wl,-soname,libmapiadmin.$(SHLIBEXT).$(LIBMAPIADMIN_SO_VERSION) -o $@ $^ $(LIBS) $(LIBMAPIADMIN_LIBS) 
+	@$(CC) $(DSOOPT) $(LDFLAGS) -Wl,-soname,libmapiadmin.$(SHLIBEXT).$(LIBMAPIADMIN_SO_VERSION) -o $@ $^ $(LIBS) $(LIBMAPIADMIN_LIBS) 
 
 libmapiadmin/proto.h libmapiadmin/proto_private.h: 	\
 	libmapiadmin/mapiadmin.c 			\
@@ -554,6 +561,7 @@
 
 libocpf-clean::
 	rm -f libocpf/*.o libocpf/*.po
+	rm -f libocpf/*.gcno libocpf/*.gcda
 ifneq ($(SNAPSHOT), no)
 	rm -f libocpf/lex.yy.c
 	rm -f libocpf/ocpf.tab.c libocpf/ocpf.tab.h
@@ -605,7 +613,7 @@
 	libocpf/ocpf_write.po			\
 	libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
 	@echo "Linking $@"
-	@$(CC) $(DSOOPT) -Wl,-soname,libocpf.$(SHLIBEXT).$(LIBOCPF_SO_VERSION) -o $@ $^ $(LIBS)
+	@$(CC) $(DSOOPT) $(LDFLAGS) -Wl,-soname,libocpf.$(SHLIBEXT).$(LIBOCPF_SO_VERSION) -o $@ $^ $(LIBS)
 
 libocpf.$(SHLIBEXT).$(LIBOCPF_SO_VERSION): libocpf.$(SHLIBEXT).$(PACKAGE_VERSION)
 	ln -fs $< $@
@@ -652,7 +660,7 @@
 ifneq ($(SNAPSHOT), no)
 	rm -f torture/torture_proto.h
 endif
-	rm -f torture/*.o torture/*.po
+	rm -f torture/*.o torture/*.po torture/*.gcno torture/*.gcda
 
 clean:: torture-clean
 
@@ -758,6 +766,7 @@
 			libmapiserver-clean			\
 			libmapistore-clean
 	rm -f mapiproxy/*.o mapiproxy/*.po
+	rm -f mapiproxy/*.gcno mapiproxy/*.gcda
 	rm -f mapiproxy/dcesrv_mapiproxy.$(SHLIBEXT)
 
 clean:: mapiproxy-clean
@@ -790,6 +799,7 @@
 
 libmapiproxy-clean:
 	rm -f mapiproxy/libmapiproxy/*.po mapiproxy/libmapiproxy/*.o
+	rm -f mapiproxy/libmapiproxy/*.gcno mapiproxy/libmapiproxy/*.gcda
 ifneq ($(SNAPSHOT), no)
 	rm -f mapiproxy/libmapiproxy/openchangedb_property.c
 endif
@@ -838,6 +848,7 @@
 
 libmapiserver-clean:
 	rm -f mapiproxy/libmapiserver/*.po mapiproxy/libmapiserver/*.o
+	rm -f mapiproxy/libmapiserver/*.gcno mapiproxy/libmapiserver/*.gcda
 	rm -f mapiproxy/libmapiserver.$(SHLIBEXT).$(PACKAGE_VERSION)
 	rm -f mapiproxy/libmapiserver.$(SHLIBEXT).$(LIBMAPISERVER_SO_VERSION)
 
@@ -885,6 +896,7 @@
 
 libmapistore-clean:	$(OC_MAPISTORE_CLEAN)
 	rm -f mapiproxy/libmapistore/*.po mapiproxy/libmapistore/*.o
+	rm -f mapiproxy/libmapistore/*.gcno mapiproxy/libmapistore/*.gcda
 	rm -f mapiproxy/libmapistore.$(SHLIBEXT).$(PACKAGE_VERSION)
 	rm -f mapiproxy/libmapistore.$(SHLIBEXT).$(LIBMAPISTORE_SO_VERSION)
 
@@ -902,7 +914,7 @@
 							mapiproxy/libmapistore/mapistore_processing.po	\
 							mapiproxy/libmapistore/mapistore_backend.po	\
 							mapiproxy/libmapistore/mapistore_tdb_wrap.po
-	@$(CC) -o $@ $(DSOOPT) -Wl,-soname,libmapistore.$(SHLIBEXT).$(LIBMAPISTORE_SO_VERSION) $^ -L. $(LIBS) $(TDB_LIBS)
+	@$(CC) -o $@ $(DSOOPT) $(LDFLAGS) -Wl,-soname,libmapistore.$(SHLIBEXT).$(LIBMAPISTORE_SO_VERSION) $^ -L. $(LIBS) $(TDB_LIBS)
 
 mapiproxy/libmapistore.$(SHLIBEXT).$(LIBMAPISTORE_SO_VERSION): libmapistore.$(SHLIBEXT).$(PACKAGE_VERSION)
 	ln -fs $< $@
@@ -923,6 +935,8 @@
 mapistore_sqlite3-clean:
 	rm -f mapiproxy/libmapistore/backends/mapistore_sqlite3.o
 	rm -f mapiproxy/libmapistore/backends/mapistore_sqlite3.po
+	rm -f mapiproxy/libmapistore/backends/mapistore_sqlite3.gcno
+	rm -f mapiproxy/libmapistore/backends/mapistore_sqlite3.gcda
 
 clean:: mapistore_sqlite3-clean
 
@@ -933,7 +947,7 @@
 
 mapiproxy/libmapistore/backends/mapistore_sqlite3.$(SHLIBEXT): mapiproxy/libmapistore/backends/mapistore_sqlite3.po
 	@echo "Linking mapistore module $@"
-	@$(CC) $(SQLITE_CFLAGS) -o $@ $(DSOOPT) $^ -L. $(LIBS) $(SQLITE_LIBS) 	\
+	@$(CC) $(SQLITE_CFLAGS) -o $@ $(DSOOPT) $(LDFLAGS) $^ -L. $(LIBS) $(SQLITE_LIBS) 	\
 	-Lmapiproxy mapiproxy/libmapistore.$(SHLIBEXT).$(PACKAGE_VERSION)
 
 #######################
@@ -949,6 +963,8 @@
 
 mapistore_clean:
 	rm -f mapiproxy/libmapistore/tests/*.o
+	rm -f mapiproxy/libmapistore/tests/*.gcno
+	rm -f mapiproxy/libmapistore/tests/*.gcda
 	rm -f bin/mapistore_test
 
 clean:: mapistore_clean
@@ -974,6 +990,7 @@
 
 mapiproxy-modules-clean::
 	rm -f mapiproxy/modules/*.o mapiproxy/modules/*.po
+	rm -f mapiproxy/modules/*.gcno mapiproxy/modules/*.gcda
 	rm -f mapiproxy/modules/*.so
 
 clean:: mapiproxy-modules-clean
@@ -1035,8 +1052,11 @@
 
 mapiproxy-servers-clean::
 	rm -f mapiproxy/servers/default/nspi/*.o mapiproxy/servers/default/nspi/*.po
+	rm -f mapiproxy/servers/default/nspi/*.gcno mapiproxy/servers/default/nspi/*.gcda
 	rm -f mapiproxy/servers/default/emsmdb/*.o mapiproxy/servers/default/emsmdb/*.po
+	rm -f mapiproxy/servers/default/emsmdb/*.gcno mapiproxy/servers/default/emsmdb/*.gcda
 	rm -f mapiproxy/servers/default/rfr/*.o mapiproxy/servers/default/rfr/*.po
+	rm -f mapiproxy/servers/default/rfr/*.gcno mapiproxy/servers/default/rfr/*.gcda
 	rm -f mapiproxy/servers/*.so
 
 clean:: mapiproxy-servers-clean
@@ -1087,7 +1107,11 @@
 openchangeclient-clean::
 	rm -f bin/openchangeclient
 	rm -f utils/openchangeclient.o
-	rm -f utils/openchange-tools.o	
+	rm -f utils/openchangeclient.gcno
+	rm -f utils/openchangeclient.gcda
+	rm -f utils/openchange-tools.o
+	rm -f utils/openchange-tools.gcno
+	rm -f utils/openchange-tools.gcda
 
 clean:: openchangeclient-clean
 
@@ -1096,7 +1120,7 @@
 			libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)		\
 			libocpf.$(SHLIBEXT).$(PACKAGE_VERSION)
 	@echo "Linking $@"
-	@$(CC) -o $@ $^ $(LDFLAGS) $(LIBS) -lpopt
+	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS) -lpopt
 
 
 ##############
@@ -1115,6 +1139,8 @@
 mapiprofile-clean::
 	rm -f bin/mapiprofile
 	rm -f utils/mapiprofile.o
+	rm -f utils/mapiprofile.gcno
+	rm -f utils/mapiprofile.gcda
 
 clean:: mapiprofile-clean
 
@@ -1122,7 +1148,7 @@
 			utils/openchange-tools.o 		\
 			libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
 	@echo "Linking $@"
-	@$(CC) -o $@ $^ $(LDFLAGS) $(LIBS) -lpopt
+	@$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS) -lpopt
 
 
 ###################
@@ -1141,6 +1167,8 @@
 openchangepfadmin-clean::
 	rm -f bin/openchangepfadmin
 	rm -f utils/openchangepfadmin.o
+	rm -f utils/openchangepfadmin.gcno
+	rm -f utils/openchangepfadmin.gcda
 
 clean:: openchangepfadmin-clean
 
@@ -1168,7 +1196,11 @@
 exchange2mbox-clean::
 	rm -f bin/exchange2mbox
 	rm -f utils/exchange2mbox.o
-	rm -f utils/openchange-tools.o	
+	rm -f utils/exchange2mbox.gcno
+	rm -f utils/exchange2mbox.gcda
+	rm -f utils/openchange-tools.o
+	rm -f utils/openchange-tools.gcno
+	rm -f utils/openchange-tools.gcda
 
 clean:: exchange2mbox-clean
 
@@ -1195,10 +1227,20 @@
 exchange2ical-clean::
 	rm -f bin/exchange2ical
 	rm -f utils/exchange2ical/exchange2ical.o
+	rm -f utils/exchange2ical/exchange2ical.gcno
+	rm -f utils/exchange2ical/exchange2ical.gcda
 	rm -f utils/exchange2ical/exchange2ical_utils.o
+	rm -f utils/exchange2ical/exchange2ical_utils.gcno
+	rm -f utils/exchange2ical/exchange2ical_utils.gcda
 	rm -f utils/exchange2ical/exchange2ical_component.o
+	rm -f utils/exchange2ical/exchange2ical_component.gcno
+	rm -f utils/exchange2ical/exchange2ical_component.gcda
 	rm -f utils/exchange2ical/exchange2ical_property.o
-	rm -f utils/openchange-tools.o	
+	rm -f utils/exchange2ical/exchange2ical_property.gcno
+	rm -f utils/exchange2ical/exchange2ical_property.gcda
+	rm -f utils/openchange-tools.o
+	rm -f utils/openchange-tools.gcno
+	rm -f utils/openchange-tools.gcda
 
 clean:: exchange2ical-clean
 
@@ -1230,7 +1272,11 @@
 mapitest-clean:
 	rm -f bin/mapitest
 	rm -f utils/mapitest/*.o
+	rm -f utils/mapitest/*.gcno
+	rm -f utils/mapitest/*.gcda
 	rm -f utils/mapitest/modules/*.o
+	rm -f utils/mapitest/modules/*.gcno
+	rm -f utils/mapitest/modules/*.gcda
 ifneq ($(SNAPSHOT), no)
 	rm -f utils/mapitest/proto.h
 	rm -f utils/mapitest/mapitest_proto.h
@@ -1301,7 +1347,11 @@
 openchangemapidump-clean::
 	rm -f bin/openchangemapidump
 	rm -f utils/backup/openchangemapidump.o
+	rm -f utils/backup/openchangemapidump.gcno
+	rm -f utils/backup/openchangemapidump.gcda
 	rm -f utils/backup/openchangebackup.o
+	rm -f utils/backup/openchangebackup.gcno
+	rm -f utils/backup/openchangebackup.gcda
 
 clean:: openchangemapidump-clean
 
@@ -1328,12 +1378,14 @@
 schemaIDGUID-clean::
 	rm -f bin/schemaIDGUID
 	rm -f utils/schemaIDGUID.o
+	rm -f utils/schemaIDGUID.gcno
+	rm -f utils/schemaIDGUID.gcda
 
 clean:: schemaIDGUID-clean
 
 bin/schemaIDGUID: utils/schemaIDGUID.o
 	@echo "Linking $@"
-	@$(CC) -o $@ $^ $(LIBS)
+	@$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
 
 
 ##################
@@ -1500,6 +1552,26 @@
 	LD_LIBRARY_PATH=`pwd` $(SMBTORTURE) --load-module torture/openchange.$(SHLIBEXT) ncalrpc: OPENCHANGE
 	./bin/mapitest --mapi-calls 
 
+####################################
+# coverage tests
+#
+# this could be better integrated...
+####################################
+coverage::
+	rm -f libmapi/\<stdout\>.gcov
+	rm -f ./libocpf/lex.yy.gcda
+	rm -f libocpf/\<stdout\>.gcov
+	rm -f ./\<stdout\>.gcov
+	lcov --base-directory . --directory libmapi --directory libocpf --directory libmapiadmin --directory utils --output-file oc_cov.info --capture
+	genhtml -o covresults oc_cov.info
+
+coverage-clean::
+	rm -rf oc_cov.info
+	rm -rf covresults
+	rm -f test.gcno
+
+clean:: coverage-clean
+
 # This should be the last line in the makefile since other distclean rules may 
 # need config.mk
 distclean::
_______________________________________________
devel mailing list
[email protected]
http://mailman.openchange.org/listinfo/devel

Reply via email to