qemuimagetest: Use same image during sanity testing instead of copying a new image for each case

To reduce the time on sanity testing, we remove variable SHARE_IMAGE and use
a new variable TEST_SERIALIZE in local.conf. It is by default set to 1. Poky
will copy and boot the to-be tested image for only once. It will not remove
or kill the image and test cases will be serialized executed against the same
image. If it is set to 0, image is always be copied for each cases, which takes
much time. I had a experiment that latest qemuppc sato only takes 7 minutes to
finish 9 sanity test cases, which takes more than 20 minutes before.

I also removed sanity case "boot" from sato/sdk/lsb because the other cases for
these targets already cover the check point of "boot".

Signed-off-by Jiajun Xu <jiajun.xu@intel.com>
This commit is contained in:
Jiajun Xu 2011-01-19 00:22:30 +08:00 committed by Richard Purdie
parent 50b2086129
commit 3e052919c9
27 changed files with 140 additions and 89 deletions

View File

@ -5,7 +5,9 @@ TEST_LOG ?= "${LOG_DIR}/qemuimagetests"
TEST_RESULT ?= "${TEST_DIR}/result" TEST_RESULT ?= "${TEST_DIR}/result"
TEST_TMP ?= "${TEST_DIR}/tmp" TEST_TMP ?= "${TEST_DIR}/tmp"
TEST_SCEN ?= "sanity" TEST_SCEN ?= "sanity"
SHARE_IMAGE ?= "1" TEST_STATUS ?= "${TEST_TMP}/status"
TARGET_IPSAVE ?= "${TEST_TMP}/target_ip"
TEST_SERIALIZE ?= "1"
python do_qemuimagetest() { python do_qemuimagetest() {
qemuimagetest_main(d) qemuimagetest_main(d)
@ -35,6 +37,17 @@ def qemuimagetest_main(d):
machine = bb.data.getVar('MACHINE', d, 1) machine = bb.data.getVar('MACHINE', d, 1)
pname = bb.data.getVar('PN', d, 1) pname = bb.data.getVar('PN', d, 1)
"""function to save test cases running status"""
def teststatus(test, status, index, length):
test_status = bb.data.getVar('TEST_STATUS', d, 1)
if not os.path.exists(test_status):
raise bb.build.FuncFailed("No test status file existing under TEST_TMP")
f = open(test_status, "w")
f.write("\t%-15s%-15s%-15s%-15s\n" % ("Case", "Status", "Number", "Total"))
f.write("\t%-15s%-15s%-15s%-15s\n" % (case, status, index, length))
f.close()
"""funtion to run each case under scenario""" """funtion to run each case under scenario"""
def runtest(scen, case, fulltestpath): def runtest(scen, case, fulltestpath):
resultpath = bb.data.getVar('TEST_RESULT', d, 1) resultpath = bb.data.getVar('TEST_RESULT', d, 1)
@ -56,11 +69,13 @@ def qemuimagetest_main(d):
os.environ["DISPLAY"] = bb.data.getVar("DISPLAY", d, True) os.environ["DISPLAY"] = bb.data.getVar("DISPLAY", d, True)
os.environ["POKYBASE"] = bb.data.getVar("POKYBASE", d, True) os.environ["POKYBASE"] = bb.data.getVar("POKYBASE", d, True)
os.environ["TOPDIR"] = bb.data.getVar("TOPDIR", d, True) os.environ["TOPDIR"] = bb.data.getVar("TOPDIR", d, True)
os.environ["SHARE_IMAGE"] = bb.data.getVar("SHARE_IMAGE", d, True) os.environ["TEST_STATUS"] = bb.data.getVar("TEST_STATUS", d, True)
os.environ["TARGET_IPSAVE"] = bb.data.getVar("TARGET_IPSAVE", d, True)
os.environ["TEST_SERIALIZE"] = bb.data.getVar("TEST_SERIALIZE", d, True)
"""run Test Case""" """run Test Case"""
bb.note("Run %s test in scenario %s" % (case, scen)) bb.note("Run %s test in scenario %s" % (case, scen))
os.system("%s | tee -a %s" % (fulltestpath, caselog)) os.system("%s" % fulltestpath)
"""Generate testcase list in runtime""" """Generate testcase list in runtime"""
def generate_list(testlist): def generate_list(testlist):
@ -120,6 +135,12 @@ def qemuimagetest_main(d):
tmppath = bb.data.getVar('TEST_TMP', d, 1) tmppath = bb.data.getVar('TEST_TMP', d, 1)
bb.utils.mkdirhier(tmppath) bb.utils.mkdirhier(tmppath)
"""initialize test status file"""
test_status = bb.data.getVar('TEST_STATUS', d, 1)
if os.path.exists(test_status):
os.remove(test_status)
os.system("touch %s" % test_status)
"""initialize result file""" """initialize result file"""
resultpath = bb.data.getVar('TEST_RESULT', d, 1) resultpath = bb.data.getVar('TEST_RESULT', d, 1)
bb.utils.mkdirhier(resultpath) bb.utils.mkdirhier(resultpath)
@ -142,9 +163,11 @@ def qemuimagetest_main(d):
fulllist = generate_list(testlist) fulllist = generate_list(testlist)
"""Begin testing""" """Begin testing"""
for test in fulllist: for index,test in enumerate(fulllist):
(scen, case, fullpath) = test (scen, case, fullpath) = test
teststatus(case, "running", index, (len(fulllist) - 1))
runtest(scen, case, fullpath) runtest(scen, case, fullpath)
teststatus(case, "finished", index, (len(fulllist) - 1))
"""Print Test Result""" """Print Test Result"""
ret = 0 ret = 0

View File

@ -158,11 +158,11 @@ ENABLE_BINARY_LOCALE_GENERATION = "1"
#Because of the QEMU booting slowness issue(see bug #646 and #618), autobuilder #Because of the QEMU booting slowness issue(see bug #646 and #618), autobuilder
#may suffer a timeout issue when running sanity test. We introduce variable #may suffer a timeout issue when running sanity test. We introduce variable
#SHARE_IMAGE here to fix the issue. It is by default set to 1. Poky will copy #TEST_SERIALIZE here to reduce the time on sanity test. It is by default set
#latest built-out image and keep using it in sanity testing. If it is set to 0, #to 1. Poky will start image and run cases in the same image without reboot
#latest built-out image will be copied and tested for each case, which will take #or kill. If it is set to 0, the image will be copied and tested for each
#much time. #case, which will take much time.
#SHARE_IMAGE = "1" #TEST_SERIALIZE = "1"
# Set GLIBC_GENERATE_LOCALES to the locales you wish to generate should you not # Set GLIBC_GENERATE_LOCALES to the locales you wish to generate should you not
# wish to perform the time-consuming step of generating all LIBC locales. # wish to perform the time-consuming step of generating all LIBC locales.

View File

@ -39,6 +39,19 @@ Test_Info()
echo -e "\tTest_Info: $*" echo -e "\tTest_Info: $*"
} }
# function to update target ip address
# $1 is the process id of the process, which starts the qemu target
# $2 is the ip address of the target
Test_Update_IPSAVE()
{
local pid=$1
local ip_addr=$2
if [ "$TEST_SERIALIZE" -eq 1 ]; then
echo "$pid $ip_addr" > $TARGET_IPSAVE
fi
}
# function to copy files from host into target # function to copy files from host into target
# $1 is the ip address of target # $1 is the ip address of target
# $2 is the files, which need to be copied into target # $2 is the files, which need to be copied into target
@ -99,6 +112,11 @@ Test_SSH_UP()
local timeout=$2 local timeout=$2
local interval=0 local interval=0
# If TEST_SERIALIZE is set, use existing running qemu for testing
if [ ${TEST_SERIALIZE} -eq 1 -a -e ${TARGET_IPSAVE} ]; then
timeout=50
fi
while [ ${interval} -lt ${timeout} ] while [ ${interval} -lt ${timeout} ]
do do
Test_SSH ${ip_addr} "hostname" Test_SSH ${ip_addr} "hostname"
@ -106,13 +124,13 @@ Test_SSH_UP()
interval=`expr $interval + 10` interval=`expr $interval + 10`
sleep 10 sleep 10
else else
Test_Info "We can ssh on ${ip_addr} now" Test_Info "We can ssh on ${ip_addr} within ${interval} seconds"
return 0 return 0
fi fi
done done
Test_Info "We can not ssh on ${ip_addr} in ${timeout}" Test_Info "We can not ssh on ${ip_addr} in ${timeout} seconds"
return 1 return 1
} }
@ -162,6 +180,8 @@ Test_Kill_Qemu()
local ret=0 local ret=0
local ppid=0 local ppid=0
local i=0 local i=0
local index=0
local total=0
declare local pid declare local pid
# Check if $1 pid exists and is a qemu process # Check if $1 pid exists and is a qemu process
@ -186,6 +206,28 @@ Test_Kill_Qemu()
ret=$? ret=$?
done done
# When TEST_SERIALIZE is set, qemu process will not be
# killed until all the cases are finished
if [ ${TEST_SERIALIZE} -eq 1 -a -e ${TEST_STATUS} ]; then
index=`sed -n 2p ${TEST_STATUS} | awk '{print $3}'`
total=`sed -n 2p ${TEST_STATUS} | awk '{print $4}'`
if [ ${index} != ${total} ]; then
Test_Info "Do not kill the qemu process and use it for later testing"
Test_Update_IPSAVE $PID $TARGET_IPADDR
else
# If it is the last case, let's kill it
while [ $i -ne 0 ]
do
i=$((i-1))
kill ${pid[$i]}
sleep 2
done
# Kill the parent id
kill $PID
fi
else
# Kill these children pids from the last one # Kill these children pids from the last one
while [ $i -ne 0 ] while [ $i -ne 0 ]
do do
@ -197,6 +239,7 @@ Test_Kill_Qemu()
# Kill the parent id # Kill the parent id
kill $PID kill $PID
fi fi
fi
return return
} }
@ -209,7 +252,7 @@ Test_Check_Qemu_UP()
Test_Info "There is no Qemu process" Test_Info "There is no Qemu process"
return 1 return 1
else else
Test_Info "There is at least Qemu process running" Test_Info "There is at least one Qemu process running"
return 0 return 0
fi fi
} }
@ -384,17 +427,14 @@ Test_Create_Qemu()
CP=`which cp` CP=`which cp`
# When SHARE_IMAGE is set, we use the existing image under tmp folder # When TEST_SERIALIZE is set, we use the existing image under tmp folder
if [ -e "$TEST_ROOTFS_IMAGE" ]; then if [ ${TEST_SERIALIZE} -eq 1 -a -e "$TARGET_IPSAVE" ]; then
if [ ${SHARE_IMAGE} -eq 1 ]; then # If TARGET_IPSAVE exists, check PID of the qemu process from it
ROOTFS_IMAGE="$TEST_ROOTFS_IMAGE" PID=`awk '{print $1}' $TARGET_IPSAVE`
TEST_ROOTFS_IMAGE="${TEST_TMP}/${QEMUTARGET}-${QEMUARCH}-shared-test.ext3" timeout=50
fi else
rm -rf $TEST_ROOTFS_IMAGE rm -rf $TEST_ROOTFS_IMAGE
fi
$CP $ROOTFS_IMAGE $TEST_ROOTFS_IMAGE $CP $ROOTFS_IMAGE $TEST_ROOTFS_IMAGE
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
Test_Info "Image ${ROOTFS_IMAGE} copy to ${TEST_ROOTFS_IMAGE} failed, return fail" Test_Info "Image ${ROOTFS_IMAGE} copy to ${TEST_ROOTFS_IMAGE} failed, return fail"
return $ret return $ret
@ -408,6 +448,7 @@ Test_Create_Qemu()
# Get the pid of the xterm processor, which will be used in Test_Kill_Qemu # Get the pid of the xterm processor, which will be used in Test_Kill_Qemu
PID=$! PID=$!
fi
while [ ${up_time} -lt 10 ] while [ ${up_time} -lt 10 ]
do do
@ -437,7 +478,7 @@ Test_Create_Qemu()
do do
Test_Check_IP_UP ${TARGET_IPADDR} Test_Check_IP_UP ${TARGET_IPADDR}
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
Test_Info "Qemu Network is up, ping with ${TARGET_IPADDR} is OK" Test_Info "Qemu Network is up, ping with ${TARGET_IPADDR} is OK within ${up_time} seconds"
ret=0 ret=0
break break
else else
@ -451,7 +492,8 @@ Test_Create_Qemu()
Test_Info "Qemu and its network is up" Test_Info "Qemu and its network is up"
return $ret return $ret
else else
Test_Info "Qemu or its network is not up in ${timeout}" Test_Info "Qemu or its network is not up in ${timeout} seconds"
Test_Update_IPSAVE $PID $TARGET_IPADDR
return $ret return $ret
fi fi
} }

View File

@ -11,7 +11,7 @@
. $POKYBASE/scripts/qemuimage-testlib . $POKYBASE/scripts/qemuimage-testlib
TIMEOUT=200 TIMEOUT=400
RET=1 RET=1
# Start qemu and check its network # Start qemu and check its network

View File

@ -11,7 +11,7 @@
. $POKYBASE/scripts/qemuimage-testlib . $POKYBASE/scripts/qemuimage-testlib
TIMEOUT=200 TIMEOUT=400
RET=1 RET=1
# Start qemu and check its network # Start qemu and check its network

View File

@ -11,7 +11,7 @@
. $POKYBASE/scripts/qemuimage-testlib . $POKYBASE/scripts/qemuimage-testlib
TIMEOUT=200 TIMEOUT=400
RET=1 RET=1
# Start qemu and check its network # Start qemu and check its network

View File

@ -11,7 +11,7 @@
. $POKYBASE/scripts/qemuimage-testlib . $POKYBASE/scripts/qemuimage-testlib
TIMEOUT=200 TIMEOUT=400
RET=1 RET=1
# Start qemu and check its network # Start qemu and check its network

View File

@ -11,7 +11,7 @@
. $POKYBASE/scripts/qemuimage-testlib . $POKYBASE/scripts/qemuimage-testlib
TIMEOUT=200 TIMEOUT=400
RET=1 RET=1
SPID=0 SPID=0
i=0 i=0

View File

@ -13,11 +13,7 @@
. $POKYBASE/scripts/qemuimage-testlib . $POKYBASE/scripts/qemuimage-testlib
if [ $SHARE_IMAGE -eq 0 ]; then TIMEOUT=400
TIMEOUT=200
elif [ $SHARE_IMAGE -eq 1 ]; then
TIMEOUT=500
fi
RET=1 RET=1
i=0 i=0
@ -66,6 +62,11 @@ fi
if [ ${RET} -eq 0 ]; then if [ ${RET} -eq 0 ]; then
Test_Info "Shutdown Test PASS" Test_Info "Shutdown Test PASS"
Test_Print_Result "shutdown" 0 Test_Print_Result "shutdown" 0
# Remove TARGET_IPSAVE since no existing qemu running now
if [ -e ${TARGET_IPSAVE} ]; then
rm -rf ${TARGET_IPSAVE}
fi
exit 0 exit 0
else else
Test_Info "Shutdown Test FAIL" Test_Info "Shutdown Test FAIL"

View File

@ -11,7 +11,7 @@
. $POKYBASE/scripts/qemuimage-testlib . $POKYBASE/scripts/qemuimage-testlib
TIMEOUT=200 TIMEOUT=400
RET=1 RET=1
# Start qemu and check its network # Start qemu and check its network

View File

@ -11,7 +11,7 @@
. $POKYBASE/scripts/qemuimage-testlib . $POKYBASE/scripts/qemuimage-testlib
TIMEOUT=200 TIMEOUT=400
RET=1 RET=1
# Start qemu and check its network # Start qemu and check its network

View File

@ -11,7 +11,7 @@
. $POKYBASE/scripts/qemuimage-testlib . $POKYBASE/scripts/qemuimage-testlib
TIMEOUT=200 TIMEOUT=400
RET=1 RET=1
# Start qemu and check its network # Start qemu and check its network

View File

@ -1,8 +1,7 @@
sanity shutdown
sanity boot
sanity ssh sanity ssh
sanity scp sanity scp
sanity dmesg sanity dmesg
sanity zypper_help sanity zypper_help
sanity zypper_search sanity zypper_search
sanity rpm_query sanity rpm_query
sanity shutdown

View File

@ -1,5 +1,3 @@
sanity shutdown
sanity boot
sanity ssh sanity ssh
sanity scp sanity scp
sanity dmesg sanity dmesg
@ -7,3 +5,4 @@ sanity zypper_help
sanity zypper_search sanity zypper_search
sanity rpm_query sanity rpm_query
sanity connman sanity connman
sanity shutdown

View File

@ -1,5 +1,3 @@
sanity shutdown
sanity boot
sanity ssh sanity ssh
sanity scp sanity scp
sanity dmesg sanity dmesg
@ -8,3 +6,4 @@ sanity zypper_search
sanity rpm_query sanity rpm_query
sanity compiler sanity compiler
sanity connman sanity connman
sanity shutdown

View File

@ -1,8 +1,7 @@
sanity shutdown
sanity boot
sanity ssh sanity ssh
sanity scp sanity scp
sanity dmesg sanity dmesg
sanity zypper_help sanity zypper_help
sanity zypper_search sanity zypper_search
sanity rpm_query sanity rpm_query
sanity shutdown

View File

@ -1,5 +1,3 @@
sanity shutdown
sanity boot
sanity ssh sanity ssh
sanity scp sanity scp
sanity dmesg sanity dmesg
@ -7,3 +5,4 @@ sanity zypper_help
sanity zypper_search sanity zypper_search
sanity rpm_query sanity rpm_query
sanity connman sanity connman
sanity shutdown

View File

@ -1,5 +1,3 @@
sanity shutdown
sanity boot
sanity ssh sanity ssh
sanity scp sanity scp
sanity dmesg sanity dmesg
@ -8,3 +6,4 @@ sanity zypper_search
sanity rpm_query sanity rpm_query
sanity compiler sanity compiler
sanity connman sanity connman
sanity shutdown

View File

@ -1,8 +1,7 @@
sanity shutdown
sanity boot
sanity ssh sanity ssh
sanity scp sanity scp
sanity dmesg sanity dmesg
sanity zypper_help sanity zypper_help
sanity zypper_search sanity zypper_search
sanity rpm_query sanity rpm_query
sanity shutdown

View File

@ -1,5 +1,3 @@
sanity shutdown
sanity boot
sanity ssh sanity ssh
sanity scp sanity scp
sanity dmesg sanity dmesg
@ -7,3 +5,4 @@ sanity zypper_help
sanity zypper_search sanity zypper_search
sanity rpm_query sanity rpm_query
sanity connman sanity connman
sanity shutdown

View File

@ -1,5 +1,3 @@
sanity shutdown
sanity boot
sanity ssh sanity ssh
sanity scp sanity scp
sanity dmesg sanity dmesg
@ -8,3 +6,4 @@ sanity zypper_search
sanity rpm_query sanity rpm_query
sanity compiler sanity compiler
sanity connman sanity connman
sanity shutdown

View File

@ -1,8 +1,7 @@
sanity shutdown
sanity boot
sanity ssh sanity ssh
sanity scp sanity scp
sanity dmesg sanity dmesg
sanity zypper_help sanity zypper_help
sanity zypper_search sanity zypper_search
sanity rpm_query sanity rpm_query
sanity shutdown

View File

@ -1,5 +1,3 @@
sanity shutdown
sanity boot
sanity ssh sanity ssh
sanity scp sanity scp
sanity dmesg sanity dmesg
@ -7,3 +5,4 @@ sanity zypper_help
sanity zypper_search sanity zypper_search
sanity rpm_query sanity rpm_query
sanity connman sanity connman
sanity shutdown

View File

@ -1,5 +1,3 @@
sanity shutdown
sanity boot
sanity ssh sanity ssh
sanity scp sanity scp
sanity dmesg sanity dmesg
@ -8,3 +6,4 @@ sanity zypper_search
sanity rpm_query sanity rpm_query
sanity compiler sanity compiler
sanity connman sanity connman
sanity shutdown

View File

@ -1,8 +1,7 @@
sanity shutdown
sanity boot
sanity ssh sanity ssh
sanity scp sanity scp
sanity dmesg sanity dmesg
sanity zypper_help sanity zypper_help
sanity zypper_search sanity zypper_search
sanity rpm_query sanity rpm_query
sanity shutdown

View File

@ -1,5 +1,3 @@
sanity shutdown
sanity boot
sanity ssh sanity ssh
sanity scp sanity scp
sanity dmesg sanity dmesg
@ -7,3 +5,4 @@ sanity zypper_help
sanity zypper_search sanity zypper_search
sanity rpm_query sanity rpm_query
sanity connman sanity connman
sanity shutdown

View File

@ -1,5 +1,3 @@
sanity shutdown
sanity boot
sanity ssh sanity ssh
sanity scp sanity scp
sanity dmesg sanity dmesg
@ -8,3 +6,4 @@ sanity zypper_search
sanity rpm_query sanity rpm_query
sanity compiler sanity compiler
sanity connman sanity connman
sanity shutdown