All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] raisin: introduce tests
@ 2015-04-29 17:00 Stefano Stabellini
  2015-04-29 17:00 ` [PATCH 1/3] " Stefano Stabellini
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Stefano Stabellini @ 2015-04-29 17:00 UTC (permalink / raw)
  To: xen-devel; +Cc: george.dunlap, Stefano Stabellini

Hi all,

this patch series introduces a framework to execute simple unit and
functional tests in raisin. It can be used by developers to validate
their changes before submitting a patch series to xen-devel. It can also
be used by OSSTest to test for regressions on one particular
functionality. This patch series only introduces two tests: a PV guest
creation test and an HVM guest creation test. They are both based on
busybox. More tests will follow.



Stefano Stabellini (3):
      raisin: introduce tests
      raisin: add an hvm test
      raisin: improve output

 README                      |   14 ++++
 components/grub             |    4 +-
 components/libvirt          |    4 +-
 components/linux            |    2 +-
 components/ovmf             |    6 +-
 components/qemu             |    2 +-
 components/qemu_traditional |    2 +-
 components/seabios          |    6 +-
 components/xen              |    8 +-
 defconfig                   |    5 ++
 lib/commands.sh             |   22 +++---
 lib/common-functions.sh     |  138 +++++++++++++++++++++++++++++-----
 lib/common-tests.sh         |  174 +++++++++++++++++++++++++++++++++++++++++++
 raise                       |    8 +-
 scripts/lopartsetup         |   67 +++++++++++++++++
 tests/busybox-hvm           |   44 +++++++++++
 tests/busybox-pv            |   38 ++++++++++
 tests/series                |    2 +
 18 files changed, 499 insertions(+), 47 deletions(-)
 create mode 100644 lib/common-tests.sh
 create mode 100755 scripts/lopartsetup
 create mode 100755 tests/busybox-hvm
 create mode 100755 tests/busybox-pv
 create mode 100644 tests/series


Cheers,

Stefano

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/3] raisin: introduce tests
  2015-04-29 17:00 [PATCH 0/3] raisin: introduce tests Stefano Stabellini
@ 2015-04-29 17:00 ` Stefano Stabellini
  2015-04-30 14:48   ` Anthony PERARD
  2015-04-29 17:00 ` [PATCH 2/3] raisin: add an hvm test Stefano Stabellini
  2015-04-29 17:00 ` [PATCH 3/3] raisin: improve output Stefano Stabellini
  2 siblings, 1 reply; 8+ messages in thread
From: Stefano Stabellini @ 2015-04-29 17:00 UTC (permalink / raw)
  To: xen-devel; +Cc: george.dunlap, Stefano Stabellini

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>
---
 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
+        for enabled in $TESTS
+        do
+            if [[ $enabled = $t ]]
+            then
+                found=1
+                break
+            fi
+        done
+        if [[ $found -eq 0 ]]
+        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
+        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..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"
+        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..941c739
--- /dev/null
+++ b/tests/busybox-pv
@@ -0,0 +1,38 @@
+#!/usr/bin/env bash
+
+set -e
+
+source $BASEDIR/lib/common-tests.sh
+
+function cleanup() {
+    $SUDO xl destroy raisin-test || true
+    umount $LOOP || true
+    cd "$BASEDIR"
+    $SUDO losetup -d $LOOP
+    rm -rf $TMPDIR
+}
+
+trap cleanup EXIT
+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
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/3] raisin: add an hvm test
  2015-04-29 17:00 [PATCH 0/3] raisin: introduce tests Stefano Stabellini
  2015-04-29 17:00 ` [PATCH 1/3] " Stefano Stabellini
@ 2015-04-29 17:00 ` Stefano Stabellini
  2015-04-29 17:00 ` [PATCH 3/3] raisin: improve output Stefano Stabellini
  2 siblings, 0 replies; 8+ messages in thread
From: Stefano Stabellini @ 2015-04-29 17:00 UTC (permalink / raw)
  To: xen-devel; +Cc: george.dunlap, Stefano Stabellini

Add a few functions to create partitions, install and configure grub in
the VM disk. Introduce a script to loopmount a partition within a VM
disk.

Add a new test that creates a local HVM guest, boots it and check the
network.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 defconfig           |    4 +--
 lib/common-tests.sh |   62 +++++++++++++++++++++++++++++++++++++++++++++++
 scripts/lopartsetup |   67 +++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/busybox-hvm   |   44 +++++++++++++++++++++++++++++++++
 tests/series        |    1 +
 5 files changed, 176 insertions(+), 2 deletions(-)
 create mode 100755 scripts/lopartsetup
 create mode 100755 tests/busybox-hvm

diff --git a/defconfig b/defconfig
index e88f3d3..664aee6 100644
--- a/defconfig
+++ b/defconfig
@@ -41,6 +41,6 @@ OVMF_REVISION="master"
 LINUX_REVISION="master"
 
 # Tests
-## All tests: busybox-pv
+## All tests: busybox-pv busybox-hvm
 ## ENABLED_TESTS is the list of test run by raise test
-ENABLED_TESTS="busybox-pv"
+ENABLED_TESTS="busybox-pv busybox-hvm"
diff --git a/lib/common-tests.sh b/lib/common-tests.sh
index be1c720..aa1daa4 100644
--- a/lib/common-tests.sh
+++ b/lib/common-tests.sh
@@ -31,6 +31,18 @@ function create_loop() {
     echo $loop
 }
 
+# $1 disk name
+# print loop device name of the partition
+function create_one_partition() {
+    local disk
+    local dev
+
+    disk=$1
+    echo -e "o\nn\np\n1\n\n\nw" | $SUDO fdisk $disk &>/dev/null
+    dev=`$SUDO $BASEDIR/scripts/lopartsetup $disk | head -1 | cut -d ":" -f 1`
+    echo $dev
+}
+
 # $1 dev name
 function busybox_rootfs() {
     local dev
@@ -78,6 +90,56 @@ EOF
     rmdir $tmpdir
 }
 
+function bootloader_init() {
+    local dev
+    local devp
+    local tmpdir
+
+    dev=$1
+    devp=$2
+    tmpdir=`mktemp -d`
+
+    $SUDO mount $devp $tmpdir
+    mkdir -p $tmpdir/boot/grub
+    cp "`get_host_kernel`" $tmpdir/boot
+    cp "`get_host_initrd`" $tmpdir/boot || true
+    cat >$tmpdir/boot/grub/grub.cfg <<EOF
+set default="0"
+set timeout=0
+
+menuentry 'Xen Guest' {
+ set root=hd0,1
+ linux `get_host_kernel` root=/dev/xvda1 console=ttyS0
+EOF
+    if [[ -e `get_host_initrd` ]]
+    then
+        echo "initrd `get_host_initrd`" >> $tmpdir/boot/grub/grub.cfg
+    fi
+    echo "}" >> $tmpdir/boot/grub/grub.cfg
+
+    cat >$tmpdir/boot/grub/device.map <<EOF
+(hd0)   $dev
+(hd0,1) $devp
+EOF
+
+    if [[ $DISTRO = "Debian" ]]
+    then
+        $SUDO grub-install --no-floppy \
+            --grub-mkdevicemap=$tmpdir/boot/grub/device.map \
+            --root-directory=$tmpdir $dev
+    elif [[ $DISTRO = "Fedora" ]]
+    then
+        $SUDO grub2-install --no-floppy \
+            --grub-mkdevicemap=$tmpdir/boot/grub/device.map \
+            --root-directory=$tmpdir $dev
+    else
+        echo "I don't know how to install grub on $DISTRO"
+    fi
+
+    $SUDO umount $tmpdir
+    rmdir $tmpdir
+}
+
 function check_guest_alive() {
     local i
     i=0
diff --git a/scripts/lopartsetup b/scripts/lopartsetup
new file mode 100755
index 0000000..bf33a28
--- /dev/null
+++ b/scripts/lopartsetup
@@ -0,0 +1,67 @@
+#!/usr/bin/env bash
+#
+# Need root privileges
+#
+# Create loop devices corresponding to partitions within an existing
+# file.
+
+set -e
+
+function _help() {
+    echo "Usage: lopartsetup file"
+}
+
+function _create_loop_device() {
+    local devnode
+    local filename
+    local offset
+    local index
+
+    filename="$1"
+    index="$2"
+    offset="$3"
+
+    devnode="`losetup -f 2>/dev/null`"
+    if [[ -z "$devnode" ]]
+    then
+        echo "no loop devices available"
+        exit 1
+    fi
+
+    echo "$devnode: partition $index of $filename"
+    losetup "$devnode" "$filename" -o "$offset"
+}
+
+if [[ $# -lt 1 ]]
+then
+    _help
+    exit 1
+fi
+
+if [[ -f "$1" && -r "$1" ]]
+then
+    filename="$1"
+    shift
+else
+    echo invalid image file
+    exit 1
+fi
+
+if [[ ! "`file -b $filename`" = *"boot sector"* ]]
+then
+    echo "$filename does not have a partition table"
+    exit 1
+fi
+
+unit="`fdisk -lu $filename 2>/dev/null | grep -e "^Units = " | cut -d " " -f 9`"
+index=0
+for i in "`fdisk -lu $filename 2>/dev/null | grep -e "^$filename"`"
+do
+    index=$((index+1))
+    offset=`echo $i | tr -s " " | cut -d " " -f 2`
+    offset=$((unit*offset))
+
+    _create_loop_device "$filename" "$index" "$offset"
+done
+
+exit 0
diff --git a/tests/busybox-hvm b/tests/busybox-hvm
new file mode 100755
index 0000000..b97ae34
--- /dev/null
+++ b/tests/busybox-hvm
@@ -0,0 +1,44 @@
+#!/usr/bin/env bash
+
+set -e
+
+source $BASEDIR/lib/common-tests.sh
+
+function cleanup() {
+    $SUDO xl destroy raisin-test || true
+    umount $LOOP_P0 || true
+    cd "$BASEDIR"
+    $SUDO losetup -d $LOOP_P0 $LOOP
+    rm -rf $TMPDIR
+}
+
+if [[ $RAISIN_ARCH != "x86_64" && $RAISIN_ARCH != "x86_32" ]]
+then
+    echo busybox hvm test only valid on x86
+    exit 0
+fi
+
+trap cleanup EXIT
+TMPDIR=`mktemp -d`
+cd $TMPDIR
+
+allocate_disk busybox-vm-disk $((20*1024*1024))
+LOOP=`create_loop busybox-vm-disk`
+LOOP_P0=`create_one_partition busybox-vm-disk`
+busybox_rootfs $LOOP_P0
+busybox_network_init $LOOP_P0
+bootloader_init $LOOP $LOOP_P0
+
+cat >busybox-hvm <<EOF
+builder = "hvm"
+memory = 512
+name = "raisin-test"
+vcpus = 2
+disk = [ '$LOOP,raw,hda,w' ]
+serial="pty"
+boot="c"
+vif=['bridge=xenbr1']
+EOF
+
+$SUDO xl create busybox-hvm
+check_guest_alive
diff --git a/tests/series b/tests/series
index a5ec626..1f5f5c6 100644
--- a/tests/series
+++ b/tests/series
@@ -1 +1,2 @@
 busybox-pv
+busybox-hvm
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 3/3] raisin: improve output
  2015-04-29 17:00 [PATCH 0/3] raisin: introduce tests Stefano Stabellini
  2015-04-29 17:00 ` [PATCH 1/3] " Stefano Stabellini
  2015-04-29 17:00 ` [PATCH 2/3] raisin: add an hvm test Stefano Stabellini
@ 2015-04-29 17:00 ` Stefano Stabellini
  2015-04-30 15:10   ` Anthony PERARD
  2 siblings, 1 reply; 8+ messages in thread
From: Stefano Stabellini @ 2015-04-29 17:00 UTC (permalink / raw)
  To: xen-devel; +Cc: george.dunlap, Stefano Stabellini

Introduce an error_echo function that prints to stderr.
Call error_echo or verbose_echo, instead of echo, when possible and
appropriate.
Redirect build and tests output to /dev/null unless VERBOSE==1.
Redirect apt-get and yum output to /dev/null.
Fix echo arguments in check-package-deb.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 components/grub             |    4 +--
 components/libvirt          |    4 +--
 components/linux            |    2 +-
 components/ovmf             |    6 ++--
 components/qemu             |    2 +-
 components/qemu_traditional |    2 +-
 components/seabios          |    6 ++--
 components/xen              |    8 ++---
 lib/commands.sh             |   18 +++++------
 lib/common-functions.sh     |   72 ++++++++++++++++++++++++++++++-------------
 lib/common-tests.sh         |    6 ++--
 tests/busybox-hvm           |    2 +-
 12 files changed, 80 insertions(+), 52 deletions(-)

diff --git a/components/grub b/components/grub
index fa72b99..3bb5254 100644
--- a/components/grub
+++ b/components/grub
@@ -19,10 +19,10 @@ function grub_check_package() {
 
     if [[ $RAISIN_ARCH != "x86_64" && $RAISIN_ARCH != "x86_32" ]]
     then
-        echo grub is only supported on x86_32 and x86_64
+        verbose_echo grub is only supported on x86_32 and x86_64
         return
     fi
-    echo Checking Grub dependencies
+    verbose_echo Checking Grub dependencies
     eval check-package \$DEP_"$DISTRO"_"$RAISIN_ARCH"
 }
 
diff --git a/components/libvirt b/components/libvirt
index a554643..20405ae 100644
--- a/components/libvirt
+++ b/components/libvirt
@@ -22,7 +22,7 @@ function libvirt_check_package() {
     local DEP_CentOS_x86_32="$DEP_Fedora_x86_32"
     local DEP_CentOS_x86_64="$DEP_Fedora_x86_64"
 
-    echo Checking Libvirt dependencies
+    verbose_echo Checking Libvirt dependencies
     eval check-package \$DEP_"$DISTRO"_"$RAISIN_ARCH"
 }
 
@@ -52,7 +52,7 @@ function libvirt_build() {
         cp daemon/libvirtd.init "$INST_DIR"/etc/rc.d/init.d/libvirtd
         chmod +x "$INST_DIR"/etc/rc.d/init.d/libvirtd
     else
-        echo "I don't know how write an init script for Libvirt on $DISTRO"
+        error_echo "I don't know how write an init script for Libvirt on $DISTRO"
     fi
     cd ..
 }
diff --git a/components/linux b/components/linux
index f90a894..9ae6955 100644
--- a/components/linux
+++ b/components/linux
@@ -15,7 +15,7 @@ function linux_check_package() {
     local DEP_CentOS_x86_32="$DEP_Fedora_x86_32"
     local DEP_CentOS_x86_64="$DEP_Fedora_x86_64"
 
-    echo Checking Linux dependencies
+    verbose_echo Checking Linux dependencies
     eval check-package \$DEP_"$DISTRO"_"$RAISIN_ARCH"
 }
 
diff --git a/components/ovmf b/components/ovmf
index a59a771..387044a 100644
--- a/components/ovmf
+++ b/components/ovmf
@@ -14,10 +14,10 @@ function ovmf_check_package() {
 
     if [[ $RAISIN_ARCH != "x86_64" ]]
     then
-        echo ovmf is only supported on x86_64
+        verbose_echo ovmf is only supported on x86_64
         return
     fi
-    echo Checking OVMF dependencies
+    verbose_echo Checking OVMF dependencies
     eval check-package \$DEP_"$DISTRO"_"$RAISIN_ARCH"
 }
 
@@ -25,7 +25,7 @@ function ovmf_check_package() {
 function ovmf_build() {
     if [[ $RAISIN_ARCH != "x86_64" ]]
     then
-        echo ovmf is only supported on x86_64
+        verbose_echo ovmf is only supported on x86_64
         return
     fi
 
diff --git a/components/qemu b/components/qemu
index 72cfec1..dce4ce0 100644
--- a/components/qemu
+++ b/components/qemu
@@ -11,7 +11,7 @@ function qemu_check_package() {
     local DEP_Fedora_x86_32="$DEP_Fedora_common"
     local DEP_Fedora_x86_64="$DEP_Fedora_common"
 
-    echo Checking QEMU dependencies
+    verbose_echo Checking QEMU dependencies
     eval check-package \$DEP_"$DISTRO"_"$RAISIN_ARCH"
 }
 
diff --git a/components/qemu_traditional b/components/qemu_traditional
index b338007..a9609b1 100644
--- a/components/qemu_traditional
+++ b/components/qemu_traditional
@@ -12,7 +12,7 @@ function qemu_traditional_check_package() {
     local DEP_Fedora_x86_32="$DEP_Fedora_common"
     local DEP_Fedora_x86_64="$DEP_Fedora_common"
 
-    echo Checking QEMU dependencies
+    verbose_echo Checking QEMU dependencies
     eval check-package \$DEP_"$DISTRO"_"$RAISIN_ARCH"
 }
 
diff --git a/components/seabios b/components/seabios
index ed2c7d2..8fea193 100644
--- a/components/seabios
+++ b/components/seabios
@@ -14,10 +14,10 @@ function seabios_check_package() {
 
     if [[ $RAISIN_ARCH != "x86_64" && $RAISIN_ARCH != "x86_32" ]]
     then
-        echo seabios is only supported on x86_32 and x86_64
+        verbose_echo seabios is only supported on x86_32 and x86_64
         return
     fi
-    echo Checking SeaBIOS dependencies
+    verbose_echo Checking SeaBIOS dependencies
     eval check-package \$DEP_"$DISTRO"_"$RAISIN_ARCH"
 }
 
@@ -25,7 +25,7 @@ function seabios_check_package() {
 function seabios_build() {
     if [[ $RAISIN_ARCH != "x86_64" && $RAISIN_ARCH != "x86_32" ]]
     then
-        echo seabios is only supported on x86_32 and x86_64
+        verbose_echo seabios is only supported on x86_32 and x86_64
         return
     fi
 
diff --git a/components/xen b/components/xen
index add8136..6b700e5 100644
--- a/components/xen
+++ b/components/xen
@@ -19,7 +19,7 @@ function xen_check_package() {
     local DEP_CentOS_x86_32="$DEP_CentOS_common dev86 texinfo iasl"
     local DEP_CentOS_x86_64="$DEP_CentOS_x86_32 glibc-devel.i686"
 
-    echo Checking Xen dependencies
+    verbose_echo Checking Xen dependencies
     eval check-package \$DEP_"$DISTRO"_"$RAISIN_ARCH"
 }
 
@@ -62,13 +62,13 @@ function _xen_create_bridge_Debian() {
 
     if [[ -z "$IFACE" ]]
     then
-        echo "Please refer to the following page to setup networking:"
-        echo "http://wiki.xenproject.org/wiki/Network_Configuration_Examples_(Xen_4.1%2B)"
+        error_echo "Please refer to the following page to setup networking:"
+        error_echo "http://wiki.xenproject.org/wiki/Network_Configuration_Examples_(Xen_4.1%2B)"
         return 1
     fi
     if [[ "`grep $BRIDGE /etc/network/interfaces`" ]]
     then
-        echo "a network bridge seems to be already setup"
+        verbose_echo "a network bridge seems to be already setup"
         return 0
     fi
 
diff --git a/lib/commands.sh b/lib/commands.sh
index ffbadb4..a79611e 100755
--- a/lib/commands.sh
+++ b/lib/commands.sh
@@ -17,29 +17,29 @@ function check-builddep() {
 
     if [[ -n "${missing[@]}" ]]
     then
-        echo "Missing packages: ${missing[@]}"
+        echo "$PREPEND Missing packages: ${missing[@]}"
         if [[ "$YES" = "n" ]]
         then
             return
         elif [[ "$YES" != "y" ]]
         then
-            echo "Do you want Raisin to automatically install them for you? (y/n)"
+            echo "$PREPEND Do you want Raisin to automatically install them for you? (y/n)"
             while read answer
             do
                 if [[ "$answer" = "n" ]]
                 then
-                    echo "Please install, or run ./raise install-builddep"
+                    echo "$PREPEND Please install, or run ./raise install-builddep"
                     exit 1
                 elif [[ "$answer" = "y" ]]
                 then
                     break
                 else
-                    echo "Reply y or n"
+                    echo "$PREPEND Reply y or n"
                 fi
             done
         fi
 
-        echo "Installing..."
+        echo "$PREPEND Installing..."
         install-package "${missing[@]}"
     fi
 }
@@ -72,7 +72,7 @@ function install() {
     # need single braces for filename matching expansion
     if [ ! -f xen-sytem*rpm ] && [ ! -f xen-system*deb ]
     then
-        echo You need to raise build first.
+        error_echo You need to raise build first.
         exit 1
     fi
     install_package xen-system
@@ -84,8 +84,8 @@ function configure() {
         return
     elif [[ "$YES" != "y" ]]
     then
-        echo "Proceeding we'll make changes to the running system,"
-        echo "are you sure that you want to continue? (y/n)"
+        echo "$PREPEND Proceeding we'll make changes to the running system,"
+        echo "$PREPEND are you sure that you want to continue? (y/n)"
         while read answer
         do
             if [[ "$answer" = "n" ]]
@@ -95,7 +95,7 @@ function configure() {
             then
                 break
             else
-                echo "Reply y or n"
+                echo "$PREPEND Reply y or n"
             fi
         done
     fi
diff --git a/lib/common-functions.sh b/lib/common-functions.sh
index 2edb168..f293ff4 100644
--- a/lib/common-functions.sh
+++ b/lib/common-functions.sh
@@ -3,10 +3,14 @@
 function verbose_echo() {
     if [[ $VERBOSE -eq 1 ]]
     then
-        echo $*
+        echo "$PREPEND" $*
     fi
 }
 
+function error_echo() {
+    echo "$PREPEND" $* >&2
+}
+
 # Executed once at the beginning of the script
 function common_init() {
     export BASEDIR=`pwd`
@@ -15,6 +19,7 @@ function common_init() {
     export RAISIN_MAKE=${MAKE-make}
     export PREFIX=${PREFIX-/usr}
     export INST_DIR=${DESTDIR-dist}
+    export PREPEND="[raisin]"
     
     INST_DIR=`readlink -f $INST_DIR`
     
@@ -24,15 +29,15 @@ function common_init() {
         export SUDO=""
     elif [[ ! -f `which sudo 2>/dev/null` ]]
     then
-        echo "Raisin requires sudo to install build dependencies for you."
-        echo "You can only build without it."
+        error_echo "Raisin requires sudo to install build dependencies for you."
+        error_echo "You can only build without it."
         export SUDO=""
     fi
 
     if [[ -z "$BASH_VERSINFO" || ${BASH_VERSINFO[0]} -lt 3 ||
         (${BASH_VERSINFO[0]} -eq 3 && ${BASH_VERSINFO[1]} -lt 2) ]]
     then
-        echo "Raisin requires BASH 3.2 or newer."
+        error_echo "Raisin requires BASH 3.2 or newer."
         exit 1
     fi
 
@@ -186,7 +191,7 @@ function get_arch() {
 }
 
 function _check-package-deb() {
-    verbose_echo "Checking for package ${args[0]}"
+    verbose_echo "Checking for package $1"
 
     if dpkg -s "$1" 2>/dev/null | grep -q "Status:.*installed"
     then
@@ -197,7 +202,7 @@ function _check-package-deb() {
 }
 
 function _install-package-deb() {
-    $SUDO apt-get install -y $*
+    $SUDO apt-get install -y $* > /dev/null
 }
 
 function _check-package-rpm() {
@@ -212,7 +217,7 @@ function _check-package-rpm() {
 }
 
 function _install-package-rpm() {
-    $SUDO yum install -y $*
+    $SUDO yum install -y $* > /dev/null
 }
 
 # Modifies inherited variable "missing"
@@ -236,13 +241,13 @@ function start_initscripts() {
     do
         case $DISTRO in
             "Debian" )
-            $SUDO update-rc.d $1 defaults || echo "Couldn't set $1 to start"
+            $SUDO update-rc.d $1 defaults || error_echo "Couldn't set $1 to start"
             ;;
             "Fedora" )
-            $SUDO chkconfig --add $1 || echo "Couldn't set $1 to start"
+            $SUDO chkconfig --add $1 || error_echo "Couldn't set $1 to start"
             ;;
             * )
-            echo "I don't know how to start initscripts on $DISTRO"
+            error_echo "I don't know how to start initscripts on $DISTRO"
             return 1
             ;;
         esac
@@ -255,13 +260,13 @@ function stop_initscripts() {
     do
         case $DISTRO in
             "Debian" )
-            $SUDO update-rc.d $1 remove || echo "Couldn't remove $1 from init"
+            $SUDO update-rc.d $1 remove || error_echo "Couldn't remove $1 from init"
             ;;
             "Fedora" )
-            $SUDO chkconfig --del $1 || echo "Couldn't remove $1 from init"
+            $SUDO chkconfig --del $1 || error_echo "Couldn't remove $1 from init"
             ;;
             * )
-            echo "I don't know how to start initscripts on $DISTRO"
+            error_echo "I don't know how to start initscripts on $DISTRO"
             return 1
             ;;
         esac
@@ -291,9 +296,14 @@ function for_each_component () {
             continue
         fi
 
-        verbose_echo calling "$component"_"$1"
-        "$component"_"$1"
-        verbose_echo "$component"_"$1" done
+        echo "$PREPEND" calling "$component"_"$1"
+        if [[ $VERBOSE -eq 0 ]]
+        then
+            "$component"_"$1" &> /dev/null
+        else
+            "$component"_"$1"
+        fi
+        echo "$PREPEND" "$component"_"$1" done
     done
 }
 
@@ -301,6 +311,7 @@ function run_tests() {
     local t
     local enabled
     local found
+    local ret
 
     for t in `cat "$BASEDIR"/tests/series`
     do
@@ -319,9 +330,26 @@ function run_tests() {
             continue
         fi
 
-        verbose_echo running test "$t"
-        "$BASEDIR"/tests/$t
-        verbose_echo "test "$t" done"
+        ret=0
+        if [[ $VERBOSE -eq 0 ]]
+        then
+            echo -n "$PREPEND test $t: "
+            "$BASEDIR"/tests/$t &>/dev/null || ret=1
+            if [[ $ret -eq 0 ]]
+            then
+                echo "success"
+            else
+                echo "fail"
+            fi
+        else
+            "$BASEDIR"/tests/$t || ret=1
+            if [[ $ret -eq 0 ]]
+            then
+                echo "$PREPEND test $t: success"
+            else
+                echo "$PREPEND test $t: fail"
+            fi
+        fi
     done
 }
 
@@ -336,7 +364,7 @@ function init_tests() {
     then
         check-package busybox grub2 which
     else
-        echo "I don't know distro $DISTRO. It might be missing packages."
+        error_echo "I don't know distro $DISTRO. It might be missing packages."
     fi
     
     if [[ -n "${missing[@]}" ]]
@@ -372,7 +400,7 @@ function install_package() {
     then
         $SUDO rpm -i --force "$1"-`git show --oneline | head -1 | cut -d " " -f 1`-0.$RAISIN_ARCH.rpm
     else
-        echo "Don't know how to install packages on $DISTRO"
+        error_echo "Don't know how to install packages on $DISTRO"
     fi
 }
 
@@ -384,6 +412,6 @@ function uninstall_package() {
     then
         $SUDO rpm -e "$1"
     else
-        echo "Don't know how to uninstall packages on $DISTRO"
+        error_echo "Don't know how to uninstall packages on $DISTRO"
     fi
 }
diff --git a/lib/common-tests.sh b/lib/common-tests.sh
index aa1daa4..02bca1c 100644
--- a/lib/common-tests.sh
+++ b/lib/common-tests.sh
@@ -133,7 +133,7 @@ EOF
             --grub-mkdevicemap=$tmpdir/boot/grub/device.map \
             --root-directory=$tmpdir $dev
     else
-        echo "I don't know how to install grub on $DISTRO"
+        echo "$PREPEND I don't know how to install grub on $DISTRO"
     fi
 
     $SUDO umount $tmpdir
@@ -149,7 +149,7 @@ function check_guest_alive() {
         i=$((i+1))
         if [[ $i -gt 60 ]]
         then
-            echo Timeout connecting to guest
+            echo $PREPEND Timeout connecting to guest
             return 1
         fi
     done
@@ -168,7 +168,7 @@ function get_host_initrd() {
     then
         echo "/boot/initramfs-`uname -r`".img
     else
-        echo "I don't know how to find the initrd"
+        echo "$PREPEND I don't know how to find the initrd"
         exit 1
     fi
 }
diff --git a/tests/busybox-hvm b/tests/busybox-hvm
index b97ae34..c8024e5 100755
--- a/tests/busybox-hvm
+++ b/tests/busybox-hvm
@@ -14,7 +14,7 @@ function cleanup() {
 
 if [[ $RAISIN_ARCH != "x86_64" && $RAISIN_ARCH != "x86_32" ]]
 then
-    echo busybox hvm test only valid on x86
+    echo $PREPEND busybox hvm test only valid on x86
     exit 0
 fi
 
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 1/3] raisin: introduce tests
  2015-04-29 17:00 ` [PATCH 1/3] " Stefano Stabellini
@ 2015-04-30 14:48   ` Anthony PERARD
  2015-04-30 16:46     ` Stefano Stabellini
  0 siblings, 1 reply; 8+ messages in thread
From: Anthony PERARD @ 2015-04-30 14:48 UTC (permalink / raw)
  To: Stefano Stabellini; +Cc: george.dunlap, xen-devel

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@eu.citrix.com>
> ---
>  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
;)

> +        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" ?

> +        echo "I don't know distro $DISTRO. It might be missing packages."
> +    fi
> +    
> +    if [[ -n "${missing[@]}" ]]

missing looks empty to me.

> +    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?

> +        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.

-- 
Anthony PERARD

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/3] raisin: improve output
  2015-04-29 17:00 ` [PATCH 3/3] raisin: improve output Stefano Stabellini
@ 2015-04-30 15:10   ` Anthony PERARD
  2015-04-30 16:40     ` Stefano Stabellini
  0 siblings, 1 reply; 8+ messages in thread
From: Anthony PERARD @ 2015-04-30 15:10 UTC (permalink / raw)
  To: Stefano Stabellini; +Cc: george.dunlap, xen-devel

On Wed, Apr 29, 2015 at 06:00:56PM +0100, Stefano Stabellini wrote:
> Introduce an error_echo function that prints to stderr.
> Call error_echo or verbose_echo, instead of echo, when possible and
> appropriate.
> Redirect build and tests output to /dev/null unless VERBOSE==1.
> Redirect apt-get and yum output to /dev/null.
> Fix echo arguments in check-package-deb.
> 
> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> ---
>  components/grub             |    4 +--
>  components/libvirt          |    4 +--
>  components/linux            |    2 +-
>  components/ovmf             |    6 ++--
>  components/qemu             |    2 +-
>  components/qemu_traditional |    2 +-
>  components/seabios          |    6 ++--
>  components/xen              |    8 ++---
>  lib/commands.sh             |   18 +++++------
>  lib/common-functions.sh     |   72 ++++++++++++++++++++++++++++++-------------
>  lib/common-tests.sh         |    6 ++--
>  tests/busybox-hvm           |    2 +-
>  12 files changed, 80 insertions(+), 52 deletions(-)
> 

[...]

> diff --git a/lib/common-functions.sh b/lib/common-functions.sh
> index 2edb168..f293ff4 100644
> --- a/lib/common-functions.sh
> +++ b/lib/common-functions.sh
> @@ -3,10 +3,14 @@
>  function verbose_echo() {
>      if [[ $VERBOSE -eq 1 ]]
>      then
> -        echo $*
> +        echo "$PREPEND" $*
>      fi
>  }
>  
> +function error_echo() {
> +    echo "$PREPEND" $* >&2

I think using "$@" (with the quote) instead of $* would be better. The
quotes will keep any space that you want to echo and using $@ instead of $*
will keep parameters separated. So calling error_echo would have the same
beavior as calling echo (well almost).

Same thing for verbose_echo.

> +}
> +

-- 
Anthony PERARD

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/3] raisin: improve output
  2015-04-30 15:10   ` Anthony PERARD
@ 2015-04-30 16:40     ` Stefano Stabellini
  0 siblings, 0 replies; 8+ messages in thread
From: Stefano Stabellini @ 2015-04-30 16:40 UTC (permalink / raw)
  To: Anthony PERARD; +Cc: george.dunlap, xen-devel, Stefano Stabellini

On Thu, 30 Apr 2015, Anthony PERARD wrote:
> On Wed, Apr 29, 2015 at 06:00:56PM +0100, Stefano Stabellini wrote:
> > Introduce an error_echo function that prints to stderr.
> > Call error_echo or verbose_echo, instead of echo, when possible and
> > appropriate.
> > Redirect build and tests output to /dev/null unless VERBOSE==1.
> > Redirect apt-get and yum output to /dev/null.
> > Fix echo arguments in check-package-deb.
> > 
> > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> > ---
> >  components/grub             |    4 +--
> >  components/libvirt          |    4 +--
> >  components/linux            |    2 +-
> >  components/ovmf             |    6 ++--
> >  components/qemu             |    2 +-
> >  components/qemu_traditional |    2 +-
> >  components/seabios          |    6 ++--
> >  components/xen              |    8 ++---
> >  lib/commands.sh             |   18 +++++------
> >  lib/common-functions.sh     |   72 ++++++++++++++++++++++++++++++-------------
> >  lib/common-tests.sh         |    6 ++--
> >  tests/busybox-hvm           |    2 +-
> >  12 files changed, 80 insertions(+), 52 deletions(-)
> > 
> 
> [...]
> 
> > diff --git a/lib/common-functions.sh b/lib/common-functions.sh
> > index 2edb168..f293ff4 100644
> > --- a/lib/common-functions.sh
> > +++ b/lib/common-functions.sh
> > @@ -3,10 +3,14 @@
> >  function verbose_echo() {
> >      if [[ $VERBOSE -eq 1 ]]
> >      then
> > -        echo $*
> > +        echo "$PREPEND" $*
> >      fi
> >  }
> >  
> > +function error_echo() {
> > +    echo "$PREPEND" $* >&2
> 
> I think using "$@" (with the quote) instead of $* would be better. The
> quotes will keep any space that you want to echo and using $@ instead of $*
> will keep parameters separated. So calling error_echo would have the same
> beavior as calling echo (well almost).
> 
> Same thing for verbose_echo.

You are right, good suggestion.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 1/3] raisin: introduce tests
  2015-04-30 14:48   ` Anthony PERARD
@ 2015-04-30 16:46     ` Stefano Stabellini
  0 siblings, 0 replies; 8+ messages in thread
From: Stefano Stabellini @ 2015-04-30 16:46 UTC (permalink / raw)
  To: Anthony PERARD; +Cc: george.dunlap, xen-devel, Stefano Stabellini

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@eu.citrix.com>
> > ---
> >  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.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2015-04-30 16:46 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-04-29 17:00 [PATCH 0/3] raisin: introduce tests Stefano Stabellini
2015-04-29 17:00 ` [PATCH 1/3] " Stefano Stabellini
2015-04-30 14:48   ` Anthony PERARD
2015-04-30 16:46     ` Stefano Stabellini
2015-04-29 17:00 ` [PATCH 2/3] raisin: add an hvm test Stefano Stabellini
2015-04-29 17:00 ` [PATCH 3/3] raisin: improve output Stefano Stabellini
2015-04-30 15:10   ` Anthony PERARD
2015-04-30 16:40     ` Stefano Stabellini

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.