summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2015-09-17 23:23:25 +0200
committerFlorian Westphal <fw@strlen.de>2015-09-18 00:00:24 +0200
commitc02107ef4e0fa49e5e57bfc8fb4e2b83654e8c68 (patch)
tree55d2dde0102a384f8a1c66a71aebc320a677a71b
parent7658a537449bdad1e9c101abfb70556511ee204d (diff)
tests: don't depend on set element order
Pablo reported test failures because the order of returned set entries is not deterministic. This sorts set elements before comparision. Patrick suggested to move ordering into libnftnl (since we could f.e. also get duplicate entries due to how netlink dumps work), but thats a bit more work. Hence this quick workaround. Reported-by: Pablo Neira Ayuso <pablo@netfilter.org> Signed-off-by: Florian Westphal <fw@strlen.de>
-rw-r--r--tests/regression/any/ct.t.payload2
-rwxr-xr-xtests/regression/nft-test.py29
2 files changed, 30 insertions, 1 deletions
diff --git a/tests/regression/any/ct.t.payload b/tests/regression/any/ct.t.payload
index 2e7c1ff7..2bebaccd 100644
--- a/tests/regression/any/ct.t.payload
+++ b/tests/regression/any/ct.t.payload
@@ -267,7 +267,7 @@ ip test-ip4 output
# ct state . ct mark vmap { new . 0x12345678 : drop}
map%d test-ip4 b
map%d test-ip4 0
- element 00000008 12345678 : 0 [end]
+ element 00000008 12345678 : 0 [end]
ip test-ip4 output
[ ct load state => reg 1 ]
[ ct load mark => reg 9 ]
diff --git a/tests/regression/nft-test.py b/tests/regression/nft-test.py
index 8168203b..d2fbe458 100755
--- a/tests/regression/nft-test.py
+++ b/tests/regression/nft-test.py
@@ -424,6 +424,32 @@ def output_clean(pre_output, chain):
return ""
return rule
+def payload_check_elems_to_set(elems):
+ newset = set()
+
+ for n, line in enumerate(elems.split('[end]')):
+ e = line.strip()
+ if e in newset:
+ print_error("duplicate", e, n)
+ return newset
+
+ newset.add(e)
+
+ return newset
+
+def payload_check_set_elems(want, got):
+
+ if want.find('element') < 0 or want.find('[end]') < 0:
+ return 0
+
+ if got.find('element') < 0 or got.find('[end]') < 0:
+ return 0
+
+ set_want = payload_check_elems_to_set(want)
+ set_got = payload_check_elems_to_set(got)
+
+ return set_want == set_got
+
def payload_check(payload_buffer, file, cmd):
file.seek(0, 0)
@@ -443,6 +469,9 @@ def payload_check(payload_buffer, file, cmd):
if want_line.find(']') < 0 and line.find(']') < 0:
continue
+ if payload_check_set_elems(want_line, line):
+ continue
+
print_differences_warning(file.name, lineno, want_line.strip(), line.strip(), cmd);
return 0