@@ -164,3 +164,57 @@ async fn test_updating_connection_on_ping() {
164
164
let node = buckets. iter_ref ( ) . next ( ) . unwrap ( ) ;
165
165
assert ! ( node. status. is_connected( ) )
166
166
}
167
+
168
+ #[ tokio:: test]
169
+ async fn test_connection_direction_on_inject_session_established ( ) {
170
+ init ( ) ;
171
+
172
+ let enr_key1 = CombinedKey :: generate_secp256k1 ( ) ;
173
+ let ip = std:: net:: Ipv4Addr :: LOCALHOST ;
174
+ let enr = EnrBuilder :: new ( "v4" )
175
+ . ip4 ( ip)
176
+ . udp4 ( 10001 )
177
+ . build ( & enr_key1)
178
+ . unwrap ( ) ;
179
+
180
+ let enr_key2 = CombinedKey :: generate_secp256k1 ( ) ;
181
+ let ip2 = std:: net:: Ipv4Addr :: LOCALHOST ;
182
+ let enr2 = EnrBuilder :: new ( "v4" )
183
+ . ip4 ( ip2)
184
+ . udp4 ( 10002 )
185
+ . build ( & enr_key2)
186
+ . unwrap ( ) ;
187
+
188
+ let mut service = build_service :: < DefaultProtocolId > (
189
+ Arc :: new ( RwLock :: new ( enr) ) ,
190
+ Arc :: new ( RwLock :: new ( enr_key1) ) ,
191
+ false ,
192
+ )
193
+ . await ;
194
+
195
+ let key = & kbucket:: Key :: from ( enr2. node_id ( ) ) ;
196
+
197
+ // Test that the existing connection direction is not updated.
198
+ // Incoming
199
+ service. inject_session_established ( enr2. clone ( ) , ConnectionDirection :: Incoming ) ;
200
+ let status = service. kbuckets . read ( ) . iter_ref ( ) . next ( ) . unwrap ( ) . status ;
201
+ assert ! ( status. is_connected( ) ) ;
202
+ assert_eq ! ( ConnectionDirection :: Incoming , status. direction) ;
203
+
204
+ service. inject_session_established ( enr2. clone ( ) , ConnectionDirection :: Outgoing ) ;
205
+ let status = service. kbuckets . read ( ) . iter_ref ( ) . next ( ) . unwrap ( ) . status ;
206
+ assert ! ( status. is_connected( ) ) ;
207
+ assert_eq ! ( ConnectionDirection :: Incoming , status. direction) ;
208
+
209
+ // (disconnected) Outgoing
210
+ let result = service. kbuckets . write ( ) . update_node_status (
211
+ key,
212
+ ConnectionState :: Disconnected ,
213
+ Some ( ConnectionDirection :: Outgoing ) ,
214
+ ) ;
215
+ assert ! ( matches!( result, UpdateResult :: Updated ) ) ;
216
+ service. inject_session_established ( enr2. clone ( ) , ConnectionDirection :: Incoming ) ;
217
+ let status = service. kbuckets . read ( ) . iter_ref ( ) . next ( ) . unwrap ( ) . status ;
218
+ assert ! ( status. is_connected( ) ) ;
219
+ assert_eq ! ( ConnectionDirection :: Outgoing , status. direction) ;
220
+ }
0 commit comments