@@ -471,6 +471,35 @@ def test_hashlimit(self):
471471 self .assertEqual (m .hashlimit_upto , "200/sec" )
472472 self .assertEqual (m .hashlimit_burst , "5" )
473473
474+ class TestRecentMatch (unittest .TestCase ):
475+ def setUp (self ):
476+ self .table = 'filter'
477+ self .chain = 'iptc_test_recent'
478+ iptc .easy .delete_chain (self .table , self .chain , ipv6 = False , flush = True , raise_exc = False )
479+ iptc .easy .add_chain (self .table , self .chain , ipv6 = False , raise_exc = True )
480+
481+ def tearDown (self ):
482+ iptc .easy .delete_chain (self .table , self .chain , ipv6 = False , flush = True , raise_exc = False )
483+
484+ def test_recent (self ):
485+ rule_d = {
486+ 'protocol' : 'udp' ,
487+ 'recent' : {
488+ 'mask' : '255.255.255.255' ,
489+ 'update' : '' ,
490+ 'seconds' : '60' ,
491+ 'rsource' : '' ,
492+ 'name' : 'UDP-PORTSCAN' ,
493+ },
494+ 'target' : {
495+ 'REJECT' :{
496+ 'reject-with' : 'icmp-port-unreachable'
497+ }
498+ }
499+ }
500+ iptc .easy .add_rule (self .table , self .chain , rule_d )
501+ rule2_d = iptc .easy .get_rule (self .table , self .chain , - 1 )
502+ self .assertEqual (rule_d , rule2_d )
474503
475504def suite ():
476505 suite_match = unittest .TestLoader ().loadTestsFromTestCase (TestMatch )
@@ -488,6 +517,8 @@ def suite():
488517 TestXTConntrackMatch )
489518 suite_hashlimit = unittest .TestLoader ().loadTestsFromTestCase (
490519 TestHashlimitMatch )
520+ suite_recent = unittest .TestLoader ().loadTestsFromTestCase (
521+ TestRecentMatch )
491522 extra_suites = []
492523 if is_table6_available (iptc .Table6 .FILTER ):
493524 extra_suites += unittest .TestLoader ().loadTestsFromTestCase (
@@ -496,7 +527,7 @@ def suite():
496527 return unittest .TestSuite ([suite_match , suite_udp , suite_mark ,
497528 suite_limit , suite_mport , suite_comment ,
498529 suite_iprange , suite_state , suite_conntrack ,
499- suite_hashlimit ] + extra_suites )
530+ suite_hashlimit , suite_recent ] + extra_suites )
500531
501532
502533def run_tests ():
0 commit comments