1# SPDX-License-Identifier: GPL-2.0
2# (C) Copyright 2023, Advanced Micro Devices, Inc.
3
4import pytest
5import re
6
7"""
8Note: This test doesn't rely on boardenv_* configuration value but they can
9change test behavior.
10
11For example:
12
13# Setup env__mii_deive_test_skip to True if tests with ethernet PHY devices
14# should be skipped. For example: Missing PHY device
15env__mii_device_test_skip = True
16
17# Setup env__mii_device_test to set the MII device names. Test will be skipped
18# if env_mii_device_test is not set
19env__mii_device_test = {
20    'device_list': ['eth0', 'eth1'],
21}
22"""
23
24@pytest.mark.buildconfigspec("cmd_mii")
25def test_mii_info(ubman):
26    if ubman.config.env.get("env__mii_device_test_skip", False):
27        pytest.skip("MII device test is not enabled!")
28    expected_output = "PHY"
29    output = ubman.run_command("mii info")
30    if not re.search(r"PHY (.+?):", output):
31        pytest.skip("PHY device does not exist!")
32    assert expected_output in output
33
34@pytest.mark.buildconfigspec("cmd_mii")
35def test_mii_list(ubman):
36    if ubman.config.env.get("env__mii_device_test_skip", False):
37        pytest.skip("MII device test is not enabled!")
38
39    f = ubman.config.env.get("env__mii_device_test", None)
40    if not f:
41        pytest.skip("No MII device to test!")
42
43    dev_list = f.get("device_list")
44    if not dev_list:
45        pytest.fail("No MII device list provided via env__mii_device_test!")
46
47    expected_output = "Current device"
48    output = ubman.run_command("mii device")
49    mii_devices = (
50        re.search(r"MII devices: '(.+)'", output).groups()[0].replace("'", "").split()
51    )
52
53    assert len([x for x in dev_list if x in mii_devices]) == len(dev_list)
54    assert expected_output in output
55
56@pytest.mark.buildconfigspec("cmd_mii")
57def test_mii_set_device(ubman):
58    test_mii_list(ubman)
59    f = ubman.config.env.get("env__mii_device_test", None)
60    dev_list = f.get("device_list")
61    output = ubman.run_command("mii device")
62    current_dev = re.search(r"Current device: '(.+?)'", output).groups()[0]
63
64    for dev in dev_list:
65        ubman.run_command(f"mii device {dev}")
66        output = ubman.run_command("echo $?")
67        assert output.endswith("0")
68
69    ubman.run_command(f"mii device {current_dev}")
70    output = ubman.run_command("mii device")
71    dev = re.search(r"Current device: '(.+?)'", output).groups()[0]
72    assert current_dev == dev
73
74@pytest.mark.buildconfigspec("cmd_mii")
75def test_mii_read(ubman):
76    test_mii_list(ubman)
77    output = ubman.run_command("mii info")
78    eth_addr = hex(int(re.search(r"PHY (.+?):", output).groups()[0], 16))
79    ubman.run_command(f"mii read {eth_addr} 0")
80    output = ubman.run_command("echo $?")
81    assert output.endswith("0")
82
83@pytest.mark.buildconfigspec("cmd_mii")
84def test_mii_dump(ubman):
85    test_mii_list(ubman)
86    expected_response = "PHY control register"
87    output = ubman.run_command("mii info")
88    eth_addr = hex(int(re.search(r"PHY (.+?):", output).groups()[0], 16))
89    response = ubman.run_command(f"mii dump {eth_addr} 0")
90    assert expected_response in response
91    output = ubman.run_command("echo $?")
92    assert output.endswith("0")
93