@@ -18,9 +18,15 @@ import (
18
18
"context"
19
19
"encoding/json"
20
20
"fmt"
21
+ "io/ioutil"
22
+ "net/url"
23
+ "os"
21
24
"testing"
22
25
"time"
23
26
27
+ "github.com/cloudwego/hertz/pkg/app/client/discovery"
28
+ "github.com/stretchr/testify/require"
29
+
24
30
"github.com/cloudwego/hertz/pkg/app"
25
31
"github.com/cloudwego/hertz/pkg/app/client"
26
32
"github.com/cloudwego/hertz/pkg/app/middlewares/client/sd"
@@ -31,6 +37,7 @@ import (
31
37
"github.com/cloudwego/hertz/pkg/protocol/consts"
32
38
"github.com/stretchr/testify/assert"
33
39
clientv3 "go.etcd.io/etcd/client/v3"
40
+ "go.etcd.io/etcd/server/v3/embed"
34
41
)
35
42
36
43
var (
@@ -267,3 +274,150 @@ func TestEtcdRegistryWithHertz(t *testing.T) {
267
274
assert .Equal (t , 0 , status1 )
268
275
assert .Equal (t , "" , string (body1 ))
269
276
}
277
+
278
+ func TestEtcdRegistryWithAddressBlank (t * testing.T ) {
279
+ s , endpoint := setupEmbedEtcd (t )
280
+ rg , err := NewEtcdRegistry ([]string {endpoint })
281
+ require .Nil (t , err )
282
+ rs , err := NewEtcdResolver ([]string {endpoint })
283
+ require .Nil (t , err )
284
+
285
+ infoList := []registry.Info {
286
+ {
287
+ ServiceName : "registry-etcd-test" ,
288
+ Addr : utils .NewNetAddr ("tcp" , "[::]:8888" ),
289
+ Weight : 27 ,
290
+ Tags : map [string ]string {"hello" : "world" },
291
+ },
292
+ {
293
+ ServiceName : "registry-etcd-test-suffix" ,
294
+ Addr : utils .NewNetAddr ("tcp" , "127.0.0.1:9999" ),
295
+ Weight : 27 ,
296
+ Tags : map [string ]string {"hello" : "world" },
297
+ },
298
+ }
299
+
300
+ // test register service
301
+ {
302
+ for _ , info := range infoList {
303
+ err = rg .Register (& info )
304
+ require .Nil (t , err )
305
+
306
+ desc := rs .Target (context .TODO (), & discovery.TargetInfo {
307
+ Host : info .ServiceName ,
308
+ Tags : info .Tags ,
309
+ })
310
+ result , err := rs .Resolve (context .TODO (), desc )
311
+ require .Nil (t , err )
312
+ address , err := rg .(* etcdRegistry ).getAddressOfRegistration (& info )
313
+ require .Nil (t , err )
314
+ expected := discovery.Result {
315
+ CacheKey : info .ServiceName ,
316
+ Instances : []discovery.Instance {
317
+ discovery .NewInstance (info .Addr .Network (), address , info .Weight , info .Tags ),
318
+ },
319
+ }
320
+ require .Equal (t , expected , result )
321
+ }
322
+ }
323
+
324
+ // test deregister service
325
+ {
326
+ for _ , info := range infoList {
327
+ err = rg .Deregister (& info )
328
+ assert .Nil (t , err )
329
+ }
330
+ }
331
+ teardownEmbedEtcd (s )
332
+ }
333
+
334
+ func TestEtcdRegistryWithEnvironmentVariable (t * testing.T ) {
335
+ s , endpoint := setupEmbedEtcd (t )
336
+ err := os .Setenv (hertzPortToRegistry , "8899" )
337
+ if err != nil {
338
+ return
339
+ }
340
+ err = os .Setenv (hertzIpToRegistry , "127.0.0.2" )
341
+ if err != nil {
342
+ return
343
+ }
344
+
345
+ rg , err := NewEtcdRegistry ([]string {endpoint })
346
+ require .Nil (t , err )
347
+ rs , err := NewEtcdResolver ([]string {endpoint })
348
+ require .Nil (t , err )
349
+
350
+ infoList := []registry.Info {
351
+ {
352
+ ServiceName : "registry-etcd-test" ,
353
+ Addr : utils .NewNetAddr ("tcp" , "[::]:8888" ),
354
+ Weight : 27 ,
355
+ Tags : map [string ]string {"hello" : "world" },
356
+ },
357
+ {
358
+ ServiceName : "registry-etcd-test-suffix" ,
359
+ Addr : utils .NewNetAddr ("tcp" , "10.122.1.108:9999" ),
360
+ Weight : 27 ,
361
+ Tags : map [string ]string {"hello" : "world" },
362
+ },
363
+ }
364
+
365
+ // test register service
366
+ {
367
+ for _ , info := range infoList {
368
+ err = rg .Register (& info )
369
+ require .Nil (t , err )
370
+
371
+ desc := rs .Target (context .TODO (), & discovery.TargetInfo {
372
+ Host : info .ServiceName ,
373
+ })
374
+ result , err := rs .Resolve (context .TODO (), desc )
375
+ require .Nil (t , err )
376
+ address , err := rg .(* etcdRegistry ).getAddressOfRegistration (& info )
377
+ require .Nil (t , err )
378
+ expected := discovery.Result {
379
+ CacheKey : info .ServiceName ,
380
+ Instances : []discovery.Instance {
381
+ discovery .NewInstance (info .Addr .Network (), address , info .Weight , info .Tags ),
382
+ },
383
+ }
384
+ require .Equal (t , expected , result )
385
+ }
386
+ }
387
+
388
+ // test deregister service
389
+ {
390
+ for _ , info := range infoList {
391
+ err = rg .Deregister (& info )
392
+ require .Nil (t , err )
393
+ }
394
+ }
395
+ os .Unsetenv (hertzPortToRegistry )
396
+ os .Unsetenv (hertzIpToRegistry )
397
+ teardownEmbedEtcd (s )
398
+ }
399
+
400
+ func setupEmbedEtcd (t * testing.T ) (* embed.Etcd , string ) {
401
+ endpoint := fmt .Sprintf ("unix://localhost:%06d" , os .Getpid ())
402
+ u , err := url .Parse (endpoint )
403
+ require .Nil (t , err )
404
+ dir , err := ioutil .TempDir ("" , "etcd_resolver_test" )
405
+ require .Nil (t , err )
406
+
407
+ cfg := embed .NewConfig ()
408
+ cfg .LCUrls = []url.URL {* u }
409
+ // disable etcd log
410
+ cfg .LogLevel = "panic"
411
+ cfg .Dir = dir
412
+
413
+ s , err := embed .StartEtcd (cfg )
414
+ require .Nil (t , err )
415
+
416
+ <- s .Server .ReadyNotify ()
417
+ return s , endpoint
418
+ }
419
+
420
+ func teardownEmbedEtcd (s * embed.Etcd ) {
421
+ s .Close ()
422
+ _ = os .RemoveAll (s .Config ().Dir )
423
+ }
0 commit comments