netfilter-devel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH nft 1/3 nft] tests/py: add more interval tests for anonymous sets
@ 2016-04-27 13:07 Pablo Neira Ayuso
  2016-04-27 13:07 ` [PATCH nft 2/3 nft] tests/py: explicitly indication of set type and flags from test definitions Pablo Neira Ayuso
  2016-04-27 13:07 ` [PATCH nft 3/3 nft] tests/py: add interval tests Pablo Neira Ayuso
  0 siblings, 2 replies; 3+ messages in thread
From: Pablo Neira Ayuso @ 2016-04-27 13:07 UTC (permalink / raw)
  To: netfilter-devel

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
 tests/py/any/ct.t           |  1 +
 tests/py/any/ct.t.payload   |  9 +++++++++
 tests/py/any/meta.t         |  3 +++
 tests/py/any/meta.t.payload | 27 +++++++++++++++++++++++++++
 4 files changed, 40 insertions(+)

diff --git a/tests/py/any/ct.t b/tests/py/any/ct.t
index 095e86c..4d13213 100644
--- a/tests/py/any/ct.t
+++ b/tests/py/any/ct.t
@@ -44,6 +44,7 @@ ct mark != 0x00000032;ok
 ct mark 0x00000032-0x00000045;ok
 ct mark != 0x00000032-0x00000045;ok
 ct mark {0x32, 0x2222, 0x42de3};ok;ct mark { 0x00042de3, 0x00002222, 0x00000032}
+ct mark {0x32-0x2222, 0x4444-0x42de3};ok;ct mark { 0x00000032-0x00002222, 0x00004444-0x00042de3}
 - ct mark != {0x32, 0x2222, 0x42de3};ok
 
 # ct mark != {0x32, 0x2222, 0x42de3};ok
diff --git a/tests/py/any/ct.t.payload b/tests/py/any/ct.t.payload
index 62e9259..a7f664b 100644
--- a/tests/py/any/ct.t.payload
+++ b/tests/py/any/ct.t.payload
@@ -166,6 +166,15 @@ ip test-ip4 output
   [ ct load mark => reg 1 ]
   [ lookup reg 1 set set%d ]
 
+# ct mark {0x32-0x2222, 0x4444-0x42de3}
+set%d test-ip4 7
+set%d test-ip4 0
+        element 00000000  : 1 [end]     element 32000000  : 0 [end]     element 23220000  : 1 [end]     element 44440000  : 0 [end]     element e42d0400  : 1 [end]
+ip test-ip4 output
+  [ ct load mark => reg 1 ]
+  [ byteorder reg 1 = hton(reg 1, 4, 4) ]
+  [ lookup reg 1 set set%d ]
+
 # ct mark set 0x11 xor 0x1331
 ip test-ip4 output
   [ immediate reg 1 0x00001320 ]
diff --git a/tests/py/any/meta.t b/tests/py/any/meta.t
index c10297a..424cb18 100644
--- a/tests/py/any/meta.t
+++ b/tests/py/any/meta.t
@@ -14,6 +14,8 @@ meta length != 233;ok
 meta length 33-45;ok
 meta length != 33-45;ok
 meta length { 33, 55, 67, 88};ok
+meta length { 33-55, 67-88};ok
+meta length { 33-55, 55-88, 100-120};ok;meta length { 33-88, 100-120}
 - meta length != { 33, 55, 67, 88};ok
 meta length { 33-55};ok
 - meta length != { 33-55};ok
@@ -162,6 +164,7 @@ meta cpu != 1;ok;cpu != 1
 meta cpu 1-3;ok;cpu 1-3
 meta cpu != 1-2;ok;cpu != 1-2
 meta cpu { 2,3};ok;cpu { 2,3}
+meta cpu { 2-3, 5-7};ok
 -meta cpu != { 2,3};ok; cpu != { 2,3}
 
 meta iifgroup 0;ok;iifgroup default
diff --git a/tests/py/any/meta.t.payload b/tests/py/any/meta.t.payload
index 9f7a6d9..14a8948 100644
--- a/tests/py/any/meta.t.payload
+++ b/tests/py/any/meta.t.payload
@@ -44,6 +44,24 @@ ip test-ip4 input
   [ byteorder reg 1 = hton(reg 1, 4, 4) ]
   [ lookup reg 1 set set%d ]
 
+# meta length { 33-55, 67-88}
+set%d test-ip4 7
+set%d test-ip4 0
+	element 00000000  : 1 [end]	element 21000000  : 0 [end]	element 38000000  : 1 [end]	element 43000000  : 0 [end]	element 59000000  : 1 [end]
+ip test-ip4 input
+  [ meta load len => reg 1 ]
+  [ byteorder reg 1 = hton(reg 1, 4, 4) ]
+  [ lookup reg 1 set set%d ]
+
+# meta length { 33-55, 55-88, 100-120}
+set%d test-ip4 7
+set%d test-ip4 0
+	element 00000000  : 1 [end]	element 21000000  : 0 [end]	element 59000000  : 1 [end]	element 64000000  : 0 [end]	element 79000000  : 1 [end]
+ip test-ip4 input
+  [ meta load len => reg 1 ]
+  [ byteorder reg 1 = hton(reg 1, 4, 4) ]
+  [ lookup reg 1 set set%d ]
+
 # meta protocol { ip, arp, ip6, vlan }
 set%d test-ip4 3
 set%d test-ip4 0
@@ -594,6 +612,15 @@ ip test-ip4 input
   [ meta load cpu => reg 1 ]
   [ lookup reg 1 set set%d ]
 
+# meta cpu { 2-3, 5-7}
+set%d test-ip4 7
+set%d test-ip4 0
+	element 00000000  : 1 [end]	element 02000000  : 0 [end]	element 04000000  : 1 [end]	element 05000000  : 0 [end]	element 08000000  : 1 [end]
+ip test-ip4 input
+  [ meta load cpu => reg 1 ]
+  [ byteorder reg 1 = hton(reg 1, 4, 4) ]
+  [ lookup reg 1 set set%d ]
+
 # meta iifgroup 0
 ip test-ip4 input
   [ meta load iifgroup => reg 1 ]
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH nft 2/3 nft] tests/py: explicitly indication of set type and flags from test definitions
  2016-04-27 13:07 [PATCH nft 1/3 nft] tests/py: add more interval tests for anonymous sets Pablo Neira Ayuso
@ 2016-04-27 13:07 ` Pablo Neira Ayuso
  2016-04-27 13:07 ` [PATCH nft 3/3 nft] tests/py: add interval tests Pablo Neira Ayuso
  1 sibling, 0 replies; 3+ messages in thread
From: Pablo Neira Ayuso @ 2016-04-27 13:07 UTC (permalink / raw)
  To: netfilter-devel

This patch adds explicit set type in test definitions, as well as flags.

This has triggered a rework that starts by introducing a Set class to
make this whole code more extensible and maintainable.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
 tests/py/ip/sets.t   | 12 ++++----
 tests/py/ip6/sets.t  | 10 +++----
 tests/py/nft-test.py | 78 ++++++++++++++++++++++++++++++++++++++--------------
 3 files changed, 68 insertions(+), 32 deletions(-)

diff --git a/tests/py/ip/sets.t b/tests/py/ip/sets.t
index db50b00..2b4e7e1 100644
--- a/tests/py/ip/sets.t
+++ b/tests/py/ip/sets.t
@@ -5,12 +5,12 @@
 *inet;test-inet;input
 *netdev;test-netdev;ingress
 
-!set_ipv4_add ipv4_addr;ok
-!set_inet inet_proto;ok
-!set_inet_serv inet_service;ok
-!set_time time;ok
+!w type ipv4_addr;ok
+!x type inet_proto;ok
+!y type inet_service;ok
+!z type time;ok
 
-!set1 ipv4_addr;ok
+!set1 type ipv4_addr;ok
 ?set1 192.168.3.4;ok
 
 ?set1 192.168.3.4;fail
@@ -21,7 +21,7 @@
 ?set1 1234:1234:1234:1234:1234:1234:1234:1234;fail
 ?set2 192.168.3.4;fail
 
-!set2 ipv4_addr;ok
+!set2 type ipv4_addr;ok
 ?set2 192.168.3.4;ok
 ?set2 192.168.3.5 192.168.3.6;ok
 ?set2 192.168.3.5 192.168.3.6;fail
diff --git a/tests/py/ip6/sets.t b/tests/py/ip6/sets.t
index 4bfa614..765b971 100644
--- a/tests/py/ip6/sets.t
+++ b/tests/py/ip6/sets.t
@@ -5,13 +5,13 @@
 *inet;test-inet;input
 *netdev;test-netdev;ingress
 
-!set_ipv6_add1 ipv6_addr;ok
-!set_inet1 inet_proto;ok
-!set_inet inet_service;ok
-!set_time time;ok
+!w type ipv6_addr;ok
+!x type inet_proto;ok
+!y type inet_service;ok
+!z type time;ok
 
 ?set2 192.168.3.4;fail
-!set2 ipv6_addr;ok
+!set2 type ipv6_addr;ok
 ?set2 1234:1234::1234:1234:1234:1234:1234;ok
 ?set2 1234:1234::1234:1234:1234:1234:1234;fail
 ?set2 1234::1234:1234:1234;ok
diff --git a/tests/py/nft-test.py b/tests/py/nft-test.py
index 1256a33..bba91be 100755
--- a/tests/py/nft-test.py
+++ b/tests/py/nft-test.py
@@ -69,6 +69,20 @@ class Table:
         return self.__dict__ == other.__dict__
 
 
+class Set:
+    """Class that represents a set"""
+
+    def __init__(self, family, table, name, type, flags):
+        self.family = family
+        self.table = table
+        self.name = name
+        self.type = type
+        self.flags = flags
+
+    def __eq__(self, other):
+        return self.__dict__ == other.__dict__
+
+
 def print_msg(reason, filename=None, lineno=None, color=None, errstr=None):
     '''
     Prints a message with nice colors, indicating file and line number.
@@ -277,7 +291,7 @@ def chain_get_by_name(name):
     return chain
 
 
-def set_add(set_info, filename, lineno):
+def set_add(s, test_result, filename, lineno):
     '''
     Adds a set.
     '''
@@ -287,25 +301,30 @@ def set_add(set_info, filename, lineno):
         return -1
 
     for table in table_list:
-        if set_exist(set_info[0], table, filename, lineno):
-            reason = "This set " + set_info + " exists in " + table.name + \
-                     ". I cannot add it again"
+        s.table = table.name
+        s.family = table.family
+        if _set_exist(s, filename, lineno):
+            reason = "Set " + s.name + " already exists in " + table.name
             print_error(reason, filename, lineno)
             return -1
 
-        table_info = " " + table.family + " " + table.name + " "
-        set_text = " " + set_info[0] + " { type " + set_info[1] + " \;}"
-        cmd = NFT_BIN + " add set" + table_info + set_text
+        table_handle = " " + table.family + " " + table.name + " "
+        if s.flags == "":
+            set_cmd = " " + s.name + " { type " + s.type + "\;}"
+        else:
+            set_cmd = " " + s.name + " { type " + s.type + "\; flags " + s.flags + "\; }"
+
+        cmd = NFT_BIN + " add set" + table_handle + set_cmd
         ret = execute_cmd(cmd, filename, lineno)
 
-        if (ret == 0 and set_info[2].rstrip() == "fail") or \
-                (ret != 0 and set_info[2].rstrip() == "ok"):
-            reason = cmd + ": " + "I cannot add the set " + set_info[0]
+        if (ret == 0 and test_result == "fail") or \
+                (ret != 0 and test_result == "ok"):
+            reason = cmd + ": " + "I cannot add the set " + s.name
             print_error(reason, filename, lineno)
             return -1
 
-        if not set_exist(set_info[0], table, filename, lineno):
-            reason = "I have just added the set " + set_info[0] + \
+        if not _set_exist(s, filename, lineno):
+            reason = "I have just added the set " + s.name + \
                      " to the table " + table.name + " but it does not exist"
             print_error(reason, filename, lineno)
             return -1
@@ -419,6 +438,17 @@ def set_exist(set_name, table, filename, lineno):
     return True if (ret == 0) else False
 
 
+def _set_exist(s, filename, lineno):
+    '''
+    Check if the set exists.
+    '''
+    table_handle = " " + s.family + " " + s.table + " "
+    cmd = NFT_BIN + " list -nnn set" + table_handle + s.name
+    ret = execute_cmd(cmd, filename, lineno)
+
+    return True if (ret == 0) else False
+
+
 def set_check_element(rule1, rule2):
     '''
     Check if element exists in anonymous sets.
@@ -717,14 +747,20 @@ def chain_process(chain_line, lineno):
 
 
 def set_process(set_line, filename, lineno):
-    set_info = []
-    set_name = "".join(set_line[0].rstrip()[1:])
-    set_info.append(set_name)
-    set_type = set_line[1].split(";")[0]
-    set_state = set_line[1].split(";")[1]  # ok or fail
-    set_info.append(set_type)
-    set_info.append(set_state)
-    ret = set_add(set_info, filename, lineno)
+    test_result = set_line[1]
+
+    tokens = set_line[0].split(" ")
+    set_name = tokens[0]
+    set_type = tokens[2]
+
+    if len(tokens) == 5 and tokens[3] == "flags":
+        set_flags = tokens[4]
+    else:
+        set_flags = ""
+
+    s = Set("", "", set_name, set_type, set_flags)
+
+    ret = set_add(s, test_result, filename, lineno)
     if ret == 0:
         all_set[set_name] = set()
 
@@ -808,7 +844,7 @@ def run_test_file(filename, force_all_family_option, specific_file):
             continue
 
         if line[0] == "!":  # Adds this set
-            set_line = line.rstrip()[0:].split(" ")
+            set_line = line.rstrip()[1:].split(";")
             ret = set_process(set_line, filename, lineno)
             tests += 1
             if ret == -1:
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH nft 3/3 nft] tests/py: add interval tests
  2016-04-27 13:07 [PATCH nft 1/3 nft] tests/py: add more interval tests for anonymous sets Pablo Neira Ayuso
  2016-04-27 13:07 ` [PATCH nft 2/3 nft] tests/py: explicitly indication of set type and flags from test definitions Pablo Neira Ayuso
@ 2016-04-27 13:07 ` Pablo Neira Ayuso
  1 sibling, 0 replies; 3+ messages in thread
From: Pablo Neira Ayuso @ 2016-04-27 13:07 UTC (permalink / raw)
  To: netfilter-devel

Add some initial tests to cover dynamic interval sets.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
 tests/py/ip/sets.t  | 12 ++++++++++++
 tests/py/ip6/sets.t | 11 +++++++++++
 2 files changed, 23 insertions(+)

diff --git a/tests/py/ip/sets.t b/tests/py/ip/sets.t
index 2b4e7e1..0e2b193 100644
--- a/tests/py/ip/sets.t
+++ b/tests/py/ip/sets.t
@@ -31,3 +31,15 @@
 ip saddr @set1 drop;ok
 ip saddr @set2 drop;ok
 ip saddr @set33 drop;fail
+
+!set3 type ipv4_addr flags interval;ok
+?set3 192.168.0.0/16;ok
+?set3 172.16.0.0/12;ok
+?set3 10.0.0.0/8;ok
+
+!set4 type ipv4_addr flags interval;ok
+?set4 192.168.1.0/24;ok
+?set4 192.168.0.0/24;ok
+?set4 192.168.2.0/24;ok
+?set4 192.168.1.1;fail
+?set4 192.168.3.0/24;ok
diff --git a/tests/py/ip6/sets.t b/tests/py/ip6/sets.t
index 765b971..ff38925 100644
--- a/tests/py/ip6/sets.t
+++ b/tests/py/ip6/sets.t
@@ -23,3 +23,14 @@
 
 ip6 saddr @set2 drop;ok
 ip6 saddr @set33 drop;fail
+
+!set3 type ipv6_addr flags interval;ok
+?set3 1234:1234:1234:1234::/64;ok
+?set3 1324:1234:1234:1235::/64;ok
+?set3 1324:1234:1234:1233::/64;ok
+?set3 1234:1234:1234:1234:1234:1234:/96;fail
+?set3 1324:1234:1234:1236::/64;ok
+
+!set4 type ipv6_addr flags interval;ok
+?set4 1234:1234:1234:1234::/64 4321:1234:1234:1234::/64;ok
+?set4 4321:1234:1234:1234:1234:1234::/96;fail
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-04-27 13:07 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-04-27 13:07 [PATCH nft 1/3 nft] tests/py: add more interval tests for anonymous sets Pablo Neira Ayuso
2016-04-27 13:07 ` [PATCH nft 2/3 nft] tests/py: explicitly indication of set type and flags from test definitions Pablo Neira Ayuso
2016-04-27 13:07 ` [PATCH nft 3/3 nft] tests/py: add interval tests Pablo Neira Ayuso

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).