[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/3] raisin: introduce tests
On Thu, 30 Apr 2015, Anthony PERARD wrote: > On Wed, Apr 29, 2015 at 06:00:54PM +0100, Stefano Stabellini wrote: > > Introduce a new command to run functional tests and unit tests. > > Introduce a generic infrastrucutre to run tests on the local machine. > > Add a library of common functions that can be used by the test scripts > > to setup guest VMs. > > > > Add a simple test script that boots a single busybox based PV guest. > > > > Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> > > --- > > README | 14 ++++++ > > defconfig | 5 +++ > > lib/commands.sh | 4 ++ > > lib/common-functions.sh | 74 +++++++++++++++++++++++++++++++ > > lib/common-tests.sh | 112 > > +++++++++++++++++++++++++++++++++++++++++++++++ > > raise | 8 ++-- > > tests/busybox-pv | 38 ++++++++++++++++ > > tests/series | 1 + > > 8 files changed, 253 insertions(+), 3 deletions(-) > > create mode 100644 lib/common-tests.sh > > create mode 100755 tests/busybox-pv > > create mode 100644 tests/series > > > > diff --git a/README b/README > > index b7832da..42c0f4d 100644 > > --- a/README > > +++ b/README > > @@ -102,3 +102,17 @@ check-package > > > > If your component comes with additional data, maybe a config script or > > anything else, place it under "data". > > + > > + > > += Testing = > > + > > +Raisin can also be used for testing. Make sure to have Xen already up > > +and running (raise build, raise install and host reboot). > > +Ask Raisin to run tests like this: > > + > > +./raise test > > + > > +You can specify a subset of tests to run with ENABLED_TESTS in the > > +config file, or the TESTS environmental variable: > > + > > +TESTS="busybox-pv" ./raise test > > diff --git a/defconfig b/defconfig > > index b4ed94d..e88f3d3 100644 > > --- a/defconfig > > +++ b/defconfig > > @@ -39,3 +39,8 @@ GRUB_REVISION="master" > > LIBVIRT_REVISION="master" > > OVMF_REVISION="master" > > LINUX_REVISION="master" > > + > > +# Tests > > +## All tests: busybox-pv > > +## ENABLED_TESTS is the list of test run by raise test > > +ENABLED_TESTS="busybox-pv" > > diff --git a/lib/commands.sh b/lib/commands.sh > > index 801341b..ffbadb4 100755 > > --- a/lib/commands.sh > > +++ b/lib/commands.sh > > @@ -103,3 +103,7 @@ function configure() { > > for_each_component configure > > } > > > > +function test() { > > + init_tests > > + run_tests > > +} > > diff --git a/lib/common-functions.sh b/lib/common-functions.sh > > index d38788b..2edb168 100644 > > --- a/lib/common-functions.sh > > +++ b/lib/common-functions.sh > > @@ -39,6 +39,7 @@ function common_init() { > > get_distro > > get_arch > > get_components > > + get_tests > > > > verbose_echo "Distro: $DISTRO" > > verbose_echo "Arch: $RAISIN_ARCH" > > @@ -73,6 +74,24 @@ function get_components() { > > export COMPONENTS > > } > > > > +function get_tests() { > > + if [[ -z "$TESTS" ]] > > + then > > + TESTS="$ENABLED_TESTS" > > + fi > > + > > + if [[ -z "$TESTS" ]] > > + then > > + local t > > + for t in `cat "$BASEDIR"/tests/series` > > + do > > + TESTS="$TESTS $t" > > + verbose_echo "Found test $t" > > + done > > + fi > > + export TESTS > > +} > > + > > function get_distro() { > > if [[ -x "`which lsb_release 2>/dev/null`" ]] > > then > > @@ -278,6 +297,61 @@ function for_each_component () { > > done > > } > > > > +function run_tests() { > > + local t > > + local enabled > > + local found > > + > > + for t in `cat "$BASEDIR"/tests/series` > > + do > > + found=0 > > found=false > > > + for enabled in $TESTS > > + do > > + if [[ $enabled = $t ]] > > + then > > + found=1 > > found=true > > > + break > > + fi > > + done > > + if [[ $found -eq 0 ]] > > if $found > ;) good suggestion, I'll make the change > > + then > > + verbose_echo "$t" is disabled > > + continue > > + fi > > + > > + verbose_echo running test "$t" > > + "$BASEDIR"/tests/$t > > + verbose_echo "test "$t" done" > > + done > > +} > > + > > +function init_tests() { > > + local -a missing > > + > > + check-package bridge-utils > > + if [[ $DISTRO = "Debian" ]] > > + then > > + check-package busybox-static > > + elif [[ $DISTRO = "Fedora" ]] > > + then > > + check-package busybox grub2 which > > + else > > Wouldn't it be easier to read with "case" instead of "if" ? Maybe, I don't really have a preference, but we have the same pair of ifs in many other places. > > + echo "I don't know distro $DISTRO. It might be missing packages." > > + fi > > + > > + if [[ -n "${missing[@]}" ]] > > missing looks empty to me. It is filled by the check-package calls above > > + then > > + verbose_echo "Installing ${missing[@]}" > > + install-package "${missing[@]}" > > + fi > > + > > + if ! ifconfig xenbr1 &>/dev/null > > + then > > + $SUDO brctl addbr xenbr1 > > + $SUDO ifconfig xenbr1 169.254.0.1 up > > + fi > > +} > > + > > function _build_package_deb() { > > fakeroot bash ./scripts/mkdeb "$1" > > } > > diff --git a/lib/common-tests.sh b/lib/common-tests.sh > > new file mode 100644 > > index 0000000..be1c720 > > --- /dev/null > > +++ b/lib/common-tests.sh > > @@ -0,0 +1,112 @@ > > +#!/usr/bin/env bash > > + > > +source ${RAISIN_PATH}/common-functions.sh > > + > > +# $1 disk name > > +# $2 disk size > > +function allocate_disk() { > > + local disk > > + local size > > + > > + disk=$1 > > + size=$2 > > + > > + size=$((size+511)) > > + size=$((size/512)) > > + > > + dd if=/dev/zero of=$disk bs=512 count=$size > > + sync > > +} > > + > > +# $1 disk name > > +# print loop device name > > +function create_loop() { > > + local disk > > + local loop > > + > > + disk=`readlink -f $1` > > + > > + $SUDO losetup -f $disk > > + loop=`$SUDO losetup -a | grep $disk | cut -d : -f 1` > > + echo $loop > > +} > > + > > +# $1 dev name > > +function busybox_rootfs() { > > + local dev > > + local tmpdir > > + > > + dev=$1 > > + > > + $SUDO mkfs.ext3 $dev > > + > > + tmpdir=`mktemp -d` > > + $SUDO mount $dev $tmpdir > > + mkdir -p $tmpdir/bin > > + mkdir -p $tmpdir/sbin > > + mkdir -p $tmpdir/dev > > + mkdir -p $tmpdir/proc > > + mkdir -p $tmpdir/sys > > + mkdir -p $tmpdir/lib > > + mkdir -p $tmpdir/var > > + cp `which busybox` $tmpdir/bin > > + $tmpdir/bin/busybox --install $tmpdir/bin > > + > > + $SUDO umount $tmpdir > > + rmdir $tmpdir > > +} > > + > > +function busybox_network_init() { > > + local dev > > + local tmpdir > > + > > + dev=$1 > > + tmpdir=`mktemp -d` > > + > > + $SUDO mount $dev $tmpdir > > + rm -f $tmpdir/bin/init > > + cat >$tmpdir/bin/init <<EOF > > +#!/bin/sh > > +mount -t proc proc /proc > > +mount -t sysfs sysfs /sys > > +ifconfig eth0 169.254.0.2 up > > +/bin/sh > > +EOF > > + chmod +x $tmpdir/bin/init > > + > > + $SUDO umount $tmpdir > > + rmdir $tmpdir > > +} > > + > > +function check_guest_alive() { > > + local i > > + i=0 > > + while ! ping -c 1 169.254.0.2 &> /dev/null > > + do > > + sleep 1 > > + i=$((i+1)) > > + if [[ $i -gt 60 ]] > > + then > > + echo Timeout connecting to guest > > + return 1 > > + fi > > + done > > + return 0 > > +} > > + > > +function get_host_kernel() { > > + echo "/boot/vmlinuz-`uname -r`" > > +} > > + > > +function get_host_initrd() { > > + if [[ $DISTRO = "Debian" ]] > > + then > > + echo "/boot/initrd.img-`uname -r`" > > + elif [[ $DISTRO = "Fedora" ]] > > + then > > + echo "/boot/initramfs-`uname -r`".img > > + else > > + echo "I don't know how to find the initrd" > > echo >&2 since it's an error message? Good point > > + exit 1 > > + fi > > +} > > Also, in general, it might be better to use quotes around variables in case > an argument of a function is missing, or a path contain a space. Yes, you are right. I am trying to avoid quotes only on variables we know must be populated, see README for a list. DISTRO is one of them. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |