[PATCH RESEND v4 10/13] test: add first sample tests
Ahmad Fatoum
a.fatoum at pengutronix.de
Fri Jun 4 01:47:01 PDT 2021
The test can be run manually with e.g.
labgrid-pytest --lg-env test/arm/qemu_virt64_defconfig.yaml test/py
Acked-by: Rouven Czerwinski <r.czerwinski at pengutronix.de>
Signed-off-by: Ahmad Fatoum <a.fatoum at pengutronix.de>
---
test/.gitignore | 1 +
test/__init__.py | 0
test/conftest.py | 27 ++++++++++++++++++++++
test/py/__init__.py | 0
test/py/helper.py | 38 +++++++++++++++++++++++++++++++
test/py/test_shell.py | 36 +++++++++++++++++++++++++++++
test/strategy.py | 53 +++++++++++++++++++++++++++++++++++++++++++
7 files changed, 155 insertions(+)
create mode 100644 test/.gitignore
create mode 100644 test/__init__.py
create mode 100644 test/conftest.py
create mode 100644 test/py/__init__.py
create mode 100644 test/py/helper.py
create mode 100644 test/py/test_shell.py
create mode 100644 test/strategy.py
diff --git a/test/.gitignore b/test/.gitignore
new file mode 100644
index 000000000000..bee8a64b79a9
--- /dev/null
+++ b/test/.gitignore
@@ -0,0 +1 @@
+__pycache__
diff --git a/test/__init__.py b/test/__init__.py
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/test/conftest.py b/test/conftest.py
new file mode 100644
index 000000000000..1a043a91fa78
--- /dev/null
+++ b/test/conftest.py
@@ -0,0 +1,27 @@
+import pytest
+import os
+from .py import helper
+
+
+ at pytest.fixture(scope='function')
+def barebox(strategy, target):
+ strategy.transition('barebox')
+ return target.get_driver('BareboxDriver')
+
+ at pytest.fixture(scope="session")
+def barebox_config(strategy, target):
+ strategy.transition('barebox')
+ command = target.get_driver("BareboxDriver")
+ return helper.get_config(command)
+
+def pytest_configure(config):
+ if 'LG_BUILDDIR' not in os.environ:
+ if 'KBUILD_OUTPUT' in os.environ:
+ os.environ['LG_BUILDDIR'] = os.environ['KBUILD_OUTPUT']
+ elif os.path.isdir('build'):
+ os.environ['LG_BUILDDIR'] = os.path.realpath('build')
+ else:
+ os.environ['LG_BUILDDIR'] = os.getcwd()
+
+ if os.environ['LG_BUILDDIR'] is not None:
+ os.environ['LG_BUILDDIR'] = os.path.realpath(os.environ['LG_BUILDDIR'])
diff --git a/test/py/__init__.py b/test/py/__init__.py
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/test/py/helper.py b/test/py/helper.py
new file mode 100644
index 000000000000..4a68e83669ba
--- /dev/null
+++ b/test/py/helper.py
@@ -0,0 +1,38 @@
+from labgrid.driver import BareboxDriver
+import pytest
+import os
+from itertools import filterfalse
+
+
+def get_config(command):
+ """Returns the enabled config options of barebox, either from
+ a running instance if supported or by looking into .config
+ in the build directory.
+ Args:
+ command (BareboxDriver): An instance of the BareboxDriver
+ Returns:
+ list: list of the enabled config options
+ """
+ assert isinstance(command, BareboxDriver)
+
+ out, err, returncode = command.run("cat /env/data/config")
+ if returncode != 0:
+ try:
+ with open(os.environ['LG_BUILDDIR'] + "/.config") as f:
+ out = f.read().splitlines()
+ except OSError:
+ return set()
+
+ options = set()
+ for line in out:
+ if line and line.startswith("CONFIG_"):
+ options.add(line.split('=')[0])
+ return options
+
+
+def skip_disabled(config, *options):
+ if bool(config):
+ undefined = list(filterfalse(config.__contains__, options))
+
+ if bool(undefined):
+ pytest.skip("skipping test due to disabled " + (",".join(undefined)) + " dependency")
diff --git a/test/py/test_shell.py b/test/py/test_shell.py
new file mode 100644
index 000000000000..1af7d597a175
--- /dev/null
+++ b/test/py/test_shell.py
@@ -0,0 +1,36 @@
+import pytest
+from .helper import *
+
+
+def test_barebox_true(barebox, barebox_config):
+ skip_disabled(barebox_config, "CONFIG_CMD_TRUE")
+
+ _, _, returncode = barebox.run('true')
+ assert returncode == 0
+
+def test_barebox_false(barebox, barebox_config):
+ skip_disabled(barebox_config, "CONFIG_CMD_FALSE")
+
+ _, _, returncode = barebox.run('false')
+ assert returncode == 1
+
+def test_barebox_md5sum(barebox, barebox_config):
+ skip_disabled(barebox_config, "CONFIG_CMD_MD5SUM", "CONFIG_CMD_ECHO")
+
+ barebox.run_check("echo -o md5 test")
+ out = barebox.run_check("md5sum md5")
+ assert out == ["d8e8fca2dc0f896fd7cb4cb0031ba249 md5"]
+
+def test_barebox_version(barebox, barebox_config):
+ skip_disabled(barebox_config, "CONFIG_CMD_VERSION")
+
+ stdout, _, returncode = barebox.run('version')
+ assert 'barebox' in stdout[1]
+ assert returncode == 0
+
+def test_barebox_no_err(barebox, barebox_config):
+ skip_disabled(barebox_config, "CONFIG_CMD_DMESG")
+
+ # TODO extend by err once all qemu platforms conform
+ stdout, _, _ = barebox.run('dmesg -l crit,alert,emerg')
+ assert stdout == []
diff --git a/test/strategy.py b/test/strategy.py
new file mode 100644
index 000000000000..1fe1b7d818e9
--- /dev/null
+++ b/test/strategy.py
@@ -0,0 +1,53 @@
+import enum
+
+import attr
+
+from labgrid import target_factory, step
+from labgrid.strategy import Strategy, StrategyError
+
+class Status(enum.Enum):
+ unknown = 0
+ off = 1
+ barebox = 2
+
+ at target_factory.reg_driver
+ at attr.s(eq=False)
+class BareboxTestStrategy(Strategy):
+ """BareboxTestStrategy - Strategy to switch to barebox"""
+ bindings = {
+ "power": "PowerProtocol",
+ "console": "ConsoleProtocol",
+ "barebox": "BareboxDriver",
+ }
+
+ status = attr.ib(default=Status.unknown)
+
+ def __attrs_post_init__(self):
+ super().__attrs_post_init__()
+
+ @step(args=['status'])
+ def transition(self, status, *, step):
+ if not isinstance(status, Status):
+ status = Status[status]
+ if status == Status.unknown:
+ raise StrategyError("can not transition to {}".format(status))
+ elif status == self.status:
+ step.skip("nothing to do")
+ return # nothing to do
+ elif status == Status.off:
+ self.target.deactivate(self.console)
+ self.target.activate(self.power)
+ self.power.off()
+ elif status == Status.barebox:
+ self.transition(Status.off) # pylint: disable=missing-kwoa
+ self.target.activate(self.console)
+ # cycle power
+ self.power.cycle()
+ # interrupt barebox
+ self.target.activate(self.barebox)
+ else:
+ raise StrategyError(
+ "no transition found from {} to {}".
+ format(self.status, status)
+ )
+ self.status = status
--
2.29.2
More information about the barebox
mailing list