diff mbox series

[1/1,autotest-client-tests] UBUNTU: SAUCE: ubuntu_boot: add tests to check error in log and kernel_tainted flags

Message ID 20200708121130.30367-2-po-hsu.lin@canonical.com
State New
Headers show
Series ubuntu_boot: add tests to check error in log and kernel_tainted flags | expand

Commit Message

Po-Hsu Lin July 8, 2020, 12:11 p.m. UTC
Add two sub-tests into the boot test to help us catching issues like
lp:1840046 ("BUG: non-zero pgtables_bytes on freeing mm: -16384") in the
early stage:
  1. log_check test - use regex to search for error patterns in syslog
  2. kernel_tainted test - check for kernel tainted flags

Call the original test as a boot_smoke_test, so now there will be 3
tests under this ubuntu_boot test.

This ubuntu_boot test will be executed when the kernel was copied to
our ppa.

Signed-off-by: Po-Hsu Lin <po-hsu.lin@canonical.com>
---
 ubuntu_boot/control.ubuntu |  8 +++---
 ubuntu_boot/ubuntu_boot.py | 54 ++++++++++++++++++++++++++++++++++++--
 2 files changed, 57 insertions(+), 5 deletions(-)

Comments

Sean Feole July 9, 2020, 3:48 p.m. UTC | #1
Acked-by: Sean Feole <sean.feole@canonical.com>

On Wed, Jul 8, 2020 at 8:12 AM Po-Hsu Lin <po-hsu.lin@canonical.com> wrote:

> Add two sub-tests into the boot test to help us catching issues like
> lp:1840046 ("BUG: non-zero pgtables_bytes on freeing mm: -16384") in the
> early stage:
>   1. log_check test - use regex to search for error patterns in syslog
>   2. kernel_tainted test - check for kernel tainted flags
>
> Call the original test as a boot_smoke_test, so now there will be 3
> tests under this ubuntu_boot test.
>
> This ubuntu_boot test will be executed when the kernel was copied to
> our ppa.
>
> Signed-off-by: Po-Hsu Lin <po-hsu.lin@canonical.com>
> ---
>  ubuntu_boot/control.ubuntu |  8 +++---
>  ubuntu_boot/ubuntu_boot.py | 54 ++++++++++++++++++++++++++++++++++++--
>  2 files changed, 57 insertions(+), 5 deletions(-)
>
> diff --git a/ubuntu_boot/control.ubuntu b/ubuntu_boot/control.ubuntu
> index f9986199..bc687b8a 100644
> --- a/ubuntu_boot/control.ubuntu
> +++ b/ubuntu_boot/control.ubuntu
> @@ -1,11 +1,13 @@
>  AUTHOR = 'brad.figg@canonical.com (Brad Figg)'
>  TIME = 'MEDIUM'
> -NAME = 'Perform a simple "boot" test'
> +NAME = 'Perform a simple "boot" test and check error / taint flags'
>  TEST_TYPE = 'client'
>  TEST_CLASS = 'Kernel'
> -TEST_CATEGORY = 'Stress'
> +TEST_CATEGORY = 'Smoke'
>
>  DOC = '''
>  '''
>
> -job.run_test_detail('ubuntu_boot', test_time=600)
> +job.run_test_detail('ubuntu_boot', test_name='kernel_tainted',
> tag='kernel_tainted')
> +job.run_test_detail('ubuntu_boot', test_name='log_check', tag='log_check')
> +job.run_test_detail('ubuntu_boot', test_name='boot_smoke_test',
> tag='boot_smoke_test')
> diff --git a/ubuntu_boot/ubuntu_boot.py b/ubuntu_boot/ubuntu_boot.py
> index dba7a1ae..c799c560 100644
> --- a/ubuntu_boot/ubuntu_boot.py
> +++ b/ubuntu_boot/ubuntu_boot.py
> @@ -1,12 +1,62 @@
>  import os
> +import re
>  from autotest.client import test, utils
> +from autotest.client.shared import error
>
>
>  class ubuntu_boot(test.test):
>      version = 1
> +    def log_check(self):
> +        '''Test for checking error patterns in log files'''
> +        # dmesg will be cleared out in autotest with dmesg -c before the
> test starts
> +        # Let's check for /var/log/syslog instead
> +        logfile = '/var/log/syslog'
> +        patterns = [
> +            'kernel: \[ *\d+\.\d+\] BUG:',
> +            'kernel: \[ *\d+\.\d+\] Oops:',
> +            'kernel: \[ *\d+\.\d+\] kernel BUG at',
> +            'kernel: \[ *\d+\.\d+\] WARNING:'
> +        ]
> +        test_passed = True
> +        print('Checking error message in {}:'.format(logfile))
> +        if os.path.exists(logfile):
> +            with open(logfile) as f:
> +                content = f.read()
> +                for pat in patterns:
> +                    print('Scanning for pattern "{}"'.format(pat))
> +                    if re.search(pat, content):
> +                        print('Pattern found, Log NOT clean.')
> +                        test_passed = False
> +        else:
> +            print('Log file was not found.')
> +            test_passed = False
> +        return test_passed
> +
> +    def kernel_tainted(self):
> +        '''Test for checking kernel tatined flags'''
> +        test_passed = True
> +        print('Checking kernel tainted flags in /proc/sys/kernel/tainted')
> +        with open('/proc/sys/kernel/tainted') as f:
> +            content = f.read()
> +            if content != '0\n':
> +                test_passed = False
> +        return test_passed
> +
> +    def run_once(self, test_name, exit_on_error=True):
> +        if test_name == 'log_check':
> +            if not self.log_check():
> +                raise error.TestFail()
> +            else:
> +                print("GOOD: Log clean.")
> +            return
> +        elif test_name == 'kernel_tainted':
> +            if not self.kernel_tainted():
> +                raise error.TestFail()
> +            else:
> +                print('GOOD: Kernel not tainted.')
> +            return
>
> -    def run_once(self, test_time=10, exit_on_error=True, set_time=True):
>          cmd = "uname -a"
>          utils.system(cmd)
> -        cmd = "lsb_release"
> +        cmd = "lsb_release -a"
>          utils.system(cmd)
> --
> 2.17.1
>
>
> --
> kernel-team mailing list
> kernel-team@lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
>
diff mbox series

Patch

diff --git a/ubuntu_boot/control.ubuntu b/ubuntu_boot/control.ubuntu
index f9986199..bc687b8a 100644
--- a/ubuntu_boot/control.ubuntu
+++ b/ubuntu_boot/control.ubuntu
@@ -1,11 +1,13 @@ 
 AUTHOR = 'brad.figg@canonical.com (Brad Figg)'
 TIME = 'MEDIUM'
-NAME = 'Perform a simple "boot" test'
+NAME = 'Perform a simple "boot" test and check error / taint flags'
 TEST_TYPE = 'client'
 TEST_CLASS = 'Kernel'
-TEST_CATEGORY = 'Stress'
+TEST_CATEGORY = 'Smoke'
 
 DOC = '''
 '''
 
-job.run_test_detail('ubuntu_boot', test_time=600)
+job.run_test_detail('ubuntu_boot', test_name='kernel_tainted', tag='kernel_tainted')
+job.run_test_detail('ubuntu_boot', test_name='log_check', tag='log_check')
+job.run_test_detail('ubuntu_boot', test_name='boot_smoke_test', tag='boot_smoke_test')
diff --git a/ubuntu_boot/ubuntu_boot.py b/ubuntu_boot/ubuntu_boot.py
index dba7a1ae..c799c560 100644
--- a/ubuntu_boot/ubuntu_boot.py
+++ b/ubuntu_boot/ubuntu_boot.py
@@ -1,12 +1,62 @@ 
 import os
+import re
 from autotest.client import test, utils
+from autotest.client.shared import error
 
 
 class ubuntu_boot(test.test):
     version = 1
+    def log_check(self):
+        '''Test for checking error patterns in log files'''
+        # dmesg will be cleared out in autotest with dmesg -c before the test starts
+        # Let's check for /var/log/syslog instead
+        logfile = '/var/log/syslog'
+        patterns = [
+            'kernel: \[ *\d+\.\d+\] BUG:',
+            'kernel: \[ *\d+\.\d+\] Oops:',
+            'kernel: \[ *\d+\.\d+\] kernel BUG at',
+            'kernel: \[ *\d+\.\d+\] WARNING:'
+        ]
+        test_passed = True
+        print('Checking error message in {}:'.format(logfile))
+        if os.path.exists(logfile):
+            with open(logfile) as f:
+                content = f.read()
+                for pat in patterns:
+                    print('Scanning for pattern "{}"'.format(pat))
+                    if re.search(pat, content):
+                        print('Pattern found, Log NOT clean.')
+                        test_passed = False
+        else:
+            print('Log file was not found.')
+            test_passed = False
+        return test_passed
+
+    def kernel_tainted(self):
+        '''Test for checking kernel tatined flags'''
+        test_passed = True
+        print('Checking kernel tainted flags in /proc/sys/kernel/tainted')
+        with open('/proc/sys/kernel/tainted') as f:
+            content = f.read()
+            if content != '0\n':
+                test_passed = False
+        return test_passed
+
+    def run_once(self, test_name, exit_on_error=True):
+        if test_name == 'log_check':
+            if not self.log_check():
+                raise error.TestFail()
+            else:
+                print("GOOD: Log clean.")
+            return
+        elif test_name == 'kernel_tainted':
+            if not self.kernel_tainted():
+                raise error.TestFail()
+            else:
+                print('GOOD: Kernel not tainted.')
+            return
 
-    def run_once(self, test_time=10, exit_on_error=True, set_time=True):
         cmd = "uname -a"
         utils.system(cmd)
-        cmd = "lsb_release"
+        cmd = "lsb_release -a"
         utils.system(cmd)