# # SPDX-License-Identifier: MIT # import os import time from oeqa.runtime.case import OERuntimeTestCase from oeqa.core.decorator.depends import OETestDepends from oeqa.core.decorator.data import skipIfNotFeature # need some kernel fragments # echo "KERNEL_FEATURES_append += \" features\/kernel\-sample\/kernel\-sample.scc\"" >> local.conf class KSample(OERuntimeTestCase): def cmd_and_check(self, cmd='', match_string=''): status, output = self.target.run(cmd) if not match_string: # send cmd msg = '%s failed, %s' % (cmd, output) self.assertEqual(status, 0, msg=msg) else: # check result result = ("%s" % match_string) in output msg = output self.assertTrue(result, msg) self.assertEqual(status, 0, cmd) def check_arch(self, archset=''): status, output = self.target.run("uname -m") result = ("%s" % output) in archset if not result: self.skipTest("This case doesn't support %s" % output) def check_config(self, config_opt=''): cmd = "zcat /proc/config.gz | grep %s" % config_opt status, output = self.target.run(cmd) result = ("%s=y" % config_opt) in output if not result: self.skipTest("%s is not set" % config_opt) def check_module_exist(self, path='', module_name=''): status, output = self.target.run("uname -r") cmd = "ls " + "/lib/modules/" + output + "/kernel/samples/" + path + module_name status, output = self.target.run(cmd) if status != 0: error_info = module_name + " doesn't exist" self.skipTest(error_info) def kfifo_func(self, name=''): module_prename = name + "-example" module_name = name + "-example.ko" sysmbol_name = name + "_example" # make sure if module exists self.check_module_exist("kfifo/", module_name) # modprobe self.cmd_and_check("modprobe %s" % module_prename) # lsmod self.cmd_and_check("lsmod | grep %s | cut -d\' \' -f1" % sysmbol_name, sysmbol_name) # check result self.cmd_and_check("dmesg | grep \"test passed\" ", "test passed") # rmmod self.cmd_and_check("rmmod %s" % module_prename) def kprobe_func(self, name=''): # check config self.check_config("CONFIG_KPROBES") module_prename = name + "_example" module_name = name + "_example.ko" sysmbol_name = module_prename # make sure if module exists self.check_module_exist("kprobes/", module_name) # modprobe self.cmd_and_check("modprobe %s" % module_prename) # lsmod self.cmd_and_check("lsmod | grep %s | cut -d\' \' -f1" % sysmbol_name, sysmbol_name) # check result self.cmd_and_check("dmesg | grep Planted | head -n10", "Planted") # rmmod self.cmd_and_check("rmmod %s" % module_prename) def kobject_func(self, name=''): module_prename = name + "_example" module_name = name + "-example.ko" sysmbol_name = module_prename # make sure if module exists self.check_module_exist("kobject/", module_name) # modprobe self.cmd_and_check("modprobe %s" % module_prename) # lsmod self.cmd_and_check("lsmod | grep %s | cut -d\' \' -f1" % sysmbol_name, sysmbol_name) # check result self.cmd_and_check("ls /sys/kernel/%s/" % sysmbol_name, "bar") # rmmod self.cmd_and_check("rmmod %s" % module_prename) class KSampleTest(KSample): # kfifo @OETestDepends(['ssh.SSHTest.test_ssh']) def test_kfifo_test(self): index = ["dma", "bytestream", "inttype", "record"] for i in index: self.kfifo_func(i) # kprobe @OETestDepends(['ssh.SSHTest.test_ssh']) def test_kprobe_test(self): self.check_arch("x86_64 i686 ppc") index = ["kprobe", "kretprobe"] for i in index: self.kprobe_func(i) # kobject @OETestDepends(['ssh.SSHTest.test_ssh']) def test_kobject_test(self): index = ["kobject", "kset"] for i in index: self.kobject_func(i) #trace @OETestDepends(['ssh.SSHTest.test_ssh']) def test_trace_events(self): # check config self.check_config("CONFIG_TRACING_SUPPORT") # make sure if module exists self.check_module_exist("trace_events/", "trace-events-sample.ko") # modprobe self.cmd_and_check("modprobe trace-events-sample") # lsmod self.cmd_and_check("lsmod | grep trace_events_sample | cut -d\' \' -f1", "trace_events_sample") # check dir self.cmd_and_check("ls /sys/kernel/debug/tracing/events/ | grep sample-trace", "sample-trace") # enable trace self.cmd_and_check("echo 1 > /sys/kernel/debug/tracing/events/sample-trace/enable") self.cmd_and_check("cat /sys/kernel/debug/tracing/events/sample-trace/enable") # check result status = 1 count = 0 while status != 0: time.sleep(1) status, output = self.target.run('cat /sys/kernel/debug/tracing/trace | grep hello | head -n1 | cut -d\':\' -f2') if " foo_bar" in output: break count = count + 1 if count > 5: self.assertTrue(False, "Time out when check result") # disable trace self.cmd_and_check("echo 0 > /sys/kernel/debug/tracing/events/sample-trace/enable") # clean up trace self.cmd_and_check("echo > /sys/kernel/debug/tracing/trace") # rmmod self.cmd_and_check("rmmod trace-events-sample") @OETestDepends(['ssh.SSHTest.test_ssh']) def test_trace_printk(self): # check config self.check_config("CONFIG_TRACING_SUPPORT") # make sure if module exists self.check_module_exist("trace_printk/", "trace-printk.ko") # modprobe self.cmd_and_check("modprobe trace-printk") # lsmod self.cmd_and_check("lsmod | grep trace_printk | cut -d\' \' -f1", "trace_printk") # check result self.cmd_and_check("cat /sys/kernel/debug/tracing/trace | grep trace_printk_irq_work | head -n1 | cut -d\':\' -f2", " trace_printk_irq_work") # clean up trace self.cmd_and_check("echo > /sys/kernel/debug/tracing/trace") # rmmod self.cmd_and_check("rmmod trace-printk") # hw breakpoint @OETestDepends(['ssh.SSHTest.test_ssh']) def test_hw_breakpoint_example(self): # check arch status, output = self.target.run("uname -m") result = ("x86_64" in output) or ("aarch64" in output) if not result: self.skipTest("the arch %s doesn't support hw breakpoint" % output) # check config self.check_config("CONFIG_KALLSYMS_ALL") # make sure if module exists self.check_module_exist("hw_breakpoint/", "data_breakpoint.ko") # modprobe self.cmd_and_check("modprobe data_breakpoint") # lsmod self.cmd_and_check("lsmod | grep data_breakpoint | cut -d\' \' -f1", "data_breakpoint") # check result self.cmd_and_check("cat /var/log/messages | grep sample_hbp_handler", "sample_hbp_handler") # rmmod self.cmd_and_check("rmmod data_breakpoint") @OETestDepends(['ssh.SSHTest.test_ssh']) def test_configfs_sample(self): # check config status, ret = self.target.run('zcat /proc/config.gz | grep CONFIG_CONFIGFS_FS') if not ["CONFIG_CONFIGFS_FS=m" in ret or "CONFIG_CONFIGFS_FS=y" in ret]: self.skipTest("CONFIG error") # make sure if module exists self.check_module_exist("configfs/", "configfs_sample.ko") # modprobe self.cmd_and_check("modprobe configfs_sample") # lsmod self.cmd_and_check("lsmod | grep configfs_sample | cut -d\' \' -f1 | head -n1", "configfs_sample") status = 1 count = 0 while status != 0: time.sleep(1) status, ret = self.target.run('cat /sys/kernel/config/01-childless/description') count = count + 1 if count > 200: self.skipTest("Time out for check dir") # rmmod self.cmd_and_check("rmmod configfs_sample") @OETestDepends(['ssh.SSHTest.test_ssh']) def test_cn_test(self): # make sure if module exists self.check_module_exist("connector/", "cn_test.ko") # modprobe self.cmd_and_check("modprobe cn_test") # lsmod self.cmd_and_check("lsmod | grep cn_test | cut -d\' \' -f1", "cn_test") # check result self.cmd_and_check("cat /proc/net/connector | grep cn_test | head -n1 | cut -d\' \' -f1", "cn_test") # rmmod self.cmd_and_check("rmmod cn_test")