# ethtool tests for emulated network devices
#
# This test leverages ethtool's --test sequence to validate network
# device behaviour.
#
# SPDX-License-Identifier: GPL-2.0-or-late

from avocado import skip
from avocado_qemu import QemuSystemTest
from avocado_qemu import wait_for_console_pattern

class NetDevEthtool(QemuSystemTest):
    """
    :avocado: tags=arch:x86_64
    :avocado: tags=machine:q35
    """

    # Runs in about 17s under KVM, 19s under TCG, 25s under GCOV
    timeout = 45

    # Fetch assets from the netdev-ethtool subdir of my shared test
    # images directory on fileserver.linaro.org.
    def get_asset(self, name, sha1):
        base_url = ('https://fileserver.linaro.org/s/'
                    'kE4nCFLdQcoBF9t/download?'
                    'path=%2Fnetdev-ethtool&files=' )
        url = base_url + name
        # use explicit name rather than failing to neatly parse the
        # URL into a unique one
        return self.fetch_asset(name=name, locations=(url), asset_hash=sha1)

    def common_test_code(self, netdev, extra_args=None):

        # This custom kernel has drivers for all the supported network
        # devices we can emulate in QEMU
        kernel = self.get_asset("bzImage",
                                "33469d7802732d5815226166581442395cb289e2")

        rootfs = self.get_asset("rootfs.squashfs",
                                "9793cea7021414ae844bda51f558bd6565b50cdc")

        append = 'printk.time=0 console=ttyS0 '
        append += 'root=/dev/sr0 rootfstype=squashfs '

        # any additional kernel tweaks for the test
        if extra_args:
            append += extra_args

        # finally invoke ethtool directly
        append += ' init=/usr/sbin/ethtool -- -t eth1 offline'

        # add the rootfs via a readonly cdrom image
        drive = f"file={rootfs},if=ide,index=0,media=cdrom"

        self.vm.add_args('-kernel', kernel,
                         '-append', append,
                         '-drive', drive,
                         '-device', netdev)

        self.vm.set_console(console_index=0)
        self.vm.launch()

        wait_for_console_pattern(self,
                                 "The test result is PASS",
                                 "The test result is FAIL",
                                 vm=None)
        # no need to gracefully shutdown, just finish
        self.vm.kill()

    # Skip testing for MSI for now. Allegedly it was fixed by:
    #   28e96556ba (igb: Allocate MSI-X vector when testing)
    # but I'm seeing oops in the kernel
    @skip("Kernel bug with MSI enabled")
    def test_igb(self):
        """
        :avocado: tags=device:igb
        """
        self.common_test_code("igb")

    def test_igb_nomsi(self):
        """
        :avocado: tags=device:igb
        """
        self.common_test_code("igb", "pci=nomsi")

    # It seems the other popular cards we model in QEMU currently fail
    # the pattern test with:
    #
    #   pattern test failed (reg 0x00178): got 0x00000000 expected 0x00005A5A
    #
    # So for now we skip them.

    @skip("Incomplete reg 0x00178 support")
    def test_e1000(self):
        """
        :avocado: tags=device:e1000
        """
        self.common_test_code("e1000")

    @skip("Incomplete reg 0x00178 support")
    def test_i82550(self):
        """
        :avocado: tags=device:i82550
        """
        self.common_test_code("i82550")
