github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/lib/net/rrdialer/dial_test.go (about)

     1  package rrdialer
     2  
     3  import (
     4  	"context"
     5  	"net"
     6  	"strconv"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/Cloud-Foundations/Dominator/lib/log"
    11  	"github.com/Cloud-Foundations/Dominator/lib/log/testlogger"
    12  )
    13  
    14  var nextPortNumber = 12340
    15  
    16  func (e *endpointType) makeListener(delay time.Duration,
    17  	logger log.Logger) *uint {
    18  	var acceptCounter uint
    19  	e.address = "localhost:" + strconv.Itoa(nextPortNumber)
    20  	nextPortNumber++
    21  	go func() {
    22  		time.Sleep(delay)
    23  		if listener, err := net.Listen("tcp", e.address); err != nil {
    24  			panic(err)
    25  		} else {
    26  			for {
    27  				if conn, err := listener.Accept(); err != nil {
    28  					logger.Println(err)
    29  				} else {
    30  					acceptCounter++
    31  					conn.Close()
    32  				}
    33  			}
    34  		}
    35  	}()
    36  	return &acceptCounter
    37  }
    38  
    39  func TestDialNoConnections(t *testing.T) {
    40  	dialer := &Dialer{
    41  		logger:    testlogger.New(t),
    42  		rawDialer: &net.Dialer{Timeout: time.Second},
    43  	}
    44  	endpoint50 := &endpointType{
    45  		MeanLatency: 50e-3,
    46  	}
    47  	endpoint100 := &endpointType{
    48  		MeanLatency: 100e-3,
    49  	}
    50  	endpoints := []*endpointType{endpoint50, endpoint100}
    51  	startTime := time.Now()
    52  	_, err := dialer.dialEndpoints(context.Background(), "tcp",
    53  		"localhost:1", endpoints, -1)
    54  	if err == nil {
    55  		t.Fatal("Dial with no working endpoints did not fail")
    56  	}
    57  	if time.Since(startTime) > time.Millisecond*40 {
    58  		t.Fatal("Dial took too long to fail")
    59  	}
    60  }
    61  
    62  func TestDialOneIsFastEnough(t *testing.T) {
    63  	dialer := &Dialer{
    64  		logger:    testlogger.New(t),
    65  		rawDialer: &net.Dialer{Timeout: time.Second},
    66  	}
    67  	endpoint50 := &endpointType{
    68  		MeanLatency: 50e-3,
    69  	}
    70  	endpoint100 := &endpointType{
    71  		MeanLatency: 100e-3,
    72  	}
    73  	counter50 := endpoint50.makeListener(0, dialer.logger)
    74  	counter100 := endpoint100.makeListener(time.Millisecond*40, dialer.logger)
    75  	endpoints := []*endpointType{endpoint50, endpoint100}
    76  	time.Sleep(time.Millisecond * 20)
    77  	_, err := dialer.dialEndpoints(context.Background(), "tcp",
    78  		"localhost:1", endpoints, -1)
    79  	if err != nil {
    80  		t.Fatal(err)
    81  	}
    82  	time.Sleep(time.Millisecond * 20)
    83  	if *counter50 != 1 {
    84  		t.Fatal("endpoint50 did not connect")
    85  	}
    86  	if *counter100 != 0 {
    87  		t.Fatal("endpoint100 connected")
    88  	}
    89  }
    90  
    91  func TestDialTwoAreFastEnough(t *testing.T) {
    92  	dialer := &Dialer{
    93  		logger:    testlogger.New(t),
    94  		rawDialer: &net.Dialer{Timeout: time.Second},
    95  	}
    96  	endpoint50 := &endpointType{
    97  		MeanLatency: 50e-3,
    98  	}
    99  	endpoint100 := &endpointType{
   100  		MeanLatency: 100e-3,
   101  	}
   102  	endpoint150 := &endpointType{
   103  		LastUpdate:  time.Now(),
   104  		MeanLatency: 150e-3,
   105  	}
   106  	counter50 := endpoint50.makeListener(0, dialer.logger)
   107  	counter100 := endpoint100.makeListener(time.Millisecond*40, dialer.logger)
   108  	counter150 := endpoint150.makeListener(0, dialer.logger)
   109  	endpoints := []*endpointType{endpoint50, endpoint100, endpoint150}
   110  	time.Sleep(time.Millisecond * 20)
   111  	_, err := dialer.dialEndpoints(context.Background(), "tcp",
   112  		"localhost:1", endpoints, -1)
   113  	if err != nil {
   114  		t.Fatal(err)
   115  	}
   116  	time.Sleep(time.Millisecond * 20)
   117  	if *counter50 != 1 && *counter150 != 1 {
   118  		t.Fatal("endpoint50 and endpoint150 did not connect")
   119  	}
   120  	if *counter100 != 0 {
   121  		t.Fatal("endpoint100 connected")
   122  	}
   123  }