github.com/annwntech/go-micro/v2@v2.9.5/util/pool/default_test.go (about) 1 package pool 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/annwntech/go-micro/v2/transport" 8 "github.com/annwntech/go-micro/v2/transport/memory" 9 ) 10 11 func testPool(t *testing.T, size int, ttl time.Duration) { 12 // mock transport 13 tr := memory.NewTransport() 14 15 options := Options{ 16 TTL: ttl, 17 Size: size, 18 Transport: tr, 19 } 20 // zero pool 21 p := newPool(options) 22 23 // listen 24 l, err := tr.Listen(":0") 25 if err != nil { 26 t.Fatal(err) 27 } 28 defer l.Close() 29 30 // accept loop 31 go func() { 32 for { 33 if err := l.Accept(func(s transport.Socket) { 34 for { 35 var msg transport.Message 36 if err := s.Recv(&msg); err != nil { 37 return 38 } 39 if err := s.Send(&msg); err != nil { 40 return 41 } 42 } 43 }); err != nil { 44 return 45 } 46 } 47 }() 48 49 for i := 0; i < 10; i++ { 50 // get a conn 51 c, err := p.Get(l.Addr()) 52 if err != nil { 53 t.Fatal(err) 54 } 55 56 msg := &transport.Message{ 57 Body: []byte(`hello world`), 58 } 59 60 if err := c.Send(msg); err != nil { 61 t.Fatal(err) 62 } 63 64 var rcv transport.Message 65 66 if err := c.Recv(&rcv); err != nil { 67 t.Fatal(err) 68 } 69 70 if string(rcv.Body) != string(msg.Body) { 71 t.Fatalf("got %v, expected %v", rcv.Body, msg.Body) 72 } 73 74 // release the conn 75 p.Release(c, nil) 76 77 p.Lock() 78 if i := len(p.conns[l.Addr()]); i > size { 79 p.Unlock() 80 t.Fatalf("pool size %d is greater than expected %d", i, size) 81 } 82 p.Unlock() 83 } 84 } 85 86 func TestClientPool(t *testing.T) { 87 testPool(t, 0, time.Minute) 88 testPool(t, 2, time.Minute) 89 }