From a5e4e016e4e17fc112df4814a50cf306e1ef6cdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Walstr=C3=B6m?= Date: Thu, 3 Oct 2024 15:26:31 +0200 Subject: [PATCH] test: Update infix-services for test-specification --- .../infix_services/services_basic/Readme.adoc | 12 ++++-- .../infix_services/services_basic/test.py | 40 +++++++++--------- .../services_basic/topology.png | Bin 7481 -> 6906 bytes 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/test/case/infix_services/services_basic/Readme.adoc b/test/case/infix_services/services_basic/Readme.adoc index 31bb1558..04aadd1c 100644 --- a/test/case/infix_services/services_basic/Readme.adoc +++ b/test/case/infix_services/services_basic/Readme.adoc @@ -16,10 +16,14 @@ image::topology.png[Services basic topology] endif::testgroup[] endif::topdoc[] ==== Test sequence -. Initialize -. Set static IPv4 address and disable services -. Start sniffer and enable services on target ... -. Disable services on target, verify no longer running ... +. Set up topology and attach to target DUT +. Set IPv4 address 10.0.0.10/24 on target:data and disable MDNS and LLDP +. Enable mDNS and LLDP and toggle target:data DOWN and UP to trigger service +. Verify on host:data there are packets from 10.0.0.10:5354 (mDNS) +. Verify on host:data there are LLDP packets sent from 10.0.0.10 +. Disable mDNS and LLDP +. Verify on host:data there are no packets from 10.0.0.10:5354 (mDNS) +. Verify on host:data there are no LLDP packets sent from 10.0.0.10 <<< diff --git a/test/case/infix_services/services_basic/test.py b/test/case/infix_services/services_basic/test.py index 5923032f..6373f735 100755 --- a/test/case/infix_services/services_basic/test.py +++ b/test/case/infix_services/services_basic/test.py @@ -26,7 +26,6 @@ def toggle(updown): } }) - def verify(enabled, sec): """Verify service traffic, or no traffic in case service not enabled""" _, hport = env.ltop.xlate("host", "data") @@ -54,11 +53,12 @@ def verify(enabled, sec): "enabled": enabled } }) + target.put_config_dict("ieee802-dot1ab-lldp", { - "lldp": { - "enabled": enabled - } - }) + "lldp": { + "enabled": enabled + } + }) toggle(True) time.sleep(sec) @@ -67,11 +67,11 @@ def verify(enabled, sec): with infamy.Test() as test: - with test.step("Initialize"): + with test.step("Set up topology and attach to target DUT"): env = infamy.Env() target = env.attach("target", "mgmt") - with test.step("Set static IPv4 address and disable services"): + with test.step("Set IPv4 address 10.0.0.10/24 on target:data and disable MDNS and LLDP"): _, tport = env.ltop.xlate("target", "data") target.put_config_dict("ietf-interfaces", { @@ -102,22 +102,24 @@ with infamy.Test() as test: "enabled": False } }) - - with test.step("Start sniffer and enable services on target ..."): + with test.step("Enable mDNS and LLDP and toggle target:data DOWN and UP to trigger service"): rc = verify(True, 10) print(rc.stdout) - # breakpoint() - if "10.0.0.10.5353" not in rc.stdout: - test.fail() - if "LLDP" not in rc.stdout: - test.fail() + with test.step("Verify on host:data there are packets from 10.0.0.10:5354 (mDNS)"): + if "10.0.0.10.5353" not in rc.stdout: + test.fail() + with test.step("Verify on host:data there are LLDP packets sent from 10.0.0.10"): + if "LLDP" not in rc.stdout: + test.fail() - with test.step("Disable services on target, verify no longer running ..."): + with test.step("Disable mDNS and LLDP"): rc = verify(False, 10) print(rc.stdout) - if "10.0.0.10.5353" in rc.stdout: - test.fail() - if "LLDP" in rc.stdout: - test.fail() + with test.step("Verify on host:data there are no packets from 10.0.0.10:5354 (mDNS)"): + if "10.0.0.10.5353" in rc.stdout: + test.fail() + with test.step("Verify on host:data there are no LLDP packets sent from 10.0.0.10"): + if "LLDP" in rc.stdout: + test.fail() test.succeed() diff --git a/test/case/infix_services/services_basic/topology.png b/test/case/infix_services/services_basic/topology.png index 9dd12e312dfc1ea5941b6567771ccff04ebf0a97..239b81e8dbd9a5489c0c9f85b0e5004b4ef19e56 100644 GIT binary patch literal 6906 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 literal 7481 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