aboutsummaryrefslogtreecommitdiffstats
path: root/coverage
diff options
context:
space:
mode:
authorJose Bollo <jose.bollo@iot.bzh>2018-07-12 10:59:48 +0200
committerJosé Bollo <jose.bollo@iot.bzh>2018-07-24 16:28:32 +0200
commite17ae412245ba9afb33ff6a0f1f665b4d66d4da4 (patch)
tree698628c58b541007033ede6b4343dae921214da6 /coverage
parent4c0f6ce66c66d39dc61ec661d88277c51d2fd9ae (diff)
coverage and test: Add tests
coverage values: - lines: 70.5 % - functions: 76.3 % Change-Id: Iaf802e84bbfa57502bbbac8c3b567b14c01608b6 Signed-off-by: Jose Bollo <jose.bollo@iot.bzh>
Diffstat (limited to 'coverage')
-rw-r--r--coverage/.gitignore11
-rw-r--r--coverage/Makefile7
-rw-r--r--coverage/bin/Makefile122
-rw-r--r--coverage/bin/bug.c270
l---------coverage/bin/fake/monitoring1
-rw-r--r--coverage/bin/loc.txt0
-rw-r--r--coverage/bin/locales/en/loc.txt0
-rw-r--r--coverage/bin/locales/fr-FR/loc.txt0
-rw-r--r--coverage/bin/locales/fr/loc.txt0
-rw-r--r--coverage/bin/locales/jp/loc.txt0
l---------coverage/ldpath/weak/bug.so1
l---------coverage/ldpath/weak/bugs1
-rwxr-xr-xcoverage/scripts/00-trace.sh7
-rwxr-xr-xcoverage/scripts/01-http.sh28
-rwxr-xr-xcoverage/scripts/02-hello.sh44
-rwxr-xr-xcoverage/scripts/03-auto-ws.sh (renamed from coverage/scripts/03-x-hello.sh)0
-rwxr-xr-xcoverage/scripts/06-auto-so.sh35
-rwxr-xr-xcoverage/scripts/run-test.sh65
18 files changed, 555 insertions, 37 deletions
diff --git a/coverage/.gitignore b/coverage/.gitignore
index 43d04cb6..69f6ea4f 100644
--- a/coverage/.gitignore
+++ b/coverage/.gitignore
@@ -1,3 +1,14 @@
lcov-out.info
report/
valgrind.out
+bin/bugs
+run-test.output
+bin/afb-client
+bin/afb-daemon-cov
+bin/test-apiset
+bin/test-session
+bin/test-wrap-json
+*.o
+*.so
+*.gcda
+*.gcno
diff --git a/coverage/Makefile b/coverage/Makefile
index 3f5f3ce3..30477a70 100644
--- a/coverage/Makefile
+++ b/coverage/Makefile
@@ -14,7 +14,8 @@ clean:
make -C bin -w clean
cleanall: clean
- rm -rf lcov-out.info report valgrind.out
+ @echo remove all outputs and reports
+ @rm -rf lcov-out.info report valgrind.out 2>/dev/null || true
.PHONY: test
@@ -22,14 +23,12 @@ test: binaries
@echo -----------------------------------------
@echo -- BEGIN TEST
@echo -----------------------------------------
- @scripts/run-test.sh
+ @scripts/run-test.sh 2>&1 | tee run-test.output
@echo -----------------------------------------
@echo -- END TEST
@echo -----------------------------------------
report: test
- @echo generating LCOV report
- @lcov -c -d bin -o lcov-out.info
@echo generating report
@genhtml -s -o report lcov-out.info
@echo ready: xdg-open report/index.html
diff --git a/coverage/bin/Makefile b/coverage/bin/Makefile
index 19bf254a..f9d561ed 100644
--- a/coverage/bin/Makefile
+++ b/coverage/bin/Makefile
@@ -4,41 +4,102 @@
heredir = .
basedir = ../..
-targets = afb-daemon-cov afb-client hi3.so hello.so salut.so salam.so shalom.so demat.so bug.so hellov2.so
+bindings = \
+ hi3.so \
+ hello.so \
+ salut.so \
+ salam.so \
+ shalom.so \
+ demat.so \
+ hellov2.so
+
+bugs = $(foreach i,\
+ 1 2 3 4 5 6 7 8 9 \
+ 10 11 12 13 14 15 16 17 18 19 \
+ 20 21, \
+ bugs/bug$i.so)
+
+tests = \
+ test-apiset \
+ test-session \
+ test-wrap-json
+
+targets = \
+ afb-daemon-cov \
+ afb-client \
+ $(tests) \
+ $(bindings) \
+ $(bugs)
binaries: $(targets)
clean:
- @rm $(targets) *.gcno *.gcda
+ @echo remove all binaries
+ @rm $(targets) *.gcno *.gcda *.o 2>/dev/null || true
#======================================================================================
-# creates the targets
+# definitions
#======================================================================================
incdir = $(basedir)/include
srcdir = $(basedir)/src
+tstdir = $(basedir)/src/tests
samdir = $(basedir)/bindings/samples
bindir = $(heredir)/bin
-cflags = -I$(incdir) \
- $(shell pkg-config --cflags --libs openssl libmicrohttpd json-c libsystemd uuid) \
- -ldl -lrt -lpthread
+deps = openssl libmicrohttpd json-c libsystemd uuid
+
+ccflags = \
+ -g \
+ -I$(incdir) \
+ $(shell pkg-config --cflags $(deps))
+
+ldflags = -ldl -lrt -lpthread \
+ $(shell pkg-config --libs $(deps))
+
+cflags = $(ccflags) $(ldflags)
+
+defs = -DAGL_DEVEL \
+ -DWITH_MONITORING_OPTION \
+ -DWITH_SUPERVISION \
+ -DAFB_VERSION=\"cov\" \
+ -DBINDING_INSTALL_DIR=\"$(shell pwd)/fake\"
afb_lib_src = $(shell ls $(srcdir)/*.c | egrep -v '/afs-|/main-' )
-afb_clib_src = $(shell ls $(srcdir)/*.c | egrep -v '/afs-|/main-' )
+afb_lib_obj = $(patsubst $(srcdir)/%.c,%.o,$(afb_lib_src))
+afb_lib = afb-lib.a
+afb_lib_defs = $(defs)
+
+afb_daemon_srcs = $(srcdir)/main-afb-daemon.c $(afb_lib_obj)
+afb_daemon_defs = $(afb_lib_defs)
-afb_daemon_srcs = $(srcdir)/main-afb-daemon.c $(afb_lib_src)
-afb_daemon_defs = '-DAFB_VERSION="cov"' -DAGL_DEVEL -DWITH_MONITORING_OPTION '-DBINDING_INSTALL_DIR="fake"'
+afb_client_srcs = $(srcdir)/main-afb-client-demo.c $(afb_lib_src)
+afb_client_defs = $(defs)
-afb_client_srcs = $(srcdir)/main-afb-client-demo.c $(afb_clib_src)
-afb_client_defs = '-DAFB_VERSION="cov"' '-DBINDING_INSTALL_DIR="fake"'
+tst_defs = $(defs)
+tst_flags = $(cflags) \
+ -I$(srcdir) \
+ $(shell pkg-config --cflags --libs check)
+
+tst_defs = '-DAFB_VERSION="cov"' '-DBINDING_INSTALL_DIR="fake"'
+tst_flags = $(cflags) \
+ -I$(srcdir) \
+ $(shell pkg-config --cflags --libs check)
hello2_src = $(samdir)/hello2.c
hello3_src = $(samdir)/hello3.c
hi_src = $(samdir)/hi3.c
binding_flags = -shared -fPIC -Wl,--version-script=$(samdir)/export.map
+#======================================================================================
+# creates the targets
+#======================================================================================
+
+%.o: $(srcdir)/%.c
+ @echo creation of $@
+ @gcc -c -o $@ $< --coverage $(afb_lib_defs) $(ccflags)
+
afb-daemon-cov: $(afb_daemon_srcs)
@echo creation of $@
@gcc -o $@ $(afb_daemon_srcs) --coverage $(afb_daemon_defs) $(cflags)
@@ -47,21 +108,41 @@ afb-client: $(afb_client_srcs)
@echo creation of $@
@gcc -o $@ $(afb_client_srcs) $(afb_client_defs) $(cflags)
+#======================================================================================
+# create test
+#======================================================================================
+
+test-apiset: $(tstdir)/apiset/test-apiset.c $(afb_lib_obj)
+ @echo creation of $@
+ @gcc -o $@ $(tstdir)/apiset/test-apiset.c $(afb_lib_obj) --coverage $(tst_defs) $(tst_flags)
+
+test-session: $(tstdir)/session/test-session.c $(afb_lib_obj)
+ @echo creation of $@
+ @gcc -o $@ $(tstdir)/session/test-session.c $(afb_lib_obj) --coverage $(tst_defs) $(tst_flags)
+
+test-wrap-json: $(tstdir)/session/test-session.c $(afb_lib_obj)
+ @echo creation of $@
+ @gcc -o $@ $(tstdir)/wrap-json/test-wrap-json.c $(afb_lib_obj) --coverage $(tst_defs) $(tst_flags)
+
+#======================================================================================
+# create bindings
+#======================================================================================
+
hi3.so: $(hi3_src)
@echo creation of $@
@gcc -o $@ $(hi3_src) $(binding_flags) $(cflags)
hello.so: $(hello3_src)
@echo creation of $@
- @gcc -o $@ $(hello3_src) '-DAPINAME="hello"' $(binding_flags) $(cflags)
+ @gcc -o $@ $(hello3_src) '-DAPINAME="hello"' '-DPREINIT_PROVIDE_CLASS="class1 class2"' $(binding_flags) $(cflags)
salut.so: $(hello3_src)
@echo creation of $@
- @gcc -o $@ $(hello3_src) '-DAPINAME="salut"' $(binding_flags) $(cflags)
+ @gcc -o $@ $(hello3_src) '-DAPINAME="salut"' '-DPREINIT_REQUIRE_CLASS="class2"' $(binding_flags) $(cflags)
salam.so: $(hello3_src)
@echo creation of $@
- @gcc -o $@ $(hello3_src) '-DAPINAME="salam"' $(binding_flags) $(cflags)
+ @gcc -o $@ $(hello3_src) '-DAPINAME="salam"' '-DINIT_REQUIRE_API="hello salut"' $(binding_flags) $(cflags)
shalom.so: $(hello3_src)
@echo creation of $@
@@ -75,7 +156,14 @@ hellov2.so: $(hello2_src)
@echo creation of $@
@gcc -o $@ $(hello2_src) '-DAPINAME="hello-v2"' $(binding_flags) $(cflags)
-bug.so: bug.c
- @echo creation of $@
- @gcc -o $@ bug.c $(binding_flags) $(cflags)
+#======================================================================================
+# create bugs
+#======================================================================================
+
+bugs:
+ @echo creation of directory bugs
+ @mkdir bugs
+bugs/bug%.so: bug.c bugs
+ @echo creation of $@
+ @gcc -o $@ bug.c $(binding_flags) $(cflags) -D$(patsubst bugs/bug%.so,BUG%,$@)
diff --git a/coverage/bin/bug.c b/coverage/bin/bug.c
index ddebdef7..62646cec 100644
--- a/coverage/bin/bug.c
+++ b/coverage/bin/bug.c
@@ -1,6 +1,276 @@
+#include <errno.h>
+#include <stdint.h>
+static int ok()
+{
+ return 0;
+}
+static int bug()
+{
+ errno = 0;
+ return ((int(*)())(intptr_t)0)();
+}
+static int err()
+{
+ errno = EAGAIN;
+ return -1;
+}
+/**************************************************************************/
+/**************************************************************************/
+/*** BINDINGS V2 ***/
+/**************************************************************************/
+/**************************************************************************/
+#if defined(BUG1) /* incomplete exports: afbBindingV2data miss */
+
+#define AFB_BINDING_VERSION 0
+#include <afb/afb-binding.h>
+const struct afb_binding_v2 afbBindingV2;
+
+#endif
+/**************************************************************************/
+#if defined(BUG2) /* incomplete exports: afbBindingV2 miss */
+
+#define AFB_BINDING_VERSION 0
+#include <afb/afb-binding.h>
+struct afb_binding_data_v2 afbBindingV2data;
+
+#endif
+/**************************************************************************/
+#if defined(BUG3) /* zero filled structure */
+
+#define AFB_BINDING_VERSION 0
+#include <afb/afb-binding.h>
+const struct afb_binding_v2 afbBindingV2;
+struct afb_binding_data_v2 afbBindingV2data;
+
+#endif
+/**************************************************************************/
+#if defined(BUG4) /* no verb definition */
+
+#define AFB_BINDING_VERSION 2
+#include <afb/afb-binding.h>
+
+const struct afb_binding_v2 afbBindingV2 = {
+ .api = "bug4",
+ .preinit = (void*)ok,
+ .init = (void*)ok
+};
+#endif
+/**************************************************************************/
+#if defined(BUG5) /* preinit buggy */
+
+#define AFB_BINDING_VERSION 2
+#include <afb/afb-binding.h>
+
+struct afb_verb_v2 verbs[] = {
+ { NULL }
+};
+const struct afb_binding_v2 afbBindingV2 = {
+ .api = "bug5",
+ .verbs = verbs,
+ .preinit = (void*)bug,
+ .init = (void*)ok
+};
+#endif
+/**************************************************************************/
+#if defined(BUG6) /* buggy init */
+
+#define AFB_BINDING_VERSION 2
+#include <afb/afb-binding.h>
+
+struct afb_verb_v2 verbs[] = {
+ { NULL }
+};
+const struct afb_binding_v2 afbBindingV2 = {
+ .api = "bug6",
+ .verbs = verbs,
+ .preinit = (void*)ok,
+ .init = (void*)bug
+};
+#endif
+/**************************************************************************/
+#if defined(BUG7) /* error in preinit */
+
+#define AFB_BINDING_VERSION 2
+#include <afb/afb-binding.h>
+
+struct afb_verb_v2 verbs[] = {
+ { NULL }
+};
+const struct afb_binding_v2 afbBindingV2 = {
+ .api = "bug7",
+ .verbs = verbs,
+ .preinit = (void*)err,
+ .init = (void*)ok
+};
+#endif
+/**************************************************************************/
+#if defined(BUG8) /* error in init */
+
+#define AFB_BINDING_VERSION 2
+#include <afb/afb-binding.h>
+
+struct afb_verb_v2 verbs[] = {
+ { NULL }
+};
+const struct afb_binding_v2 afbBindingV2 = {
+ .api = "bug8",
+ .verbs = verbs,
+ .preinit = (void*)ok,
+ .init = (void*)err
+};
+#endif
+/**************************************************************************/
+#if defined(BUG9) /* no api name */
+
+#define AFB_BINDING_VERSION 2
+#include <afb/afb-binding.h>
+
+struct afb_verb_v2 verbs[] = {
+ { NULL }
+};
+const struct afb_binding_v2 afbBindingV2 = {
+ .verbs = verbs,
+ .preinit = (void*)ok,
+ .init = (void*)ok
+};
+#endif
+/**************************************************************************/
+#if defined(BUG10) /* bad api name */
+
+#define AFB_BINDING_VERSION 2
+#include <afb/afb-binding.h>
+
+struct afb_verb_v2 verbs[] = {
+ { NULL }
+};
+const struct afb_binding_v2 afbBindingV2 = {
+ .api = "bug 10",
+ .verbs = verbs,
+ .preinit = (void*)ok,
+ .init = (void*)err
+};
+#endif
+/**************************************************************************/
+/**************************************************************************/
+/*** BINDINGS V3 ***/
+/**************************************************************************/
+/**************************************************************************/
+#if defined(BUG11) /* make a SEGV */
+
#define AFB_BINDING_VERSION 3
#include <afb/afb-binding.h>
int afbBindingEntry(afb_api_t api)
{
return ((int(*)())(intptr_t)0)();
}
+#endif
+/**************************************************************************/
+#if defined(BUG12) /* no afbBindingV3 nor afbBindingV3entry */
+
+#define AFB_BINDING_VERSION 0
+#include <afb/afb-binding.h>
+struct afb_api_x3 *afbBindingV3root;
+
+#endif
+/**************************************************************************/
+#if defined(BUG13) /* no afbBindingV3root nor afbBindingV3entry */
+
+#define AFB_BINDING_VERSION 0
+#include <afb/afb-binding.h>
+const struct afb_binding_v3 afbBindingV3;
+int afbBindingV3entry(struct afb_api_x3 *rootapi) { return 0; }
+
+#endif
+/**************************************************************************/
+#if defined(BUG14) /* no api name */
+
+#define AFB_BINDING_VERSION 3
+#include <afb/afb-binding.h>
+
+const struct afb_binding_v3 afbBindingV3;
+
+#endif
+/**************************************************************************/
+#if defined(BUG15) /* bad api name */
+
+#define AFB_BINDING_VERSION 3
+#include <afb/afb-binding.h>
+
+const struct afb_binding_v3 afbBindingV3 = {
+ .api = "bug 15"
+};
+
+#endif
+/**************************************************************************/
+#if defined(BUG16) /* both entry and preinit */
+
+#define AFB_BINDING_VERSION 3
+#include <afb/afb-binding.h>
+
+int afbBindingV3entry(struct afb_api_x3 *rootapi) { return 0; }
+const struct afb_binding_v3 afbBindingV3 = {
+ .api = "bug16",
+ .preinit = afbBindingV3entry
+};
+
+#endif
+/**************************************************************************/
+#if defined(BUG17) /* entry fails */
+
+#define AFB_BINDING_VERSION 3
+#include <afb/afb-binding.h>
+
+int afbBindingV3entry(struct afb_api_x3 *rootapi) { errno = EAGAIN; return -1; }
+#endif
+/**************************************************************************/
+#if defined(BUG18) /* preinit fails */
+
+#define AFB_BINDING_VERSION 3
+#include <afb/afb-binding.h>
+
+const struct afb_binding_v3 afbBindingV3 = {
+ .api = "bug18",
+ .preinit = (void*)err
+};
+
+#endif
+/**************************************************************************/
+#if defined(BUG19) /* preinit SEGV */
+
+#define AFB_BINDING_VERSION 3
+#include <afb/afb-binding.h>
+
+const struct afb_binding_v3 afbBindingV3 = {
+ .api = "bug19",
+ .preinit = (void*)bug
+};
+
+#endif
+/**************************************************************************/
+#if defined(BUG20) /* init fails */
+
+#define AFB_BINDING_VERSION 3
+#include <afb/afb-binding.h>
+
+const struct afb_binding_v3 afbBindingV3 = {
+ .api = "bug20",
+ .init = (void*)err
+};
+
+#endif
+/**************************************************************************/
+#if defined(BUG21) /* init SEGV */
+
+#define AFB_BINDING_VERSION 3
+#include <afb/afb-binding.h>
+
+const struct afb_binding_v3 afbBindingV3 = {
+ .api = "bug21",
+ .init = (void*)bug,
+ .provide_class = "a b c",
+ .require_class = "x y z",
+ .require_api = "bug4 bug5",
+};
+
+#endif
+/**************************************************************************/
diff --git a/coverage/bin/fake/monitoring b/coverage/bin/fake/monitoring
new file mode 120000
index 00000000..8cdac10f
--- /dev/null
+++ b/coverage/bin/fake/monitoring
@@ -0,0 +1 @@
+../../../test/monitoring \ No newline at end of file
diff --git a/coverage/bin/loc.txt b/coverage/bin/loc.txt
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/coverage/bin/loc.txt
diff --git a/coverage/bin/locales/en/loc.txt b/coverage/bin/locales/en/loc.txt
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/coverage/bin/locales/en/loc.txt
diff --git a/coverage/bin/locales/fr-FR/loc.txt b/coverage/bin/locales/fr-FR/loc.txt
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/coverage/bin/locales/fr-FR/loc.txt
diff --git a/coverage/bin/locales/fr/loc.txt b/coverage/bin/locales/fr/loc.txt
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/coverage/bin/locales/fr/loc.txt
diff --git a/coverage/bin/locales/jp/loc.txt b/coverage/bin/locales/jp/loc.txt
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/coverage/bin/locales/jp/loc.txt
diff --git a/coverage/ldpath/weak/bug.so b/coverage/ldpath/weak/bug.so
deleted file mode 120000
index 01e7c27a..00000000
--- a/coverage/ldpath/weak/bug.so
+++ /dev/null
@@ -1 +0,0 @@
-sub/bug.so \ No newline at end of file
diff --git a/coverage/ldpath/weak/bugs b/coverage/ldpath/weak/bugs
new file mode 120000
index 00000000..6ed8e22c
--- /dev/null
+++ b/coverage/ldpath/weak/bugs
@@ -0,0 +1 @@
+../../bin/bugs \ No newline at end of file
diff --git a/coverage/scripts/00-trace.sh b/coverage/scripts/00-trace.sh
index 34a19bb0..27edc5b1 100755
--- a/coverage/scripts/00-trace.sh
+++ b/coverage/scripts/00-trace.sh
@@ -1,4 +1,7 @@
#!/bin/sh
-$R/bin/afb-client -k $WSURL monitor trace '{"add":{"api":"*","request":"*","event":"*","session":"*","global":"*"}}' &
-
+$R/bin/afb-client -k $WSURL <<EOC &
+monitor trace {"add":{"tag":"fun","api":"*","request":"*","event":"*","session":"*","global":"*"}}
+monitor trace {"add":{"tag":"T","api":"*","request":"*","event":"*","session":"*","global":"*"}}
+monitor trace {"drop":{"tag":"fun"}}
+EOC
diff --git a/coverage/scripts/01-http.sh b/coverage/scripts/01-http.sh
index 191318c0..9ffd640f 100755
--- a/coverage/scripts/01-http.sh
+++ b/coverage/scripts/01-http.sh
@@ -1,17 +1,29 @@
#!/bin/sh
-curl $URL/index.html
-curl $URL/marrus-orthocanna.jpg
-curl $URL/test.js
-curl $URL/icons/marrus-orthocanna.jpg
+curl -s -o /dev/null $URL/index.html
+curl -s -o /dev/null $URL/marrus-orthocanna.jpg
+curl -s -o /dev/null $URL/test.js
+curl -s -o /dev/null $URL/icons/marrus-orthocanna.jpg
-curl $URL/fake-file.html
+curl -s -o /dev/null $URL/fake-file.html
-curl "$URL/api/salut/ping?arg1=null&arg1=%22a+string%22"
-curl "$URL/api/hello/ping" \
+curl -s "$URL/api/salut/ping?arg1=null&arg1=%22a+string%22"
+curl -s "$URL/api/hello/ping" \
-F image=@$R/www/marrus-orthocanna.jpg \
-F name=test
-curl -X POST "$URL/api/hello/ping" \
+curl -s -X POST "$URL/api/hello/ping" \
--header 'content-type: application/json' \
--data-binary '[null,3,{"hello":false,"salut":4.5},true]'
+
+curl -s "$URL/api/hello/get?name=something&something=nothing"
+
+curl -s -F name=file -F file=@$R/www/marrus-orthocanna.jpg "$URL/api/hello/get"
+
+curl -s -X HEAD -o /dev/null $URL/index.html
+#curl -s -X CONNECT -o /dev/null $URL/index.html
+curl -s -X DELETE -o /dev/null $URL/index.html
+curl -s -X OPTIONS -o /dev/null $URL/index.html
+curl -s -X PATCH -o /dev/null $URL/index.html
+curl -s -X PUT -o /dev/null $URL/index.html
+curl -s -X TRACE -o /dev/null $URL/index.html
diff --git a/coverage/scripts/02-hello.sh b/coverage/scripts/02-hello.sh
index fe9040c2..9e3a9b08 100755
--- a/coverage/scripts/02-hello.sh
+++ b/coverage/scripts/02-hello.sh
@@ -48,5 +48,49 @@ hello setctx "some-text-2"
hello getctx
hello info
hello verbose {"level":2,"message":"hello"}
+hello eventloop
+hello dbus false
+hello dbus true
+hello reply-count 0
+hello reply-count 2
+hello get null
+hello get {"name":"toto"}
+hello get {"name":"toto","toto":5}
+hello ref null
+hello rootdir null
+hello eventadd {"tag":"EVENT","name":"EVENT"}
+hello locale {"file":"loc.txt","lang":"ru,de,jp-JP,fr"}
+hello locale "loc.txt"
+hello locale "i don't exist"
+hello api {"action":"create","api":"_extra_"}
+hello api {"action":"addverb","api":"_extra_","verb":"ping"}
+hello api {"action":"seal","api":"_extra_"}
+hello api {"action":"addverb","api":"_extra_","verb":"ping"}
+hello api {"action":"destroy","api":"_extra_"}
+_extra_ ping2 {"a":true}
+_extra_ ping3 {"b":false}
+_extra_ ping {"c":[1,2,3]}
+hello api {"action":"create","api":"extra"}
+extra api {"action":"addverb","verb":"blablabla"}
+extra api {"action":"addverb","verb":"ping"}
+extra api {"action":"addverb","verb":"ping2"}
+extra api {"action":"addverb","verb":"ping3"}
+extra api {"action":"addverb","verb":"q*"}
+extra api {"action":"delverb","verb":"blablabla"}
+extra api {"action":"addhandler","pattern":"*","closure":"*"}
+extra api {"action":"addhandler","pattern":"hello/*","closure":"hello/*"}
+extra call {"api":"hello","verb":"eventsub","args":{"tag":"EVENT"}}
+hello eventpush {"tag":"EVENT","data":[1,2,"hello"]}
+hello api {"action":"delhandler","api":"extra","pattern":"hello/*"}
+hello eventpush {"tag":"EVENT","data":[1,2,"hello"]}
+extra ping2 {"a":true}
+extra ping3 {"b":false}
+extra ping {"c":[1,2,3]}
+extra query {"c":[1,2,3]}
+extra blablabla {"c":[1,2,3]}
+extra api {"action":"addverb","verb":"ping"}
+extra ping {"c":[1,2,3]}
+hello api {"action":"destroy","api":"extra"}
+extra ping {"c":[1,2,3]}
EOC
diff --git a/coverage/scripts/03-x-hello.sh b/coverage/scripts/03-auto-ws.sh
index 9d3726e4..9d3726e4 100755
--- a/coverage/scripts/03-x-hello.sh
+++ b/coverage/scripts/03-auto-ws.sh
diff --git a/coverage/scripts/06-auto-so.sh b/coverage/scripts/06-auto-so.sh
new file mode 100755
index 00000000..36214ee0
--- /dev/null
+++ b/coverage/scripts/06-auto-so.sh
@@ -0,0 +1,35 @@
+#!/bin/sh
+
+$R/bin/afb-client -s -e $WSURL <<EOC
+salam ping true
+x-HELLO PING false
+salam pIngNull true
+salam PingBug true
+salam PiNgJsOn {"well":"formed","json":[1,2,3,4.5,true,false,null,"oups"]}
+salam subcall {"api":"salam","verb":"pingjson","args":[{"key1":"value1"}]}
+salam subcall {"api":"salam","verb":"subcall","args":{"api":"salam","verb":"pingjson","args":[{"key1":"value1"}]}}
+salam subcallsync {"api":"salam","verb":"pingjson","args":[{"key1":"value1"}]}
+salam subcallsync {"api":"salam","verb":"subcall","args":{"api":"salam","verb":"pingjson","args":[{"key1":"value1"}]}}
+salam subcall {"api":"salam","verb":"subcallsync","args":{"api":"salam","verb":"pingjson","args":[{"key1":"value1"}]}}
+salam subcallsync {"api":"salam","verb":"subcallsync","args":{"api":"salam","verb":"pingjson","args":[{"key1":"value1"}]}}
+salam eventadd {"tag":"ev1","name":"event-A"}
+salam eventadd {"tag":"ev2","name":"event-B"}
+salam eventpush {"tag":"ev1","data":[1,2,"salam"]}
+salam eventpush {"tag":"ev2","data":{"item":0}}
+salam eventsub {"tag":"ev2"}
+salam eventpush {"tag":"ev1","data":[1,2,"salam"]}
+salam eventpush {"tag":"ev2","data":{"item":0}}
+salam eventsub {"tag":"ev1"}
+salam subcall {"api":"salam","verb":"eventpush","args":{"tag":"ev1","data":[1,2,"salam"]}}
+salam subcall {"api":"salam","verb":"eventpush","args":{"tag":"ev2","data":{"item":0}}}
+salam subcallsync {"api":"salam","verb":"eventpush","args":{"tag":"ev1","data":[1,2,"salam"]}}
+salam subcallsync {"api":"salam","verb":"eventpush","args":{"tag":"ev2","data":{"item":0}}}
+salam eventunsub {"tag":"ev2"}
+salam eventpush {"tag":"ev1","data":[1,2,"salam"]}
+salam eventpush {"tag":"ev2","data":{"item":0}}
+salam eventdel {"tag":"ev1"}
+salam eventpush {"tag":"ev1","data":[1,2,"salam"]}
+salam eventpush {"tag":"ev2","data":{"item":0}}
+salam eventdel {"tag":"ev2"}
+EOC
+
diff --git a/coverage/scripts/run-test.sh b/coverage/scripts/run-test.sh
index 34c2d303..bac4da5e 100755
--- a/coverage/scripts/run-test.sh
+++ b/coverage/scripts/run-test.sh
@@ -3,18 +3,72 @@
export R=$(realpath $(dirname $0)/..)
export PATH="$R/bin:$R/scripts:$PATH"
-$R/bin/afb-daemon-cov --help > /dev/null
+cd $R/bin
-$R/bin/afb-daemon-cov --version > /dev/null
+lcov -c -i -d $R/bin -o $R/lcov-out.info
-$R/bin/afb-daemon-cov --fake-option > /dev/null
+mk() {
+ echo
+ echo "*******************************************************************"
+ echo "** $*"
+ echo "*******************************************************************"
+ lcov -c -i -d $R/bin -o $R/fake.info
+ "$@"
+ lcov -c -d $R/bin -o $R/tmp.info
+ mv $R/lcov-out.info $R/previous.info
+ lcov -a $R/tmp.info -a $R/previous.info -o $R/lcov-out.info
+ rm $R/previous.info $R/fake.info $R/tmp.info
+}
+mkdir /tmp/ldpaths
+export AFB_LDPATHS=/tmp/ldpaths
+export AFB_TRACEAPI=no
+
+##########################################################
+# test to check options
+##########################################################
+mk $R/bin/afb-daemon-cov --help
+
+mk $R/bin/afb-daemon-cov --version
+
+mk $R/bin/afb-daemon-cov --no-httpd --fake-option
+
+mk $R/bin/afb-daemon-cov --daemon --session-max
+
+mk $R/bin/afb-daemon-cov --ws-client fake --session-max toto
+
+mk $R/bin/afb-daemon-cov --foreground --port -55
+
+mk $R/bin/afb-daemon-cov --foreground --port 9999999
+
+mk $R/bin/afb-daemon-cov --no-ldpath --traceapi fake
+
+mk $R/bin/afb-daemon-cov --traceditf all --tracesvc all --log error,alarm
+
+LISTEN_FDNAMES=toto,demat LISTEN_FDS=5 mk $R/bin/afb-daemon-cov --no-ldpath --binding $R/bin/demat.so --ws-server sd:demat --call "demat/exit:0"
+
+mk $R/bin/afb-daemon-cov --weak-ldpaths $R/ldpath/weak --binding $R/bin/demat.so --ws-server sd:demat --call "demat/exit:0"
+
+##########################################################
+# test of the bench
+##########################################################
+mk $R/bin/test-apiset
+
+mk $R/bin/test-session
+
+mk $R/bin/test-wrap-json
+
+##########################################################
+# true life test
+##########################################################
+mk \
valgrind \
--log-file=$R/valgrind.out \
--trace-children=no \
--track-fds=yes \
--leak-check=full \
- --show-leak-kinds=all \
+ --show-leak-kinds=all \
+ --num-callers=50 \
$R/bin/afb-daemon-cov \
--verbose \
--verbose \
@@ -29,6 +83,7 @@ $R/bin/afb-daemon-cov \
--log error,warning,notice,info,debug,critical,alert-error,warning,notice,info,debug,critical,alert+error,warning,notice,info,debug,critical,alert \
--foreground \
--name binder-cov \
+ --port 8888 \
--roothttp $R/www \
--rootbase /opx \
--rootapi /api \
@@ -41,7 +96,6 @@ $R/bin/afb-daemon-cov \
--rootdir . \
--ldpaths $R/ldpath/strong \
--binding $R/bin/demat.so \
- --weak-ldpaths $R/ldpath/weak \
--auto-api $R/apis/auto \
--token HELLO \
--random-token \
@@ -50,6 +104,7 @@ $R/bin/afb-daemon-cov \
--traceapi all \
--traceses all \
--traceevt all \
+ --monitoring \
--call demat/ping:true \
--ws-server unix:$R/apis/ws/hello \
--ws-server unix:$R/apis/ws/salut \