Skip to content

Commit

Permalink
update-mocks: move mock generation into tools/, fix and generalize.
Browse files Browse the repository at this point in the history
update-mocks was broken, since it assumed the daemon/ directory.

We now use "make" directly to build the test file and harvest errors,
and are more robust if it simply doesn't compile (ie. fails, but no
linker errors).

Signed-off-by: Rusty Russell <[email protected]>
  • Loading branch information
rustyrussell authored and cdecker committed Sep 3, 2017
1 parent 7e13e9e commit 8a829ba
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 14 deletions.
14 changes: 1 addition & 13 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -281,19 +281,7 @@ clean: wire-clean
find . -name '*gcno' -delete

update-mocks/%: %
@set -e; BASE=/tmp/mocktmp.$$$$.`echo $* | tr / _`; trap "rm -f $$BASE.*" EXIT; \
START=`fgrep -n '/* AUTOGENERATED MOCKS START */' $< | cut -d: -f1`;\
END=`fgrep -n '/* AUTOGENERATED MOCKS END */' $< | cut -d: -f1`; \
if [ -n "$$START" ]; then \
echo $<: ; \
head -n $$START $< > $$BASE.new; \
(cat $$BASE.new; tail -n +$$END $<) > $$BASE.test.c; \
if ! $(CC) $(CFLAGS) $$BASE.test.c -o $$BASE.out $(HELPER_OBJS) $(CCAN_OBJS) $(LDLIBS) 2>$$BASE.err; then \
test/scripts/mockup.sh < $$BASE.err >> $$BASE.new; \
sed -n 's,.*Generated stub for \(.*\) .*,\t\1,p' < $$BASE.new; \
fi; \
tail -n +$$END $< >> $$BASE.new; mv $$BASE.new $<; \
fi
@tools/update-mocks.sh "$*"

unittest/%: %
$(VALGRIND) $(VALGRIND_TEST_ARGS) $*
Expand Down
2 changes: 1 addition & 1 deletion test/scripts/mockup.sh → tools/mockup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ if [ $# -eq 0 ]; then
fi

for SYMBOL; do
WHERE=$(grep -nH "^[a-z0-9_ ]* [*]*$SYMBOL(" daemon/*.h)
WHERE=$(grep -nH "^[a-z0-9_ ]* [*]*$SYMBOL(" */*.h )
if [ x"$WHERE" != x ]; then
STUB='\n{ fprintf(stderr, "'$SYMBOL' called!\\n"); abort(); }'
else
Expand Down
39 changes: 39 additions & 0 deletions tools/update-mocks.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#! /bin/sh
# Script to rewrite the autogenerated mocks in a unit test between
# /* AUTOGENERATED MOCKS START */ and /* AUTOGENERATED MOCKS END */
# based on link failures.

set -e
FILE="$1"

BASE=/tmp/mocktmp.$$.`echo $@ | tr / _`
trap "mv $BASE.old $FILE; rm -f $BASE.*" EXIT

START=`fgrep -n '/* AUTOGENERATED MOCKS START */' $FILE | cut -d: -f1`
END=`fgrep -n '/* AUTOGENERATED MOCKS END */' $FILE | cut -d: -f1`

if [ -n "$START" ]; then
mv $FILE $BASE.old
echo $FILE:
head -n $START $BASE.old > $FILE
tail -n +$END $BASE.old >> $FILE
# Try to make binary.
if ! make `echo $FILE | sed 's/.c$//'` 2> $BASE.err >/dev/null; then
tools/mockup.sh < $BASE.err >> $BASE.stubs
# If there are no link errors, maybe compile fail for other reason?
if ! fgrep -q 'Generated stub for' $BASE.stubs; then
cat $BASE.err
exit 1
fi
sed -n 's,.*Generated stub for \(.*\) .*,\t\1,p' < $BASE.stubs
head -n $START $BASE.old > $FILE
cat $BASE.stubs >> $FILE
tail -n +$END $BASE.old >> $FILE
else
echo "...build succeeded without stubs"
fi
fi

# All good.
rm -f $BASE.*
trap "" EXIT

0 comments on commit 8a829ba

Please sign in to comment.