aboutsummaryrefslogtreecommitdiffstats
path: root/meta-arm/lib/oeqa/runtime/cases/fvp_devices.py
diff options
context:
space:
mode:
Diffstat (limited to 'meta-arm/lib/oeqa/runtime/cases/fvp_devices.py')
-rw-r--r--meta-arm/lib/oeqa/runtime/cases/fvp_devices.py130
1 files changed, 130 insertions, 0 deletions
diff --git a/meta-arm/lib/oeqa/runtime/cases/fvp_devices.py b/meta-arm/lib/oeqa/runtime/cases/fvp_devices.py
new file mode 100644
index 00000000..0246e76a
--- /dev/null
+++ b/meta-arm/lib/oeqa/runtime/cases/fvp_devices.py
@@ -0,0 +1,130 @@
+from oeqa.runtime.case import OERuntimeTestCase
+from oeqa.core.decorator.data import skipIfNotInDataVar
+from oeqa.core.decorator.depends import OETestDepends
+
+
+class FvpDevicesTest(OERuntimeTestCase):
+ def run_cmd(self, cmd, check=True):
+ """
+ A wrapper around self.target.run, which:
+ * Fails the test on command failure by default
+ * Allows the "run" behavior to be overridden in sub-classes
+ """
+ (status, output) = self.target.run(cmd)
+ if status and check:
+ self.fail("Command '%s' returned non-zero exit "
+ "status %d:\n%s" % (cmd, status, output))
+
+ return (status, output)
+
+ def check_devices(self, cls, min_count, search_drivers):
+ # Find all the devices of the specified class
+ cmd = f'find "/sys/class/{cls}" -type l -maxdepth 1'
+ _, output = self.run_cmd(cmd)
+
+ devices = output.split()
+ self.assertGreaterEqual(len(devices),
+ min_count,
+ msg='Device count is lower than expected')
+
+ # Assert that at least one of the devices uses at least one of the
+ # drivers
+ drivers = set()
+ for device in devices:
+ cmd = f'basename "$(readlink "{device}/device/driver")"'
+ _, output = self.run_cmd(cmd)
+ drivers.update(output.split())
+
+ self.assertTrue(drivers & set(search_drivers),
+ msg='No device uses either of the drivers: ' +
+ str(search_drivers))
+
+ def check_rng(self, hw_random, dev):
+ cmd = f'cat {hw_random} | grep {dev}'
+ self.run_cmd(cmd)
+
+ def set_cpu(self, cpu_num, flag):
+ # Issue echo command
+ self.run_cmd(
+ f'echo "{flag}" > "/sys/devices/system/cpu/cpu{cpu_num}/online"',
+ check = False,
+ )
+ _, output = self.run_cmd(
+ f'cat "/sys/devices/system/cpu/cpu{cpu_num}/online"'
+ )
+
+ return output == flag
+
+ def enable_cpu(self, cpu_num):
+ return self.set_cpu(cpu_num, "1")
+
+ def disable_cpu(self, cpu_num):
+ return self.set_cpu(cpu_num, "0")
+
+ @OETestDepends(['ssh.SSHTest.test_ssh'])
+ @skipIfNotInDataVar('TEST_FVP_DEVICES', 'cpu_hotplug',
+ 'cpu_hotplug not included in BSP tests')
+ def test_cpu_hotplug(self):
+ _, cpus = self.run_cmd('find /sys/firmware/devicetree/base/cpus/'
+ ' -name "cpu@*" -maxdepth 1 | wc -l')
+
+ try:
+ count_cpus = int(cpus)
+ except ValueError:
+ self.fail(f"Expected number of CPUs, but found this:\n{cpus}")
+
+ self.num_cpus = int(self.td.get('TEST_CPU_HOTPLUG_NUM_CPUS',
+ count_cpus))
+ try:
+ # Test that all cores are online
+ _, cpus = self.run_cmd('grep -c "processor" /proc/cpuinfo')
+ self.assertEqual(int(cpus), self.num_cpus)
+ # Don't try to disable here the only cpu present in the system.
+ if self.num_cpus > 1:
+ # Test that we can stop each core individually
+ for i in range(self.num_cpus):
+ self.assertTrue(self.disable_cpu(i))
+ self.assertTrue(self.enable_cpu(i))
+
+ # Test that we cannot disable all cores
+ for i in range(self.num_cpus - 1):
+ self.assertTrue(self.disable_cpu(i))
+ # Disabling last core should trigger an error
+ self.assertFalse(self.disable_cpu(self.num_cpus - 1))
+ finally:
+ # Ensure all CPUs are re-enabled
+ for i in range(self.num_cpus):
+ self.enable_cpu(i)
+
+ @OETestDepends(['ssh.SSHTest.test_ssh'])
+ @skipIfNotInDataVar('TEST_FVP_DEVICES', 'rtc',
+ 'rtc device not included in BSP tests')
+ def test_rtc(self):
+ self.check_devices("rtc", 1, ["rtc-pl031"])
+ self.run_cmd('hwclock')
+
+ @OETestDepends(['ssh.SSHTest.test_ssh'])
+ @skipIfNotInDataVar('TEST_FVP_DEVICES', 'watchdog',
+ 'watchdog device not included in BSP tests')
+ def test_watchdog(self):
+ self.check_devices("watchdog", 1, ["sp805-wdt", "sbsa-gwdt"])
+
+ @OETestDepends(['ssh.SSHTest.test_ssh'])
+ @skipIfNotInDataVar('TEST_FVP_DEVICES', 'networking',
+ 'networking device not included in BSP tests')
+ def test_networking(self):
+ self.check_devices("net", 2, ["virtio_net", "vif"])
+
+ # Check that outbound network connections work
+ self.run_cmd('wget -O /dev/null "https://www.arm.com"')
+
+ @OETestDepends(['ssh.SSHTest.test_ssh'])
+ @skipIfNotInDataVar('TEST_FVP_DEVICES', 'virtiorng',
+ 'virtiorng device not included in BSP tests')
+ def test_virtiorng(self):
+ self.check_rng('/sys/devices/virtual/misc/hw_random/rng_available',
+ 'virtio_rng.0')
+ self.check_rng('/sys/devices/virtual/misc/hw_random/rng_current',
+ 'virtio_rng.0')
+
+ self.run_cmd('hexdump -n 32 /dev/hwrng')