]> git.puffer.fish Git - matthieu/frr.git/commitdiff
tests: use std polling for results in zebra_rib test
authorChristian Hopps <chopps@labn.net>
Sat, 21 Aug 2021 17:37:42 +0000 (13:37 -0400)
committerChristian Hopps <chopps@labn.net>
Sat, 21 Aug 2021 17:44:48 +0000 (13:44 -0400)
In particular, the fixed 2 second sleep here was not long enough.
Switch to standard run_and_expect polling to make test more robust.

Signed-off-by: Christian Hopps <chopps@labn.net>
tests/topotests/zebra_rib/test_zebra_rib.py

index 56d112b7c358962bea81220129785f794d6ae2b6..778a710ee3f9ad741cdb16f5dfe8d4ad50003ac9 100644 (file)
@@ -104,13 +104,19 @@ def test_zebra_kernel_admin_distance():
     r1 = tgen.gears["r1"]
 
     # Route with 255/8192 metric
-    r1.run("ip route add 4.5.1.0/24 via 192.168.210.2 dev r1-eth0 metric 4278198272")
+
+    distance = 255
+    metric = 8192
+    def makekmetric(dist, metric):
+        return (dist << 24) + metric
+
+    r1.run("ip route add 4.5.1.0/24 via 192.168.210.2 dev r1-eth0 metric " + str(makekmetric(255, 8192)))
     # Route with 1/1 metric
-    r1.run("ip route add 4.5.2.0/24 via 192.168.211.2 dev r1-eth1 metric 16777217")
+    r1.run("ip route add 4.5.2.0/24 via 192.168.211.2 dev r1-eth1 metric " + str(makekmetric(1, 1)))
     # Route with 10/1 metric
-    r1.run("ip route add 4.5.3.0/24 via 192.168.212.2 dev r1-eth2 metric 167772161")
+    r1.run("ip route add 4.5.3.0/24 via 192.168.212.2 dev r1-eth2 metric " + str(makekmetric(10, 1)))
     # Same route with a 160/1 metric
-    r1.run("ip route add 4.5.3.0/24 via 192.168.213.2 dev r1-eth3 metric 2684354561")
+    r1.run("ip route add 4.5.3.0/24 via 192.168.213.2 dev r1-eth3 metric " + str(makekmetric(160, 1)))
 
     # Currently I believe we have a bug here with the same route and different
     # metric.  That needs to be properly resolved.  Making a note for
@@ -194,93 +200,69 @@ def test_route_map_usage():
     static_rmapfile = "%s/r1/static_rmap.ref" % (thisDir)
     expected = open(static_rmapfile).read().rstrip()
     expected = ("\n".join(expected.splitlines()) + "\n").rstrip()
-    actual = r1.vtysh_cmd("show route-map static")
-    actual = ("\n".join(actual.splitlines()) + "\n").rstrip()
     logger.info(
         "Does the show route-map static command run the correct number of times"
     )
-
-    diff = topotest.get_textdiff(
-        actual,
-        expected,
-        title1="Actual Route-map output",
-        title2="Expected Route-map output",
-    )
-    if diff:
-        logger.info("Actual:")
-        logger.info(actual)
-        logger.info("Expected:")
-        logger.info(expected)
-        srun = r1.vtysh_cmd("show run")
-        srun = ("\n".join(srun.splitlines()) + "\n").rstrip()
-        logger.info("Show run")
-        logger.info(srun)
-        assert 0, "r1 static route processing:\n"
+    def check_static_map_correct_runs():
+        actual = r1.vtysh_cmd("show route-map static")
+        actual = ("\n".join(actual.splitlines()) + "\n").rstrip()
+        return topotest.get_textdiff(
+            actual,
+            expected,
+            title1="Actual Route-map output",
+            title2="Expected Route-map output",
+        )
+    ok, result = topotest.run_and_expect(check_static_map_correct_runs, "", count=5, wait=1)
+    assert ok, result
 
     sharp_rmapfile = "%s/r1/sharp_rmap.ref" % (thisDir)
     expected = open(sharp_rmapfile).read().rstrip()
     expected = ("\n".join(expected.splitlines()) + "\n").rstrip()
-    actual = r1.vtysh_cmd("show route-map sharp")
-    actual = ("\n".join(actual.splitlines()) + "\n").rstrip()
     logger.info("Does the show route-map sharp command run the correct number of times")
-
-    diff = topotest.get_textdiff(
-        actual,
-        expected,
-        title1="Actual Route-map output",
-        title2="Expected Route-map output",
-    )
-    if diff:
-        logger.info("Actual:")
-        logger.info(actual)
-        logger.info("Expected:")
-        logger.info(expected)
-        srun = r1.vtysh_cmd("show run")
-        srun = ("\n".join(srun.splitlines()) + "\n").rstrip()
-        logger.info("Show run:")
-        logger.info(srun)
-        assert 0, "r1 sharp route-map processing:\n"
+    def check_sharp_map_correct_runs():
+        actual = r1.vtysh_cmd("show route-map sharp")
+        actual = ("\n".join(actual.splitlines()) + "\n").rstrip()
+        return topotest.get_textdiff(
+            actual,
+            expected,
+            title1="Actual Route-map output",
+            title2="Expected Route-map output",
+        )
+    ok, result = topotest.run_and_expect(check_sharp_map_correct_runs, "", count=5, wait=1)
+    assert ok, result
 
     logger.info(
         "Add a extension to the static route-map to see the static route go away"
+        " and test that the routes installed are correct"
     )
+
     r1.vtysh_cmd("conf\nroute-map sharp deny 5\nmatch ip address 5")
-    sleep(2)
     # we are only checking the kernel here as that this will give us the implied
     # testing of both the route-map and staticd withdrawing the route
     # let's spot check that the routes were installed correctly
     # in the kernel
-    logger.info("Test that the routes installed are correct")
     sharp_ipfile = "%s/r1/iproute.ref" % (thisDir)
     expected = open(sharp_ipfile).read().rstrip()
     expected = ("\n".join(expected.splitlines()) + "\n").rstrip()
-    actual = r1.run("ip route show")
-    actual = ("\n".join(actual.splitlines()) + "\n").rstrip()
-    actual = re.sub(r" nhid [0-9][0-9]", "", actual)
-    actual = re.sub(r" proto sharp", " proto XXXX", actual)
-    actual = re.sub(r" proto static", " proto XXXX", actual)
-    actual = re.sub(r" proto 194", " proto XXXX", actual)
-    actual = re.sub(r" proto 196", " proto XXXX", actual)
-    actual = re.sub(r" proto kernel", " proto XXXX", actual)
-    actual = re.sub(r" proto 2", " proto XXXX", actual)
-    # Some platforms have double spaces?  Why??????
-    actual = re.sub(r"  proto XXXX  ", " proto XXXX ", actual)
-    actual = re.sub(r"  metric", " metric", actual)
-    actual = re.sub(r" link  ", " link ", actual)
-    diff = topotest.get_textdiff(
-        actual, expected, title1="Actual ip route show", title2="Expected ip route show"
-    )
-
-    if diff:
-        logger.info("Actual:")
-        logger.info(actual)
-        logger.info("Expected:")
-        logger.info(expected)
-        srun = r1.vtysh_cmd("show run")
-        srun = ("\n".join(srun.splitlines()) + "\n").rstrip()
-        logger.info("Show run:")
-        logger.info(srun)
-        assert 0, "r1 ip route show is not correct:"
+    def check_routes_installed():
+        actual = r1.run("ip route show")
+        actual = ("\n".join(actual.splitlines()) + "\n").rstrip()
+        actual = re.sub(r" nhid [0-9][0-9]", "", actual)
+        actual = re.sub(r" proto sharp", " proto XXXX", actual)
+        actual = re.sub(r" proto static", " proto XXXX", actual)
+        actual = re.sub(r" proto 194", " proto XXXX", actual)
+        actual = re.sub(r" proto 196", " proto XXXX", actual)
+        actual = re.sub(r" proto kernel", " proto XXXX", actual)
+        actual = re.sub(r" proto 2", " proto XXXX", actual)
+        # Some platforms have double spaces?  Why??????
+        actual = re.sub(r"  proto XXXX  ", " proto XXXX ", actual)
+        actual = re.sub(r"  metric", " metric", actual)
+        actual = re.sub(r" link  ", " link ", actual)
+        return topotest.get_textdiff(
+            actual, expected, title1="Actual ip route show", title2="Expected ip route show"
+        )
+    ok, result = topotest.run_and_expect(check_routes_installed, "", count=5, wait=1)
+    assert ok, result
 
 
 def test_memory_leak():