Sure, no problem. Thank you. Rob
From: "Sebastian Benoit" <be...@openbsd.org> To: "Rob Pierce" <r...@2keys.ca> Cc: "tech" <tech@openbsd.org> Sent: Thursday, July 13, 2017 6:12:14 PM Subject: Re: add simple ifstated regression test script BQ_BEGIN Hi, i wanted to commit this, but saw that it does not have a licence yet. Can i add /usr/share/misc/license.template with your name and email-Adress? /Benno Rob Pierce(r...@2keys.ca) on 2017.07.06 13:12:26 -0400: > On Sun, Jul 02, 2017 at 06:29:07PM +0200, Sebastian Benoit wrote: > > Rob Pierce(r...@2keys.ca) on 2017.07.02 12:06:25 -0400: > > > I am currently using this regression script for basic ifstated sanity > > > testing. > > > > > > Still a work in progress. Requesting commit for safe keeping. > > > > > > Hi, > > > > this should go into /usr/src/regress/usr.sbin/ifstated > > (which does not esist yet). > > > > Also, it should hook into the regress framework (bsd.regress.mk(5)). > > > > As it needs some network configuration, maybe it should be similar to > > relayd regress tests. > > > > Happy to work with you on that. > > > > /B. > > I have updated the ifstated regression scripts based on your feedback. > > I also added a script to test drive the state machine. > > Both should be more systematic in coverage, but hopefully it is a good start. > > Regards, > > Rob > > Index: regress/usr.sbin/ifstated/Makefile > =================================================================== > RCS file: regress/usr.sbin/ifstated/Makefile > diff -N regress/usr.sbin/ifstated/Makefile > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ regress/usr.sbin/ifstated/Makefile 6 Jul 2017 16:55:57 -0000 > @@ -0,0 +1,13 @@ > +# $OpenBSD$ > + > +# Regress tests for ifstated > + > +REGRESS_TARGETS = run-regress-statemachine run-regress-ifstated > + > +run-regress-statemachine: > + sh ${.CURDIR}/statemachine > + > +run-regress-ifstated: > + sh ${.CURDIR}/ifstated > + > +.include <bsd.regress.mk> > > Index: regress/usr.sbin/ifstated/ifstated > =================================================================== > RCS file: regress/usr.sbin/ifstated/ifstated > diff -N regress/usr.sbin/ifstated/ifstated > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ regress/usr.sbin/ifstated/ifstated 6 Jul 2017 16:55:57 -0000 > @@ -0,0 +1,148 @@ > +# $OpenBSD$ > + > +# Basic ifstated regression script to test interface changes. > + > +# Golbal variables > +VHIDA=252 > +VHIDB=253 > +PREFIX=172.16.0 > +DEMOTE=ifconfig > +PROMOTE=ifconfig > +EVERY=5 > +SLEEP=10 > + > +cleanup() { > + ifconfig carp${VHIDA} destroy > /dev/null 2>&1 > + ifconfig carp${VHIDB} destroy > /dev/null 2>&1 > + rm working/ifstated.conf >/dev/null 2>&1 > + rm working/ifstated.log >/dev/null 2>&1 > + rm working/output.test >/dev/null 2>&1 > + rm working/output.new >/dev/null 2>&1 > + rm working/nohup.out >/dev/null 2>&1 > + rmdir working >/dev/null 2>&1 > +} > + > +fail() { > + echo FAILED > + cleanup > + exit 1 > +} > + > +skip() { > + echo SKIPPED > + cleanup > + exit 0 > +} > + > +trap 'skip' INT > + > +# look for a suitable physical interface for carp > +NIC="$(netstat -rn -finet | grep ^default | awk '{ print $8 }')" > +STATUS="$(ifconfig | grep -A5 ^${NIC} | grep status: | awk '{ print $2 }')" > + > +if [ "$STATUS" != "active" ] > +then > + echo "No suitable physical interface found." > + echo SKIPPED > + exit 0 > +fi > + > +if [ "$(pgrep ifstated)" ] > +then > + echo "The ifstated daemon is already running." > + echo SKIPPED > + exit 0 > +fi > + > +for interface in carp${VHIDA} carp${VHIDB} > +do > + ifconfig ${interface} > /dev/null 2>&1 > + if [ $? -eq 0 ] > + then > + echo "Interface $interface already exists." > + echo SKIPPED > + exit 0 > + fi > +done > + > +mkdir -p working > + > +cat > working/ifstated.conf <<EOF > +# This is a config template for ifstated regression testing > +carp = "carp${VHIDA}.link.up" > +init-state primary > +net = '( "ping -q -c 1 -w 1 ${PREFIX}.${VHIDB} > /dev/null" every ${EVERY})' > +state primary { > + init { > + run "ifconfig" > + } > + if ! \$net > + set-state demoted > + if ! \$carp > + set-state demoted > +} > +state demoted { > + init { > + run "ifconfig" > + } > + if \$net && \$carp > + set-state primary > +} > +EOF > + > +ifconfig carp${VHIDA} inet ${PREFIX}.${VHIDA} netmask 255.255.255.0 > broadcast \ > + ${PREFIX}.255 vhid ${VHIDA} carpdev ${NIC} > +ifconfig carp${VHIDB} inet ${PREFIX}.${VHIDB} netmask 255.255.255.0 > broadcast \ > + ${PREFIX}.255 vhid ${VHIDB} carpdev ${NIC} > + > +# give the carp interface time to come up as MASTER > +sleep 5 > + > +cat > working/output.test <<EOF > +changing state to primary > +changing state to demoted > +changing state to primary > +changing state to demoted > +changing state to primary > +changing state to demoted > +changing state to primary > +changing state to primary > +EOF > + > +(cd working && nohup ifstated -dvf ./ifstated.conf > ifstated.log 2>&1) & > + > +sleep ${SLEEP} > +ifconfig carp${VHIDA} down > +sleep ${SLEEP} > +ifconfig carp${VHIDA} up > +sleep ${SLEEP} > +ifconfig carp${VHIDB} destroy > +sleep ${SLEEP} > +ifconfig carp${VHIDB} inet ${PREFIX}.${VHIDB} netmask 255.255.255.0 > broadcast \ > + ${PREFIX}.255 vhid ${VHIDB} carpdev ${NIC} > +sleep ${SLEEP} > +ifconfig carp${VHIDA} down > +sleep ${SLEEP} > +ifconfig carp${VHIDB} destroy > +sleep ${SLEEP} > +ifconfig carp${VHIDA} up > +sleep ${SLEEP} > +ifconfig carp${VHIDB} inet ${PREFIX}.${VHIDB} netmask 255.255.255.0 > broadcast \ > + ${PREFIX}.255 vhid ${VHIDB} carpdev ${NIC} > +sleep ${SLEEP} > +kill -HUP $(pgrep ifstated) >/dev/null 2>&1 > +sleep ${SLEEP} > + > +grep ^changing working/ifstated.log > working/output.new > + > +kill $(pgrep ifstated) >/dev/null 2>&1 > + > +diff working/output.test working/output.new > +case $? in > +0) echo PASSED > + cleanup > + exit 0 > + ;; > +1) fail > + ;; > +esac > > Index: regress/usr.sbin/ifstated/statemachine > =================================================================== > RCS file: regress/usr.sbin/ifstated/statemachine > diff -N regress/usr.sbin/ifstated/statemachine > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ regress/usr.sbin/ifstated/statemachine 6 Jul 2017 16:55:57 -0000 > @@ -0,0 +1,183 @@ > +# $OpenBSD$ > + > +# Basic ifstated regression script to test the finite state machine. > + > +# > +# NOTE: Increase LSLEEP as required when adding additional test states. > +# > + > +# Golbal variables > +FILE1="truth1.test" > +FILE2="truth2.test" > +EVERY=2 > +SLEEP=5 > +LSLEEP=35 > + > +cleanup() { > + rm working/$FILE1 >/dev/null 2>&1 > + rm working/$FILE2 >/dev/null 2>&1 > + rm working/ifstated.conf >/dev/null 2>&1 > + rm working/ifstated.log >/dev/null 2>&1 > + rm working/output.test >/dev/null 2>&1 > + rm working/output.new >/dev/null 2>&1 > + rm working/nohup.out >/dev/null 2>&1 > + rmdir working >/dev/null 2>&1 > +} > + > +fail() { > + echo FAILED > + cleanup > + exit 1 > +} > + > +skip() { > + echo SKIPPED > + cleanup > + exit 0 > +} > + > +trap 'skip' INT > + > +if [ "$(pgrep ifstated)" ] > +then > + echo "The ifstated daemon is already running." > + echo SKIPPED > + exit 0 > +fi > + > +mkdir -p working > + > +rm -rf working/${FILE1} > +rm -rf working/${FILE2} > + > +cat > working/ifstated.conf <<EOF > +# This is a config template for ifstated regression testing > +init-state one > +true = '( "true" every $EVERY )' > +false = '( "false" every $EVERY )' > +test1 = '( "test -f ${FILE1}" every $EVERY )' > +test2 = '( "test -f ${FILE2}" every $EVERY )' > +state one { > + init { > + run "sleep $SLEEP && ( test -f ${FILE2} || touch ${FILE1} )" > + } > + if \$test1 && ! \$test2 > + set-state two > + if \$test2 > + set-state ninetyeight > +} > +state two { > + init { > + run "sleep $SLEEP && rm ${FILE1}" > + } > + if ! \$test1 > + set-state three > +} > +state three { > + if ( \$false || \$false ) || ( ! \$test1 || \$false ) > + set-state four > +} > +state four { > + if ( \$true && \$true ) && ( ! \$test1 && \$true ) > + set-state five > +} > +state five { > + init { > + run "sleep $SLEEP && touch ${FILE1}" > + } > + if ( \$false || \$true ) && ( ! \$true || \$test1 ) > + set-state six > +} > +state six { > + init { > + run "sleep $SLEEP && touch ${FILE1}" > + } > + if ( \$false || \$true ) && ( ! \$true || \$test1 ) > + if \$true > + set-state seven > +} > +state seven { > + if ( ! \$false ) > + set-state eight > +} > +state eight { > + if ! ( \$false ) > + set-state nine > +} > +state nine { > + if ! ( \$false ) { > + set-state ten > + } > +} > +state ten { > + if \$true && ! ( \$true && ! \$test1 ) { > + run "rm ${FILE1}" > + run "touch ${FILE2}" > + set-state one > + } > +} > +state ninetyeight { > + init { > + if \$true > + if ( \$true && ! \$false ) && ( \$false || \$true ) { > + if \$true > + run "touch ${FILE1}" > + } > + } > + if \$test1 && \$test2 { > + run "rm ${FILE2}" > + set-state ninetynine > + } > +} > +state ninetynine { > + init { > + run "touch ${FILE2}" > + } > + if \$test1 && \$test2 > + set-state onehundred > +} > +state onehundred { > + if ! ( ! ( ! \$false ) ) > + set-state end > +} > +state end { > + if \$false > + set-state one > +} > +EOF > + > +cat > working/output.test <<EOF > +changing state to one > +changing state to two > +changing state to three > +changing state to four > +changing state to five > +changing state to six > +changing state to seven > +changing state to eight > +changing state to nine > +changing state to ten > +changing state to one > +changing state to ninetyeight > +changing state to ninetynine > +changing state to onehundred > +changing state to end > +EOF > + > +(cd working && nohup ifstated -dvf ./ifstated.conf > ifstated.log 2>&1) & > + > +sleep ${LSLEEP} > + > +grep ^changing working/ifstated.log > working/output.new > + > +kill $(pgrep ifstated) >/dev/null 2>&1 > + > +diff working/output.test working/output.new > +case $? in > +0) echo PASSED > + cleanup > + exit 0 > + ;; > +1) fail > + ;; > +esac > BQ_END