diff options
author | Jiajun Xu <jiajun.xu@intel.com> | 2011-05-03 10:07:30 +0800 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2011-05-04 00:56:33 +0100 |
commit | ea4857a98b500e0b73d875b28c43e2d1d0f740b6 (patch) | |
tree | 23cbe4dab67160a869b2689949720b10de1a3c99 /scripts/qemuimage-testlib | |
parent | 49e2fcc60458853d7ff7f2908e695b11a95f3061 (diff) | |
download | poky-ea4857a98b500e0b73d875b28c43e2d1d0f740b6.tar.gz |
qemuimagetest: Enable toolchain automation tests in qemuimagetest
Enable toolchain automation tests in qemuimagetest framework. 3 C/C++ test
projects are added to test toolchain - cvs, iptables and sudoku-savant. User
needs to set TEST_SCEN to "toolchain" in local.conf to enable tests. Test case
will check if toolchain tarball exists under "${DEPLOY_DIR}/sdk". And it will
extract toolchain tarball into /opt. It requires user to chown /opt to non-root
user, who will run qemuimagetest.
Signed-off-by Jiajun Xu <jiajun.xu@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts/qemuimage-testlib')
-rwxr-xr-x | scripts/qemuimage-testlib | 232 |
1 files changed, 231 insertions, 1 deletions
diff --git a/scripts/qemuimage-testlib b/scripts/qemuimage-testlib index 5318ca636c..c39fb7ae21 100755 --- a/scripts/qemuimage-testlib +++ b/scripts/qemuimage-testlib | |||
@@ -19,6 +19,9 @@ TYPE="ext3" | |||
19 | # The folder to hold all scripts running on targets | 19 | # The folder to hold all scripts running on targets |
20 | TOOLS="$COREBASE/scripts/qemuimage-tests/tools" | 20 | TOOLS="$COREBASE/scripts/qemuimage-tests/tools" |
21 | 21 | ||
22 | # The folder to hold all projects for toolchain testing | ||
23 | TOOLCHAIN_PROJECTS="$COREBASE/scripts/qemuimage-tests/toolchain_projects" | ||
24 | |||
22 | # Test Directory on target for testing | 25 | # Test Directory on target for testing |
23 | TARGET_TEST_DIR="/opt/test" | 26 | TARGET_TEST_DIR="/opt/test" |
24 | 27 | ||
@@ -28,6 +31,24 @@ PID=0 | |||
28 | # Global variable for target ip address | 31 | # Global variable for target ip address |
29 | TARGET_IPADDR=0 | 32 | TARGET_IPADDR=0 |
30 | 33 | ||
34 | # Global variable for test project version during toolchain test | ||
35 | # Version of cvs is 1.11.23 | ||
36 | # Version of iptables is 1.4.9 | ||
37 | # Version of sudoku-savant is 1.3 | ||
38 | PROJECT_PV=0 | ||
39 | |||
40 | # Global variable for test project download URL during toolchain test | ||
41 | # URL of cvs is http://ftp.gnu.org/non-gnu/cvs/source/stable/1.11.23/cvs-1.11.23.tar.bz2 | ||
42 | # URL of iptables is http://netfilter.org/projects/iptables/files/iptables-1.4.9.tar.bz2 | ||
43 | # URL of sudoku-savant is http://downloads.sourceforge.net/project/sudoku-savant/sudoku-savant/sudoku-savant-1.3/sudoku-savant-1.3.tar.bz2 | ||
44 | PROJECT_DOWNLOAD_URL=0 | ||
45 | |||
46 | # SDK folder to hold toolchain tarball | ||
47 | TOOLCHAIN_DIR="${DEPLOY_DIR}/sdk" | ||
48 | |||
49 | # Toolchain test folder to hold extracted toolchain tarball | ||
50 | TOOLCHAIN_TEST="/opt" | ||
51 | |||
31 | # common function for information print | 52 | # common function for information print |
32 | Test_Error() | 53 | Test_Error() |
33 | { | 54 | { |
@@ -400,7 +421,7 @@ Test_Create_Qemu() | |||
400 | RUNQEMU=`which runqemu` | 421 | RUNQEMU=`which runqemu` |
401 | else | 422 | else |
402 | Test_Error "Can not find runqemu in \$PATH, return fail" | 423 | Test_Error "Can not find runqemu in \$PATH, return fail" |
403 | exit 1 | 424 | return 1 |
404 | fi | 425 | fi |
405 | 426 | ||
406 | if [ "$QEMUARCH" = "qemux86" -o "$QEMUARCH" = "qemux86-64" ]; then | 427 | if [ "$QEMUARCH" = "qemux86" -o "$QEMUARCH" = "qemux86-64" ]; then |
@@ -499,3 +520,212 @@ Test_Create_Qemu() | |||
499 | return $ret | 520 | return $ret |
500 | fi | 521 | fi |
501 | } | 522 | } |
523 | |||
524 | # Function to prepare test project for toolchain test | ||
525 | # $1 is the folder holding test project file | ||
526 | # $2 is the test project name | ||
527 | Test_Project_Prepare() | ||
528 | { | ||
529 | local toolchain_dir=$1 | ||
530 | local ret=1 | ||
531 | |||
532 | if [ ! -d ${toolchain_dir} ]; then | ||
533 | mkdir -p ${toolchain_dir} | ||
534 | ret=$? | ||
535 | |||
536 | if [ $ret -ne 0 ]; then | ||
537 | Test_Info "Create ${toolchain_dir} fail, return" | ||
538 | return $ret | ||
539 | fi | ||
540 | fi | ||
541 | |||
542 | ret=0 | ||
543 | # Download test project tarball if it does not exist | ||
544 | if [ ! -f ${toolchain_dir}/${2}-${PROJECT_PV}.${suffix} ]; then | ||
545 | wget -c -t 5 $PROJECT_DOWNLOAD_URL -O ${toolchain_dir}/${2}-${PROJECT_PV}.${suffix} | ||
546 | ret=$? | ||
547 | fi | ||
548 | |||
549 | # Extract the test project into ${TEST_TMP} | ||
550 | if [ $ret -eq 0 ]; then | ||
551 | tar jxf ${toolchain_dir}/${2}-${PROJECT_PV}.${suffix} -C ${TEST_TMP} | ||
552 | ret=$? | ||
553 | if [ $ret -eq 0 ]; then | ||
554 | Test_Info "Extract ${2}-${PROJECT_PV}.${suffix} into ${TEST_TMP} successfully" | ||
555 | return $ret | ||
556 | else | ||
557 | Test_Info "Fail to extract ${2}-${PROJECT_PV}.${suffix} into ${TEST_TMP}" | ||
558 | return $ret | ||
559 | fi | ||
560 | else | ||
561 | Test_Info "Fail to download ${2}-${PROJECT_PV}.${suffix} from $PROJECT_DOWNLOAD_URL" | ||
562 | rm -rf ${toolchain_dir}/${2}-${PROJECT_PV}.${suffix} | ||
563 | return $ret | ||
564 | fi | ||
565 | } | ||
566 | |||
567 | # Function to prepare toolchain environment | ||
568 | # $1 is toolchain directory to hold toolchain tarball | ||
569 | # $2 is prefix name for toolchain tarball | ||
570 | Test_Toolchain_Prepare() | ||
571 | { | ||
572 | local toolchain_dir=$1 | ||
573 | local sdk_name=$2 | ||
574 | local ret=1 | ||
575 | |||
576 | if [ ! -d ${toolchain_dir} ]; then | ||
577 | Test_Info "No directory ${toolchain_dir}, which holds toolchain tarballs" | ||
578 | return 1 | ||
579 | fi | ||
580 | |||
581 | # Check if there is any toolchain tarball under $toolchain_dir with prefix $sdk_name | ||
582 | for i in `dir ${toolchain_dir}` | ||
583 | do | ||
584 | echo $i | grep "${sdk_name}-toolchain-gmae" | ||
585 | if [ $? -eq 0 ]; then | ||
586 | rm -rf ${TEST_TMP}/opt | ||
587 | tar jxf ${toolchain_dir}/${i} -C ${TEST_TMP} | ||
588 | ret=$? | ||
589 | break | ||
590 | fi | ||
591 | done | ||
592 | |||
593 | if [ $ret -eq 0 ]; then | ||
594 | Test_Info "Check if /opt is accessible for non-root user" | ||
595 | |||
596 | # Check if the non-root test user has write access of $TOOLCHAIN_TEST | ||
597 | if [ -d ${TOOLCHAIN_TEST} ]; then | ||
598 | touch ${TOOLCHAIN_TEST} | ||
599 | if [ $? -ne 0 ]; then | ||
600 | Test_Info "Has no right to modify folder $TOOLCHAIN_TEST, pls. chown it to test user" | ||
601 | return 2 | ||
602 | fi | ||
603 | else | ||
604 | mkdir -p ${TOOLCHAIN_TEST} | ||
605 | if [ $? -ne 0 ]; then | ||
606 | Test_Info "Has no right to create folder $TOOLCHAIN_TEST, pls. create it and chown it to test user" | ||
607 | return 2 | ||
608 | fi | ||
609 | fi | ||
610 | |||
611 | # If there is a toolchain folder under $TOOLCHAIN_TEST, let's remove it | ||
612 | if [ -d ${TOOLCHAIN_TEST}/poky ]; then | ||
613 | rm -rf ${TOOLCHAIN_TEST}/poky | ||
614 | fi | ||
615 | |||
616 | # Copy toolchain into $TOOLCHAIN_TEST | ||
617 | cp -r ${TEST_TMP}/opt/poky ${TOOLCHAIN_TEST} | ||
618 | ret=$? | ||
619 | |||
620 | if [ $ret -eq 0 ]; then | ||
621 | Test_Info "Successfully copy toolchain into $TOOLCHAIN_TEST" | ||
622 | return $ret | ||
623 | else | ||
624 | Test_Info "Meet error when copy toolchain into $TOOLCHAIN_TEST" | ||
625 | return $ret | ||
626 | fi | ||
627 | else | ||
628 | Test_Info "No tarball named ${sdk_name}-toolchain-gmae under ${toolchain_dir}" | ||
629 | return $ret | ||
630 | fi | ||
631 | } | ||
632 | |||
633 | # Function to execute command and exit if run out of time | ||
634 | # $1 is timeout value | ||
635 | # $2 is the command to be executed | ||
636 | Test_Time_Out() | ||
637 | { | ||
638 | local timeout=$1 | ||
639 | shift | ||
640 | local command=$* | ||
641 | local date=0 | ||
642 | local tmp=`mktemp` | ||
643 | local ret=1 | ||
644 | |||
645 | # Run command in background | ||
646 | ($command; echo $? > $tmp) & | ||
647 | while ps -e -o pid | grep -qw $!; do | ||
648 | if [ $date -ge $timeout ]; then | ||
649 | Test_Info "$timeout Timeout when running command $command" | ||
650 | rm -rf $tmp | ||
651 | return 1 | ||
652 | fi | ||
653 | sleep 5 | ||
654 | date=`expr $date + 5` | ||
655 | done | ||
656 | ret=`cat $tmp` | ||
657 | rm -rf $tmp | ||
658 | return $ret | ||
659 | } | ||
660 | |||
661 | # Function to test toolchain | ||
662 | # $1 is test project name | ||
663 | # $2 is the timeout value | ||
664 | Test_Toolchain() | ||
665 | { | ||
666 | local test_project=$1 | ||
667 | local timeout=$2 | ||
668 | local ret=1 | ||
669 | local suffix="tar.bz2" | ||
670 | local env_setup="" | ||
671 | local pro_install="${TEST_TMP}/pro_install" | ||
672 | |||
673 | # Set value for PROJECT_PV and PROJECT_DOWNLOAD_URL accordingly | ||
674 | if [ $test_project == "cvs" ]; then | ||
675 | PROJECT_PV=1.11.23 | ||
676 | PROJECT_DOWNLOAD_URL="http://ftp.gnu.org/non-gnu/cvs/source/stable/1.11.23/cvs-1.11.23.tar.bz2" | ||
677 | elif [ $test_project == "iptables" ]; then | ||
678 | PROJECT_PV=1.4.9 | ||
679 | PROJECT_DOWNLOAD_URL="http://netfilter.org/projects/iptables/files/iptables-1.4.9.tar.bz2" | ||
680 | elif [ $test_project == "sudoku-savant" ]; then | ||
681 | PROJECT_PV=1.3 | ||
682 | PROJECT_DOWNLOAD_URL="http://downloads.sourceforge.net/project/sudoku-savant/sudoku-savant/sudoku-savant-1.3/sudoku-savant-1.3.tar.bz2" | ||
683 | else | ||
684 | Test_Info "Unknown test project name $test_project" | ||
685 | return 1 | ||
686 | fi | ||
687 | |||
688 | # Download test project and extract it | ||
689 | Test_Project_Prepare $TOOLCHAIN_PROJECTS $test_project | ||
690 | if [ $? -ne 0 ]; then | ||
691 | Test_Info "Prepare test project file failed" | ||
692 | return 1 | ||
693 | fi | ||
694 | |||
695 | # Extract toolchain tarball into ${TEST_TMP} | ||
696 | Test_Toolchain_Prepare $TOOLCHAIN_DIR $SDK_NAME | ||
697 | ret=$? | ||
698 | if [ $ret -ne 0 ]; then | ||
699 | Test_Info "Prepare toolchain test environment failed" | ||
700 | return $ret | ||
701 | fi | ||
702 | |||
703 | if [ ! -d ${pro_install} ]; then | ||
704 | mkdir -p ${pro_install} | ||
705 | fi | ||
706 | |||
707 | # Begin to build test project in toolchain environment | ||
708 | env_setup=`find ${TOOLCHAIN_TEST}/poky -name "environment-setup*"` | ||
709 | |||
710 | source $env_setup | ||
711 | |||
712 | if [ $test_project == "cvs" -o $test_project == "iptables" ]; then | ||
713 | cd ${TEST_TMP}/${test_project}-${PROJECT_PV} | ||
714 | Test_Time_Out $timeout ./configure ${CONFIGURE_FLAGS} || { Test_Info "configure failed with $test_project"; return 1; } | ||
715 | Test_Time_Out $timeout make -j4 || { Test_Info "make failed with $test_project"; return 1; } | ||
716 | Test_Time_Out $timeout make install DESTDIR=${pro_install} || { Test_Info "make failed with $test_project"; return 1; } | ||
717 | cd - | ||
718 | ret=0 | ||
719 | elif [ $test_project == "sudoku-savant" ]; then | ||
720 | cd ${TEST_TMP}/${test_project}-${PROJECT_PV} | ||
721 | Test_Time_Out $timeout ./configure ${CONFIGURE_FLAGS} || { Test_Info "configure failed with $test_project"; return 1; } | ||
722 | Test_Time_Out $timeout make -j4 || { Test_Info "make failed with $test_project"; return 1; } | ||
723 | cd - | ||
724 | ret=0 | ||
725 | else | ||
726 | Test_Info "Unknown test project $test_project" | ||
727 | ret=1 | ||
728 | fi | ||
729 | |||
730 | return $ret | ||
731 | } | ||