[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 1/5] raisin: introduce tests
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. > +} > + > +# $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. :-) > + > +# $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 |