]> code.ossystems Code Review - openembedded-core.git/commitdiff
qemuimagetest: Use same image during sanity testing instead of copying a new image...
authorJiajun Xu <jiajun.xu@intel.com>
Tue, 18 Jan 2011 16:22:30 +0000 (00:22 +0800)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Thu, 20 Jan 2011 21:36:57 +0000 (21:36 +0000)
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>

27 files changed:
meta/classes/imagetest-qemu.bbclass
meta/conf/local.conf.sample
scripts/qemuimage-testlib
scripts/qemuimage-tests/sanity/compiler
scripts/qemuimage-tests/sanity/connman
scripts/qemuimage-tests/sanity/dmesg
scripts/qemuimage-tests/sanity/rpm_query
scripts/qemuimage-tests/sanity/scp
scripts/qemuimage-tests/sanity/shutdown
scripts/qemuimage-tests/sanity/ssh
scripts/qemuimage-tests/sanity/zypper_help
scripts/qemuimage-tests/sanity/zypper_search
scripts/qemuimage-tests/scenario/qemuarm/poky-image-lsb
scripts/qemuimage-tests/scenario/qemuarm/poky-image-sato
scripts/qemuimage-tests/scenario/qemuarm/poky-image-sdk
scripts/qemuimage-tests/scenario/qemumips/poky-image-lsb
scripts/qemuimage-tests/scenario/qemumips/poky-image-sato
scripts/qemuimage-tests/scenario/qemumips/poky-image-sdk
scripts/qemuimage-tests/scenario/qemuppc/poky-image-lsb
scripts/qemuimage-tests/scenario/qemuppc/poky-image-sato
scripts/qemuimage-tests/scenario/qemuppc/poky-image-sdk
scripts/qemuimage-tests/scenario/qemux86-64/poky-image-lsb
scripts/qemuimage-tests/scenario/qemux86-64/poky-image-sato
scripts/qemuimage-tests/scenario/qemux86-64/poky-image-sdk
scripts/qemuimage-tests/scenario/qemux86/poky-image-lsb
scripts/qemuimage-tests/scenario/qemux86/poky-image-sato
scripts/qemuimage-tests/scenario/qemux86/poky-image-sdk

index 28bb2182725c87552b129f30939c0cf1c04641f5..8301df84527c1b69295d1799254c6374e1fa462c 100644 (file)
@@ -5,7 +5,9 @@ TEST_LOG ?= "${LOG_DIR}/qemuimagetests"
 TEST_RESULT ?= "${TEST_DIR}/result"
 TEST_TMP ?= "${TEST_DIR}/tmp"
 TEST_SCEN ?= "sanity"
-SHARE_IMAGE ?= "1"
+TEST_STATUS ?= "${TEST_TMP}/status"
+TARGET_IPSAVE ?= "${TEST_TMP}/target_ip"
+TEST_SERIALIZE ?= "1"
 
 python do_qemuimagetest() {
     qemuimagetest_main(d)
@@ -35,6 +37,17 @@ def qemuimagetest_main(d):
     machine = bb.data.getVar('MACHINE', 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"""
     def runtest(scen, case, fulltestpath):
         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["POKYBASE"] = bb.data.getVar("POKYBASE", 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"""
         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"""
     def generate_list(testlist):
@@ -119,7 +134,13 @@ def qemuimagetest_main(d):
 
     tmppath = bb.data.getVar('TEST_TMP', d, 1)
     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"""
     resultpath = bb.data.getVar('TEST_RESULT', d, 1)
     bb.utils.mkdirhier(resultpath)
@@ -142,9 +163,11 @@ def qemuimagetest_main(d):
     fulllist = generate_list(testlist)
 
     """Begin testing"""
-    for test in fulllist:
+    for index,test in enumerate(fulllist):
         (scen, case, fullpath) = test
+        teststatus(case, "running", index, (len(fulllist) - 1))
         runtest(scen, case, fullpath)
+        teststatus(case, "finished", index, (len(fulllist) - 1))
     
     """Print Test Result"""
     ret = 0
index cb0e54887f0e864366315719affc198595b3dd1e..4567a828ffcce326137e258e3cbb167fac075891 100644 (file)
@@ -158,11 +158,11 @@ ENABLE_BINARY_LOCALE_GENERATION = "1"
 
 #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
-#SHARE_IMAGE here to fix the issue. It is by default set to 1. Poky will copy
-#latest built-out image and keep using it in sanity testing. If it is set to 0,
-#latest built-out image will be copied and tested for each case, which will take
-#much time.
-#SHARE_IMAGE = "1"
+#TEST_SERIALIZE here to reduce the time on sanity test. It is by default set 
+#to 1. Poky will start image and run cases in the same image without reboot 
+#or kill. If it is set to 0, the image will be copied and tested for each 
+#case, which will take much time.
+#TEST_SERIALIZE = "1"
 
 # 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.
index b9afcf5bb6633ae3e33521095204e059b92d4d63..823cbfa18b172ff3dd5330c15a8c32fdb28b7a53 100644 (file)
@@ -39,6 +39,19 @@ Test_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
 # $1 is the ip address of target
 # $2 is the files, which need to be copied into target
@@ -99,6 +112,11 @@ Test_SSH_UP()
        local timeout=$2
        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} ]
        do
                Test_SSH ${ip_addr} "hostname"
@@ -106,13 +124,13 @@ Test_SSH_UP()
                        interval=`expr $interval + 10`
                        sleep 10
                else
-                       Test_Info "We can ssh on ${ip_addr} now"
+                       Test_Info "We can ssh on ${ip_addr} within ${interval} seconds"
                        return 0
                fi
 
        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
 }
 
@@ -162,6 +180,8 @@ Test_Kill_Qemu()
        local ret=0
        local ppid=0
        local i=0
+       local index=0
+       local total=0
        declare local pid
 
        # Check if $1 pid exists and is a qemu process
@@ -186,16 +206,39 @@ Test_Kill_Qemu()
                        ret=$?
                done
 
-               # Kill these children pids from the last one
-               while [ $i -ne 0 ]
-               do
-                       i=$((i-1))
-                       kill ${pid[$i]}
-                       sleep 2
-               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
 
-               # Kill the parent id
-               kill $PID
+               else
+                       # Kill these children pids from the last one
+                       while [ $i -ne 0 ]
+                       do
+                               i=$((i-1))
+                               kill ${pid[$i]}
+                               sleep 2
+                       done
+
+                       # Kill the parent id
+                       kill $PID
+               fi
        fi
 
        return
@@ -209,7 +252,7 @@ Test_Check_Qemu_UP()
                Test_Info "There is no Qemu process"
                return 1
        else
-               Test_Info "There is at least Qemu process running"
+               Test_Info "There is at least one Qemu process running"
                return 0
        fi
 }
@@ -384,31 +427,29 @@ Test_Create_Qemu()
        
        CP=`which cp`
 
-       # When SHARE_IMAGE is set, we use the existing image under tmp folder
-       if [ -e "$TEST_ROOTFS_IMAGE" ]; then
-               if [ ${SHARE_IMAGE} -eq 1 ]; then
-                       ROOTFS_IMAGE="$TEST_ROOTFS_IMAGE"
-                       TEST_ROOTFS_IMAGE="${TEST_TMP}/${QEMUTARGET}-${QEMUARCH}-shared-test.ext3"
-               fi
+       # When TEST_SERIALIZE is set, we use the existing image under tmp folder
+       if [ ${TEST_SERIALIZE} -eq 1 -a -e "$TARGET_IPSAVE" ]; then
+               # If TARGET_IPSAVE exists, check PID of the qemu process from it
+               PID=`awk '{print $1}' $TARGET_IPSAVE`
+               timeout=50
+       else
                rm -rf $TEST_ROOTFS_IMAGE
-       fi
+               $CP $ROOTFS_IMAGE $TEST_ROOTFS_IMAGE
+               if [ $? -ne 0 ]; then
+                       Test_Info "Image ${ROOTFS_IMAGE} copy to ${TEST_ROOTFS_IMAGE} failed, return fail"
+                       return $ret
+               fi
 
-       $CP $ROOTFS_IMAGE $TEST_ROOTFS_IMAGE
+               export MACHINE=$QEMUARCH
 
-       if [ $? -ne 0 ]; then
-               Test_Info "Image ${ROOTFS_IMAGE} copy to ${TEST_ROOTFS_IMAGE} failed, return fail"
-               return $ret
+               # Create Qemu in localhost VNC Port 1
+               echo "Running xterm -display ${DISPLAY} -e 'BUILDDIR=${TOPDIR} ${RUNQEMU} ${KERNEL} ${TEST_ROOTFS_IMAGE}' &"
+               xterm -display ${DISPLAY} -e "BUILDDIR=${TOPDIR} ${RUNQEMU} ${KERNEL} ${TEST_ROOTFS_IMAGE}" &
+       
+               # Get the pid of the xterm processor, which will be used in Test_Kill_Qemu
+               PID=$!
        fi
 
-       export MACHINE=$QEMUARCH
-
-       # Create Qemu in localhost VNC Port 1
-       echo "Running xterm -display ${DISPLAY} -e 'BUILDDIR=${TOPDIR} ${RUNQEMU} ${KERNEL} ${TEST_ROOTFS_IMAGE}' &"
-       xterm -display ${DISPLAY} -e "BUILDDIR=${TOPDIR} ${RUNQEMU} ${KERNEL} ${TEST_ROOTFS_IMAGE}" &
-
-       # Get the pid of the xterm processor, which will be used in Test_Kill_Qemu
-       PID=$!
-
        while [ ${up_time} -lt 10 ]
        do
                Test_Check_Qemu_UP
@@ -437,7 +478,7 @@ Test_Create_Qemu()
        do
                Test_Check_IP_UP ${TARGET_IPADDR}
                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
                        break
                else
@@ -451,7 +492,8 @@ Test_Create_Qemu()
                Test_Info "Qemu and its network is up"
                return $ret
        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
        fi
 }
index d3168a973cb068f5e9ee7566178f9a8356c1549d..29dbfd9bb9b70426b75a88f0f4db607569352ed0 100755 (executable)
@@ -11,7 +11,7 @@
 
 . $POKYBASE/scripts/qemuimage-testlib
 
-TIMEOUT=200
+TIMEOUT=400
 RET=1
 
 # Start qemu and check its network
index 6e19b81b16aad83916923c8f6255a46499a530a3..fca6a2784580855c360e0563e7b5724f2646ae10 100755 (executable)
@@ -11,7 +11,7 @@
 
 . $POKYBASE/scripts/qemuimage-testlib
 
-TIMEOUT=200
+TIMEOUT=400
 RET=1
 
 # Start qemu and check its network
index d98d7aff84e36760d08db39ef60c6153f93a14f4..5ed31b735fbde16df308f4ccd64fec05c278891c 100755 (executable)
@@ -11,7 +11,7 @@
 
 . $POKYBASE/scripts/qemuimage-testlib
 
-TIMEOUT=200
+TIMEOUT=400
 RET=1
 
 # Start qemu and check its network
index 76639019625a7160381f39c39b6e0c8efb419e5f..08017ffbe68aeb400a58174bb1cb703e095c905b 100755 (executable)
@@ -11,7 +11,7 @@
 
 . $POKYBASE/scripts/qemuimage-testlib
 
-TIMEOUT=200
+TIMEOUT=400
 RET=1
 
 # Start qemu and check its network
index ca19857928b6ebdd4c71bc236b136d525794a131..c72cdc9d654a792dae654c9c5c9db7aa92cf8f24 100755 (executable)
@@ -11,7 +11,7 @@
 
 . $POKYBASE/scripts/qemuimage-testlib
 
-TIMEOUT=200
+TIMEOUT=400
 RET=1
 SPID=0
 i=0
index dde03c9a10011ce95e9ff68d84c8770ab31b6cfa..bc08cf0fdc0a5ae7e3d5f135a86700b4b8999231 100755 (executable)
 
 . $POKYBASE/scripts/qemuimage-testlib
 
-if [ $SHARE_IMAGE -eq 0 ]; then
-       TIMEOUT=200
-elif [ $SHARE_IMAGE -eq 1 ]; then
-       TIMEOUT=500
-fi
+TIMEOUT=400
 
 RET=1
 i=0
@@ -66,6 +62,11 @@ fi
 if [ ${RET} -eq 0 ]; then
        Test_Info "Shutdown Test PASS"
        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
 else
        Test_Info "Shutdown Test FAIL"
index e0ade72ca322b8f6e26d23c5f25ac44cb359ddc8..2a0e934392b6a58e202523a7495d02917d50241c 100755 (executable)
@@ -11,7 +11,7 @@
 
 . $POKYBASE/scripts/qemuimage-testlib
 
-TIMEOUT=200
+TIMEOUT=400
 RET=1
 
 # Start qemu and check its network
index 48e121c9e1e880566224e3549c8eef27769641ec..1ab6d2407fe53695990660afd3bbc36d7c647022 100755 (executable)
@@ -11,7 +11,7 @@
 
 . $POKYBASE/scripts/qemuimage-testlib
 
-TIMEOUT=200
+TIMEOUT=400
 RET=1
 
 # Start qemu and check its network
index 9ae69ebf1fc6b294bff28d5a70ba153480b34cb5..d6bcd27a34b0409db4f971dbc071f5c3610f37c5 100755 (executable)
@@ -11,7 +11,7 @@
 
 . $POKYBASE/scripts/qemuimage-testlib
 
-TIMEOUT=200
+TIMEOUT=400
 RET=1
 
 # Start qemu and check its network
index 0eb1926cfdce217906fb26e93e8453ad1db208c1..4fa6068768bc5c72d50523bd6008879bba5f7b13 100644 (file)
@@ -1,8 +1,7 @@
-sanity shutdown
-sanity boot
 sanity ssh
 sanity scp
 sanity dmesg
 sanity zypper_help
 sanity zypper_search
 sanity rpm_query
+sanity shutdown
index b60a89af5115e295793a8b196b75262b3779f210..7a6353e1afa5fb938a54cda677f9ad1a943194f1 100644 (file)
@@ -1,5 +1,3 @@
-sanity shutdown
-sanity boot
 sanity ssh
 sanity scp
 sanity dmesg
@@ -7,3 +5,4 @@ sanity zypper_help
 sanity zypper_search
 sanity rpm_query
 sanity connman
+sanity shutdown
index 53c9ad591e142eea3ccd0f7f3ef1d742fcba5ef9..42b8e19026e2fb487d0e77449c8342e3ec489fc3 100644 (file)
@@ -1,5 +1,3 @@
-sanity shutdown
-sanity boot
 sanity ssh
 sanity scp
 sanity dmesg
@@ -8,3 +6,4 @@ sanity zypper_search
 sanity rpm_query
 sanity compiler
 sanity connman
+sanity shutdown
index 0eb1926cfdce217906fb26e93e8453ad1db208c1..4fa6068768bc5c72d50523bd6008879bba5f7b13 100644 (file)
@@ -1,8 +1,7 @@
-sanity shutdown
-sanity boot
 sanity ssh
 sanity scp
 sanity dmesg
 sanity zypper_help
 sanity zypper_search
 sanity rpm_query
+sanity shutdown
index b60a89af5115e295793a8b196b75262b3779f210..7a6353e1afa5fb938a54cda677f9ad1a943194f1 100644 (file)
@@ -1,5 +1,3 @@
-sanity shutdown
-sanity boot
 sanity ssh
 sanity scp
 sanity dmesg
@@ -7,3 +5,4 @@ sanity zypper_help
 sanity zypper_search
 sanity rpm_query
 sanity connman
+sanity shutdown
index 53c9ad591e142eea3ccd0f7f3ef1d742fcba5ef9..42b8e19026e2fb487d0e77449c8342e3ec489fc3 100644 (file)
@@ -1,5 +1,3 @@
-sanity shutdown
-sanity boot
 sanity ssh
 sanity scp
 sanity dmesg
@@ -8,3 +6,4 @@ sanity zypper_search
 sanity rpm_query
 sanity compiler
 sanity connman
+sanity shutdown
index 0eb1926cfdce217906fb26e93e8453ad1db208c1..4fa6068768bc5c72d50523bd6008879bba5f7b13 100644 (file)
@@ -1,8 +1,7 @@
-sanity shutdown
-sanity boot
 sanity ssh
 sanity scp
 sanity dmesg
 sanity zypper_help
 sanity zypper_search
 sanity rpm_query
+sanity shutdown
index b60a89af5115e295793a8b196b75262b3779f210..7a6353e1afa5fb938a54cda677f9ad1a943194f1 100644 (file)
@@ -1,5 +1,3 @@
-sanity shutdown
-sanity boot
 sanity ssh
 sanity scp
 sanity dmesg
@@ -7,3 +5,4 @@ sanity zypper_help
 sanity zypper_search
 sanity rpm_query
 sanity connman
+sanity shutdown
index 53c9ad591e142eea3ccd0f7f3ef1d742fcba5ef9..42b8e19026e2fb487d0e77449c8342e3ec489fc3 100644 (file)
@@ -1,5 +1,3 @@
-sanity shutdown
-sanity boot
 sanity ssh
 sanity scp
 sanity dmesg
@@ -8,3 +6,4 @@ sanity zypper_search
 sanity rpm_query
 sanity compiler
 sanity connman
+sanity shutdown
index 0eb1926cfdce217906fb26e93e8453ad1db208c1..4fa6068768bc5c72d50523bd6008879bba5f7b13 100644 (file)
@@ -1,8 +1,7 @@
-sanity shutdown
-sanity boot
 sanity ssh
 sanity scp
 sanity dmesg
 sanity zypper_help
 sanity zypper_search
 sanity rpm_query
+sanity shutdown
index b60a89af5115e295793a8b196b75262b3779f210..7a6353e1afa5fb938a54cda677f9ad1a943194f1 100644 (file)
@@ -1,5 +1,3 @@
-sanity shutdown
-sanity boot
 sanity ssh
 sanity scp
 sanity dmesg
@@ -7,3 +5,4 @@ sanity zypper_help
 sanity zypper_search
 sanity rpm_query
 sanity connman
+sanity shutdown
index 53c9ad591e142eea3ccd0f7f3ef1d742fcba5ef9..42b8e19026e2fb487d0e77449c8342e3ec489fc3 100644 (file)
@@ -1,5 +1,3 @@
-sanity shutdown
-sanity boot
 sanity ssh
 sanity scp
 sanity dmesg
@@ -8,3 +6,4 @@ sanity zypper_search
 sanity rpm_query
 sanity compiler
 sanity connman
+sanity shutdown
index 0eb1926cfdce217906fb26e93e8453ad1db208c1..4fa6068768bc5c72d50523bd6008879bba5f7b13 100644 (file)
@@ -1,8 +1,7 @@
-sanity shutdown
-sanity boot
 sanity ssh
 sanity scp
 sanity dmesg
 sanity zypper_help
 sanity zypper_search
 sanity rpm_query
+sanity shutdown
index b60a89af5115e295793a8b196b75262b3779f210..7a6353e1afa5fb938a54cda677f9ad1a943194f1 100644 (file)
@@ -1,5 +1,3 @@
-sanity shutdown
-sanity boot
 sanity ssh
 sanity scp
 sanity dmesg
@@ -7,3 +5,4 @@ sanity zypper_help
 sanity zypper_search
 sanity rpm_query
 sanity connman
+sanity shutdown
index 53c9ad591e142eea3ccd0f7f3ef1d742fcba5ef9..42b8e19026e2fb487d0e77449c8342e3ec489fc3 100644 (file)
@@ -1,5 +1,3 @@
-sanity shutdown
-sanity boot
 sanity ssh
 sanity scp
 sanity dmesg
@@ -8,3 +6,4 @@ sanity zypper_search
 sanity rpm_query
 sanity compiler
 sanity connman
+sanity shutdown