#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#

import os

from subprocess import check_output
from shutil import rmtree
from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.data import skipIfDataVar
from oeqa.runtime.decorator.package import OEHasPackage

#in the future these lists could be moved outside of module
errors = ["error", "cannot", "can\'t", "failed"]

common_errors = [
    "(WW) warning, (EE) error, (NI) not implemented, (??) unknown.",
    "dma timeout",
    "can\'t add hid device:",
    "usbhid: probe of ",
    "_OSC failed (AE_ERROR)",
    "_OSC failed (AE_SUPPORT)",
    "AE_ALREADY_EXISTS",
    "ACPI _OSC request failed (AE_SUPPORT)",
    "can\'t disable ASPM",
    "Failed to load module \"vesa\"",
    "Failed to load module vesa",
    "Failed to load module \"modesetting\"",
    "Failed to load module modesetting",
    "Failed to load module \"glx\"",
    "Failed to load module \"fbdev\"",
    "Failed to load module fbdev",
    "Failed to load module glx",
    "[drm] Cannot find any crtc or sizes",
    "_OSC failed (AE_NOT_FOUND); disabling ASPM",
    "Open ACPI failed (/var/run/acpid.socket) (No such file or directory)",
    "NX (Execute Disable) protection cannot be enabled: non-PAE kernel!",
    "hd.: possibly failed opcode",
    'NETLINK INITIALIZATION FAILED',
    'kernel: Cannot find map file',
    'omap_hwmod: debugss: _wait_target_disable failed',
    'VGA arbiter: cannot open kernel arbiter, no multi-card support',
    'Failed to find URL:http://ipv4.connman.net/online/status.html',
    'Online check failed for',
    'netlink init failed',
    'Fast TSC calibration',
    "BAR 0-9",
    "Failed to load module \"ati\"",
    "controller can't do DEVSLP, turning off",
    "stmmac_dvr_probe: warning: cannot get CSR clock",
    "error: couldn\'t mount because of unsupported optional features",
    "GPT: Use GNU Parted to correct GPT errors",
    "Cannot set xattr user.Librepo.DownloadInProgress",
    "Failed to read /var/lib/nfs/statd/state: Success",
    "error retry time-out =",
    "logind: cannot setup systemd-logind helper (-61), using legacy fallback",
    "Failed to rename network interface",
    "Failed to process device, ignoring: Device or resource busy",
    "Cannot find a map file",
    "[rdrand]: Initialization Failed",
    "[rndr  ]: Initialization Failed",
    "[pulseaudio] authkey.c: Failed to open cookie file",
    "[pulseaudio] authkey.c: Failed to load authentication key",
    "was skipped because of a failed condition check",
    "was skipped because all trigger condition checks failed",
    "xf86OpenConsole: Switching VT failed",
    ]

video_related = [
]

x86_common = [
    '[drm:psb_do_init] *ERROR* Debug is',
    'wrong ELF class',
    'Could not enable PowerButton event',
    'probe of LNXPWRBN:00 failed with error -22',
    'pmd_set_huge: Cannot satisfy',
    'failed to setup card detect gpio',
    'amd_nb: Cannot enumerate AMD northbridges',
    'failed to retrieve link info, disabling eDP',
    'Direct firmware load for iwlwifi',
    'Direct firmware load for regulatory.db',
    'failed to load regulatory.db',
] + common_errors

qemux86_common = [
    'wrong ELF class',
    "fail to add MMCONFIG information, can't access extended PCI configuration space under this bridge.",
    "can't claim BAR ",
    'amd_nb: Cannot enumerate AMD northbridges',
    'tsc: HPET/PMTIMER calibration failed',
    "modeset(0): Failed to initialize the DRI2 extension",
    "glamor initialization failed",
    "blk_update_request: I/O error, dev fd0, sector 0 op 0x0:(READ)",
    "floppy: error",
    'failed to IDENTIFY (I/O error, err_mask=0x4)',
] + common_errors

ignore_errors = {
    'default' : common_errors,
    'qemux86' : [
        'Failed to access perfctr msr (MSR',
        'pci 0000:00:00.0: [Firmware Bug]: reg 0x..: invalid BAR (can\'t size)',
        ] + qemux86_common,
    'qemux86-64' : qemux86_common,
    'qemumips' : [
        'Failed to load module "glx"',
        'pci 0000:00:00.0: [Firmware Bug]: reg 0x..: invalid BAR (can\'t size)',
        'cacheinfo: Failed to find cpu0 device node',
        ] + common_errors,
    'qemumips64' : [
        'pci 0000:00:00.0: [Firmware Bug]: reg 0x..: invalid BAR (can\'t size)',
        'cacheinfo: Failed to find cpu0 device node',
         ] + common_errors,
    'qemuppc' : [
        'PCI 0000:00 Cannot reserve Legacy IO [io  0x0000-0x0fff]',
        'host side 80-wire cable detection failed, limiting max speed',
        'mode "640x480" test failed',
        'Failed to load module "glx"',
        'can\'t handle BAR above 4GB',
        'Cannot reserve Legacy IO',
        ] + common_errors,
    'qemuppc64' : [
        'vio vio: uevent: failed to send synthetic uevent',
        'synth uevent: /devices/vio: failed to send uevent',
        'PCI 0000:00 Cannot reserve Legacy IO [io  0x10000-0x10fff]',
        ] + common_errors,
    'qemuarmv5' : [
        'mmci-pl18x: probe of fpga:05 failed with error -22',
        'mmci-pl18x: probe of fpga:0b failed with error -22',
        'Failed to load module "glx"',
        'OF: amba_device_add() failed (-19) for /amba/smc@10100000',
        'OF: amba_device_add() failed (-19) for /amba/mpmc@10110000',
        'OF: amba_device_add() failed (-19) for /amba/sctl@101e0000',
        'OF: amba_device_add() failed (-19) for /amba/watchdog@101e1000',
        'OF: amba_device_add() failed (-19) for /amba/sci@101f0000',
        'OF: amba_device_add() failed (-19) for /amba/spi@101f4000',
        'OF: amba_device_add() failed (-19) for /amba/ssp@101f4000',
        'OF: amba_device_add() failed (-19) for /amba/fpga/sci@a000',
        'Failed to initialize \'/amba/timer@101e3000\': -22',
        'jitterentropy: Initialization failed with host not compliant with requirements: 2',
        'clcd-pl11x: probe of 10120000.display failed with error -2',
        'arm-charlcd 10008000.lcd: error -ENXIO: IRQ index 0 not found'
        ] + common_errors,
    'qemuarm64' : [
        'Fatal server error:',
        '(EE) Server terminated with error (1). Closing log file.',
        'dmi: Firmware registration failed.',
        'irq: type mismatch, failed to map hwirq-27 for /intc',
        'logind: failed to get session seat',
        ] + common_errors,
    'intel-core2-32' : [
        'ACPI: No _BQC method, cannot determine initial brightness',
        '[Firmware Bug]: ACPI: No _BQC method, cannot determine initial brightness',
        '(EE) Failed to load module "psb"',
        '(EE) Failed to load module psb',
        '(EE) Failed to load module "psbdrv"',
        '(EE) Failed to load module psbdrv',
        '(EE) open /dev/fb0: No such file or directory',
        '(EE) AIGLX: reverting to software rendering',
        'dmi: Firmware registration failed.',
        'ioremap error for 0x78',
        ] + x86_common,
    'intel-corei7-64' : [
        'can\'t set Max Payload Size to 256',
        'intel_punit_ipc: can\'t request region for resource',
        '[drm] parse error at position 4 in video mode \'efifb\'',
        'ACPI Error: Could not enable RealTimeClock event',
        'ACPI Warning: Could not enable fixed event - RealTimeClock',
        'hci_intel INT33E1:00: Unable to retrieve gpio',
        'hci_intel: probe of INT33E1:00 failed',
        'can\'t derive routing for PCI INT A',
        'failed to read out thermal zone',
        'Bluetooth: hci0: Setting Intel event mask failed',
        'ttyS2 - failed to request DMA',
        'Bluetooth: hci0: Failed to send firmware data (-38)',
        'atkbd serio0: Failed to enable keyboard on isa0060/serio0',
        ] + x86_common,
    'genericx86' : x86_common,
    'genericx86-64' : [
        'Direct firmware load for i915',
        'Failed to load firmware i915',
        'Failed to fetch GuC',
        'Failed to initialize GuC',
        'Failed to load DMC firmware',
        'The driver is built-in, so to load the firmware you need to',
        ] + x86_common,
    'edgerouter' : [
        'not creating \'/sys/firmware/fdt\'',
        'Failed to find cpu0 device node',
        'Fatal server error:',
        'Server terminated with error',
        ] + common_errors,
    'beaglebone-yocto' : [
        'Direct firmware load for regulatory.db',
        'failed to load regulatory.db',
        'l4_wkup_cm',
        'Failed to load module "glx"',
        'Failed to make EGL context current',
        'glamor initialization failed',
        ] + common_errors,
}

log_locations = ["/var/log/","/var/log/dmesg", "/tmp/dmesg_output.log"]

class ParseLogsTest(OERuntimeTestCase):

    @classmethod
    def setUpClass(cls):
        cls.errors = errors

        # When systemd is enabled we need to notice errors on
        # circular dependencies in units.
        if 'systemd' in cls.td.get('DISTRO_FEATURES', ''):
            cls.errors.extend([
                'Found ordering cycle on',
                'Breaking ordering cycle by deleting job',
                'deleted to break ordering cycle',
                'Ordering cycle found, skipping',
                ])

        cls.ignore_errors = ignore_errors
        cls.log_locations = log_locations
        cls.msg = ''
        is_lsb, _ = cls.tc.target.run("which LSB_Test.sh")
        if is_lsb == 0:
            for machine in cls.ignore_errors:
                cls.ignore_errors[machine] = cls.ignore_errors[machine] \
                                             + video_related

    def getMachine(self):
        return self.td.get('MACHINE', '')

    def getWorkdir(self):
        return self.td.get('WORKDIR', '')

    # Get some information on the CPU of the machine to display at the
    # beginning of the output. This info might be useful in some cases.
    def getHardwareInfo(self):
        hwi = ""
        cmd = ('cat /proc/cpuinfo | grep "model name" | head -n1 | '
               " awk 'BEGIN{FS=\":\"}{print $2}'")
        _, cpu_name = self.target.run(cmd)

        cmd = ('cat /proc/cpuinfo | grep "cpu cores" | head -n1 | '
               "awk {'print $4'}")
        _, cpu_physical_cores = self.target.run(cmd)

        cmd = 'cat /proc/cpuinfo | grep "processor" | wc -l'
        _, cpu_logical_cores = self.target.run(cmd)

        _, cpu_arch = self.target.run('uname -m')

        hwi += 'Machine information: \n'
        hwi += '*******************************\n'
        hwi += 'Machine name: ' + self.getMachine() + '\n'
        hwi += 'CPU: ' + str(cpu_name) + '\n'
        hwi += 'Arch: ' + str(cpu_arch)+ '\n'
        hwi += 'Physical cores: ' + str(cpu_physical_cores) + '\n'
        hwi += 'Logical cores: ' + str(cpu_logical_cores) + '\n'
        hwi += '*******************************\n'

        return hwi

    # Go through the log locations provided and if it's a folder
    # create a list with all the .log files in it, if it's a file
    # just add it to that list.
    def getLogList(self, log_locations):
        logs = []
        for location in log_locations:
            status, _ = self.target.run('test -f ' + str(location))
            if status == 0:
                logs.append(str(location))
            else:
                status, _ = self.target.run('test -d ' + str(location))
                if status == 0:
                    cmd = 'find ' + str(location) + '/*.log -maxdepth 1 -type f'
                    status, output = self.target.run(cmd)
                    if status == 0:
                        output = output.splitlines()
                        for logfile in output:
                            logs.append(os.path.join(location, str(logfile)))
        return logs

    # Copy the log files to be parsed locally
    def transfer_logs(self, log_list):
        workdir = self.getWorkdir()
        self.target_logs = workdir + '/' + 'target_logs'
        target_logs = self.target_logs
        if os.path.exists(target_logs):
            rmtree(self.target_logs)
        os.makedirs(target_logs)
        for f in log_list:
            self.target.copyFrom(str(f), target_logs)

    # Get the local list of logs
    def get_local_log_list(self, log_locations):
        self.transfer_logs(self.getLogList(log_locations))
        list_dir = os.listdir(self.target_logs)
        dir_files = [os.path.join(self.target_logs, f) for f in list_dir]
        logs = [f for f in dir_files if os.path.isfile(f)]
        return logs

    # Build the grep command to be used with filters and exclusions
    def build_grepcmd(self, errors, ignore_errors, log):
        grepcmd = 'grep '
        grepcmd += '-Ei "'
        for error in errors:
            grepcmd += r'\<' + error + r'\>' + '|'
        grepcmd = grepcmd[:-1]
        grepcmd += '" ' + str(log) + " | grep -Eiv \'"

        try:
            errorlist = ignore_errors[self.getMachine()]
        except KeyError:
            self.msg += 'No ignore list found for this machine, using default\n'
            errorlist = ignore_errors['default']

        for ignore_error in errorlist:
            ignore_error = ignore_error.replace('(', r'\(')
            ignore_error = ignore_error.replace(')', r'\)')
            ignore_error = ignore_error.replace("'", '.')
            ignore_error = ignore_error.replace('?', r'\?')
            ignore_error = ignore_error.replace('[', r'\[')
            ignore_error = ignore_error.replace(']', r'\]')
            ignore_error = ignore_error.replace('*', r'\*')
            ignore_error = ignore_error.replace('0-9', '[0-9]')
            grepcmd += ignore_error + '|'
        grepcmd = grepcmd[:-1]
        grepcmd += "\'"

        return grepcmd

    # Grep only the errors so that their context could be collected.
    # Default context is 10 lines before and after the error itself
    def parse_logs(self, errors, ignore_errors, logs,
                   lines_before = 10, lines_after = 10):
        results = {}
        rez = []
        grep_output = ''

        for log in logs:
            result = None
            thegrep = self.build_grepcmd(errors, ignore_errors, log)

            try:
                result = check_output(thegrep, shell=True).decode('utf-8')
            except:
                pass

            if result is not None:
                results[log] = {}
                rez = result.splitlines()

                for xrez in rez:
                    try:
                        cmd = ['grep', '-F', xrez, '-B', str(lines_before)]
                        cmd += ['-A', str(lines_after), log]
                        grep_output = check_output(cmd).decode('utf-8')
                    except:
                        pass
                    results[log][xrez]=grep_output

        return results

    # Get the output of dmesg and write it in a file.
    # This file is added to log_locations.
    def write_dmesg(self):
        (status, dmesg) = self.target.run('dmesg > /tmp/dmesg_output.log')

    @OETestDepends(['ssh.SSHTest.test_ssh'])
    def test_parselogs(self):
        self.write_dmesg()
        log_list = self.get_local_log_list(self.log_locations)
        result = self.parse_logs(self.errors, self.ignore_errors, log_list)
        print(self.getHardwareInfo())
        errcount = 0
        for log in result:
            self.msg += 'Log: ' + log + '\n'
            self.msg += '-----------------------\n'
            for error in result[log]:
                errcount += 1
                self.msg += 'Central error: ' + str(error) + '\n'
                self.msg +=  '***********************\n'
                self.msg +=  result[str(log)][str(error)] + '\n'
                self.msg +=  '***********************\n'
        self.msg += '%s errors found in logs.' % errcount
        self.assertEqual(errcount, 0, msg=self.msg)
