From: George Dunlap <george.dunlap@eu.citrix.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
xen-devel@lists.xensource.com
Subject: Re: [PATCH v3 1/5] raisin: introduce tests
Date: Wed, 13 May 2015 11:27:29 +0100 [thread overview]
Message-ID: <55532711.5080107@eu.citrix.com> (raw)
In-Reply-To: <1430928011-26706-1-git-send-email-stefano.stabellini@eu.citrix.com>
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@eu.citrix.com>
>
> ---
>
> 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
>
next prev parent reply other threads:[~2015-05-13 10:27 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-06 15:58 [PATCH v3 0/5] raisin: introduce tests Stefano Stabellini
2015-05-06 16:00 ` [PATCH v3 1/5] " Stefano Stabellini
2015-05-13 10:27 ` George Dunlap [this message]
2015-05-13 11:33 ` Stefano Stabellini
2015-05-06 16:00 ` [PATCH v3 2/5] raisin: add an hvm test Stefano Stabellini
2015-05-06 16:00 ` [PATCH v3 3/5] raisin: improve output Stefano Stabellini
2015-05-06 16:00 ` [PATCH v3 4/5] raisin: small stlye improvement in for_each_component Stefano Stabellini
2015-05-06 16:00 ` [PATCH v3 5/5] raisin: introduce a local migration test Stefano Stabellini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=55532711.5080107@eu.citrix.com \
--to=george.dunlap@eu.citrix.com \
--cc=stefano.stabellini@eu.citrix.com \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.