From: Michał Kępień Date: Thu, 28 Jun 2018 11:38:39 +0000 (+0200) Subject: Implement a "read-only" version of nextpart() X-Git-Tag: v9.11.15~27^2~2 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=609c7dc79e8df61e486e974bd506067de5e72b29;p=thirdparty%2Fbind9.git Implement a "read-only" version of nextpart() The system test helper function nextpart() always updates the "lines read so far" marker (".prev") when it is called, which somewhat limits its flexibility. Add two new helper functions, nextpartpeek() and nextpartreset(), so that certain parts of log files can be easily examined more than once. Add some documentation to help understand the purpose of each function in the nextpart*() family. (cherry picked from commit facb68b22e36b2959ccbc1c3b1680c1814988927) --- diff --git a/bin/tests/system/conf.sh.in b/bin/tests/system/conf.sh.in index 6d196b209ed..9b677dfb859 100644 --- a/bin/tests/system/conf.sh.in +++ b/bin/tests/system/conf.sh.in @@ -351,13 +351,78 @@ keyfile_to_key_id() { echo "$1" | sed "s/.*+0\{0,4\}//" } -# nextpart: read everything that's been appended to a file since the -# last time 'nextpart' was called. -nextpart () { - [ -f $1.prev ] || echo "0" > $1.prev +# nextpart*() - functions for reading files incrementally +# +# These functions aim to facilitate looking for (or waiting for) +# messages which may be logged more than once throughout the lifetime of +# a given named instance by outputting just the part of the file which +# has been appended since the last time we read it. +# +# Calling some of these functions causes temporary *.prev files to be +# created that need to be cleaned up manually (usually by a given system +# test's clean.sh script). +# +# Note that unlike other nextpart*() functions, nextpartread() is not +# meant to be directly used in system tests; its sole purpose is to +# reduce code duplication below. +# +# A quick usage example: +# +# $ echo line1 > named.log +# $ echo line2 >> named.log +# $ nextpart named.log +# line1 +# line2 +# $ echo line3 >> named.log +# $ nextpart named.log +# line3 +# $ nextpart named.log +# $ echo line4 >> named.log +# $ nextpartpeek named.log +# line4 +# $ nextpartpeek named.log +# line4 +# $ nextpartreset named.log +# $ nextpartpeek named.log +# line1 +# line2 +# line3 +# line4 +# $ nextpart named.log +# line1 +# line2 +# line3 +# line4 +# $ nextpart named.log +# $ + +# nextpartreset: reset the marker used by nextpart() and nextpartpeek() +# so that it points to the start of the given file +nextpartreset() { + echo "0" > $1.prev +} + +# nextpartread: read everything that's been appended to a file since the +# last time nextpart() was called and print it to stdout, print the +# total number of lines read from that file so far to stderr +nextpartread() { + [ -f $1.prev ] || nextpartreset $1 prev=`cat $1.prev` awk "NR > $prev "'{ print } - END { print NR > "/dev/stderr" }' $1 2> $1.prev + END { print NR > "/dev/stderr" }' $1 +} + +# nextpart: read everything that's been appended to a file since the +# last time nextpart() was called +nextpart() { + nextpartread $1 2> $1.prev.tmp + mv $1.prev.tmp $1.prev +} + +# nextpartpeek: read everything that's been appended to a file since the +# last time nextpart() was called +nextpartpeek() { + nextpartread $1 2> /dev/null } # _retry: keep running a command until it succeeds, up to $1 times, with diff --git a/bin/tests/system/conf.sh.win32 b/bin/tests/system/conf.sh.win32 index dcee94f2c7d..9f2184e015e 100644 --- a/bin/tests/system/conf.sh.win32 +++ b/bin/tests/system/conf.sh.win32 @@ -320,13 +320,78 @@ keyfile_to_key_id() { echo "$1" | sed "s/.*+0\{0,4\}//" } -# nextpart: read everything that's been appended to a file since the -# last time 'nextpart' was called. -nextpart () { - [ -f $1.prev ] || echo "0" > $1.prev +# nextpart*() - functions for reading files incrementally +# +# These functions aim to facilitate looking for (or waiting for) +# messages which may be logged more than once throughout the lifetime of +# a given named instance by outputting just the part of the file which +# has been appended since the last time we read it. +# +# Calling some of these functions causes temporary *.prev files to be +# created that need to be cleaned up manually (usually by a given system +# test's clean.sh script). +# +# Note that unlike other nextpart*() functions, nextpartread() is not +# meant to be directly used in system tests; its sole purpose is to +# reduce code duplication below. +# +# A quick usage example: +# +# $ echo line1 > named.log +# $ echo line2 >> named.log +# $ nextpart named.log +# line1 +# line2 +# $ echo line3 >> named.log +# $ nextpart named.log +# line3 +# $ nextpart named.log +# $ echo line4 >> named.log +# $ nextpartpeek named.log +# line4 +# $ nextpartpeek named.log +# line4 +# $ nextpartreset named.log +# $ nextpartpeek named.log +# line1 +# line2 +# line3 +# line4 +# $ nextpart named.log +# line1 +# line2 +# line3 +# line4 +# $ nextpart named.log +# $ + +# nextpartreset: reset the marker used by nextpart() and nextpartpeek() +# so that it points to the start of the given file +nextpartreset() { + echo "0" > $1.prev +} + +# nextpartread: read everything that's been appended to a file since the +# last time 'nextpart' was called and print it to stdout, print the +# total number of lines read from that file so far to stderr +nextpartread() { + [ -f $1.prev ] || nextpartreset $1 prev=`cat $1.prev` awk "NR > $prev "'{ print } - END { print NR > "/dev/stderr" }' $1 2> $1.prev + END { print NR > "/dev/stderr" }' $1 +} + +# nextpart: read everything that's been appended to a file since the +# last time 'nextpart' was called +nextpart() { + nextpartread $1 2> $1.prev.tmp + mv $1.prev.tmp $1.prev +} + +# nextpartpeek: read everything that's been appended to a file since the +# last time 'nextpart' was called +nextpartpeek() { + nextpartread $1 2> /dev/null } # retry: keep running a command until it succeeds, up to $1 times, with