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")
|
|
}
|
|
}
|