[PATCH 1/1] UBUNTU: SAUCE: ubuntu_xilinx: Initial commit of Xilinx test suite

Po-Hsu Lin po-hsu.lin at canonical.com
Mon Sep 19 05:56:29 UTC 2022


Hello Portia,
please find inline reply.

On Fri, Sep 16, 2022 at 7:09 PM Portia Stephens
<portia.stephens at canonical.com> wrote:
>
> This contains the initial code for ubuntu_xilinx tests. It contains one
> test splat which checks for kernel errors.
>
> Signed-off-by: Portia Stephens <portia.stephens at canonical.com>
> ---
>  ubuntu_xilinx/control          |  17 +++
>  ubuntu_xilinx/lib/run-test     | 202 +++++++++++++++++++++++++++++++++
>  ubuntu_xilinx/tests/splat      |  25 ++++
>  ubuntu_xilinx/ubuntu_xilinx.py |  14 +++
>  4 files changed, 258 insertions(+)
>  create mode 100644 ubuntu_xilinx/control
>  create mode 100755 ubuntu_xilinx/lib/run-test
>  create mode 100755 ubuntu_xilinx/tests/splat
>  create mode 100644 ubuntu_xilinx/ubuntu_xilinx.py
>
> diff --git a/ubuntu_xilinx/control b/ubuntu_xilinx/control
> new file mode 100644
> index 00000000..b56d00f4
> --- /dev/null
> +++ b/ubuntu_xilinx/control
> @@ -0,0 +1,17 @@
> +AUTHOR = "Ubuntu"
> +NAME = "ubuntu_xilinx"
> +CRITERIA = """
> +Uses the linux-xilinx-zynqmp kernel repo
> +"""
> +SUITE = "None"
> +TIME = "SHORT"
> +TEST_CLASS = 'kernel'
> +TEST_CATEGORY = 'Functional'
> +TEST_TYPE = "client"
> +DOC = ""
> +
> +tests_dir = os.path.join(job.bindir, 'tests', NAME, 'tests')
> +tests_list = os.listdir(tests_dir)
> +tests_list.sort()
> +for test in tests_list:
> +    job.run_test_detail(NAME, test_name=test, tag=test, timeout=60*5)
> diff --git a/ubuntu_xilinx/lib/run-test b/ubuntu_xilinx/lib/run-test
> new file mode 100755
> index 00000000..bf05d82e
> --- /dev/null
> +++ b/ubuntu_xilinx/lib/run-test
> @@ -0,0 +1,202 @@
> +#!/bin/bash
> +#
> +# Wrapper script to run a Xilinx SoC regression test (RT)
> +# This script was copied and modified from:
> +# https://git.launchpad.net/~juergh/+git/raspi-rt
> +#
> +# The following global variables are available to the test scripts:
> +#   RT_TEST_NAME         - The name of the test being run
> +#   RT_UNAME             - System information (uname -a)
> +#   RT_OS_CODENAME       - The codename  of the OS (bionic, focal, ...)
> +#   RT_XILINX_MODEL      - Xilinx SoC full model name
> +#   RT_XILINX_BOARD      - Xilinx board (KV260, KR260, ZCU102, ...)
> +#   RT_XILINX_REV        - Xilinx SoC odel revision (1, 2, A, ...)
> +#
> +# The following are global variables that can be defined by tests:
> +#   RT_TEMP_FILE  - If non-empty, will be deleted when the test terminates.
> +#
> +
> +set -e
> +set -u
> +
> +# -----------------------------------------------------------------------------
> +# Public functions
> +#
> +# All public functions start with 'rt_'
> +#
> +
> +function rt_echo()
> +{
> +       echo "[${RT_TEST_NAME}] ${*}"
> +}
> +
> +function rt_fail()
> +{
> +       rt_echo "Test failure: ${*}" >&2
> +}
> +
> +function rt_assert()
> +{
> +       local val1=${1} val2=${2} msg=${3}
> +
> +       if [ "${val1}" != "${val2}" ] ; then
> +               rt_fail "${msg}"
> +               rt_fail "${val1} != ${val2}"
> +               return 1
> +       fi
> +}
> +
> +function rt_reboot_required()
> +{
> +       touch "${_RT_REBOOT_FLAG}"
> +       return 126
> +}
> +
> +# -----------------------------------------------------------------------------
> +# Private functions
> +#
> +# All private functions start with '_'
> +#
> +
> +function _out()
> +{
> +       local rc=${?}
> +
> +       trap - EXIT INT TERM HUP
> +
> +       # Cleanup after the test
> +       if [ -n "${RT_TEMP_FILE:-}" ] ; then
> +               rm -f "${RT_TEMP_FILE}"
> +       fi
> +
> +       if [ "${_RT_PRINT_TEST_RESULT}" -eq 1 ] ; then
> +               case "${rc}" in
> +                       0)   rt_echo "Test result: PASSED" ;;
> +                       125) rt_echo "Test result: SKIPPED" ;;
> +                       126) rt_echo "Test result: REBOOT_REQUIRED" ;;
> +                       *)   rt_echo "Test result: FAILED" >&2 ;;
> +               esac
> +       fi
> +
> +       exit "${rc}"
> +}
> +
> +function _set_globals()
> +{
> +       # Test name
> +       RT_TEST_NAME=$(basename "${0}")
> +
> +       # Print a test result string at the end
> +       _RT_PRINT_TEST_RESULT=1
> +
> +       # Check for empty globals
> +       _RT_CHECK_EMPTY_GLOBALS=1
> +
> +       # Per-test reboot flag
> +       _RT_REBOOT_FLAG=/tmp/xilinx-rt.reboot.${RT_TEST_NAME}
> +
> +       # OS Codename
> +       RT_OS_CODENAME=$(lsb_release -s -c)
> +       RT_OS_CODENAME=${RT_OS_CODENAME,,}
> +       RT_OS_CODENAME=${RT_OS_CODENAME^}
> +
> +       # System information
> +       RT_UNAME=$(uname -a)
> +
> +       # Boot directory
> +       if [ -d /boot/firmware ] ; then
> +               RT_BOOT_DIR=/boot/firmware
> +       else
> +               RT_BOOT_DIR=/boot
> +       fi
> +
> +       # shellcheck disable=SC2002
> +       RT_XILINX_MODEL=$(cat /proc/device-tree/model 2>/dev/null | \
> +                                                tr -d '\0\n')
> +
> +       # Find the board
> +       RT_XILINX_BOARD=$(cat /proc/device-tree/compatible | grep -ao kv260 | head -1)
> +       RT_XILINX_BOARD="$RT_XILINX_BOARD $(cat /proc/device-tree/compatible | grep -ao kr260 | head -1)"
> +       RT_XILINX_BOARD="$RT_XILINX_BOARD $(cat /proc/device-tree/compatible | grep -ao zcu102 | head -1)"
> +       RT_XILINX_BOARD="$RT_XILINX_BOARD $(cat /proc/device-tree/compatible | grep -ao zcu104 | head -1)"
> +       RT_XILINX_BOARD="$RT_XILINX_BOARD $(cat /proc/device-tree/compatible | grep -ao zcu106 | head -1)"
> +
> +
> +       # Compute the model revision
> +       RT_XILINX_REV=${RT_XILINX_MODEL#* Rev}
> +
> +       # Hack to silence shellcheck SC2034
> +       export RT_UNAME RT_BOOT_DIR RT_XILINX_REV \
> +               RT_XILINX_BOARD
> +}
> +
> +function _print_globals()
> +{
> +       local var error
> +
> +       rt_echo "-- Globals --"
> +
> +       error=0
> +       while IFS= read -r var ; do
> +               if [ -z "${!var}" ] ; then
> +                       error=1
> +               fi
> +               rt_echo "$(printf "%-22s: %s" "${var}" "${!var}")"
> +       done < <(compgen -A variable | grep '^RT_')
> +
> +       if [ "${_RT_CHECK_EMPTY_GLOBALS}" -eq 1 ] && [ "${error}" -ne 0 ] ; then
> +               rt_fail "Empty global(s) found"
> +               return 1
> +       fi
> +}
> +
> +function _run_test()
> +{
> +       # Bail out if a reboot is required
> +       if [ -e "${_RT_REBOOT_FLAG}" ] ; then
> +               rt_echo "A reboot is required to continue the test"
> +               return 126
> +       fi
> +
> +       if [ "$(type -t rt_test_setup)" = "function" ] ; then
> +               rt_echo "-- Test setup --"
> +               rt_test_setup
> +       fi
> +
> +       rt_echo "-- Test --"
> +       rt_test
> +
> +       if [ "$(type -t rt_test_cleanup)" = "function" ] ; then
> +               rt_echo "-- Test cleanup --"
> +               rt_test_cleanup
> +       fi
> +
> +       rt_echo "-- Test done --"
> +}
> +
> +# -----------------------------------------------------------------------------
> +# Main entry point
> +
> +# Install a generic exit handler
> +trap _out EXIT INT TERM HUP
> +
> +# Set the globals
> +_set_globals
> +
> +case "${1:-}" in
> +       ""|run)
> +               # Print the globals and run the test
> +               _print_globals
> +               _run_test
> +               ;;
> +       globals)
> +               # Print the globals
> +               _RT_PRINT_TEST_RESULT=0
> +               _RT_CHECK_EMPTY_GLOBALS=0
> +               _print_globals
> +               ;;
> +       *)
> +               echo "Invalid test command: ${1}" >&2
> +               exit 2
> +               ;;
> +esac
> diff --git a/ubuntu_xilinx/tests/splat b/ubuntu_xilinx/tests/splat
> new file mode 100755
> index 00000000..165f86ec
> --- /dev/null
> +++ b/ubuntu_xilinx/tests/splat
> @@ -0,0 +1,25 @@
> +#!/bin/bash
> +#
> +# splat: Check dmesg for kernel splats
> +#
> +
> +function rt_test()
> +{
> +       regexes=(
> +               "---\[\scut\shere\s\]---"
> +               "\sBUG:\s"
> +               "\sCall trace:"
> +       )
> +       regex=$(printf "%s|" "${regexes[@]}")
> +       regex=${regex%|}
> +
> +       if sudo dmesg | grep -qP -- "${regex}" ; then
dmesg will be cleared once the test gets started by autotest,
so this will never capture anything if you're trying to detect them on
a freshly rebooted system.

See:
https://git.launchpad.net/~canonical-kernel-team/+git/autotest/tree/client/base_sysinfo.py#n188

To verify this, you can try something like:
echo "BUG: This is a test" | sudo tee /dev/kmsg
Then run the splat script directly vs. run the whole test with autotest

We have an ubuntu_boot test that will check for these patterns in
/var/log/syslog after boot:
            'kernel: \[ *\d+\.\d+\] BUG:.*',
            'kernel: \[ *\d+\.\d+\] Oops:.*',
            'kernel: \[ *\d+\.\d+\] kernel BUG at.*',
            'kernel: \[ *\d+\.\d+\] WARNING:.*'
(/var/log/syslog will be rotated by our infrastructure code, CKCT,
during the deployment stage)

xilinx kernel will be tested with this test. Do you think this will be enough?

BTW for autotest-client-tests changes, you can open a merge proposal
on launchpad as well.
https://code.launchpad.net/~canonical-kernel-team/+git/autotest-client-tests/+ref/master

Thanks
Sam

> +               rt_fail "Kernel errors found"
> +               sudo dmesg
> +               return 1
> +       fi
> +}
> +
> +root=$(cd "$(dirname "${BASH_SOURCE[0]}")"/.. && pwd)
> +# shellcheck disable=SC1090
> +. "${root}"/lib/run-test
> diff --git a/ubuntu_xilinx/ubuntu_xilinx.py b/ubuntu_xilinx/ubuntu_xilinx.py
> new file mode 100644
> index 00000000..af14a863
> --- /dev/null
> +++ b/ubuntu_xilinx/ubuntu_xilinx.py
> @@ -0,0 +1,14 @@
> +from autotest.client import test, utils
> +import os
> +
> +class ubuntu_xilinx(test.test):
> +    version = 1
> +
> +    def initialize(self):
> +        pass
> +
> +    def run_once(self, test_name):
> +        cmd = os.path.join(self.bindir, 'tests', test_name)
> +        utils.system_output(cmd, retain_output=True)
> +
> +# vi:set ts=4 sw=4 expandtab syntax=python:
> --
> 2.34.1
>
>
> --
> kernel-team mailing list
> kernel-team at lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team



More information about the kernel-team mailing list