package privval import ( "net" "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto/ed25519" cmn "github.com/tendermint/tendermint/libs/common" "github.com/tendermint/tendermint/libs/log" "github.com/tendermint/tendermint/types" ) // TestSignerRemoteRetryTCPOnly will test connection retry attempts over TCP. We // don't need this for Unix sockets because the OS instantly knows the state of // both ends of the socket connection. This basically causes the // SignerServiceEndpoint.dialer() call inside SignerServiceEndpoint.connect() to return // successfully immediately, putting an instant stop to any retry attempts. func TestSignerRemoteRetryTCPOnly(t *testing.T) { var ( attemptCh = make(chan int) retries = 2 ) ln, err := net.Listen("tcp", "127.0.0.1:0") require.NoError(t, err) go func(ln net.Listener, attemptCh chan<- int) { attempts := 0 for { conn, err := ln.Accept() require.NoError(t, err) err = conn.Close() require.NoError(t, err) attempts++ if attempts == retries { attemptCh <- attempts break } } }(ln, attemptCh) serviceEndpoint := NewSignerServiceEndpoint( log.TestingLogger(), cmn.RandStr(12), types.NewMockPV(), DialTCPFn(ln.Addr().String(), testTimeoutReadWrite, ed25519.GenPrivKey()), ) defer serviceEndpoint.Stop() SignerServiceEndpointTimeoutReadWrite(time.Millisecond)(serviceEndpoint) SignerServiceEndpointConnRetries(retries)(serviceEndpoint) assert.Equal(t, serviceEndpoint.Start(), ErrDialRetryMax) select { case attempts := <-attemptCh: assert.Equal(t, retries, attempts) case <-time.After(100 * time.Millisecond): t.Error("expected remote to observe connection attempts") } }