|
[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 |