11from hathor .p2p .netfilter import get_table
2- from hathor .p2p .netfilter .utils import add_peer_id_blacklist
2+ from hathor .p2p .netfilter .utils import (
3+ add_blacklist_peers ,
4+ add_peer_id_blacklist ,
5+ list_blacklist_peers ,
6+ remove_blacklist_peers ,
7+ )
38from hathor_tests import unittest
49
510
611class NetfilterUtilsTest (unittest .TestCase ):
12+ def setUp (self ) -> None :
13+ """Clean up rules and tracking before each test."""
14+ super ().setUp ()
15+ post_peerid = get_table ('filter' ).get_chain ('post_peerid' )
16+ post_peerid .rules = []
17+ # Clear the global tracking dictionary
18+ from hathor .p2p .netfilter import utils
19+ utils ._peer_id_to_rule_uuid .clear ()
20+
721 def test_peer_id_blacklist (self ) -> None :
822 post_peerid = get_table ('filter' ).get_chain ('post_peerid' )
923
@@ -24,3 +38,128 @@ def test_peer_id_blacklist(self) -> None:
2438 self .assertEqual (data ['match' ]['type' ], 'NetfilterMatchPeerId' )
2539 self .assertIn (data ['match' ]['match_params' ]['peer_id' ], blacklist )
2640 self .assertEqual (data ['target' ]['type' ], 'NetfilterReject' )
41+
42+ def test_add_blacklist_peers_with_list (self ) -> None :
43+ """Test adding multiple peers with a list."""
44+ post_peerid = get_table ('filter' ).get_chain ('post_peerid' )
45+
46+ # Initially empty
47+ self .assertEqual (len (post_peerid .rules ), 0 )
48+ self .assertEqual (list_blacklist_peers (), [])
49+
50+ # Add peers
51+ peer_ids = ['peer1' , 'peer2' , 'peer3' ]
52+ added = add_blacklist_peers (peer_ids )
53+
54+ # All peers should be added
55+ self .assertEqual (sorted (added ), sorted (peer_ids ))
56+ self .assertEqual (len (post_peerid .rules ), 3 )
57+ self .assertEqual (sorted (list_blacklist_peers ()), sorted (peer_ids ))
58+
59+ def test_add_blacklist_peers_with_string (self ) -> None :
60+ """Test adding a single peer with a string."""
61+ post_peerid = get_table ('filter' ).get_chain ('post_peerid' )
62+
63+ # Add single peer
64+ peer_id = 'single_peer'
65+ added = add_blacklist_peers (peer_id )
66+
67+ self .assertEqual (added , [peer_id ])
68+ self .assertEqual (len (post_peerid .rules ), 1 )
69+ self .assertEqual (list_blacklist_peers (), [peer_id ])
70+
71+ def test_add_blacklist_peers_skip_duplicates (self ) -> None :
72+ """Test that adding duplicate peers is skipped."""
73+ post_peerid = get_table ('filter' ).get_chain ('post_peerid' )
74+
75+ # Add peers first time
76+ peer_ids = ['peer1' , 'peer2' ]
77+ added1 = add_blacklist_peers (peer_ids )
78+ self .assertEqual (sorted (added1 ), sorted (peer_ids ))
79+ self .assertEqual (len (post_peerid .rules ), 2 )
80+
81+ # Try to add same peers again
82+ added2 = add_blacklist_peers (peer_ids )
83+ self .assertEqual (added2 , []) # Nothing added
84+ self .assertEqual (len (post_peerid .rules ), 2 ) # Still 2 rules
85+
86+ # Add mix of new and existing
87+ added3 = add_blacklist_peers (['peer1' , 'peer3' ])
88+ self .assertEqual (added3 , ['peer3' ]) # Only new peer added
89+ self .assertEqual (len (post_peerid .rules ), 3 )
90+
91+ def test_add_blacklist_peers_skip_empty (self ) -> None :
92+ """Test that empty strings are skipped."""
93+ peer_ids = ['peer1' , '' , 'peer2' , '' ]
94+ added = add_blacklist_peers (peer_ids )
95+
96+ self .assertEqual (sorted (added ), ['peer1' , 'peer2' ])
97+ self .assertEqual (sorted (list_blacklist_peers ()), ['peer1' , 'peer2' ])
98+
99+ def test_remove_blacklist_peers_with_list (self ) -> None :
100+ """Test removing multiple peers with a list."""
101+ # Add peers first
102+ peer_ids = ['peer1' , 'peer2' , 'peer3' ]
103+ add_blacklist_peers (peer_ids )
104+ self .assertEqual (sorted (list_blacklist_peers ()), sorted (peer_ids ))
105+
106+ # Remove some peers
107+ to_remove = ['peer1' , 'peer3' ]
108+ removed = remove_blacklist_peers (to_remove )
109+
110+ self .assertEqual (sorted (removed ), sorted (to_remove ))
111+ self .assertEqual (list_blacklist_peers (), ['peer2' ])
112+
113+ def test_remove_blacklist_peers_with_string (self ) -> None :
114+ """Test removing a single peer with a string."""
115+ # Add peers first
116+ add_blacklist_peers (['peer1' , 'peer2' ])
117+
118+ # Remove one peer
119+ removed = remove_blacklist_peers ('peer1' )
120+
121+ self .assertEqual (removed , ['peer1' ])
122+ self .assertEqual (list_blacklist_peers (), ['peer2' ])
123+
124+ def test_remove_blacklist_peers_nonexistent (self ) -> None :
125+ """Test removing peers that don't exist."""
126+ # Add one peer
127+ add_blacklist_peers ('peer1' )
128+
129+ # Try to remove nonexistent peers
130+ removed = remove_blacklist_peers (['peer2' , 'peer3' ])
131+
132+ self .assertEqual (removed , [])
133+ self .assertEqual (list_blacklist_peers (), ['peer1' ])
134+
135+ # Remove mix of existing and nonexistent
136+ removed2 = remove_blacklist_peers (['peer1' , 'peer2' ])
137+ self .assertEqual (removed2 , ['peer1' ])
138+ self .assertEqual (list_blacklist_peers (), [])
139+
140+ def test_remove_blacklist_peers_skip_empty (self ) -> None :
141+ """Test that empty strings are skipped during removal."""
142+ add_blacklist_peers (['peer1' , 'peer2' ])
143+
144+ removed = remove_blacklist_peers (['peer1' , '' , 'peer2' ])
145+
146+ self .assertEqual (sorted (removed ), ['peer1' , 'peer2' ])
147+ self .assertEqual (list_blacklist_peers (), [])
148+
149+ def test_list_blacklist_peers (self ) -> None :
150+ """Test listing blacklisted peers."""
151+ # Initially empty
152+ self .assertEqual (list_blacklist_peers (), [])
153+
154+ # Add some peers
155+ peer_ids = ['peer1' , 'peer2' , 'peer3' ]
156+ add_blacklist_peers (peer_ids )
157+ self .assertEqual (sorted (list_blacklist_peers ()), sorted (peer_ids ))
158+
159+ # Remove one
160+ remove_blacklist_peers ('peer2' )
161+ self .assertEqual (sorted (list_blacklist_peers ()), ['peer1' , 'peer3' ])
162+
163+ # Remove all
164+ remove_blacklist_peers (['peer1' , 'peer3' ])
165+ self .assertEqual (list_blacklist_peers (), [])
0 commit comments