diff mbox series

[ACT] UBUNTU: SAUCE: ubuntu_kernel_selftests: granularity improvement

Message ID 20211109083255.21613-1-po-hsu.lin@canonical.com
State New
Headers show
Series [ACT] UBUNTU: SAUCE: ubuntu_kernel_selftests: granularity improvement | expand

Commit Message

Po-Hsu Lin Nov. 9, 2021, 8:32 a.m. UTC
BugLink: https://bugs.launchpad.net/bugs/1941052

This patch will change how we run those test cases in the selftests
directory of a kernel tree:
  * Test will now abort early if the setup() has failed
  * Each test suite will be built first with a SUITE_NAME-build job,
    we will be able to distinguish build failures and actual test
    failures more easily.
  * Each test inside a suite will be executed one-by-one with name in
    a format of SUITE:CASE, e.g. net:test_bpf.sh, this will help us
    to improve our result hinting process, make the test report
    become more reliable and easier to gate new regressions.
  * Use a helper.mk file to get the executable test names, by doing
    so we can workaround the issue caused by kernel source code
    difference across various releases.
  * Remove the summary section, we won't have a summary for a whole
    suite in the end of the test. I think this feature can be added
    back if needed.
  * Remove out-dated control files.
  * Trusty control file is untouched as this test is blacklisted.

This patch has been tested on KVM instances with X/F/H/I kernel on our
dev jenkins and X-4.15/B-4.15/B-5.4/F/H/I Oracle kernel with SRU cycle
sru-20211018, the overall result is looking good. Bionic kernel will
need fix in bug 1949889 to land first to make net tests working
properly.

Signed-off-by: Po-Hsu Lin <po-hsu.lin@canonical.com>
---
 ubuntu_kernel_selftests/control               | 28 ++++--
 ubuntu_kernel_selftests/control.ubuntu.artful | 21 -----
 ubuntu_kernel_selftests/control.ubuntu.utopic | 21 -----
 ubuntu_kernel_selftests/control.ubuntu.vivid  | 21 -----
 ubuntu_kernel_selftests/control.ubuntu.wily   | 21 -----
 ubuntu_kernel_selftests/control.ubuntu.xenial | 24 +++--
 .../control.ubuntu.yakkety                    | 21 -----
 ubuntu_kernel_selftests/control.ubuntu.zesty  | 21 -----
 ubuntu_kernel_selftests/helper.mk             |  2 +
 .../ubuntu_kernel_selftests.py                | 88 +++++++++----------
 10 files changed, 84 insertions(+), 184 deletions(-)
 delete mode 100644 ubuntu_kernel_selftests/control.ubuntu.artful
 delete mode 100644 ubuntu_kernel_selftests/control.ubuntu.utopic
 delete mode 100644 ubuntu_kernel_selftests/control.ubuntu.vivid
 delete mode 100644 ubuntu_kernel_selftests/control.ubuntu.wily
 delete mode 100644 ubuntu_kernel_selftests/control.ubuntu.yakkety
 delete mode 100644 ubuntu_kernel_selftests/control.ubuntu.zesty
 create mode 100755 ubuntu_kernel_selftests/helper.mk

Comments

Sean Feole Nov. 9, 2021, 1:55 p.m. UTC | #1
+1 from me

Thanks for putting in the time to finally make this right. It was not
an easy task, if anything more of a headache.

I know you have been testing this around the clock thanks for your hard
work on this!

-Sfeole

On Tue,  9 Nov 2021 16:32:55 +0800
Po-Hsu Lin <po-hsu.lin@canonical.com> wrote:

> BugLink: https://bugs.launchpad.net/bugs/1941052
> 
> This patch will change how we run those test cases in the selftests
> directory of a kernel tree:
>   * Test will now abort early if the setup() has failed
>   * Each test suite will be built first with a SUITE_NAME-build job,
>     we will be able to distinguish build failures and actual test
>     failures more easily.
>   * Each test inside a suite will be executed one-by-one with name in
>     a format of SUITE:CASE, e.g. net:test_bpf.sh, this will help us
>     to improve our result hinting process, make the test report
>     become more reliable and easier to gate new regressions.
>   * Use a helper.mk file to get the executable test names, by doing
>     so we can workaround the issue caused by kernel source code
>     difference across various releases.
>   * Remove the summary section, we won't have a summary for a whole
>     suite in the end of the test. I think this feature can be added
>     back if needed.
>   * Remove out-dated control files.
>   * Trusty control file is untouched as this test is blacklisted.
> 
> This patch has been tested on KVM instances with X/F/H/I kernel on our
> dev jenkins and X-4.15/B-4.15/B-5.4/F/H/I Oracle kernel with SRU cycle
> sru-20211018, the overall result is looking good. Bionic kernel will
> need fix in bug 1949889 to land first to make net tests working
> properly.
> 
> Signed-off-by: Po-Hsu Lin <po-hsu.lin@canonical.com>
> ---
>  ubuntu_kernel_selftests/control               | 28 ++++--
>  ubuntu_kernel_selftests/control.ubuntu.artful | 21 -----
>  ubuntu_kernel_selftests/control.ubuntu.utopic | 21 -----
>  ubuntu_kernel_selftests/control.ubuntu.vivid  | 21 -----
>  ubuntu_kernel_selftests/control.ubuntu.wily   | 21 -----
>  ubuntu_kernel_selftests/control.ubuntu.xenial | 24 +++--
>  .../control.ubuntu.yakkety                    | 21 -----
>  ubuntu_kernel_selftests/control.ubuntu.zesty  | 21 -----
>  ubuntu_kernel_selftests/helper.mk             |  2 +
>  .../ubuntu_kernel_selftests.py                | 88
> +++++++++---------- 10 files changed, 84 insertions(+), 184
> deletions(-) delete mode 100644
> ubuntu_kernel_selftests/control.ubuntu.artful delete mode 100644
> ubuntu_kernel_selftests/control.ubuntu.utopic delete mode 100644
> ubuntu_kernel_selftests/control.ubuntu.vivid delete mode 100644
> ubuntu_kernel_selftests/control.ubuntu.wily delete mode 100644
> ubuntu_kernel_selftests/control.ubuntu.yakkety delete mode 100644
> ubuntu_kernel_selftests/control.ubuntu.zesty create mode 100755
> ubuntu_kernel_selftests/helper.mk
> 
> diff --git a/ubuntu_kernel_selftests/control
> b/ubuntu_kernel_selftests/control index e2874196..4fcee658 100644
> --- a/ubuntu_kernel_selftests/control
> +++ b/ubuntu_kernel_selftests/control
> @@ -1,5 +1,5 @@
>  AUTHOR = "Ubuntu"
> -NAME = "selftests"
> +NAME = 'ubuntu_kernel_selftests'
>  CRITERIA = """
>  Uses built-in kernel repository self tests.
>  """
> @@ -10,20 +10,32 @@ TEST_CATEGORY = 'Functional'
>  TEST_TYPE = "client"
>  DOC = ""
>  
> -name = 'ubuntu_kernel_selftests'
> -
> -tests = [
> 'setup','breakpoints','cpu-hotplug','efivarfs','memfd','memory-hotplug','mount','net','ptrace','seccomp','timers','powerpc','user','ftrace'
> ] +categories = ['breakpoints', 'cpu-hotplug', 'efivarfs', 'memfd',
> 'memory-hotplug', 'mount', 'net', 'ptrace', 'seccomp', 'timers',
> 'powerpc', 'user', 'ftrace'] # #  The seccomp tests on 4.19+ on
> non-x86 are known to be fail and #  need fixing up. For now, disable
> them. #
>  release = platform.release().split(".")[:2]
>  release = int(release[0])*100 + int(release[1])
> -if 'seccomp' in tests and release > 418 and platform.machine() not
> in ['x86_64', 'ppc64le']:
> -	tests.remove('seccomp')
> +if 'seccomp' in categories and release > 418 and platform.machine()
> not in ['x86_64', 'ppc64le']:
> +    categories.remove('seccomp')
>  
> -for test in tests:
> -    results = job.run_test_detail('ubuntu_kernel_selftests',
> test_name=test, tag=test, timeout=60*30) +result =
> job.run_test_detail(NAME, test_name='setup', tag='setup',
> timeout=60*30) +if result == 'ERROR':
> +    print("ERROR: test failed to build, skipping all the sub tests")
> +else:
> +    for category in categories:
> +        build = '{}-build'.format(category)
> +        job.run_test_detail(NAME, test_name=build, tag=build,
> timeout=60*10)
> +        mk_helper = os.path.join(job.testdir, NAME, 'helper.mk')
> +        dir_src = os.path.join(job.bindir, 'tmp', NAME, 'src',
> 'linux/tools/testing/selftests/', category)
> +        mk_src = os.path.join(dir_src, 'Makefile')
> +        os.chdir(dir_src)
> +        cmd = 'make -f {} -f {} gettests'.format(mk_helper, mk_src)
> +        tests = utils.system_output(cmd).split()
> +        for item in tests:
> +            test = "{}:{}".format(category, os.path.basename(item))
> +            job.run_test_detail(NAME, test_name=test, tag=test,
> timeout=60*20) 
>  # vi:set ts=4 sw=4 expandtab syntax=python:
> diff --git a/ubuntu_kernel_selftests/control.ubuntu.artful
> b/ubuntu_kernel_selftests/control.ubuntu.artful deleted file mode
> 100644 index ec5121c9..00000000
> --- a/ubuntu_kernel_selftests/control.ubuntu.artful
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -AUTHOR = "Ubuntu"
> -NAME = "selftests"
> -CRITERIA = """
> -Uses built-in kernel repository self tests.
> -"""
> -SUITE = "None"
> -TIME = "SHORT"
> -TEST_CLASS = 'kernel'
> -TEST_CATEGORY = 'Functional'
> -TEST_TYPE = "client"
> -DOC = ""
> -
> -name = 'ubuntu_kernel_selftests'
> -
> -tests = [
> 'setup','breakpoints','cpu-hotplug','efivarfs','memory-hotplug','mount','net','ptrace','powerpc','seccomp','user'
> ] - -
> -for test in tests:
> -    results = job.run_test_detail('ubuntu_kernel_selftests',
> test_name=test, tag=test, timeout=60*15) -
> -# vi:set ts=4 sw=4 expandtab syntax=python:
> diff --git a/ubuntu_kernel_selftests/control.ubuntu.utopic
> b/ubuntu_kernel_selftests/control.ubuntu.utopic deleted file mode
> 100644 index 4e5b1230..00000000
> --- a/ubuntu_kernel_selftests/control.ubuntu.utopic
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -AUTHOR = "Ubuntu"
> -NAME = "selftests"
> -CRITERIA = """
> -Uses built-in kernel repository self tests.
> -"""
> -SUITE = "None"
> -TIME = "SHORT"
> -TEST_CLASS = 'kernel'
> -TEST_CATEGORY = 'Functional'
> -TEST_TYPE = "client"
> -DOC = ""
> -
> -name = 'ubuntu_kernel_selftests'
> -
> -tests = [
> 'breakpoints','cpu-hotplug','efivarfs','memory-hotplug','mount','net','ptrace','powerpc','user'
> ] - -
> -for test in tests:
> -    results = job.run_test_detail('ubuntu_kernel_selftests',
> test_name=test, tag=test, timeout=60*15) -
> -# vi:set ts=4 sw=4 expandtab syntax=python:
> diff --git a/ubuntu_kernel_selftests/control.ubuntu.vivid
> b/ubuntu_kernel_selftests/control.ubuntu.vivid deleted file mode
> 100644 index 4e5b1230..00000000
> --- a/ubuntu_kernel_selftests/control.ubuntu.vivid
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -AUTHOR = "Ubuntu"
> -NAME = "selftests"
> -CRITERIA = """
> -Uses built-in kernel repository self tests.
> -"""
> -SUITE = "None"
> -TIME = "SHORT"
> -TEST_CLASS = 'kernel'
> -TEST_CATEGORY = 'Functional'
> -TEST_TYPE = "client"
> -DOC = ""
> -
> -name = 'ubuntu_kernel_selftests'
> -
> -tests = [
> 'breakpoints','cpu-hotplug','efivarfs','memory-hotplug','mount','net','ptrace','powerpc','user'
> ] - -
> -for test in tests:
> -    results = job.run_test_detail('ubuntu_kernel_selftests',
> test_name=test, tag=test, timeout=60*15) -
> -# vi:set ts=4 sw=4 expandtab syntax=python:
> diff --git a/ubuntu_kernel_selftests/control.ubuntu.wily
> b/ubuntu_kernel_selftests/control.ubuntu.wily deleted file mode 100644
> index 4e5b1230..00000000
> --- a/ubuntu_kernel_selftests/control.ubuntu.wily
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -AUTHOR = "Ubuntu"
> -NAME = "selftests"
> -CRITERIA = """
> -Uses built-in kernel repository self tests.
> -"""
> -SUITE = "None"
> -TIME = "SHORT"
> -TEST_CLASS = 'kernel'
> -TEST_CATEGORY = 'Functional'
> -TEST_TYPE = "client"
> -DOC = ""
> -
> -name = 'ubuntu_kernel_selftests'
> -
> -tests = [
> 'breakpoints','cpu-hotplug','efivarfs','memory-hotplug','mount','net','ptrace','powerpc','user'
> ] - -
> -for test in tests:
> -    results = job.run_test_detail('ubuntu_kernel_selftests',
> test_name=test, tag=test, timeout=60*15) -
> -# vi:set ts=4 sw=4 expandtab syntax=python:
> diff --git a/ubuntu_kernel_selftests/control.ubuntu.xenial
> b/ubuntu_kernel_selftests/control.ubuntu.xenial index
> ec5121c9..89436fa1 100644 ---
> a/ubuntu_kernel_selftests/control.ubuntu.xenial +++
> b/ubuntu_kernel_selftests/control.ubuntu.xenial @@ -1,5 +1,5 @@
>  AUTHOR = "Ubuntu"
> -NAME = "selftests"
> +NAME = 'ubuntu_kernel_selftests'
>  CRITERIA = """
>  Uses built-in kernel repository self tests.
>  """
> @@ -10,12 +10,24 @@ TEST_CATEGORY = 'Functional'
>  TEST_TYPE = "client"
>  DOC = ""
>  
> -name = 'ubuntu_kernel_selftests'
>  
> -tests = [
> 'setup','breakpoints','cpu-hotplug','efivarfs','memory-hotplug','mount','net','ptrace','powerpc','seccomp','user'
> ] +categories = ['breakpoints', 'cpu-hotplug', 'efivarfs',
> 'memory-hotplug', 'mount', 'net', 'ptrace', 'powerpc', 'seccomp',
> 'user'] - -for test in tests:
> -    results = job.run_test_detail('ubuntu_kernel_selftests',
> test_name=test, tag=test, timeout=60*15) +result =
> job.run_test_detail(NAME, test_name='setup', tag='setup',
> timeout=60*30) +if result == 'ERROR':
> +    print("ERROR: test failed to build, skipping all the sub tests")
> +else:
> +    for category in categories:
> +        build = '{}-build'.format(category)
> +        job.run_test_detail(NAME, test_name=build, tag=build,
> timeout=60*10)
> +        mk_helper = os.path.join(job.testdir, NAME, 'helper.mk')
> +        dir_src = os.path.join(job.bindir, 'tmp', NAME, 'src',
> 'linux/tools/testing/selftests/', category)
> +        mk_src = os.path.join(dir_src, 'Makefile')
> +        os.chdir(dir_src)
> +        cmd = 'make -f {} -f {} gettests'.format(mk_helper, mk_src)
> +        tests = utils.system_output(cmd).split()
> +        for item in tests:
> +            test = "{}:{}".format(category, os.path.basename(item))
> +            job.run_test_detail(NAME, test_name=test, tag=test,
> timeout=60*20) 
>  # vi:set ts=4 sw=4 expandtab syntax=python:
> diff --git a/ubuntu_kernel_selftests/control.ubuntu.yakkety
> b/ubuntu_kernel_selftests/control.ubuntu.yakkety deleted file mode
> 100644 index 085aa7f3..00000000
> --- a/ubuntu_kernel_selftests/control.ubuntu.yakkety
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -AUTHOR = "Ubuntu"
> -NAME = "selftests"
> -CRITERIA = """
> -Uses built-in kernel repository self tests.
> -"""
> -SUITE = "None"
> -TIME = "SHORT"
> -TEST_CLASS = 'kernel'
> -TEST_CATEGORY = 'Functional'
> -TEST_TYPE = "client"
> -DOC = ""
> -
> -name = 'ubuntu_kernel_selftests'
> -
> -tests = [
> 'breakpoints','cpu-hotplug','efivarfs','memory-hotplug','mount','net','ptrace','powerpc','seccomp','user'
> ] - -
> -for test in tests:
> -    results = job.run_test_detail('ubuntu_kernel_selftests',
> test_name=test, tag=test, timeout=60*15) -
> -# vi:set ts=4 sw=4 expandtab syntax=python:
> diff --git a/ubuntu_kernel_selftests/control.ubuntu.zesty
> b/ubuntu_kernel_selftests/control.ubuntu.zesty deleted file mode
> 100644 index ec5121c9..00000000
> --- a/ubuntu_kernel_selftests/control.ubuntu.zesty
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -AUTHOR = "Ubuntu"
> -NAME = "selftests"
> -CRITERIA = """
> -Uses built-in kernel repository self tests.
> -"""
> -SUITE = "None"
> -TIME = "SHORT"
> -TEST_CLASS = 'kernel'
> -TEST_CATEGORY = 'Functional'
> -TEST_TYPE = "client"
> -DOC = ""
> -
> -name = 'ubuntu_kernel_selftests'
> -
> -tests = [
> 'setup','breakpoints','cpu-hotplug','efivarfs','memory-hotplug','mount','net','ptrace','powerpc','seccomp','user'
> ] - -
> -for test in tests:
> -    results = job.run_test_detail('ubuntu_kernel_selftests',
> test_name=test, tag=test, timeout=60*15) -
> -# vi:set ts=4 sw=4 expandtab syntax=python:
> diff --git a/ubuntu_kernel_selftests/helper.mk
> b/ubuntu_kernel_selftests/helper.mk new file mode 100755
> index 00000000..85fbd0ab
> --- /dev/null
> +++ b/ubuntu_kernel_selftests/helper.mk
> @@ -0,0 +1,2 @@
> +gettests:
> +	@echo '$(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS)'
> diff --git a/ubuntu_kernel_selftests/ubuntu_kernel_selftests.py
> b/ubuntu_kernel_selftests/ubuntu_kernel_selftests.py index
> e6f98082..3f06838f 100644 ---
> a/ubuntu_kernel_selftests/ubuntu_kernel_selftests.py +++
> b/ubuntu_kernel_selftests/ubuntu_kernel_selftests.py @@ -10,6 +10,7
> @@ class ubuntu_kernel_selftests(test.test): version = 1
>  
>      def install_required_pkgs(self):
> +        '''Function to install necessary packages.'''
>          pkgs = [
>              'bc',
>              'build-essential',
> @@ -24,7 +25,7 @@ class ubuntu_kernel_selftests(test.test):
>              'pkg-config',
>              'uuid-runtime'
>          ]
> -        if not (self.arch == 's390x' and self.series in ['precise',
> 'trusty', 'vivid', 'xenial']):
> +        if not (self.arch == 's390x' and self.series in ['trusty',
> 'xenial']): pkgs.append('libnuma-dev')
>              pkgs.append('libfuse-dev')
>          gcc = 'gcc' if self.arch in ['ppc64le', 'aarch64', 's390x',
> 'riscv64'] else 'gcc-multilib' @@ -49,7 +50,7 @@ class
> ubuntu_kernel_selftests(test.test): pkgs.extend(['clang', 'llvm'])
>  
>          cmd = 'yes "" | DEBIAN_FRONTEND=noninteractive apt-get
> install --yes --force-yes ' + ' '.join(pkgs)
> -        self.results = utils.system_output(cmd, retain_output=True)
> +        utils.system_output(cmd, retain_output=True)
>  
>      def initialize(self):
>          self.arch = platform.processor()
> @@ -61,26 +62,20 @@ class ubuntu_kernel_selftests(test.test):
>              self.series = distro.codename()
>          self.kv = platform.release().split(".")[:2]
>          self.kv = int(self.kv[0]) * 100 + int(self.kv[1])
> -        pass
>  
>      def download(self):
> +        '''Function to download kernel source.'''
>          cmd = "dpkg -S /lib/modules/" + platform.release() +
> "/kernel | cut -d: -f 1 | cut -d, -f 1" pkg =
> os.popen(cmd).readlines()[0].strip() utils.system("apt-get source
> --download-only " + pkg) 
>      def extract(self):
> +        '''Function to extract kernel source.'''
>          os.system("rm -rf linux/")
>          utils.system("dpkg-source -x linux*dsc linux")
>  
> -    def summary(self, pattern):
> -        failures = list(re.finditer(pattern, self.results))
> -        if failures:
> -            for i in failures:
> -                print('Sub test case: {}
> failed.'.format(i.group('case')))
> -            return True
> -        return False
> -
>      def setup(self):
> +        '''Function to setup the test environment.'''
>          self.install_required_pkgs()
>          self.job.require_gcc()
>          os.chdir(self.srcdir)
> @@ -103,8 +98,8 @@ class ubuntu_kernel_selftests(test.test):
>              #
>              fn =
> 'linux/tools/testing/selftests/breakpoints/step_after_suspend_test.c'
> if os.path.exists(fn):
> -               cmd = 'sed -i "s/tv_sec = 5;/tv_sec = 30;/" ' + fn
> -               utils.system(cmd)
> +                cmd = 'sed -i "s/tv_sec = 5;/tv_sec = 30;/" ' + fn
> +                utils.system(cmd)
>              # currently disable step_after_suspend_test as this
> breaks ssh'd login # connections to the test VMs and real H/W
>              fn = 'linux/tools/testing/selftests/breakpoints/Makefile'
> @@ -136,12 +131,12 @@ class ubuntu_kernel_selftests(test.test):
>              # update fix CPU hotplug test, new and old versions
>              #
>              print("Updating CPU hotplug test")
> -
> fn="linux/tools/testing/selftests/cpu-hotplug/cpu-on-off-test.sh"
> +            fn =
> "linux/tools/testing/selftests/cpu-hotplug/cpu-on-off-test.sh" if
> os.path.exists(fn) and 'present_cpus=' not in open(fn).read(): cmd =
> 'cp %s/cpu-on-off-test.sh %s' % (self.bindir, fn) utils.system(cmd)
>              else:
> -
> fn="linux/tools/testing/selftests/cpu-hotplug/on-off-test.sh"
> +                fn =
> "linux/tools/testing/selftests/cpu-hotplug/on-off-test.sh" if
> os.path.exists(fn) and 'present_cpus=' not in open(fn).read(): cmd =
> 'cp %s/cpu-on-off-test.sh %s' % (self.bindir, fn) utils.system(cmd)
> @@ -216,40 +211,45 @@ class ubuntu_kernel_selftests(test.test):
>      def run_once(self, test_name):
>          if test_name == 'setup':
>              return
> +        if test_name.endswith('-build'):
> +            os.chdir(self.srcdir)
> +            if "net" in test_name:
> +                cmd = "sh -c 'echo 1 >
> /proc/sys/net/ipv4/conf/all/accept_local'"
> +                utils.system(cmd)
> +                if self.kv >= 415:
> +                    # net selftests use a module built by bpf
> selftests, bpf is available since bionic kernel
> +                    if self.kv == 506:
> +                        os.environ["CLANG"] = "clang-10"
> +                        os.environ["LLC"] = "llc-10"
> +                        os.environ["LLVM_OBJCOPY"] =
> "llvm-objcopy-10"
> +                        os.environ["LLVM_READELF"] =
> "llvm-readelf-10"
> +                    elif self.kv in [504, 503]:
> +                        os.environ["CLANG"] = "clang-9"
> +                        os.environ["LLC"] = "llc-9"
> +                        os.environ["LLVM_OBJCOPY"] = "llvm-objcopy-9"
> +                        os.environ["LLVM_READELF"] = "llvm-readelf-9"
> +                    cmd = "make -C linux/tools/testing/selftests
> TARGETS=bpf SKIP_TARGETS=
> KDIR=/usr/src/linux-headers-{}".format(platform.release())
> +                    # keep running selftests/net, even if
> selftests/bpf build fails
> +                    utils.system(cmd, ignore_status=True)
> +            cmd = "make -C linux/tools/testing/selftests
> TARGETS={}".format(test_name.replace('-build', ''))
> +            utils.system_output(cmd, retain_output=True)
> +            return
>  
> -        cmd = "sudo sh -c 'echo 1 >
> /proc/sys/net/ipv4/conf/all/accept_local'"
> -        utils.system(cmd)
> -
> -        os.chdir(self.srcdir)
> -        if test_name == "net" and self.kv >= 415:
> -            # net selftests use a module built by bpf selftests, bpf
> is available since bionic kernel
> -            if self.kv == 506:
> -                os.environ["CLANG"] = "clang-10"
> -                os.environ["LLC"] = "llc-10"
> -                os.environ["LLVM_OBJCOPY"] = "llvm-objcopy-10"
> -                os.environ["LLVM_READELF"] = "llvm-readelf-10"
> -            elif self.kv in [504, 503]:
> -                os.environ["CLANG"] = "clang-9"
> -                os.environ["LLC"] = "llc-9"
> -                os.environ["LLVM_OBJCOPY"] = "llvm-objcopy-9"
> -                os.environ["LLVM_READELF"] = "llvm-readelf-9"
> -            cmd = "make -C linux/tools/testing/selftests TARGETS=bpf
> SKIP_TARGETS=
> KDIR=/usr/src/linux-headers-{}".format(platform.release())
> -            # keep running selftests/net, even if selftests/bpf
> build fails
> -            utils.system(cmd, ignore_status=True)
> -        cmd = "sudo make -C linux/tools/testing/selftests TARGETS=%s
> run_tests" % test_name
> -        self.results = utils.system_output(cmd, retain_output=True)
> -
> -        print('========== Summary ===========')
> +        category = test_name.split(':')[0]
> +        sub_test = test_name.split(':')[1]
> +        dir_root = os.path.join(self.srcdir, 'linux', 'tools',
> 'testing', 'selftests')
> +        os.chdir(dir_root)
> +        cmd = "make run_tests -C {} TEST_PROGS={} TEST_GEN_PROGS=''
> TEST_CUSTOM_PROGS=''".format(category, sub_test)
> +        result = utils.system_output(cmd, retain_output=True)
>  
>          # Old pattern for Xenial
>          pattern = re.compile('selftests: *(?P<case>[\w\-\.]+)
> \[FAIL\]\n')
> -        if self.summary(pattern):
> -            raise error.TestError('Test failed for ' + test_name)
> +        if re.search(pattern, result):
> +            raise error.TestError(test_name + ' failed.')
>          # If the test was not end by previous check, check again
> with new pattern
> -        pattern = re.compile('not ok [\d\.]* selftests: *({}.*:
> )?(?P<case>[\w\-\.]+)(?!.*SKIP)'.format(test_name))
> -        if self.summary(pattern):
> -            raise error.TestError('Test failed for ' + test_name)
> +        pattern = re.compile('not ok [\d\.]* selftests: {}: {} #
> (?!.*SKIP)'.format(category, sub_test))
> +        if re.search(pattern, result):
> +            raise error.TestError(test_name + ' failed.')
>  
> -        print('No failed cases reported')
>  
>  # vi:set ts=4 sw=4 expandtab syntax=python:
Po-Hsu Lin Nov. 10, 2021, 2:41 a.m. UTC | #2
Applied and pushed.

Thanks
Sam
diff mbox series

Patch

diff --git a/ubuntu_kernel_selftests/control b/ubuntu_kernel_selftests/control
index e2874196..4fcee658 100644
--- a/ubuntu_kernel_selftests/control
+++ b/ubuntu_kernel_selftests/control
@@ -1,5 +1,5 @@ 
 AUTHOR = "Ubuntu"
-NAME = "selftests"
+NAME = 'ubuntu_kernel_selftests'
 CRITERIA = """
 Uses built-in kernel repository self tests.
 """
@@ -10,20 +10,32 @@  TEST_CATEGORY = 'Functional'
 TEST_TYPE = "client"
 DOC = ""
 
-name = 'ubuntu_kernel_selftests'
-
-tests = [ 'setup','breakpoints','cpu-hotplug','efivarfs','memfd','memory-hotplug','mount','net','ptrace','seccomp','timers','powerpc','user','ftrace' ]
 
+categories = ['breakpoints', 'cpu-hotplug', 'efivarfs', 'memfd', 'memory-hotplug', 'mount', 'net', 'ptrace', 'seccomp', 'timers', 'powerpc', 'user', 'ftrace']
 #
 #  The seccomp tests on 4.19+ on non-x86 are known to be fail and
 #  need fixing up. For now, disable them.
 #
 release = platform.release().split(".")[:2]
 release = int(release[0])*100 + int(release[1])
-if 'seccomp' in tests and release > 418 and platform.machine() not in ['x86_64', 'ppc64le']:
-	tests.remove('seccomp')
+if 'seccomp' in categories and release > 418 and platform.machine() not in ['x86_64', 'ppc64le']:
+    categories.remove('seccomp')
 
-for test in tests:
-    results = job.run_test_detail('ubuntu_kernel_selftests', test_name=test, tag=test, timeout=60*30)
+result = job.run_test_detail(NAME, test_name='setup', tag='setup', timeout=60*30)
+if result == 'ERROR':
+    print("ERROR: test failed to build, skipping all the sub tests")
+else:
+    for category in categories:
+        build = '{}-build'.format(category)
+        job.run_test_detail(NAME, test_name=build, tag=build, timeout=60*10)
+        mk_helper = os.path.join(job.testdir, NAME, 'helper.mk')
+        dir_src = os.path.join(job.bindir, 'tmp', NAME, 'src', 'linux/tools/testing/selftests/', category)
+        mk_src = os.path.join(dir_src, 'Makefile')
+        os.chdir(dir_src)
+        cmd = 'make -f {} -f {} gettests'.format(mk_helper, mk_src)
+        tests = utils.system_output(cmd).split()
+        for item in tests:
+            test = "{}:{}".format(category, os.path.basename(item))
+            job.run_test_detail(NAME, test_name=test, tag=test, timeout=60*20)
 
 # vi:set ts=4 sw=4 expandtab syntax=python:
diff --git a/ubuntu_kernel_selftests/control.ubuntu.artful b/ubuntu_kernel_selftests/control.ubuntu.artful
deleted file mode 100644
index ec5121c9..00000000
--- a/ubuntu_kernel_selftests/control.ubuntu.artful
+++ /dev/null
@@ -1,21 +0,0 @@ 
-AUTHOR = "Ubuntu"
-NAME = "selftests"
-CRITERIA = """
-Uses built-in kernel repository self tests.
-"""
-SUITE = "None"
-TIME = "SHORT"
-TEST_CLASS = 'kernel'
-TEST_CATEGORY = 'Functional'
-TEST_TYPE = "client"
-DOC = ""
-
-name = 'ubuntu_kernel_selftests'
-
-tests = [ 'setup','breakpoints','cpu-hotplug','efivarfs','memory-hotplug','mount','net','ptrace','powerpc','seccomp','user' ]
-
-
-for test in tests:
-    results = job.run_test_detail('ubuntu_kernel_selftests', test_name=test, tag=test, timeout=60*15)
-
-# vi:set ts=4 sw=4 expandtab syntax=python:
diff --git a/ubuntu_kernel_selftests/control.ubuntu.utopic b/ubuntu_kernel_selftests/control.ubuntu.utopic
deleted file mode 100644
index 4e5b1230..00000000
--- a/ubuntu_kernel_selftests/control.ubuntu.utopic
+++ /dev/null
@@ -1,21 +0,0 @@ 
-AUTHOR = "Ubuntu"
-NAME = "selftests"
-CRITERIA = """
-Uses built-in kernel repository self tests.
-"""
-SUITE = "None"
-TIME = "SHORT"
-TEST_CLASS = 'kernel'
-TEST_CATEGORY = 'Functional'
-TEST_TYPE = "client"
-DOC = ""
-
-name = 'ubuntu_kernel_selftests'
-
-tests = [ 'breakpoints','cpu-hotplug','efivarfs','memory-hotplug','mount','net','ptrace','powerpc','user' ]
-
-
-for test in tests:
-    results = job.run_test_detail('ubuntu_kernel_selftests', test_name=test, tag=test, timeout=60*15)
-
-# vi:set ts=4 sw=4 expandtab syntax=python:
diff --git a/ubuntu_kernel_selftests/control.ubuntu.vivid b/ubuntu_kernel_selftests/control.ubuntu.vivid
deleted file mode 100644
index 4e5b1230..00000000
--- a/ubuntu_kernel_selftests/control.ubuntu.vivid
+++ /dev/null
@@ -1,21 +0,0 @@ 
-AUTHOR = "Ubuntu"
-NAME = "selftests"
-CRITERIA = """
-Uses built-in kernel repository self tests.
-"""
-SUITE = "None"
-TIME = "SHORT"
-TEST_CLASS = 'kernel'
-TEST_CATEGORY = 'Functional'
-TEST_TYPE = "client"
-DOC = ""
-
-name = 'ubuntu_kernel_selftests'
-
-tests = [ 'breakpoints','cpu-hotplug','efivarfs','memory-hotplug','mount','net','ptrace','powerpc','user' ]
-
-
-for test in tests:
-    results = job.run_test_detail('ubuntu_kernel_selftests', test_name=test, tag=test, timeout=60*15)
-
-# vi:set ts=4 sw=4 expandtab syntax=python:
diff --git a/ubuntu_kernel_selftests/control.ubuntu.wily b/ubuntu_kernel_selftests/control.ubuntu.wily
deleted file mode 100644
index 4e5b1230..00000000
--- a/ubuntu_kernel_selftests/control.ubuntu.wily
+++ /dev/null
@@ -1,21 +0,0 @@ 
-AUTHOR = "Ubuntu"
-NAME = "selftests"
-CRITERIA = """
-Uses built-in kernel repository self tests.
-"""
-SUITE = "None"
-TIME = "SHORT"
-TEST_CLASS = 'kernel'
-TEST_CATEGORY = 'Functional'
-TEST_TYPE = "client"
-DOC = ""
-
-name = 'ubuntu_kernel_selftests'
-
-tests = [ 'breakpoints','cpu-hotplug','efivarfs','memory-hotplug','mount','net','ptrace','powerpc','user' ]
-
-
-for test in tests:
-    results = job.run_test_detail('ubuntu_kernel_selftests', test_name=test, tag=test, timeout=60*15)
-
-# vi:set ts=4 sw=4 expandtab syntax=python:
diff --git a/ubuntu_kernel_selftests/control.ubuntu.xenial b/ubuntu_kernel_selftests/control.ubuntu.xenial
index ec5121c9..89436fa1 100644
--- a/ubuntu_kernel_selftests/control.ubuntu.xenial
+++ b/ubuntu_kernel_selftests/control.ubuntu.xenial
@@ -1,5 +1,5 @@ 
 AUTHOR = "Ubuntu"
-NAME = "selftests"
+NAME = 'ubuntu_kernel_selftests'
 CRITERIA = """
 Uses built-in kernel repository self tests.
 """
@@ -10,12 +10,24 @@  TEST_CATEGORY = 'Functional'
 TEST_TYPE = "client"
 DOC = ""
 
-name = 'ubuntu_kernel_selftests'
 
-tests = [ 'setup','breakpoints','cpu-hotplug','efivarfs','memory-hotplug','mount','net','ptrace','powerpc','seccomp','user' ]
+categories = ['breakpoints', 'cpu-hotplug', 'efivarfs', 'memory-hotplug', 'mount', 'net', 'ptrace', 'powerpc', 'seccomp', 'user']
 
-
-for test in tests:
-    results = job.run_test_detail('ubuntu_kernel_selftests', test_name=test, tag=test, timeout=60*15)
+result = job.run_test_detail(NAME, test_name='setup', tag='setup', timeout=60*30)
+if result == 'ERROR':
+    print("ERROR: test failed to build, skipping all the sub tests")
+else:
+    for category in categories:
+        build = '{}-build'.format(category)
+        job.run_test_detail(NAME, test_name=build, tag=build, timeout=60*10)
+        mk_helper = os.path.join(job.testdir, NAME, 'helper.mk')
+        dir_src = os.path.join(job.bindir, 'tmp', NAME, 'src', 'linux/tools/testing/selftests/', category)
+        mk_src = os.path.join(dir_src, 'Makefile')
+        os.chdir(dir_src)
+        cmd = 'make -f {} -f {} gettests'.format(mk_helper, mk_src)
+        tests = utils.system_output(cmd).split()
+        for item in tests:
+            test = "{}:{}".format(category, os.path.basename(item))
+            job.run_test_detail(NAME, test_name=test, tag=test, timeout=60*20)
 
 # vi:set ts=4 sw=4 expandtab syntax=python:
diff --git a/ubuntu_kernel_selftests/control.ubuntu.yakkety b/ubuntu_kernel_selftests/control.ubuntu.yakkety
deleted file mode 100644
index 085aa7f3..00000000
--- a/ubuntu_kernel_selftests/control.ubuntu.yakkety
+++ /dev/null
@@ -1,21 +0,0 @@ 
-AUTHOR = "Ubuntu"
-NAME = "selftests"
-CRITERIA = """
-Uses built-in kernel repository self tests.
-"""
-SUITE = "None"
-TIME = "SHORT"
-TEST_CLASS = 'kernel'
-TEST_CATEGORY = 'Functional'
-TEST_TYPE = "client"
-DOC = ""
-
-name = 'ubuntu_kernel_selftests'
-
-tests = [ 'breakpoints','cpu-hotplug','efivarfs','memory-hotplug','mount','net','ptrace','powerpc','seccomp','user' ]
-
-
-for test in tests:
-    results = job.run_test_detail('ubuntu_kernel_selftests', test_name=test, tag=test, timeout=60*15)
-
-# vi:set ts=4 sw=4 expandtab syntax=python:
diff --git a/ubuntu_kernel_selftests/control.ubuntu.zesty b/ubuntu_kernel_selftests/control.ubuntu.zesty
deleted file mode 100644
index ec5121c9..00000000
--- a/ubuntu_kernel_selftests/control.ubuntu.zesty
+++ /dev/null
@@ -1,21 +0,0 @@ 
-AUTHOR = "Ubuntu"
-NAME = "selftests"
-CRITERIA = """
-Uses built-in kernel repository self tests.
-"""
-SUITE = "None"
-TIME = "SHORT"
-TEST_CLASS = 'kernel'
-TEST_CATEGORY = 'Functional'
-TEST_TYPE = "client"
-DOC = ""
-
-name = 'ubuntu_kernel_selftests'
-
-tests = [ 'setup','breakpoints','cpu-hotplug','efivarfs','memory-hotplug','mount','net','ptrace','powerpc','seccomp','user' ]
-
-
-for test in tests:
-    results = job.run_test_detail('ubuntu_kernel_selftests', test_name=test, tag=test, timeout=60*15)
-
-# vi:set ts=4 sw=4 expandtab syntax=python:
diff --git a/ubuntu_kernel_selftests/helper.mk b/ubuntu_kernel_selftests/helper.mk
new file mode 100755
index 00000000..85fbd0ab
--- /dev/null
+++ b/ubuntu_kernel_selftests/helper.mk
@@ -0,0 +1,2 @@ 
+gettests:
+	@echo '$(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS)'
diff --git a/ubuntu_kernel_selftests/ubuntu_kernel_selftests.py b/ubuntu_kernel_selftests/ubuntu_kernel_selftests.py
index e6f98082..3f06838f 100644
--- a/ubuntu_kernel_selftests/ubuntu_kernel_selftests.py
+++ b/ubuntu_kernel_selftests/ubuntu_kernel_selftests.py
@@ -10,6 +10,7 @@  class ubuntu_kernel_selftests(test.test):
     version = 1
 
     def install_required_pkgs(self):
+        '''Function to install necessary packages.'''
         pkgs = [
             'bc',
             'build-essential',
@@ -24,7 +25,7 @@  class ubuntu_kernel_selftests(test.test):
             'pkg-config',
             'uuid-runtime'
         ]
-        if not (self.arch == 's390x' and self.series in ['precise', 'trusty', 'vivid', 'xenial']):
+        if not (self.arch == 's390x' and self.series in ['trusty', 'xenial']):
             pkgs.append('libnuma-dev')
             pkgs.append('libfuse-dev')
         gcc = 'gcc' if self.arch in ['ppc64le', 'aarch64', 's390x', 'riscv64'] else 'gcc-multilib'
@@ -49,7 +50,7 @@  class ubuntu_kernel_selftests(test.test):
                 pkgs.extend(['clang', 'llvm'])
 
         cmd = 'yes "" | DEBIAN_FRONTEND=noninteractive apt-get install --yes --force-yes ' + ' '.join(pkgs)
-        self.results = utils.system_output(cmd, retain_output=True)
+        utils.system_output(cmd, retain_output=True)
 
     def initialize(self):
         self.arch = platform.processor()
@@ -61,26 +62,20 @@  class ubuntu_kernel_selftests(test.test):
             self.series = distro.codename()
         self.kv = platform.release().split(".")[:2]
         self.kv = int(self.kv[0]) * 100 + int(self.kv[1])
-        pass
 
     def download(self):
+        '''Function to download kernel source.'''
         cmd = "dpkg -S /lib/modules/" + platform.release() + "/kernel | cut -d: -f 1 | cut -d, -f 1"
         pkg = os.popen(cmd).readlines()[0].strip()
         utils.system("apt-get source --download-only " + pkg)
 
     def extract(self):
+        '''Function to extract kernel source.'''
         os.system("rm -rf linux/")
         utils.system("dpkg-source -x linux*dsc linux")
 
-    def summary(self, pattern):
-        failures = list(re.finditer(pattern, self.results))
-        if failures:
-            for i in failures:
-                print('Sub test case: {} failed.'.format(i.group('case')))
-            return True
-        return False
-
     def setup(self):
+        '''Function to setup the test environment.'''
         self.install_required_pkgs()
         self.job.require_gcc()
         os.chdir(self.srcdir)
@@ -103,8 +98,8 @@  class ubuntu_kernel_selftests(test.test):
             #
             fn = 'linux/tools/testing/selftests/breakpoints/step_after_suspend_test.c'
             if os.path.exists(fn):
-               cmd = 'sed -i "s/tv_sec = 5;/tv_sec = 30;/" ' + fn
-               utils.system(cmd)
+                cmd = 'sed -i "s/tv_sec = 5;/tv_sec = 30;/" ' + fn
+                utils.system(cmd)
             # currently disable step_after_suspend_test as this breaks ssh'd login
             # connections to the test VMs and real H/W
             fn = 'linux/tools/testing/selftests/breakpoints/Makefile'
@@ -136,12 +131,12 @@  class ubuntu_kernel_selftests(test.test):
             # update fix CPU hotplug test, new and old versions
             #
             print("Updating CPU hotplug test")
-            fn="linux/tools/testing/selftests/cpu-hotplug/cpu-on-off-test.sh"
+            fn = "linux/tools/testing/selftests/cpu-hotplug/cpu-on-off-test.sh"
             if os.path.exists(fn) and 'present_cpus=' not in open(fn).read():
                 cmd = 'cp %s/cpu-on-off-test.sh %s' % (self.bindir, fn)
                 utils.system(cmd)
             else:
-                fn="linux/tools/testing/selftests/cpu-hotplug/on-off-test.sh"
+                fn = "linux/tools/testing/selftests/cpu-hotplug/on-off-test.sh"
                 if os.path.exists(fn) and 'present_cpus=' not in open(fn).read():
                     cmd = 'cp %s/cpu-on-off-test.sh %s' % (self.bindir, fn)
                     utils.system(cmd)
@@ -216,40 +211,45 @@  class ubuntu_kernel_selftests(test.test):
     def run_once(self, test_name):
         if test_name == 'setup':
             return
+        if test_name.endswith('-build'):
+            os.chdir(self.srcdir)
+            if "net" in test_name:
+                cmd = "sh -c 'echo 1 > /proc/sys/net/ipv4/conf/all/accept_local'"
+                utils.system(cmd)
+                if self.kv >= 415:
+                    # net selftests use a module built by bpf selftests, bpf is available since bionic kernel
+                    if self.kv == 506:
+                        os.environ["CLANG"] = "clang-10"
+                        os.environ["LLC"] = "llc-10"
+                        os.environ["LLVM_OBJCOPY"] = "llvm-objcopy-10"
+                        os.environ["LLVM_READELF"] = "llvm-readelf-10"
+                    elif self.kv in [504, 503]:
+                        os.environ["CLANG"] = "clang-9"
+                        os.environ["LLC"] = "llc-9"
+                        os.environ["LLVM_OBJCOPY"] = "llvm-objcopy-9"
+                        os.environ["LLVM_READELF"] = "llvm-readelf-9"
+                    cmd = "make -C linux/tools/testing/selftests TARGETS=bpf SKIP_TARGETS= KDIR=/usr/src/linux-headers-{}".format(platform.release())
+                    # keep running selftests/net, even if selftests/bpf build fails
+                    utils.system(cmd, ignore_status=True)
+            cmd = "make -C linux/tools/testing/selftests TARGETS={}".format(test_name.replace('-build', ''))
+            utils.system_output(cmd, retain_output=True)
+            return
 
-        cmd = "sudo sh -c 'echo 1 > /proc/sys/net/ipv4/conf/all/accept_local'"
-        utils.system(cmd)
-
-        os.chdir(self.srcdir)
-        if test_name == "net" and self.kv >= 415:
-            # net selftests use a module built by bpf selftests, bpf is available since bionic kernel
-            if self.kv == 506:
-                os.environ["CLANG"] = "clang-10"
-                os.environ["LLC"] = "llc-10"
-                os.environ["LLVM_OBJCOPY"] = "llvm-objcopy-10"
-                os.environ["LLVM_READELF"] = "llvm-readelf-10"
-            elif self.kv in [504, 503]:
-                os.environ["CLANG"] = "clang-9"
-                os.environ["LLC"] = "llc-9"
-                os.environ["LLVM_OBJCOPY"] = "llvm-objcopy-9"
-                os.environ["LLVM_READELF"] = "llvm-readelf-9"
-            cmd = "make -C linux/tools/testing/selftests TARGETS=bpf SKIP_TARGETS= KDIR=/usr/src/linux-headers-{}".format(platform.release())
-            # keep running selftests/net, even if selftests/bpf build fails
-            utils.system(cmd, ignore_status=True)
-        cmd = "sudo make -C linux/tools/testing/selftests TARGETS=%s run_tests" % test_name
-        self.results = utils.system_output(cmd, retain_output=True)
-
-        print('========== Summary ===========')
+        category = test_name.split(':')[0]
+        sub_test = test_name.split(':')[1]
+        dir_root = os.path.join(self.srcdir, 'linux', 'tools', 'testing', 'selftests')
+        os.chdir(dir_root)
+        cmd = "make run_tests -C {} TEST_PROGS={} TEST_GEN_PROGS='' TEST_CUSTOM_PROGS=''".format(category, sub_test)
+        result = utils.system_output(cmd, retain_output=True)
 
         # Old pattern for Xenial
         pattern = re.compile('selftests: *(?P<case>[\w\-\.]+) \[FAIL\]\n')
-        if self.summary(pattern):
-            raise error.TestError('Test failed for ' + test_name)
+        if re.search(pattern, result):
+            raise error.TestError(test_name + ' failed.')
         # If the test was not end by previous check, check again with new pattern
-        pattern = re.compile('not ok [\d\.]* selftests: *({}.*: )?(?P<case>[\w\-\.]+)(?!.*SKIP)'.format(test_name))
-        if self.summary(pattern):
-            raise error.TestError('Test failed for ' + test_name)
+        pattern = re.compile('not ok [\d\.]* selftests: {}: {} # (?!.*SKIP)'.format(category, sub_test))
+        if re.search(pattern, result):
+            raise error.TestError(test_name + ' failed.')
 
-        print('No failed cases reported')
 
 # vi:set ts=4 sw=4 expandtab syntax=python: