From 4e45f3adc25339d51b05281710c046591be9dd6e Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Sat, 13 Nov 2021 11:40:33 +1100 Subject: [PATCH] oceani-tests: add valgrind testing for 'special' tests Make sure we clean up properly, even after a fatal error - just because. Signed-off-by: NeilBrown --- csrc/oceani-tests.mdc | 14 ++++++++++++++ csrc/oceani.mdc | 8 ++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/csrc/oceani-tests.mdc b/csrc/oceani-tests.mdc index fbc5a2f..4dceab4 100644 --- a/csrc/oceani-tests.mdc +++ b/csrc/oceani-tests.mdc @@ -94,6 +94,7 @@ arguments separated from the name by commas. For each test, there is a section echo "valgrind found memory in use at exit"; cat .tmp.valg ; exit 1 ; fi; \ echo " passed"; \ done + ## valgrind test code @[ -n "$$SKIP_COVERAGE_CHECK" ] || awk '/NOTEST/ { next } /^ *[1-9]/ {ran+=1} /^ *###/ {skip+=1} \ END {printf "coverage: %6.2f%%\n", ran * 100 / (ran + skip); \ if (ran < (ran + skip) *0.968) exit(1) }' \ @@ -1057,6 +1058,19 @@ command list possible. echo "passed"; \ ./coverage_oceani $${1+"$$@"} > /dev/null 2>&1 ;\ done || true +###### valgrind test code + @[ -n "$$SKIP_VALGRIND" ] || for t in $(oceani_special_tests); do\ + echo -n "Valgrind $$t.. "; \ + i="$$IFS"; IFS=,; set $$t; IFS="$$i"; shift ;\ + if valgrind --error-exitcode=42 --log-file=.tmp.valg ./oceani $${1+"$$@"} > .tmp.have 2>&1 ;\ + [ $$? -eq 42 ]; then \ + echo "FAILED"; cat .tmp.valg; exit 1; fi ; \ + if grep 'LEAK SUMMARY' .tmp.valg > /dev/null; then \ + echo "valgrind found LEAKS"; cat .tmp.valg ; exit 1 ; fi; \ + if grep 'in use at exit [1-9]' .tmp.valg > /dev/null; then \ + echo "valgrind found memory in use at exit"; cat .tmp.valg ; exit 1 ; fi; \ + echo " passed"; \ + done ###### test list oceani_special_tests += "cmd" diff --git a/csrc/oceani.mdc b/csrc/oceani.mdc index 0334af1..96fe6c6 100644 --- a/csrc/oceani.mdc +++ b/csrc/oceani.mdc @@ -176,7 +176,7 @@ structures can be used. int fd; int len; char *file; - struct section *s, *ss; + struct section *s = NULL, *ss; char *section = NULL; struct parse_context context = { .config = { @@ -231,13 +231,13 @@ structures can be used. if (!ss) { fprintf(stderr, "oceani: cannot find section %s\n", section); - exit(1); + goto cleanup; } } else ss = s; // NOTEST if (!ss->code) { fprintf(stderr, "oceani: no code found in requested section\n"); // NOTEST - exit(1); // NOTEST + goto cleanup; // NOTEST } parse_oceani(ss->code, &context.config, dotrace ? stderr : NULL); @@ -254,7 +254,7 @@ structures can be used. } if (doexec && !context.parse_error) interp_main(&context, argc - optind, argv + optind); - + cleanup: while (s) { struct section *t = s->next; code_free(s->code); -- 2.43.0