Skip to content

Latest commit

 

History

History
306 lines (264 loc) · 202 KB

README.en.md

File metadata and controls

306 lines (264 loc) · 202 KB

mugen

About mugen

mugen is a testing framework provided by openEuler community. This repo contains mugen along with testcases and testsuits for openEuler risc-v port.

Update log

  • New mugen entry function
  • Added support for setting testsuit directory and testing envrionment
  • Added python util functions for testing

How to use

Installation

Simply run bash dep_install.sh.

Set testing envrionment

  • run bash mugen.sh -c --ip $ip --password $passwd --user $user --port $port
  • Parameters
    • ip: ip address of target machine
    • user: username of target machine, default is root
    • password
    • port: ssh port of target machine, default is22
  • Configuration file is located at ./conf/env.json
{
    "NODE": [
        {
            "ID": 1,
            "LOCALTION": "local",
            "MACHINE": "physical",
            "FRAME": "aarch64",
            "NIC": "eth0",
            "MAC": "55:54:00:c8:a9:21",
            "IPV4": "192.168.0.10",
            "USER": "root",
            "PASSWORD": "openEuler12#$",
            "SSH_PORT": 22,
            "BMC_IP": "",
            "BMC_USER": "",
            "BMC_PASSWORD": ""
        },
        {
            "ID": 2,
            "LOCALTION": "remote",
            "MACHINE": "kvm",
            "FRAME": "aarch64",
            "NIC": "eth0",
            "MAC": "55:54:00:c8:a9:22",
            "IPV4": "192.168.0.11",
            "USER": "root",
            "PASSWORD": "openEuler12#$",
            "SSH_PORT": 22,
            "HOST_IP": "",
            "HOST_USER": "",
            "HOST_PASSWORD": ""
            "HOST_SSH_PORT": ""
        }
    ]
}
  • In the testcases, use NODE${id}_${LOCALTION} to use the configured environment.

Run the test

  • Run all test cases bash mugen.sh -a
  • Run a test suit bash mugen.sh -f testsuite
  • Run a test case bash mugen.sh -f testsuite -r testcase
  • Scve the testing log
bash mugen.sh -a -x 
bash mugen.sh -f testsuite -x
bash mugen.sh -f testsuite -r testcase -x

Write your test case

  • Follow the template we provided:
source ${OET_PATH}/libs/locallibs/common_lib.sh

# Load the data and config 
function config_params() {
    LOG_INFO "Start to config params of the case."

    LOG_INFO "No params need to config."

    LOG_INFO "End to config params of the case."
}

# Prepare the testing environment, eg. Install required packages
function pre_test() {
    LOG_INFO "Start to prepare the test environment."

    LOG_INFO "No pkgs need to install."

    LOG_INFO "End to prepare the test environment."
}

# Run the test
function run_test() {
    LOG_INFO "Start to run test."

    # to test ls
    ls -CZl -all
    CHECK_RESULT 0

    # To check the result
    CHECK_RESULT "$(ls / | grep -cE 'proc|usr|roor|var|sys|etc|boot|dev')" 7

    LOG_INFO "End to run test."
}

# Cleaning the testing environment
function post_test() {
    LOG_INFO "Start to restore the test environment."

    LOG_INFO "Nothing to do."

    LOG_INFO "End to restore the test environment."
}

main "$@"
  • A testcase is a shell/python script, and a return value of 0 indicates a successful test.
    • Examples: oe_test_casename_02 and oe_test_casename_03

The json file in suite2cases

  • The json file is a configuration of a test suit.
  • Note that:

Util functions provided by mugen

  • How to load and call these util functions
# bash
source ${OET_PATH}/libs/locallibs/common_lib.sh

# python
import os, sys, subprocess

LIBS_PATH = os.environ.get("OET_PATH") + "/libs/locallibs"
sys.path.append(LIBS_PATH)
import xxx
  • Util functions
    • Logging
    # bash 
    LOG_INFO "$message"
    LOG_WARN "$message"
    LOG_DEBUG "$message"
    LOG_ERROR "$message"
    # python
    import mugen_log
    mugen_log.logging(level, message) # level:INFO,WARN,DEBUG,ERROR;message:日志输出
    
    • Check result
    # bash
    CHECK_RESULT $1 $2 $3 $4
    # $1: Return value of last command
    # $2: Expected value
    # $3: Comp mode, 0: ret == expected -> successful ; 1: ret != expected -> successful
    # $4: Output of 
    
    • Install/Uninstall of rpm packages
    # bash
    ## func 1
    DNF_INSTALL "vim bc" "$node_id"
    DNF_REMOVE "$node_id" "jq" "$mode"
    
    # mode: Default 0, indicates normal removal of the package; when mode is not 0, mugen will only remove the required package.
    # python
    import rpm_manage
    tpmfile = rpm_manage.rpm_install(pkgs, node, tmpfile)
    rpm_manage.rpm_remove(node, pkgs, tmpfile)
    
    • Remote execution
    # bash
    ## func 1
    SSH_CMD "$cmd" $remote_ip $remote_password $remote_user $time_out $remote_port`
    ## func 2
    P_SSH_CMD --cmd $cmd --node $node(PORT)
    P_SSH_CMD --cmd $cmd --ip $remote_ip --password $remote_password --port $remote_port --user $remote_user --timeout $timeout
    # python
    conn = ssh_cmd.pssh_conn(remote_ip, remote_password,remote_port,remote_user,remote_timeout)
    exitcode, output = ssh_cmd.pssh_cmd(conn, cmd)
    
    # port: default is 22
    # user: default is root
    # timeout: default is unlimited
    
    • File transfer
    # bash
    ## func 1
    ### local -> remote  
    `SSH_SCP $local_path/$file $REMOTE_USER@$REMOTE_IP:$remote_path "$REMOTE_PASSWD"`
    ### local <- remote
    `SSH_SCP $REMOTE_USER@$REMOTE_IP:$remote_path/$file $local_path "$REMOTE_PASSWD"`
    ## func 2
    ### Transfer a directory
    SFTP get/put --localdir $localdir --remotedir $remotedir
    ### Transfer a file
    SFTP get/put --localdir $localdir --remotedir $remotedir --localfile/remotefile $localfile/$remotefile
    # python
    ### Transfer a directory
    import ssh_cmd, sftp
    conn = ssh_cmd.pssh_conn(remote_ip, remote_password,remote_port,remote_user,remote_timeout)
    psftp_get(conn,remote_dir, local_dir)
    psftp_put(local_dir=local_dir, remote_dir=remote_dir)
    ### Transfer a directory
    import ssh_cmd, sftp
    psftp_get(remote_dir, remote_file, local_dir)
    psftp_put(local_dir=local_dir, local_file=local_file, remote_dir=remote_dir)
    
    
    # get: get from remote
    # put: put into remote
    # localdir: default is local $(pwd)
    # remotedir: default is remote $(pwd)
    
    • Get a free port
    # bash
    GET_FREE_PORT $ip
    # python
    import free_port
    free_port.find_free_port(ip)
    
    • Check if a port is taken
    # bash 
    IS_FREE_PORT $port $ip
    # python
    import free_port
    free_port.is_free_port(port, ip)
    
    • Get a test NIC
    # bash
    TEST_NIC $node_id
    # python
    import get_test_device
    get_test_nic(node_id)
    
    # node_id: 默认为1号节点
    
    • Get a test Disk
    # bash
    TEST_DISK $node_id
    # python
    import get_test_device
    get_test_disk(node_id)
    
    # node_id: default is 1
    
    • Sleep
    # bash
    SLEEP_WAIT $wait_time $cmd
    # python
    import sleep_wait
    sleep_wait.sleep_wait(wait_time,cmd)
    
    • Reboot remote
    # bash
    REMOTE_REBOOT_WAIT $node_id $wait_time
    

How to debug your testcase

  • use export OET_PATH=$(pwd) to set OET_PATH and just run the script in their correspoding dir

About timeout

  • Default timeout is 30 min
  • If a test case costs more than 30 min,set TIMEOUT in the test case script

FAQ

  • Timeout in remote execution
    • Possible cause: ssh will wait for stdout and will not exit unless there is a signal
    • Possible solution: Redirect stdout to /dev/null, like cmd > /dev/nul 2>&1 &

Contribution

  1. Fork the repository
  2. Create Feat_xxx branch
  3. Commit your code
  4. Create Pull Request

Gitee Feature

  1. You can use Readme_XXX.md to support different languages, such as Readme_en.md, Readme_zh.md
  2. Gitee blog blog.gitee.com
  3. Explore open source project https://gitee.com/explore
  4. The most valuable open source project GVP
  5. The manual of Gitee https://gitee.com/help
  6. The most popular members https://gitee.com/gitee-stars/