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