mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Ahmad Fatoum <a.fatoum@pengutronix.de>
To: barebox@lists.infradead.org
Cc: jmaselbas@kalray.eu, Ahmad Fatoum <a.fatoum@pengutronix.de>,
	rcz@pengutronix.de
Subject: [PATCH v4 10/13] test: add first sample tests
Date: Fri,  4 Jun 2021 10:31:06 +0200	[thread overview]
Message-ID: <20210604083109.10581-11-a.fatoum@pengutronix.de> (raw)
In-Reply-To: <20210604083109.10581-1-a.fatoum@pengutronix.de>

The test can be run manually with e.g.

  labgrid-pytest --lg-env test/arm/qemu_virt64_defconfig.yaml test/py

Signed-off-by: Ahmad Fatoum <a.fatoum@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
+
+
+@pytest.fixture(scope='function')
+def barebox(strategy, target):
+    strategy.transition('barebox')
+    return target.get_driver('BareboxDriver')
+
+@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
+
+@target_factory.reg_driver
+@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


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


  parent reply	other threads:[~2021-06-04  8:33 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-04  8:30 [PATCH v4 00/13] add barebox in-tree testing infrastructure Ahmad Fatoum
2021-06-04  8:30 ` [PATCH v4 01/13] kbuild: add install target Ahmad Fatoum
2021-06-04  8:30 ` [PATCH v4 02/13] kbuild: add ARCH={i386, x86_64} as aliases for x86 Ahmad Fatoum
2021-06-04  8:30 ` [PATCH v4 03/13] kbuild: add ARCH=um alias for sandbox Ahmad Fatoum
2021-06-04  8:31 ` [PATCH v4 04/13] MIPS: qemu-malta: generate swapped image as part of multi-image build Ahmad Fatoum
2021-06-04  8:31 ` [PATCH v4 05/13] openrisc: set default KBUILD_IMAGE Ahmad Fatoum
2021-06-04  8:31 ` [PATCH v4 06/13] Documentation: boards: RISC-V: update TinyEMU support Ahmad Fatoum
2021-06-04  8:31 ` [PATCH v4 07/13] test: add basic barebox self-test infrastructure Ahmad Fatoum
2021-06-04  8:31 ` [PATCH v4 08/13] test: self: port Linux printf kselftest Ahmad Fatoum
2021-06-04  8:31 ` [PATCH v4 09/13] test: add labgrid-style configs for some emulated targets Ahmad Fatoum
2021-06-04  8:31 ` Ahmad Fatoum [this message]
2021-06-04  8:31 ` [PATCH v4 11/13] test: add emulate.pl, a runner for barebox on " Ahmad Fatoum
2021-06-04  8:31 ` [PATCH v4 12/13] test: self: run selftests as part of the pytest suite Ahmad Fatoum
2021-06-04  8:31 ` [PATCH v4 13/13] test: add bthread test Ahmad Fatoum

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210604083109.10581-11-a.fatoum@pengutronix.de \
    --to=a.fatoum@pengutronix.de \
    --cc=barebox@lists.infradead.org \
    --cc=jmaselbas@kalray.eu \
    --cc=rcz@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox