#!/bin/bash _kill_all_jobs() { local _jobs=$(jobs -r -p) [ -n "$_jobs" ] && kill $_jobs } trap ' ret=$?; _kill_all_jobs exit $ret; ' EXIT trap 'exit 1;' SIGINT BASEDIR=$(realpath $(dirname "$0")) . $BASEDIR/test-lib.sh TESTCASEDIR="$BASEDIR/testcases" console=0 testcases="" while [ $# -gt 0 ]; do case $1 in '') break ;; --console ) console=1 ;; -*) echo "Invalid option $1" ;; *) testcases+=" $1" ;; esac shift; done if [ -z "$testcases" ]; then echo "==== Starting all tests: ====" testcases=$(ls -1 $TESTCASEDIR) else echo "==== Starting specified tests: ====" fi echo ${testcases##*/} echo declare -A results ret=0 for test_case in $testcases; do echo "======== Running Test Case $test_case ========" results[$test_case]="" testdir=$TESTCASEDIR/$test_case script_num=$(ls -1 $testdir | wc -l) scripts=$(ls -r -1 $testdir | tr '\n' ' ') test_outputs="" read main_script aux_script <<< "$scripts" if [ -z "$main_script" ]; then echo "ERROR: Empty testcase dir $testdir" continue fi for script in $scripts; do echo "---- Building image for: $script ----" echo "-------- Output image is: $(get_test_image $testdir/$script)" echo "-------- Building log is: $(get_test_image $testdir/$script).log" mkdir -p $(dirname $(get_test_image $testdir/$script)) build_test_image $testdir/$script &> $(get_test_image $testdir/$script).log if [ $? -ne 0 ]; then echo "Failing building image!" continue 2 fi done for script in $aux_script; do echo "---- Starting VM: $script ----" script="$testdir/$script" echo "-------- Qemu cmdline: $(get_test_qemu_cmd_file $script)" echo "-------- Console log: $(get_test_console_file $script)" echo "-------- Test log: $(get_test_output_file $script)" test_outputs+="$(get_test_output_file $script) " rm -f $(get_test_console_file $script) rm -f $(get_test_output_file $script) $(run_test_sync $script > $(get_test_console_file $script)) & sleep 5 done script="$main_script" echo "---- Starting test VM: $(basename $script) ----" script="$testdir/$script" echo "-------- Qemu cmdline: $(get_test_qemu_cmd_file $script)" echo "-------- Console log: $(get_test_console_file $script)" echo "-------- Test log: $(get_test_output_file $script)" test_outputs+="$(get_test_output_file $script) " rm -f $(get_test_console_file $script) rm -f $(get_test_output_file $script) if [ $console -eq 1 ]; then run_test_sync $script | tee $(get_test_console_file $script) [ -n "$(jobs -p)" ] && kill $(jobs -p) else $(run_test_sync $script > $(get_test_console_file $script)) & watch_test_outputs $test_outputs fi res="$(gather_test_result $test_outputs)" [ $? -ne 0 ] && ret=$(expr $ret + 1) results[$test_case]="$res" echo -e "-------- Test finished: $test_case $res --------" for script in $scripts; do script="$testdir/$script" output="$(get_test_output_file $script) " image="$(get_test_image $script)" vmcore="$(sed -n 's/^VMCORE: \(\S*\).*/\1/p' $output)" kernel="$(sed -n 's/^KERNEL VERSION: \(\S*\).*/\1/p' $output)" if [ -n "$vmcore" ]; then echo "You can retrive the verify the vmcore file using following command:" echo "./scripts/copy-from-image.sh \\" echo " $image \\" echo " $vmcore ./" echo "Kernel package verion is: $kernel" fi done done echo "======== Test results ========" for i in ${!results[@]}; do echo "----------------" echo -e "$i:\t\t${results[$i]}" done exit $ret