[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 1/5] raisin: introduce tests
On Wed, 13 May 2015, George Dunlap wrote: > On 05/06/2015 05:00 PM, 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> > > > > --- > > > > Changes in v3: > > > > - source test scripts > > - expose a _test and a _cleanup function from the test script > > > > > > Changes in v2: > > > > - use found as a boolean > > - print error to stderr > > --- > > README | 14 ++++++ > > defconfig | 5 +++ > > lib/commands.sh | 4 ++ > > lib/common-functions.sh | 77 ++++++++++++++++++++++++++++++++ > > lib/common-tests.sh | 112 > > +++++++++++++++++++++++++++++++++++++++++++++++ > > raise | 8 ++-- > > tests/busybox-pv | 37 ++++++++++++++++ > > tests/series | 1 + > > 8 files changed, 255 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..d88bc0d 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,64 @@ function for_each_component () { > > done > > } > > > > +function run_tests() { > > + local t > > + local enabled > > + local found > > + > > + for t in `cat "$BASEDIR"/tests/series` > > + do > > + found=false > > + for enabled in $TESTS > > + do > > + if [[ $enabled = $t ]] > > + then > > + found=true > > + break > > + fi > > + done > > + if ! $found > > + then > > + verbose_echo "$t" is disabled > > + continue > > + fi > > + > > + source "$BASEDIR"/tests/$t > > + > > + verbose_echo running test "$t" > > + "$t"_test > > + "$t"_cleanup > > + 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 > > + echo "I don't know distro $DISTRO. It might be missing packages." > > + fi > > + > > + if [[ -n "${missing[@]}" ]] > > + 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..8d2ee6b > > --- /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 > > This a lot faster if you use truncate: > > function raw-create() > { > truncate -s "${size}"M "${image}" > } > > In addition, truncate makes the file sparse on most modern filesystems. > > You might want to take a look at my testlib "lib/image.sh" for some more > recipes. Nice, I didn't know about it. > > +} > > + > > +# $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 > > +} > > I think this is generally better done by attaching the disk to dom0; > that way you can use the same code to initialize other kinds of disks > and formats (e.g., qcow, vhd, &c). > > But in both these cases I can send some patches to add these in later, I > think. :-) OK, in that case I'll push my series as is. > > + > > +# $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" >&2 > > + exit 1 > > + fi > > +} > > diff --git a/raise b/raise > > index 68dbfd8..dd275ad 100755 > > --- a/raise > > +++ b/raise > > @@ -3,7 +3,7 @@ > > set -e > > > > _help() { > > - echo "Usage: ./build.sh <options> <command>" > > + echo "Usage: ./raise <options> <command>" > > echo "where options are:" > > echo " -v | --verbose Verbose" > > echo " -y | --yes Do not ask questions and continue" > > @@ -14,6 +14,7 @@ _help() { > > echo " install Install binaries under / (requires > > sudo)" > > echo " configure Configure the system (requires sudo)" > > echo " unraise Uninstall and unconfigure the system > > (requires sudo)" > > + echo " test Runs tests on the system (requires > > sudo, Xen must be running)" > > } > > > > # Include your defaults > > @@ -25,10 +26,11 @@ fi > > source ./config > > > > # To use this as a library, set RAISIN_PATH appropriately > > -[[ -z "$RAISIN_PATH" ]] && RAISIN_PATH="$PWD/lib" > > +[[ -z "$RAISIN_PATH" ]] && export RAISIN_PATH="$PWD/lib" > > > > # Then as many as the sub-libraries as you need > > source ${RAISIN_PATH}/common-functions.sh > > +source ${RAISIN_PATH}/common-tests.sh > > source ${RAISIN_PATH}/git-checkout.sh > > source ${RAISIN_PATH}/commands.sh > > > > @@ -59,7 +61,7 @@ do > > done > > > > case "$1" in > > - "install-builddep" | "build" | "install" | "configure" | "unraise" ) > > + "install-builddep" | "build" | "install" | "configure" | "unraise" | > > "test" ) > > COMMAND=$1 > > ;; > > *) > > diff --git a/tests/busybox-pv b/tests/busybox-pv > > new file mode 100755 > > index 0000000..ec3ba5c > > --- /dev/null > > +++ b/tests/busybox-pv > > @@ -0,0 +1,37 @@ > > +#!/usr/bin/env bash > > + > > +set -e > > + > > +function busybox-pv-cleanup() { > > + $SUDO xl destroy raisin-test || true > > + umount $LOOP || true > > + cd "$BASEDIR" > > + $SUDO losetup -d $LOOP > > + rm -rf $TMPDIR > > +} > > + > > +function busybox-pv-test() { > > + TMPDIR=`mktemp -d` > > + cd $TMPDIR > > + > > + allocate_disk busybox-vm-disk $((20*1024*1024)) > > + LOOP=`create_loop busybox-vm-disk` > > + busybox_rootfs $LOOP > > + busybox_network_init $LOOP > > + > > + cat >busybox-pv <<EOF > > +kernel = "`get_host_kernel`" > > +ramdisk = "`get_host_initrd`" > > +extra = "root=/dev/xvda console=hvc0" > > +memory = 512 > > +name = "raisin-test" > > +vcpus = 2 > > +disk = [ '$LOOP,raw,xvda,w' ] > > +serial="pty" > > +boot="c" > > +vif=['bridge=xenbr1'] > > +EOF > > + > > + $SUDO xl create busybox-pv > > + check_guest_alive > > +} > > diff --git a/tests/series b/tests/series > > new file mode 100644 > > index 0000000..a5ec626 > > --- /dev/null > > +++ b/tests/series > > @@ -0,0 +1 @@ > > +busybox-pv > > > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |