From: Brian Cain <[email protected]>
Signed-off-by: Brian Cain <[email protected]>
Reviewed-by: Pierrick Bouvier <[email protected]>
Signed-off-by: Matheus Tavares Bernardino <[email protected]>
---
tests/functional/hexagon/meson.build | 9 ++
tests/functional/hexagon/test_systests.py | 110 ++++++++++++++++++++++
tests/functional/meson.build | 1 +
3 files changed, 120 insertions(+)
create mode 100644 tests/functional/hexagon/meson.build
create mode 100755 tests/functional/hexagon/test_systests.py
diff --git a/tests/functional/hexagon/meson.build
b/tests/functional/hexagon/meson.build
new file mode 100644
index 00000000000..6cd684b0df7
--- /dev/null
+++ b/tests/functional/hexagon/meson.build
@@ -0,0 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+test_hexagon_timeouts = {
+ 'systests': 180,
+}
+
+tests_hexagon_system_thorough = [
+ 'systests',
+]
diff --git a/tests/functional/hexagon/test_systests.py
b/tests/functional/hexagon/test_systests.py
new file mode 100755
index 00000000000..8977aece43d
--- /dev/null
+++ b/tests/functional/hexagon/test_systests.py
@@ -0,0 +1,110 @@
+#!/usr/bin/env python3
+#
+# Copyright(c) Qualcomm Innovation Center, Inc. All Rights Reserved.
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+import os
+import re
+import time
+import unittest
+
+from qemu_test import QemuSystemTest, Asset, wait_for_console_pattern
+
+
+_TARBALL_BIN_PATH = (
+ "systests_standalone_package",
+ "StandaloneSysTests_6.4.0.2_v68",
+ "bin",
+)
+
+class SysTestsStandaloneTests(QemuSystemTest):
+ SYSTEST_TIMEOUT_SEC = 30
+
+ ASSET_TARBALL = Asset(
+
"https://github.com/qualcomm/qemu-hexagon-testing/releases/download/v0.2.11/systests_standalone.tar.gz",
+ "b5777aa65245de7710a7a08d717953c1362be7c8b60d9014c9fee8b17610ad1c",
+ )
+
+ def setUp(self):
+ super().setUp()
+ self.archive_extract(self.ASSET_TARBALL)
+
+ def binary(self, name):
+ """Return the full path to binary *name* inside bin dir."""
+ path = self.scratch_file(*_TARBALL_BIN_PATH, name)
+ self.assertTrue(os.path.exists(path))
+ return path
+
+ def run_exit_zero(self, binary_name, *extra_args, machine="V66G_1024"):
+ """Launch *binary_name* and assert it exits with code 0.
+
+ :param binary_name: name of the binary inside bin dir.
+ :param extra_args: optional pairs of (flag, value) strings passed
+ to set_vm_arg(), e.g. ('-append', 'myarg').
+ :param machine: QEMU machine type (default "V66G_1024").
+ """
+ self.set_machine(machine)
+ self.set_vm_arg("-display", "none")
+ self.set_vm_arg("-kernel", self.binary(binary_name))
+ for flag, value in zip(extra_args[::2], extra_args[1::2]):
+ self.set_vm_arg(flag, value)
+ self.vm.launch()
+ self.vm.wait(timeout=60.0)
+ self.assertEqual(self.vm.exitcode(), 0,
+ f"Test {binary_name} exited with "
+ f"code {self.vm.exitcode()}, expected 0")
+
+ def run_console_pattern(self, binary_name, pattern, *extra_args,
+ machine="V66G_1024"):
+ """Launch *binary_name* and wait for *pattern* on the semihosting
console.
+
+ :param binary_name: name of the binary inside bin dir.
+ :param pattern: string pattern to wait for via
wait_for_console_pattern.
+ :param extra_args: optional pairs of (flag, value) strings passed
+ to set_vm_arg(), e.g. ('-append', 'myarg').
+ :param machine: QEMU machine type (default "V66G_1024").
+ """
+ self.set_machine(machine)
+ self.set_vm_arg("-display", "none")
+ self.set_vm_arg("-kernel", self.binary(binary_name))
+ for flag, value in zip(extra_args[::2], extra_args[1::2]):
+ self.set_vm_arg(flag, value)
+ self.vm.set_console(semihosting=True)
+ self.vm.launch()
+ try:
+ wait_for_console_pattern(self, pattern)
+ finally:
+ self.vm.kill()
+
+ def test_fopen(self):
+ """fopen reads a file passed via --append and verifies its contents."""
+ import tempfile
+ # The fopen binary has a short cmdline buffer; use a short path.
+ dummy = os.path.join(tempfile.gettempdir(), "qemu_fopen_test.so")
+ with open(dummy, "w") as f:
+ f.write("valid\n")
+ self.run_exit_zero("fopen", "-append", dummy)
+
+ def test_ftrunc(self):
+ """ftrunc truncates _testfile_ftrunc from 6 bytes to 1 byte."""
+ ftrunc_path = self.scratch_file("_testfile_ftrunc")
+ with open(ftrunc_path, "w") as f:
+ f.write("valid\n")
+ # Sleep 1 s so mtime change is observable
+ time.sleep(1)
+ self.run_exit_zero("ftrunc", "-append", ftrunc_path)
+ self.assertEqual(os.path.getsize(ftrunc_path), 1,
+ "_testfile_ftrunc should be 1 byte after ftrunc")
+
+ def test_access(self):
+ """access checks R_OK|W_OK on _testfile_access."""
+ testfile = self.scratch_file("_testfile_access")
+ with open(testfile, "w") as f:
+ f.write("valid\n")
+ self.run_exit_zero("access", "-append", testfile)
+
+ def test_semihost(self):
+ self.run_console_pattern("semihost", "PASS", "-append", "arg1", "arg2")
+
+if __name__ == "__main__":
+ QemuSystemTest.main()
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
index c158197c4b7..c7362dd00ef 100644
--- a/tests/functional/meson.build
+++ b/tests/functional/meson.build
@@ -14,6 +14,7 @@ subdir('aarch64')
subdir('alpha')
subdir('arm')
subdir('avr')
+subdir('hexagon')
subdir('hppa')
subdir('i386')
subdir('loongarch64')
--
2.37.2