mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Jonas Rebmann <mail@schlaraffenlan.de>
To: Sascha Hauer <s.hauer@pengutronix.de>,
	 BAREBOX <barebox@lists.infradead.org>
Cc: Jonas Rebmann <mail@schlaraffenlan.de>
Subject: [PATCH] test: pytest: introduce pytest for network, test tftp notfound
Date: Wed, 05 Jun 2024 15:13:22 +0200	[thread overview]
Message-ID: <20240605-test_tftp-v1-1-5752ea677b06@schlaraffenlan.de> (raw)

barebox already has a few pytest integration tests but none of them are
networking related. This type of test requires a network connection to
the barebox device, without the "network" feature the test is marked
xfail. DHCP is assumed. For the case of qemu device we also assume DHCP
to set serverip correctly. In any other case, it is set via console to
that IP of the pytest-host that has the route to the barebox devices IP.
The test asserts on a successful ICMP ping from the test device to the
pytest-host as well as on a "No such file or directory" conversation
from the barebox device to the pytest-host

Signed-off-by: Jonas Rebmann <mail@schlaraffenlan.de>
---
 test/arm/virt@multi_v8_defconfig.yaml |  1 +
 test/openrisc/generic_defconfig.yaml  |  2 +
 test/py/test_network.py               | 69 +++++++++++++++++++++++++++++++++++
 3 files changed, 72 insertions(+)

diff --git a/test/arm/virt@multi_v8_defconfig.yaml b/test/arm/virt@multi_v8_defconfig.yaml
index d8f8ab5cbf..42ce10328d 100644
--- a/test/arm/virt@multi_v8_defconfig.yaml
+++ b/test/arm/virt@multi_v8_defconfig.yaml
@@ -14,6 +14,7 @@ targets:
       BareboxTestStrategy: {}
     features:
       - virtio-mmio
+      - network
     runner:
       tuxmake_arch: arm64
 images:
diff --git a/test/openrisc/generic_defconfig.yaml b/test/openrisc/generic_defconfig.yaml
index 93ba9586c4..56b70b8242 100644
--- a/test/openrisc/generic_defconfig.yaml
+++ b/test/openrisc/generic_defconfig.yaml
@@ -12,6 +12,8 @@ targets:
         prompt: 'barebox@[^:]+:[^ ]+ '
         bootstring: 'commandline:'
       BareboxTestStrategy: {}
+    features:
+      - network
 images:
   barebox: !template "$LG_BUILDDIR/barebox"
 imports:
diff --git a/test/py/test_network.py b/test/py/test_network.py
new file mode 100644
index 0000000000..00bcea3606
--- /dev/null
+++ b/test/py/test_network.py
@@ -0,0 +1,69 @@
+import pytest
+
+from labgrid import driver,Environment
+import socket
+import threading
+
+TFTP_TEST_PORT = 6968
+
+def get_source_addr(destination_ip, destination_port):
+    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+    udp_socket.connect((destination_ip, destination_port))
+    source_ip, _ = udp_socket.getsockname()
+    return source_ip
+
+def expect_tftp_notfound(filename, listen_port, listen_addr):
+    uname = filename.encode("ascii")
+    messages = [
+        b"\000\001" + uname + b"\000octet\000timeout\0005\000blksize\000512\000tsize\0000\000",
+        b"\000\005\000\001File not found\000",
+    ]
+    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+    udp_socket.bind((listen_addr, listen_port))
+    udp_socket.settimeout(3)
+    data, addr = udp_socket.recvfrom(1024)
+    udp_socket.sendto(messages[1], addr)
+    udp_socket.close()
+    assert data == messages[0]
+
+def test_skip():
+    pytest.mark.skip("no network adapter available")
+
+def test_barebox_tftp_not_found(barebox, barebox_config, env):
+    # on duts without network feature, this is expected to fail
+    # set xfail_strict=True to enforce specifying the network feature if available
+    if not 'network' in env.get_target_features():
+        pytest.xfail("network feature not specified")
+
+    barebox.run_check("ifup eth0")
+    guestaddr = barebox.run_check("echo $eth0.ipaddr")[0]
+    assert guestaddr != "0.0.0.0"
+
+    listen_addr = "127.0.0.1"
+    if not isinstance(barebox.console, driver.QEMUDriver):
+        # sending an arbitrary udp package to determine the IP towards dut
+        listen_addr = get_source_addr(guestaddr, TFTP_TEST_PORT)
+        barebox.run_check(f"eth0.serverip={listen_addr}")
+
+    barebox.run_check("ping $eth0.serverip", timeout=2)
+
+    tftp_thread = threading.Thread(
+        target=expect_tftp_notfound,
+        name="expect_tftp_notfound",
+        args=("a", TFTP_TEST_PORT, listen_addr),
+    )
+    tftp_thread.daemon = True
+    tftp_thread.start()
+    
+    try:
+        stdout, _, returncode = barebox.run(f"tftp -P {TFTP_TEST_PORT} a", timeout=3)
+        assert returncode == 127
+    except:
+        raise
+    finally:
+        # terminate a timed-out ftpf
+        barebox.console.sendcontrol("c")
+
+    tftp_thread.join()
+    barebox.run_check("ifdown eth0")
+

---
base-commit: 55cf43c442c260846b393c2099d4a72d0ebdbdd9
change-id: 20240605-test_tftp-9e12282d46a0

Best regards,
-- 
Jonas Rebmann <mail@schlaraffenlan.de>




             reply	other threads:[~2024-06-05 13:14 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-06-05 13:13 Jonas Rebmann [this message]
2024-06-10  9:23 ` 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=20240605-test_tftp-v1-1-5752ea677b06@schlaraffenlan.de \
    --to=mail@schlaraffenlan.de \
    --cc=barebox@lists.infradead.org \
    --cc=s.hauer@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