88 "net/http"
99 "net/url"
1010 "runtime"
11+ "sort"
1112 "strings"
1213 "sync"
1314 "testing"
@@ -60,7 +61,7 @@ func TestRemovePeer(t *testing.T) {
6061 ts .Len (peer2 .app .AuthStatus .GetIngoingAuthRequests (), 0 )
6162
6263 // Add peer2 from peer1 - should succeed
63- err = peer1 .api .SendFriendRequest (peer2 .PeerID (), "peer_2" )
64+ err = peer1 .api .SendFriendRequest (peer2 .PeerID (), "peer_2" , "" )
6465 ts .NoError (err )
6566 time .Sleep (500 * time .Millisecond )
6667
@@ -93,7 +94,7 @@ func TestDeclinePeerFriendRequest(t *testing.T) {
9394 peer2 := ts .NewTestPeer (false )
9495 ts .ensurePeersAvailableInDHT (peer1 , peer2 )
9596
96- err := peer1 .api .SendFriendRequest (peer2 .PeerID (), "peer_2" )
97+ err := peer1 .api .SendFriendRequest (peer2 .PeerID (), "peer_2" , "" )
9798 ts .NoError (err )
9899
99100 var authRequests []entity.AuthRequest
@@ -102,7 +103,7 @@ func TestDeclinePeerFriendRequest(t *testing.T) {
102103 ts .NoError (err )
103104 return len (authRequests ) == 1
104105 }, 15 * time .Second , 50 * time .Millisecond )
105- err = peer2 .api .ReplyFriendRequest (authRequests [0 ].PeerID , "peer_1" , true )
106+ err = peer2 .api .ReplyFriendRequest (authRequests [0 ].PeerID , "peer_1" , true , "" )
106107 ts .NoError (err )
107108
108109 time .Sleep (500 * time .Millisecond )
@@ -127,7 +128,7 @@ func TestAutoAcceptFriendRequest(t *testing.T) {
127128 peer2 .app .Conf .P2pNode .AutoAcceptAuthRequests = true
128129 peer2 .app .Conf .Unlock ()
129130
130- err := peer1 .api .SendFriendRequest (peer2 .PeerID (), "peer_2" )
131+ err := peer1 .api .SendFriendRequest (peer2 .PeerID (), "peer_2" , "" )
131132 ts .NoError (err )
132133
133134 ts .Eventually (func () bool {
@@ -148,6 +149,105 @@ func TestAutoAcceptFriendRequest(t *testing.T) {
148149 ts .False (knownPeer .Declined )
149150}
150151
152+ func TestFriendRequestWithCustomIP (t * testing.T ) {
153+ ts := NewTestSuite (t )
154+
155+ peer1 := ts .NewTestPeer (false )
156+ peer2 := ts .NewTestPeer (false )
157+ peer3 := ts .NewTestPeer (false )
158+ ts .ensurePeersAvailableInDHT (peer1 , peer2 )
159+ ts .ensurePeersAvailableInDHT (peer1 , peer3 )
160+
161+ t .Run ("InviteWithCustomIP" , func (t * testing.T ) {
162+ customIP := "10.66.0.222"
163+ err := peer1 .api .SendFriendRequest (peer2 .PeerID (), "peer_2" , customIP )
164+ ts .NoError (err )
165+
166+ // Check immediate state on peer1
167+ p2 , exists := peer1 .app .Conf .GetPeer (peer2 .PeerID ())
168+ ts .True (exists )
169+ ts .Equal (customIP , p2 .IPAddr )
170+ })
171+
172+ t .Run ("RespondWithCustomIP" , func (t * testing.T ) {
173+ err := peer3 .api .SendFriendRequest (peer1 .PeerID (), "peer_1" , "" )
174+ ts .NoError (err )
175+
176+ var authRequests []entity.AuthRequest
177+ ts .Eventually (func () bool {
178+ authRequests , err = peer1 .api .AuthRequests ()
179+ ts .NoError (err )
180+ return len (authRequests ) == 1
181+ }, 15 * time .Second , 50 * time .Millisecond )
182+
183+ customIP := "10.66.0.223"
184+ err = peer1 .api .ReplyFriendRequest (authRequests [0 ].PeerID , "peer_3" , false , customIP )
185+ ts .NoError (err )
186+
187+ p3 , exists := peer1 .app .Conf .GetPeer (peer3 .PeerID ())
188+ ts .True (exists )
189+ ts .Equal (customIP , p3 .IPAddr )
190+ })
191+
192+ t .Run ("InviteWithInvalidIP" , func (t * testing.T ) {
193+ peer4 := ts .NewTestPeer (false )
194+ ts .ensurePeersAvailableInDHT (peer1 , peer4 )
195+
196+ err := peer1 .api .SendFriendRequest (peer4 .PeerID (), "peer_4" , "invalid-ip" )
197+ ts .Error (err )
198+ ts .ErrorContains (err , "Field validation for 'IPAddr' failed" )
199+ })
200+
201+ t .Run ("InviteWithDuplicateIP" , func (t * testing.T ) {
202+ peer5 := ts .NewTestPeer (false )
203+ ts .ensurePeersAvailableInDHT (peer1 , peer5 )
204+
205+ // Try to use peer2's IP which is 10.66.0.222
206+ err := peer1 .api .SendFriendRequest (peer5 .PeerID (), "peer_5" , "10.66.0.222" )
207+ ts .Error (err )
208+ ts .ErrorContains (err , "ip 10.66.0.222 is already used by peer" )
209+ })
210+ }
211+
212+ func TestGetAuthRequestsSuggestedIP (t * testing.T ) {
213+ ts := NewTestSuite (t )
214+
215+ peer1 := ts .NewTestPeer (false )
216+ peer2 := ts .NewTestPeer (false )
217+ peer3 := ts .NewTestPeer (false )
218+ ts .ensurePeersAvailableInDHT (peer1 , peer2 )
219+ ts .ensurePeersAvailableInDHT (peer1 , peer3 )
220+
221+ err := peer2 .api .SendFriendRequest (peer1 .PeerID (), "peer_1" , "" )
222+ ts .NoError (err )
223+ time .Sleep (200 * time .Millisecond )
224+
225+ err = peer3 .api .SendFriendRequest (peer1 .PeerID (), "peer_1" , "" )
226+ ts .NoError (err )
227+
228+ ts .Eventually (func () bool {
229+ reqs , err := peer1 .api .AuthRequests ()
230+ ts .NoError (err )
231+ return len (reqs ) == 2
232+ }, 15 * time .Second , 50 * time .Millisecond )
233+
234+ reqs , err := peer1 .api .AuthRequests ()
235+ ts .NoError (err )
236+ ts .Len (reqs , 2 )
237+
238+ ips := []string {reqs [0 ].SuggestedIP , reqs [1 ].SuggestedIP }
239+ sort .Strings (ips )
240+
241+ ts .Equal ("10.66.0.2" , ips [0 ])
242+ ts .Equal ("10.66.0.3" , ips [1 ])
243+
244+ // Verify they are valid and unused
245+ err = peer1 .app .Conf .CheckIPUnique (ips [0 ], "" )
246+ ts .NoError (err )
247+ err = peer1 .app .Conf .CheckIPUnique (ips [1 ], "" )
248+ ts .NoError (err )
249+ }
250+
151251func TestUniquePeerAlias (t * testing.T ) {
152252 ts := NewTestSuite (t )
153253
@@ -157,12 +257,12 @@ func TestUniquePeerAlias(t *testing.T) {
157257 ts .ensurePeersAvailableInDHT (peer1 , peer2 )
158258 ts .ensurePeersAvailableInDHT (peer2 , peer3 )
159259
160- err := peer1 .api .SendFriendRequest (peer2 .PeerID (), "peer" )
260+ err := peer1 .api .SendFriendRequest (peer2 .PeerID (), "peer" , "" )
161261 ts .NoError (err )
162262
163263 time .Sleep (200 * time .Millisecond )
164264
165- err = peer1 .api .SendFriendRequest (peer3 .PeerID (), "peer" )
265+ err = peer1 .api .SendFriendRequest (peer3 .PeerID (), "peer" , "" )
166266 ts .EqualError (err , api .ErrorPeerAliasIsNotUniq )
167267}
168268
@@ -300,7 +400,7 @@ func TestUpdatePeerSettingsIPAddr(t *testing.T) {
300400 // Make peer3 and peer1 friends (manual to use unique alias "peer_3")
301401 // TODO: refactor makeFriends helper to accept alias arg
302402 ts .ensurePeersAvailableInDHT (peer3 , peer1 )
303- err := peer3 .api .SendFriendRequest (peer1 .PeerID (), "peer_1" )
403+ err := peer3 .api .SendFriendRequest (peer1 .PeerID (), "peer_1" , "" )
304404 ts .NoError (err )
305405
306406 var authRequests []entity.AuthRequest
@@ -309,7 +409,7 @@ func TestUpdatePeerSettingsIPAddr(t *testing.T) {
309409 ts .NoError (err )
310410 return len (authRequests ) == 1
311411 }, 15 * time .Second , 50 * time .Millisecond )
312- err = peer1 .api .ReplyFriendRequest (authRequests [0 ].PeerID , "peer_3" , false )
412+ err = peer1 .api .ReplyFriendRequest (authRequests [0 ].PeerID , "peer_3" , false , "" )
313413 ts .NoError (err )
314414
315415 time .Sleep (500 * time .Millisecond )
0 commit comments