#
# Copyright OpenEmbedded Contributors
#
# 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")
