Skip to content

Commit e264d49

Browse files
committed
test(raft): Add comprehensive RPC server method tests
Implement thorough test suites for Raft RPC server methods: - AddPeer: Test peer addition with various input scenarios - RemovePeer: Validate peer removal in different conditions - GetPeerInfo: Verify peer information retrieval Enhance test coverage for Raft RPC server operations, improving reliability and robustness of cluster management methods.
1 parent 3b24bfd commit e264d49

File tree

1 file changed

+254
-6
lines changed

1 file changed

+254
-6
lines changed

raft/rpc_test.go

Lines changed: 254 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)