BBlack has submitted this change and it was merged.
Change subject: some basic unit-test stuff for strq, + coverage
......................................................................
some basic unit-test stuff for strq, + coverage
Change-Id: Idc43bb4bc485ddd7d2bb51b0c7912f753e28b1bc
---
M .gitignore
A qa/coverage.sh
M src/Makefile.am
A src/test_strq.c
4 files changed, 177 insertions(+), 1 deletion(-)
Approvals:
BBlack: Verified; Looks good to me, approved
diff --git a/.gitignore b/.gitignore
index 481e4fa..d737d5a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,6 +17,9 @@
# Built, installed binaries
/src/vhtcpd
+# Test binaries
+/src/test_strq
+
# Various tool outputs in all dirs
Makefile
Makefile.in
diff --git a/qa/coverage.sh b/qa/coverage.sh
new file mode 100755
index 0000000..73f212c
--- /dev/null
+++ b/qa/coverage.sh
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+# A script that automates coverage testing with lcov
+# Run this from the top directory of the repo
+
+if [ ! -f $PWD/src/test_strq.c ]; then
+ echo "Run this from the root of the source tree!"
+ exit 99
+fi
+
+set -x
+set -e
+
+make distclean
+rm -f *.info
+rm -rf lcovout
+find . -name "*.gcov" -o -name "*.gcda" -o -name "*.gcno"|xargs rm -f
+
+CFLAGS="-O0 -fprofile-arcs -ftest-coverage"
CPPFLAGS="-DDMN_NO_UNREACH_BUILTIN" ./configure --disable-developer
+make
+
+lcov -c -i -d . -o test_strq-base.info
+
+make check
+
+lcov -c -d . -o test_strq-test.info
+lcov -a test_strq-base.info -a test_strq-test.info -o test_strq-cov.info
+genhtml -o lcovout test_strq-cov.info
diff --git a/src/Makefile.am b/src/Makefile.am
index a3d30a6..7a5c4e8 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -2,7 +2,14 @@
EXTRA_DIST = libdmn/ http-parser/ libdmn/README
AM_CPPFLAGS = -DVHTCPD_SYSRUNDIR=\"$(VHTCPD_SYSRUNDIR)\"
+LIBDMN_SRC = libdmn/dmn_daemon.c libdmn/dmn_log.c libdmn/dmn_secure.c
libdmn/dmn_net.c libdmn/dmn.h
+
# How to build gdnsd
sbin_PROGRAMS = vhtcpd
-vhtcpd_SOURCES = main.c strq.c strq.h receiver.c receiver.h purger.c purger.h
stats.c stats.h http-parser/http_parser.c http-parser/http_parser.h
libdmn/dmn_daemon.c libdmn/dmn_log.c libdmn/dmn_secure.c libdmn/dmn_net.c
libdmn/dmn.h
+vhtcpd_SOURCES = main.c strq.c strq.h receiver.c receiver.h purger.c purger.h
stats.c stats.h http-parser/http_parser.c http-parser/http_parser.h
$(LIBDMN_SRC)
vhtcpd_LDADD = -lev
+
+TESTS = test_strq
+check_PROGRAMS = test_strq
+test_strq_SOURCES = test_strq.c strq.c strq.h stats.c stats.h $(LIBDMN_SRC)
+test_strq_LDADD = -lev
diff --git a/src/test_strq.c b/src/test_strq.c
new file mode 100644
index 0000000..468ce70
--- /dev/null
+++ b/src/test_strq.c
@@ -0,0 +1,138 @@
+
+#include <string.h>
+#include <ev.h>
+#include "strq.h"
+#include "libdmn/dmn.h"
+
+static const char test_str_1[] = "Test string #1";
+static const char test_str_2[] = " - Test string #2, which happens to be a bit
larger";
+static const unsigned test_len_1 = sizeof(test_str_1) - 1;
+static const unsigned test_len_2 = sizeof(test_str_2) - 1;
+
+#define TST(msg, ...) do { \
+ if(!(__VA_ARGS__)) \
+ dmn_log_fatal("Test failed: " msg); \
+ } while(0)
+
+int main(int argc, char* argv[]) {
+ dmn_init_log("test_strq", true);
+ struct ev_loop* loop = ev_loop_new(0);
+ strq_t* q = strq_new(loop, 2, 3);
+
+
+ const char* deq_str = NULL;
+ unsigned deq_len = 0;
+
+ // Basic initial tests
+
+ for(unsigned i = 0; i < 3; i++) {
+ TST("empty initial queue", strq_is_empty(q, i));
+ deq_str = strq_dequeue(q, &deq_len, i);
+ TST("empty initial dequeue", !deq_str && !deq_len);
+ }
+
+ strq_enqueue(q, test_str_1, test_len_1);
+ for(unsigned i = 0; i < 3; i++) {
+ deq_len = 0;
+ TST("not-empty after one insert", !strq_is_empty(q, i));
+ deq_str = strq_dequeue(q, &deq_len, i);
+ TST("correct result dequeueing non-empty dequeue", deq_str && deq_len
&& !strcmp(test_str_1, deq_str));
+ TST("empty again after one cycle", strq_is_empty(q, i));
+ }
+
+ // Start 8K seq deq
+
+ for(unsigned i = 0; i < 8000; i++) {
+ strq_enqueue(q, test_str_1, test_len_1);
+ strq_enqueue(q, test_str_2, test_len_2);
+ }
+
+ for(unsigned i = 0; i < 8000; i++) {
+ for(unsigned j = 0; j < 3; j++) {
+ TST("not-empty during 8k seq deq", !strq_is_empty(q, j));
+ deq_len = 0;
+ deq_str = strq_dequeue(q, &deq_len, j);
+ TST("correct result during 8k seq deq", deq_str && deq_len &&
!strcmp(test_str_1, deq_str));
+ TST("not-empty during 8k seq deq", !strq_is_empty(q, j));
+ deq_len = 0;
+ deq_str = strq_dequeue(q, &deq_len, j);
+ TST("correct result during 8k seq deq", deq_str && deq_len &&
!strcmp(test_str_2, deq_str));
+ }
+ }
+
+ for(unsigned i = 0; i < 3; i++) {
+ TST("empty queue post-8k", strq_is_empty(q, i));
+ deq_len = 0;
+ deq_str = strq_dequeue(q, &deq_len, i);
+ TST("empty dequeue post-8k", !deq_str && !deq_len);
+ }
+
+ // Start 13K nseq deq
+
+ for(unsigned i = 0; i < 13000; i++) {
+ strq_enqueue(q, test_str_1, test_len_1);
+ strq_enqueue(q, test_str_2, test_len_2);
+ }
+
+ for(unsigned i = 0; i < 3; i++) {
+ for(unsigned j = 0; j < 13000; j++) {
+ deq_len = 0;
+ deq_str = strq_dequeue(q, &deq_len, i);
+ TST("correct result during 13k nseq deq", deq_str && deq_len &&
!strcmp(test_str_1, deq_str));
+ deq_len = 0;
+ deq_str = strq_dequeue(q, &deq_len, i);
+ TST("correct result during 13k nseq deq", deq_str && deq_len &&
!strcmp(test_str_2, deq_str));
+ }
+ TST("empty queue post-13k", strq_is_empty(q, i));
+ deq_len = 0;
+ deq_str = strq_dequeue(q, &deq_len, i);
+ TST("empty dequeue post-13k", !deq_str && !deq_len);
+ }
+
+ // Start irregular stuff
+
+ for(unsigned i = 0; i < 13000; i++) {
+ strq_enqueue(q, test_str_1, test_len_1);
+ strq_enqueue(q, test_str_2, test_len_2);
+ for(unsigned j = 0; j < 2; j++) {
+ deq_len = 0;
+ deq_str = strq_dequeue(q, &deq_len, j);
+ if(i & 1)
+ TST("correct result during irreg front-half-deq", deq_str &&
deq_len && !strcmp(test_str_2, deq_str));
+ else
+ TST("correct result during irreg front-half-deq", deq_str &&
deq_len && !strcmp(test_str_1, deq_str));
+ }
+ }
+
+ for(unsigned i = 0; i < 13000; i++) {
+ deq_len = 0;
+ deq_str = strq_dequeue(q, &deq_len, 2);
+ TST("correct result during irreg final-head-deq", deq_str && deq_len
&& !strcmp(test_str_1, deq_str));
+ deq_len = 0;
+ deq_str = strq_dequeue(q, &deq_len, 2);
+ TST("correct result during irreg final-head-deq", deq_str && deq_len
&& !strcmp(test_str_2, deq_str));
+ }
+
+ for(unsigned i = 0; i < 2; i++) {
+ for(unsigned j = 0; j < 13000; j++) {
+ deq_len = 0;
+ deq_str = strq_dequeue(q, &deq_len, i);
+ if(j & 1)
+ TST("correct result during irreg back-half-deq", deq_str &&
deq_len && !strcmp(test_str_2, deq_str));
+ else
+ TST("correct result during irreg back-half-deq", deq_str &&
deq_len && !strcmp(test_str_1, deq_str));
+ }
+ }
+
+ for(unsigned i = 0; i < 3; i++) {
+ TST("empty queue post-irreg", strq_is_empty(q, i));
+ deq_len = 0;
+ deq_str = strq_dequeue(q, &deq_len, i);
+ TST("empty dequeue post-irreg", !deq_str && !deq_len);
+ }
+
+ strq_destroy(q);
+ ev_loop_destroy(loop);
+
+ return 0;
+}
--
To view, visit https://gerrit.wikimedia.org/r/65610
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Idc43bb4bc485ddd7d2bb51b0c7912f753e28b1bc
Gerrit-PatchSet: 1
Gerrit-Project: operations/software/varnish/vhtcpd
Gerrit-Branch: master
Gerrit-Owner: BBlack <[email protected]>
Gerrit-Reviewer: BBlack <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits