diff options
author | Pablo M. Bermudo Garay <pablombg@gmail.com> | 2016-01-12 01:26:56 +0100 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2016-01-12 14:36:51 +0100 |
commit | f8ce80a1b3a6e54147c80a3e1fe00558ece1e031 (patch) | |
tree | 9af47e27ab70c5c15c1ed1ff3dcb79a9527f63fd /tests/py/nft-test.py | |
parent | 1858c5f4059d395ba0c272c3b5a3b5104a3c2f64 (diff) |
tests/py: modify supported test file syntax
Until now, the syntax to represent tables and chains in test files was:
*ip;test-ip4
*ip6;test-ip6
*inet;test-inet
:input;type filter hook input priority 0
Where lines starting with * are tables and lines starting with : are
chains.
This commit change the test script to deal with new syntax:
:input;type filter hook input priority 0
*ip;test-ip4;input
*ip6;test-ip6;input
*inet;test-inet;input
Now the chains should be included before tables. Also, lines defining
tables have a new third part (delimited by semicolon) where the chains
needed by the table are declared. If table needs to include more than
one chain, those must be separated by commas:
:input;type filter hook input priority 0
:forward;type filter hook forward priority 0
:output;type filter hook output priority 0
*arp;test-arp;input,forward,output
This new syntax allow to include in the same test file chains not
supported by all families of tables tested.
Signed-off-by: Pablo M. Bermudo Garay <pablombg@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'tests/py/nft-test.py')
-rwxr-xr-x | tests/py/nft-test.py | 70 |
1 files changed, 44 insertions, 26 deletions
diff --git a/tests/py/nft-test.py b/tests/py/nft-test.py index 6b039159..9dc2b95b 100755 --- a/tests/py/nft-test.py +++ b/tests/py/nft-test.py @@ -48,9 +48,10 @@ class Colors: class Chain: """Class that represents a chain""" - def __init__(self, name, config): + def __init__(self, name, config, lineno): self.name = name self.config = config + self.lineno = lineno def __eq__(self, other): return self.__dict__ == other.__dict__ @@ -59,9 +60,10 @@ class Chain: class Table: """Class that represents a table""" - def __init__(self, family, name): + def __init__(self, family, name, chains): self.family = family self.name = name + self.chains = chains def __eq__(self, other): return self.__dict__ == other.__dict__ @@ -148,6 +150,15 @@ def table_create(table, filename, lineno): print_error(reason, filename, lineno) return -1 + for table_chain in table.chains: + chain = chain_get_by_name(table_chain) + if chain is None: + reason = "The chain " + table_chain + " requested by table " + \ + table.name + " does not exist." + print_error(reason, filename, lineno) + else: + chain_create(chain, table, filename) + return 0 @@ -180,45 +191,42 @@ def table_delete(table, filename=None, lineno=None): return 0 -def chain_exist(chain, table, filename, lineno): +def chain_exist(chain, table, filename): ''' Checks a chain ''' table_info = " " + table.family + " " + table.name + " " cmd = NFT_BIN + " list -nnn chain" + table_info + chain.name - ret = execute_cmd(cmd, filename, lineno) + ret = execute_cmd(cmd, filename, chain.lineno) return True if (ret == 0) else False -def chain_create(chain, table, filename, lineno): +def chain_create(chain, table, filename): ''' Adds a chain ''' table_info = " " + table.family + " " + table.name + " " - if chain_exist(chain, table, filename, lineno): + if chain_exist(chain, table, filename): reason = "This chain '" + chain.name + "' exists in " + table.name + \ ". I cannot create two chains with same name." - print_error(reason, filename, lineno) + print_error(reason, filename, chain.lineno) return -1 cmd = NFT_BIN + " add chain" + table_info + chain.name + \ "\{ " + chain.config + "\; \}" - ret = execute_cmd(cmd, filename, lineno) + ret = execute_cmd(cmd, filename, chain.lineno) if ret != 0: reason = "I cannot create the chain '" + chain.name - print_error(reason, filename, lineno) + print_error(reason, filename, chain.lineno) return -1 - if chain not in chain_list: - chain_list.append(chain) - - if not chain_exist(chain, table, filename, lineno): + if not chain_exist(chain, table, filename): reason = "I have added the chain '" + chain.name + \ "' but it does not exist in " + table.name - print_error(reason, filename, lineno) + print_error(reason, filename, chain.lineno) return -1 return 0 @@ -230,7 +238,7 @@ def chain_delete(chain, table, filename=None, lineno=None): ''' table_info = " " + table.family + " " + table.name + " " - if not chain_exist(chain, table, filename, lineno): + if not chain_exist(chain, table, filename): reason = "The chain " + chain.name + " does not exists in " + \ table.name + ". I cannot delete it." print_error(reason, filename, lineno) @@ -250,7 +258,7 @@ def chain_delete(chain, table, filename=None, lineno=None): print_error(reason, filename, lineno) return -1 - if chain_exist(chain, table, filename, lineno): + if chain_exist(chain, table, filename): reason = "The chain " + chain.name + " exists in " + table.name + \ ". I cannot delete this chain" print_error(reason, filename, lineno) @@ -259,6 +267,16 @@ def chain_delete(chain, table, filename=None, lineno=None): return 0 +def chain_get_by_name(name): + for chain in chain_list: + if chain.name == name: + break + else: + chain = None + + return chain + + def set_add(set_info, filename, lineno): ''' Adds a set. @@ -524,7 +542,8 @@ def rule_add(rule, filename, lineno, force_all_family_option, filename_path): print_error("did not find payload information for " "rule '%s'" % rule[0], payload_log.name, 1) - for chain in chain_list: + for table_chain in table.chains: + chain = chain_get_by_name(table_chain) unit_tests += 1 table_flush(table, filename, lineno) table_info = " " + table.family + " " + table.name + " " @@ -624,7 +643,8 @@ def preexec(): def cleanup_on_exit(): for table in table_list: - for chain in chain_list: + for table_chain in table.chains: + chain = chain_get_by_name(table_chain) chain_delete(chain, table, "", "") if all_set: set_delete(table) @@ -678,18 +698,15 @@ def print_result_all(filename, tests, warning, error, unit_tests): def table_process(table_line, filename, lineno): table_info = table_line.split(";") - table = Table(table_info[0], table_info[1]) + table = Table(table_info[0], table_info[1], table_info[2].split(",")) return table_create(table, filename, lineno) -def chain_process(chain_line, filename, lineno): +def chain_process(chain_line, lineno): chain_info = chain_line.split(";") - chain = Chain(chain_info[0], chain_info[1]) + chain_list.append(Chain(chain_info[0], chain_info[1], lineno)) - for table in table_list: - if chain_create(chain, table, filename, lineno) != 0: - return -1 return 0 @@ -779,7 +796,7 @@ def run_test_file(filename, force_all_family_option, specific_file): if line[0] == ":": # Chain chain_line = line.rstrip()[1:] - ret = chain_process(chain_line, filename, lineno) + ret = chain_process(chain_line, lineno) if ret != 0: break continue @@ -837,7 +854,8 @@ def run_test_file(filename, force_all_family_option, specific_file): # Delete rules, sets, chains and tables for table in table_list: # We delete chains - for chain in chain_list: + for table_chain in table.chains: + chain = chain_get_by_name(table_chain) chain_delete(chain, table, filename, lineno) # We delete sets. |