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 }