mirror of
				https://github.com/go-micro/go-micro.git
				synced 2025-10-30 23:27:41 +02:00 
			
		
		
		
	Make mock listen on random port if 0 is specified
This commit is contained in:
		| @@ -2,7 +2,11 @@ package mock | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"errors" | 	"errors" | ||||||
|  | 	"fmt" | ||||||
|  | 	"math/rand" | ||||||
|  | 	"strings" | ||||||
| 	"sync" | 	"sync" | ||||||
|  | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/micro/go-micro/transport" | 	"github.com/micro/go-micro/transport" | ||||||
| ) | ) | ||||||
| @@ -126,15 +130,25 @@ func (m *mockTransport) Listen(addr string, opts ...transport.ListenOption) (tra | |||||||
| 	m.Lock() | 	m.Lock() | ||||||
| 	defer m.Unlock() | 	defer m.Unlock() | ||||||
|  |  | ||||||
| 	if _, ok := m.listeners[addr]; ok { |  | ||||||
| 		return nil, errors.New("already listening on " + addr) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	var options transport.ListenOptions | 	var options transport.ListenOptions | ||||||
| 	for _, o := range opts { | 	for _, o := range opts { | ||||||
| 		o(&options) | 		o(&options) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	parts := strings.Split(addr, ":") | ||||||
|  |  | ||||||
|  | 	// if zero port then randomly assign one | ||||||
|  | 	if len(parts) > 1 && parts[len(parts)-1] == "0" { | ||||||
|  | 		r := rand.New(rand.NewSource(time.Now().UnixNano())) | ||||||
|  | 		i := r.Intn(10000) | ||||||
|  | 		// set addr with port | ||||||
|  | 		addr = fmt.Sprintf("%s:%d", parts[:len(parts)-1], 10000+i) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if _, ok := m.listeners[addr]; ok { | ||||||
|  | 		return nil, errors.New("already listening on " + addr) | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	listener := &mockListener{ | 	listener := &mockListener{ | ||||||
| 		opts: options, | 		opts: options, | ||||||
| 		addr: addr, | 		addr: addr, | ||||||
|   | |||||||
| @@ -58,3 +58,32 @@ func TestTransport(t *testing.T) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func TestListener(t *testing.T) { | ||||||
|  | 	tr := NewTransport() | ||||||
|  |  | ||||||
|  | 	// bind / listen on random port | ||||||
|  | 	l, err := tr.Listen(":0") | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Fatalf("Unexpected error listening %v", err) | ||||||
|  | 	} | ||||||
|  | 	defer l.Close() | ||||||
|  |  | ||||||
|  | 	// try again | ||||||
|  | 	l2, err := tr.Listen(":0") | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Fatalf("Unexpected error listening %v", err) | ||||||
|  | 	} | ||||||
|  | 	defer l2.Close() | ||||||
|  |  | ||||||
|  | 	// now make sure it still fails | ||||||
|  | 	l3, err := tr.Listen(":8080") | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Fatalf("Unexpected error listening %v", err) | ||||||
|  | 	} | ||||||
|  | 	defer l3.Close() | ||||||
|  |  | ||||||
|  | 	if _, err := tr.Listen(":8080"); err == nil { | ||||||
|  | 		t.Fatal("Expected error binding to :8080 got nil") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user