@@ -45,30 +45,33 @@ func setupNodes(t *testing.T, logger zerolog.Logger, ports []int, tempDir string
4545 {
4646 NodeID : "testRaftLeadershipnode1" ,
4747 Address : "127.0.0.1:" + strconv .Itoa (ports [0 ]),
48+ GRPCAddress : "127.0.0.1:" + strconv .Itoa (ports [0 ]+ 10 ),
4849 IsBootstrap : true ,
4950 Peers : []config.RaftPeer {
50- {ID : "testRaftLeadershipnode2" , Address : "127.0.0.1:" + strconv .Itoa (ports [1 ])},
51- {ID : "testRaftLeadershipnode3" , Address : "127.0.0.1:" + strconv .Itoa (ports [2 ])},
51+ {ID : "testRaftLeadershipnode2" , Address : "127.0.0.1:" + strconv .Itoa (ports [1 ]), GRPCAddress : "127.0.0.1:" + strconv . Itoa ( ports [ 1 ] + 10 ) },
52+ {ID : "testRaftLeadershipnode3" , Address : "127.0.0.1:" + strconv .Itoa (ports [2 ]), GRPCAddress : "127.0.0.1:" + strconv . Itoa ( ports [ 2 ] + 10 ) },
5253 },
5354 Directory : tempDir ,
5455 },
5556 {
5657 NodeID : "testRaftLeadershipnode2" ,
5758 Address : "127.0.0.1:" + strconv .Itoa (ports [1 ]),
59+ GRPCAddress : "127.0.0.1:" + strconv .Itoa (ports [1 ]+ 10 ),
5860 IsBootstrap : false ,
5961 Peers : []config.RaftPeer {
60- {ID : "testRaftLeadershipnode1" , Address : "127.0.0.1:" + strconv .Itoa (ports [0 ])},
61- {ID : "testRaftLeadershipnode3" , Address : "127.0.0.1:" + strconv .Itoa (ports [2 ])},
62+ {ID : "testRaftLeadershipnode1" , Address : "127.0.0.1:" + strconv .Itoa (ports [0 ]), GRPCAddress : "127.0.0.1:" + strconv . Itoa ( ports [ 0 ] + 10 ) },
63+ {ID : "testRaftLeadershipnode3" , Address : "127.0.0.1:" + strconv .Itoa (ports [2 ]), GRPCAddress : "127.0.0.1:" + strconv . Itoa ( ports [ 2 ] + 10 ) },
6264 },
6365 Directory : tempDir ,
6466 },
6567 {
6668 NodeID : "testRaftLeadershipnode3" ,
6769 Address : "127.0.0.1:" + strconv .Itoa (ports [2 ]),
70+ GRPCAddress : "127.0.0.1:" + strconv .Itoa (ports [2 ]+ 10 ),
6871 IsBootstrap : false ,
6972 Peers : []config.RaftPeer {
70- {ID : "testRaftLeadershipnode1" , Address : "127.0.0.1:" + strconv .Itoa (ports [0 ])},
71- {ID : "testRaftLeadershipnode2" , Address : "127.0.0.1:" + strconv .Itoa (ports [1 ])},
73+ {ID : "testRaftLeadershipnode1" , Address : "127.0.0.1:" + strconv .Itoa (ports [0 ]), GRPCAddress : "127.0.0.1:" + strconv . Itoa ( ports [ 0 ] + 10 ) },
74+ {ID : "testRaftLeadershipnode2" , Address : "127.0.0.1:" + strconv .Itoa (ports [1 ]), GRPCAddress : "127.0.0.1:" + strconv . Itoa ( ports [ 1 ] + 10 ) },
7275 },
7376 Directory : tempDir ,
7477 },
@@ -203,3 +206,248 @@ func TestRPCClient(t *testing.T) {
203206 assert .NotEqual (t , "READY" , conn .GetState ().String ())
204207 })
205208}
209+
210+ func TestRPCServer_AddPeer (t * testing.T ) {
211+ tests := []struct {
212+ name string
213+ request * pb.AddPeerRequest
214+ wantSuccess bool
215+ wantErr bool
216+ }{
217+ {
218+ name : "successful peer addition" ,
219+ request : & pb.AddPeerRequest {
220+ PeerId : "newPeer1" ,
221+ PeerAddress : "127.0.0.1:6100" ,
222+ GrpcAddress : "127.0.0.1:6101" ,
223+ },
224+ wantSuccess : true ,
225+ wantErr : false ,
226+ },
227+ {
228+ name : "nil request" ,
229+ request : nil ,
230+ wantSuccess : false ,
231+ wantErr : true ,
232+ },
233+ {
234+ name : "missing peer ID" ,
235+ request : & pb.AddPeerRequest {
236+ PeerAddress : "127.0.0.1:6100" ,
237+ GrpcAddress : "127.0.0.1:6101" ,
238+ },
239+ wantSuccess : false ,
240+ wantErr : true ,
241+ },
242+ {
243+ name : "missing peer address" ,
244+ request : & pb.AddPeerRequest {
245+ PeerId : "newPeer2" ,
246+ GrpcAddress : "127.0.0.1:6101" ,
247+ },
248+ wantSuccess : false ,
249+ wantErr : true ,
250+ },
251+ {
252+ name : "missing gRPC address" ,
253+ request : & pb.AddPeerRequest {
254+ PeerId : "newPeer3" ,
255+ PeerAddress : "127.0.0.1:6100" ,
256+ },
257+ wantSuccess : false ,
258+ wantErr : true ,
259+ },
260+ }
261+
262+ for i , tt := range tests {
263+ t .Run (tt .name , func (t * testing.T ) {
264+ tempDir := t .TempDir ()
265+ logger := setupTestLogger ()
266+ ports := []int {7004 + i , 7005 + i , 7006 + i }
267+
268+ nodes := setupNodes (t , logger , ports , tempDir )
269+
270+ // Wait for leader election
271+ time .Sleep (3 * time .Second )
272+
273+ server , lis := setupGRPCServer (t , nodes [0 ])
274+ defer server .Stop ()
275+
276+ conn , err := grpc .NewClient (
277+ getListenerAddr (lis ),
278+ grpc .WithTransportCredentials (insecure .NewCredentials ()),
279+ )
280+ require .NoError (t , err , "Failed to create gRPC client connection" )
281+ defer conn .Close ()
282+
283+ client := pb .NewRaftServiceClient (conn )
284+ resp , err := client .AddPeer (context .Background (), tt .request )
285+
286+ if tt .wantErr {
287+ assert .Error (t , err )
288+ if resp != nil {
289+ assert .False (t , resp .Success )
290+ assert .NotEmpty (t , resp .Error )
291+ }
292+ return
293+ }
294+
295+ require .NoError (t , err )
296+ assert .True (t , resp .Success )
297+ assert .Empty (t , resp .Error )
298+ })
299+ }
300+ }
301+
302+ func TestRPCServer_RemovePeer (t * testing.T ) {
303+ tests := []struct {
304+ name string
305+ request * pb.RemovePeerRequest
306+ wantSuccess bool
307+ wantErr bool
308+ }{
309+ {
310+ name : "successful peer removal" ,
311+ request : & pb.RemovePeerRequest {
312+ PeerId : "testRaftLeadershipnode2" ,
313+ },
314+ wantSuccess : true ,
315+ wantErr : false ,
316+ },
317+ {
318+ name : "nil request" ,
319+ request : nil ,
320+ wantSuccess : false ,
321+ wantErr : true ,
322+ },
323+ {
324+ name : "missing peer ID" ,
325+ request : & pb.RemovePeerRequest {
326+ PeerId : "" ,
327+ },
328+ wantSuccess : false ,
329+ wantErr : true ,
330+ },
331+ }
332+
333+ for i , tt := range tests {
334+ t .Run (tt .name , func (t * testing.T ) {
335+ tempDir := t .TempDir ()
336+ logger := setupTestLogger ()
337+ ports := []int {8004 + i , 8005 + i , 8006 + i }
338+
339+ nodes := setupNodes (t , logger , ports , tempDir )
340+
341+ // Wait for leader election
342+ time .Sleep (3 * time .Second )
343+
344+ server , lis := setupGRPCServer (t , nodes [0 ])
345+ defer server .Stop ()
346+
347+ conn , err := grpc .NewClient (
348+ getListenerAddr (lis ),
349+ grpc .WithTransportCredentials (insecure .NewCredentials ()),
350+ )
351+ require .NoError (t , err , "Failed to create gRPC client connection" )
352+ defer conn .Close ()
353+
354+ client := pb .NewRaftServiceClient (conn )
355+ resp , err := client .RemovePeer (context .Background (), tt .request )
356+
357+ if tt .wantErr {
358+ assert .Error (t , err )
359+ if resp != nil {
360+ assert .False (t , resp .Success )
361+ assert .NotEmpty (t , resp .Error )
362+ }
363+ return
364+ }
365+
366+ require .NoError (t , err )
367+ assert .True (t , resp .Success )
368+ assert .Empty (t , resp .Error )
369+ })
370+ }
371+ }
372+
373+ func TestRPCServer_GetPeerInfo (t * testing.T ) {
374+ tests := []struct {
375+ name string
376+ request * pb.GetPeerInfoRequest
377+ want * pb.GetPeerInfoResponse
378+ wantErr bool
379+ }{
380+ {
381+ name : "existing peer" ,
382+ request : & pb.GetPeerInfoRequest {
383+ PeerId : "testRaftLeadershipnode2" ,
384+ },
385+ want : & pb.GetPeerInfoResponse {
386+ Exists : true ,
387+ GrpcAddress : "127.0.0.1:9015" ,
388+ },
389+ wantErr : false ,
390+ },
391+ {
392+ name : "non-existent peer" ,
393+ request : & pb.GetPeerInfoRequest {
394+ PeerId : "nonexistentPeer" ,
395+ },
396+ want : & pb.GetPeerInfoResponse {
397+ Exists : false ,
398+ },
399+ wantErr : false ,
400+ },
401+ {
402+ name : "nil request" ,
403+ request : nil ,
404+ want : nil ,
405+ wantErr : true ,
406+ },
407+ {
408+ name : "empty peer ID" ,
409+ request : & pb.GetPeerInfoRequest {
410+ PeerId : "" ,
411+ },
412+ want : nil ,
413+ wantErr : true ,
414+ },
415+ }
416+
417+ for i , tt := range tests [0 :1 ] {
418+ t .Run (tt .name , func (t * testing.T ) {
419+ tempDir := t .TempDir ()
420+ logger := setupTestLogger ()
421+ ports := []int {9004 + i , 9005 + i , 9006 + i }
422+
423+ nodes := setupNodes (t , logger , ports , tempDir )
424+
425+ // Wait for leader election
426+ time .Sleep (3 * time .Second )
427+
428+ server , lis := setupGRPCServer (t , nodes [0 ])
429+ defer server .Stop ()
430+
431+ conn , err := grpc .NewClient (
432+ getListenerAddr (lis ),
433+ grpc .WithTransportCredentials (insecure .NewCredentials ()),
434+ )
435+ require .NoError (t , err , "Failed to create gRPC client connection" )
436+ defer conn .Close ()
437+
438+ client := pb .NewRaftServiceClient (conn )
439+ resp , err := client .GetPeerInfo (context .Background (), tt .request )
440+
441+ if tt .wantErr {
442+ assert .Error (t , err )
443+ return
444+ }
445+
446+ require .NoError (t , err )
447+ assert .Equal (t , tt .want .Exists , resp .Exists )
448+ if tt .want .Exists {
449+ assert .Equal (t , tt .want .GrpcAddress , resp .GrpcAddress )
450+ }
451+ })
452+ }
453+ }
0 commit comments