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

Reply via email to