On Fri, 05/22 16:17, John Snow wrote: > Like a makefile, try to skip tests if we know they have already been > executed using the current set of external dependencies. > > If a user passes the -ts option to ./check, if a test or its output > or its dependencies (qemu, qemu-nbd, qemu-io, qemu-img, > socket-scm-helper) have been modified, the test will be skipped. > > This is primarily to speed up running bisectability tests for larger > series where each interim patch may or may not change all of the > dependencies, so some tests can be skipped. > > Signed-off-by: John Snow <js...@redhat.com>
Reviewed-by: Fam Zheng <f...@redhat.com> > --- > tests/qemu-iotests/check | 56 > ++++++++++++++++++++++++++++++++++++++++++++++- > tests/qemu-iotests/common | 6 +++++ > 2 files changed, 61 insertions(+), 1 deletion(-) > > diff --git a/tests/qemu-iotests/check b/tests/qemu-iotests/check > index baeae80..0db40e2 100755 > --- a/tests/qemu-iotests/check > +++ b/tests/qemu-iotests/check > @@ -141,6 +141,51 @@ _timestamp() > echo -n " [$now]" > } > > +_okfile() > +{ > + echo "ts/${IMGPROTO}/${IMGFMT}/${1}.ok" > +} > + > +# _hasdep <seq> <dep> > +_hasdep() > +{ > + grep -q "^${1}.*${2}" "${source_iotests}/group" > +} > + > +# _skippable <seq> > +_skippable() > +{ > + tsfile=$(_okfile "${1}") > + deps=(${QEMU_IMG} \ > + ${QEMU_IO} \ > + "${source_iotests}/${1}" \ > + "${source_iotests}/${1}.out" \ > + "${source_iotests}/common" \ > + "${source_iotests}/common.rc" \ > + "${source_iotests}/common.env" \ > + "${source_iotests}/common.config") > + > + if _hasdep "${1}" "scm"; then > + deps+=("${SOCKET_SCM_HELPER}") > + fi > + > + if _hasdep "${1}" "nbd" || [ "$IMGPROTO" = "nbd" ]; then > + deps+=("${QEMU_NBD}") > + fi > + > + if _hasdep "${1}" "qemu"; then > + deps+=("${QEMU}") > + fi > + > + if [ ! -e "${tsfile}" ]; then return 1; fi > + for dep in "${deps[@]}"; do > + if [ "${tsfile}" -ot "${dep}" ]; then return 1; fi > + done > + > + # Looks skippable, .ok file is newer than all external dependencies. > + return 0 > +} > + > _wrapup() > { > # for hangcheck ... > @@ -268,6 +313,10 @@ do > echo " - expunged" > rm -f $seq.out.bad > echo "/^$seq\$/d" >>$tmp.expunged > + > + elif [ "${ts_skip}" == "true" ] && _skippable "${seq}"; then > + echo " [skip] (Results are recent)" > + > elif [ ! -f "$source_iotests/$seq" ] > then > echo " - no such test?" > @@ -275,7 +324,8 @@ do > else > # really going to try and run this one > # > - rm -f $seq.out.bad > + tsfile="$(_okfile ${seq})" > + rm -f $seq.out.bad "${tsfile}" > lasttime=`sed -n -e "/^$seq /s/.* //p" <check.time` > if [ "X$lasttime" != X ]; then > echo -n " ${lasttime}s ..." > @@ -340,6 +390,10 @@ do > then > : > else > + if [ ! -d "$(dirname ${tsfile})" ]; then > + mkdir -p "$(dirname ${tsfile})" > + fi > + touch "${tsfile}" > echo "$seq `expr $stop - $start`" >>$tmp.time > fi > else > diff --git a/tests/qemu-iotests/common b/tests/qemu-iotests/common > index c4d0742..b3d869e 100644 > --- a/tests/qemu-iotests/common > +++ b/tests/qemu-iotests/common > @@ -161,6 +161,8 @@ check options > -T output timestamps > -r randomize test order > -c mode cache mode > + -ts timestamp skip: skip tests when already ran and > + no dependencies have changed on disk. > > testlist options > -g group[,group...] include tests from these groups > @@ -319,6 +321,10 @@ testlist options > xpand=false > ;; > > + -ts) > + ts_skip=true > + xpand=false > + ;; > -v) > verbose=true > xpand=false > -- > 2.1.0 >