@@ -37,6 +37,7 @@ import (
37
37
"google.golang.org/grpc/credentials"
38
38
"google.golang.org/grpc/credentials/insecure"
39
39
"google.golang.org/grpc/status"
40
+ "google.golang.org/protobuf/types/known/emptypb"
40
41
41
42
"github.com/webmeshproj/webmesh/pkg/context"
42
43
"github.com/webmeshproj/webmesh/pkg/crypto"
@@ -45,6 +46,67 @@ import (
45
46
"github.com/webmeshproj/webmesh/pkg/plugins/clients"
46
47
)
47
48
49
+ var testNode = & v1.MeshNode {
50
+ Id : "test-node" ,
51
+ PublicKey : must (crypto .MustGenerateKey ().PublicKey ().Encode ),
52
+ }
53
+
54
+ func must (fn func () (string , error )) string {
55
+ s , err := fn ()
56
+ if err != nil {
57
+ panic (err )
58
+ }
59
+ return s
60
+ }
61
+
62
+ type TestMeshAPI struct {
63
+ v1.UnimplementedMeshServer
64
+ }
65
+
66
+ func (* TestMeshAPI ) GetMeshGraph (context.Context , * emptypb.Empty ) (* v1.MeshGraph , error ) {
67
+ // Leave unimplemented.
68
+ return nil , status .Errorf (codes .Unimplemented , "unimplemented" )
69
+ }
70
+
71
+ func (* TestMeshAPI ) GetNode (context.Context , * v1.GetNodeRequest ) (* v1.MeshNode , error ) {
72
+ // Return a dummy node
73
+ return testNode , nil
74
+ }
75
+
76
+ func (* TestMeshAPI ) ListNodes (context.Context , * emptypb.Empty ) (* v1.NodeList , error ) {
77
+ // Use for a custom error message
78
+ return nil , status .Errorf (codes .Internal , "something went wrong" )
79
+ }
80
+
81
+ func RunClientConnTests (ctx context.Context , t * testing.T , c * grpc.ClientConn ) {
82
+ t .Helper ()
83
+ cli := v1 .NewMeshClient (c )
84
+ _ , err := cli .GetMeshGraph (ctx , & emptypb.Empty {})
85
+ if err == nil {
86
+ t .Fatal ("Expected error, got nil" )
87
+ }
88
+ if status .Code (err ) != codes .Unimplemented {
89
+ t .Fatal ("Expected unimplemented error, got" , err )
90
+ }
91
+ _ , err = cli .ListNodes (ctx , & emptypb.Empty {})
92
+ if err == nil {
93
+ t .Fatal ("Expected error, got nil" )
94
+ }
95
+ if status .Code (err ) != codes .Internal {
96
+ t .Fatal ("Expected internal error, got" , err )
97
+ }
98
+ node , err := cli .GetNode (ctx , & v1.GetNodeRequest {})
99
+ if err != nil {
100
+ t .Fatal ("GetNode:" , err )
101
+ }
102
+ if node .Id != testNode .Id {
103
+ t .Fatal ("Expected node ID" , testNode .Id , "got" , node .Id )
104
+ }
105
+ if node .PublicKey != testNode .PublicKey {
106
+ t .Fatal ("Expected node public key" , testNode .PublicKey , "got" , node .PublicKey )
107
+ }
108
+ }
109
+
48
110
func TestRPCTransport (t * testing.T ) {
49
111
ctx := context .Background ()
50
112
@@ -89,7 +151,7 @@ func TestRPCTransport(t *testing.T) {
89
151
}
90
152
// Create a dummy gRPC server and register an unimplemented service.
91
153
srv := grpc .NewServer ()
92
- v1 .RegisterMeshServer (srv , v1. UnimplementedMeshServer {})
154
+ v1 .RegisterMeshServer (srv , & TestMeshAPI {})
93
155
go func () {
94
156
err := srv .Serve (server .RPCListener ())
95
157
if err != nil {
@@ -107,15 +169,7 @@ func TestRPCTransport(t *testing.T) {
107
169
t .Fatal ("Dial server address:" , err )
108
170
}
109
171
defer c .Close ()
110
- cli := v1 .NewMeshClient (c )
111
- _ , err = cli .GetNode (ctx , & v1.GetNodeRequest {})
112
- // We should actually get an unimplemented error here.
113
- if err == nil {
114
- t .Fatal ("Expected error, got nil" )
115
- }
116
- if status .Code (err ) != codes .Unimplemented {
117
- t .Fatal ("Expected unimplemented error, got" , err )
118
- }
172
+ RunClientConnTests (ctx , t , c )
119
173
})
120
174
121
175
t .Run ("DialByMultiaddr" , func (t * testing.T ) {
@@ -125,15 +179,7 @@ func TestRPCTransport(t *testing.T) {
125
179
t .Fatal ("Dial server address:" , err )
126
180
}
127
181
defer c .Close ()
128
- cli := v1 .NewMeshClient (c )
129
- _ , err = cli .GetNode (ctx , & v1.GetNodeRequest {})
130
- // We should actually get an unimplemented error here.
131
- if err == nil {
132
- t .Fatal ("Expected error, got nil" )
133
- }
134
- if status .Code (err ) != codes .Unimplemented {
135
- t .Fatal ("Expected unimplemented error, got" , err )
136
- }
182
+ RunClientConnTests (ctx , t , c )
137
183
}
138
184
})
139
185
})
@@ -159,7 +205,7 @@ func TestRPCTransport(t *testing.T) {
159
205
// Create a dummy gRPC server and register an unimplemented service.
160
206
srv := grpc .NewServer ()
161
207
t .Cleanup (srv .Stop )
162
- v1 .RegisterMeshServer (srv , v1. UnimplementedMeshServer {})
208
+ v1 .RegisterMeshServer (srv , & TestMeshAPI {})
163
209
go func () {
164
210
err := srv .Serve (server .RPCListener ())
165
211
if err != nil {
@@ -176,15 +222,7 @@ func TestRPCTransport(t *testing.T) {
176
222
t .Fatal ("Dial server address:" , err )
177
223
}
178
224
defer c .Close ()
179
- cli := v1 .NewMeshClient (c )
180
- _ , err = cli .GetNode (ctx , & v1.GetNodeRequest {})
181
- // We should actually get an unimplemented error here.
182
- if err == nil {
183
- t .Fatal ("Expected error, got nil" )
184
- }
185
- if status .Code (err ) != codes .Unimplemented {
186
- t .Fatal ("Expected unimplemented error, got" , err )
187
- }
225
+ RunClientConnTests (ctx , t , c )
188
226
}
189
227
})
190
228
@@ -227,7 +265,7 @@ func TestRPCTransport(t *testing.T) {
227
265
idauthcli := clients .NewInProcessClient (idauthsrv )
228
266
srv := grpc .NewServer (grpc .ChainUnaryInterceptor (plugins .NewAuthUnaryInterceptor (idauthcli .Auth ())))
229
267
t .Cleanup (srv .Stop )
230
- v1 .RegisterMeshServer (srv , v1. UnimplementedMeshServer {})
268
+ v1 .RegisterMeshServer (srv , & TestMeshAPI {})
231
269
go func () {
232
270
err := srv .Serve (server .RPCListener ())
233
271
if err != nil {
@@ -244,15 +282,7 @@ func TestRPCTransport(t *testing.T) {
244
282
t .Fatal ("Dial server address:" , err )
245
283
}
246
284
defer c .Close ()
247
- cli := v1 .NewMeshClient (c )
248
- _ , err = cli .GetNode (ctx , & v1.GetNodeRequest {})
249
- // We should actually get an unimplemented error here.
250
- if err == nil {
251
- t .Fatal ("Expected error, got nil" )
252
- }
253
- if status .Code (err ) != codes .Unimplemented {
254
- t .Fatal ("Expected unimplemented error, got" , err )
255
- }
285
+ RunClientConnTests (ctx , t , c )
256
286
}
257
287
})
258
288
// Test that an unallowed ID can use the server, but will be rejected.
@@ -307,7 +337,7 @@ func TestRPCTransport(t *testing.T) {
307
337
}
308
338
srv := grpc .NewServer (grpc .Creds (credentials .NewTLS (tlsconf )))
309
339
t .Cleanup (srv .Stop )
310
- v1 .RegisterMeshServer (srv , v1. UnimplementedMeshServer {})
340
+ v1 .RegisterMeshServer (srv , & TestMeshAPI {})
311
341
go func () {
312
342
err := srv .Serve (server .RPCListener ())
313
343
if err != nil {
@@ -324,15 +354,7 @@ func TestRPCTransport(t *testing.T) {
324
354
t .Fatal ("Dial server address:" , err )
325
355
}
326
356
defer c .Close ()
327
- cli := v1 .NewMeshClient (c )
328
- _ , err = cli .GetNode (ctx , & v1.GetNodeRequest {})
329
- // We should actually get an unimplemented error here.
330
- if err == nil {
331
- t .Fatal ("Expected error, got nil" )
332
- }
333
- if status .Code (err ) != codes .Unimplemented {
334
- t .Fatal ("Expected unimplemented error, got" , err )
335
- }
357
+ RunClientConnTests (ctx , t , c )
336
358
}
337
359
})
338
360
@@ -392,7 +414,7 @@ func TestRPCTransport(t *testing.T) {
392
414
t .Fatal (err )
393
415
}
394
416
srv := grpc .NewServer (servercreds )
395
- v1 .RegisterMeshServer (srv , v1. UnimplementedMeshServer {})
417
+ v1 .RegisterMeshServer (srv , & TestMeshAPI {})
396
418
go func () {
397
419
err := srv .Serve (server .RPCListener ())
398
420
if err != nil {
@@ -419,14 +441,7 @@ func TestRPCTransport(t *testing.T) {
419
441
t .Fatal ("Dial server address:" , err )
420
442
}
421
443
defer c .Close ()
422
- cli := v1 .NewMeshClient (c )
423
- _ , err = cli .GetNode (ctx , & v1.GetNodeRequest {})
424
- if err == nil {
425
- t .Fatal ("Expected error, got nil" )
426
- }
427
- if status .Code (err ) != codes .Unimplemented {
428
- t .Fatal ("Expected unimplemented error, got" , err )
429
- }
444
+ RunClientConnTests (ctx , t , c )
430
445
}
431
446
})
432
447
@@ -501,7 +516,7 @@ func TestDiscoveryRPCTransport(t *testing.T) {
501
516
server .Announce (ctx , rendezvous , time .Minute )
502
517
t .Cleanup (func () { _ = server .Close () })
503
518
srv := grpc .NewServer (grpc .Creds (insecure .NewCredentials ()))
504
- v1 .RegisterMeshServer (srv , v1. UnimplementedMeshServer {})
519
+ v1 .RegisterMeshServer (srv , & TestMeshAPI {})
505
520
go func () {
506
521
err := srv .Serve (server .RPCListener ())
507
522
if err != nil {
@@ -532,14 +547,7 @@ func TestDiscoveryRPCTransport(t *testing.T) {
532
547
t .Fatal ("Dial server address:" , err )
533
548
}
534
549
defer c .Close ()
535
- cli := v1 .NewMeshClient (c )
536
- _ , err = cli .GetNode (ctx , & v1.GetNodeRequest {})
537
- if err == nil {
538
- t .Fatal ("Expected error, got nil" )
539
- }
540
- if status .Code (err ) != codes .Unimplemented {
541
- t .Fatal ("Expected unimplemented error, got" , err )
542
- }
550
+ RunClientConnTests (ctx , t , c )
543
551
})
544
552
545
553
t .Run ("PrestartedHosts" , func (t * testing.T ) {
@@ -565,7 +573,7 @@ func TestDiscoveryRPCTransport(t *testing.T) {
565
573
server .Announce (ctx , rendezvous , time .Minute )
566
574
t .Cleanup (func () { _ = server .Close () })
567
575
srv := grpc .NewServer (grpc .Creds (insecure .NewCredentials ()))
568
- v1 .RegisterMeshServer (srv , v1. UnimplementedMeshServer {})
576
+ v1 .RegisterMeshServer (srv , & TestMeshAPI {})
569
577
go func () {
570
578
err := srv .Serve (server .RPCListener ())
571
579
if err != nil {
@@ -602,13 +610,6 @@ func TestDiscoveryRPCTransport(t *testing.T) {
602
610
t .Fatal ("Dial server address:" , err )
603
611
}
604
612
defer c .Close ()
605
- cli := v1 .NewMeshClient (c )
606
- _ , err = cli .GetNode (ctx , & v1.GetNodeRequest {})
607
- if err == nil {
608
- t .Fatal ("Expected error, got nil" )
609
- }
610
- if status .Code (err ) != codes .Unimplemented {
611
- t .Fatal ("Expected unimplemented error, got" , err )
612
- }
613
+ RunClientConnTests (ctx , t , c )
613
614
})
614
615
}
0 commit comments