90 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package pool
 | |
| 
 | |
| import (
 | |
| 	"testing"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/micro/go-micro/v2/transport"
 | |
| 	"github.com/micro/go-micro/v2/transport/memory"
 | |
| )
 | |
| 
 | |
| func testPool(t *testing.T, size int, ttl time.Duration) {
 | |
| 	// mock transport
 | |
| 	tr := memory.NewTransport()
 | |
| 
 | |
| 	options := Options{
 | |
| 		TTL:       ttl,
 | |
| 		Size:      size,
 | |
| 		Transport: tr,
 | |
| 	}
 | |
| 	// zero pool
 | |
| 	p := newPool(options)
 | |
| 
 | |
| 	// listen
 | |
| 	l, err := tr.Listen(":0")
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	defer l.Close()
 | |
| 
 | |
| 	// accept loop
 | |
| 	go func() {
 | |
| 		for {
 | |
| 			if err := l.Accept(func(s transport.Socket) {
 | |
| 				for {
 | |
| 					var msg transport.Message
 | |
| 					if err := s.Recv(&msg); err != nil {
 | |
| 						return
 | |
| 					}
 | |
| 					if err := s.Send(&msg); err != nil {
 | |
| 						return
 | |
| 					}
 | |
| 				}
 | |
| 			}); err != nil {
 | |
| 				return
 | |
| 			}
 | |
| 		}
 | |
| 	}()
 | |
| 
 | |
| 	for i := 0; i < 10; i++ {
 | |
| 		// get a conn
 | |
| 		c, err := p.Get(l.Addr())
 | |
| 		if err != nil {
 | |
| 			t.Fatal(err)
 | |
| 		}
 | |
| 
 | |
| 		msg := &transport.Message{
 | |
| 			Body: []byte(`hello world`),
 | |
| 		}
 | |
| 
 | |
| 		if err := c.Send(msg); err != nil {
 | |
| 			t.Fatal(err)
 | |
| 		}
 | |
| 
 | |
| 		var rcv transport.Message
 | |
| 
 | |
| 		if err := c.Recv(&rcv); err != nil {
 | |
| 			t.Fatal(err)
 | |
| 		}
 | |
| 
 | |
| 		if string(rcv.Body) != string(msg.Body) {
 | |
| 			t.Fatalf("got %v, expected %v", rcv.Body, msg.Body)
 | |
| 		}
 | |
| 
 | |
| 		// release the conn
 | |
| 		p.Release(c, nil)
 | |
| 
 | |
| 		p.Lock()
 | |
| 		if i := len(p.conns[l.Addr()]); i > size {
 | |
| 			p.Unlock()
 | |
| 			t.Fatalf("pool size %d is greater than expected %d", i, size)
 | |
| 		}
 | |
| 		p.Unlock()
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestClientPool(t *testing.T) {
 | |
| 	testPool(t, 0, time.Minute)
 | |
| 	testPool(t, 2, time.Minute)
 | |
| }
 |