(t *testing.T)
| 79 | } |
| 80 | |
| 81 | func TestTCPTransportWriteToUnreachableAddr(t *testing.T) { |
| 82 | writeCt := 50 |
| 83 | |
| 84 | // Listen for TCP connections on a random port |
| 85 | listener, err := net.Listen("tcp", "127.0.0.1:0") |
| 86 | require.NoError(t, err) |
| 87 | defer listener.Close() |
| 88 | |
| 89 | logs := &concurrency.SyncBuffer{} |
| 90 | logger := log.NewLogfmtLogger(logs) |
| 91 | |
| 92 | cfg := TCPTransportConfig{} |
| 93 | flagext.DefaultValues(&cfg) |
| 94 | cfg.BindAddrs = getLocalhostAddrs() |
| 95 | cfg.MaxConcurrentWrites = writeCt |
| 96 | cfg.PacketDialTimeout = 500 * time.Millisecond |
| 97 | transport, err := NewTCPTransport(cfg, logger, nil) |
| 98 | require.NoError(t, err) |
| 99 | |
| 100 | // Configure TLS only for writes. The dialing should timeout (because of the timeoutReader) |
| 101 | transport.cfg.TLSEnabled = true |
| 102 | transport.cfg.TLS = tls.ClientConfig{ |
| 103 | Reader: &timeoutReader{}, |
| 104 | CertPath: "fake", |
| 105 | KeyPath: "fake", |
| 106 | CAPath: "fake", |
| 107 | } |
| 108 | |
| 109 | timeStart := time.Now() |
| 110 | |
| 111 | for i := 0; i < writeCt; i++ { |
| 112 | _, err = transport.WriteTo([]byte("test"), listener.Addr().String()) |
| 113 | require.NoError(t, err) |
| 114 | } |
| 115 | |
| 116 | require.NoError(t, transport.Shutdown()) |
| 117 | |
| 118 | gotErrorCt := strings.Count(logs.String(), "context deadline exceeded") |
| 119 | assert.Equal(t, writeCt, gotErrorCt, "expected %d errors, got %d", writeCt, gotErrorCt) |
| 120 | assert.GreaterOrEqual(t, time.Since(timeStart), 500*time.Millisecond, "expected to take at least 500ms (timeout duration)") |
| 121 | assert.LessOrEqual(t, time.Since(timeStart), 2*time.Second, "expected to take less than 2s (timeout + a good margin), writing to unreachable addresses should not block") |
| 122 | } |
| 123 | |
| 124 | func TestTCPTransportWriterAcquireTimeout(t *testing.T) { |
| 125 | // Listen for TCP connections on a random port |
nothing calls this directly
no test coverage detected