|
|
- package privval
-
- import (
- "io/ioutil"
- "os"
- "testing"
- "time"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-
- cmn "github.com/tendermint/tendermint/libs/common"
- "github.com/tendermint/tendermint/libs/log"
- "github.com/tendermint/tendermint/types"
- )
-
- func TestIPCPVVote(t *testing.T) {
- var (
- chainID = cmn.RandStr(12)
- sc, rs = testSetupIPCSocketPair(t, chainID, types.NewMockPV())
-
- ts = time.Now()
- vType = types.PrecommitType
- want = &types.Vote{Timestamp: ts, Type: vType}
- have = &types.Vote{Timestamp: ts, Type: vType}
- )
- defer sc.Stop()
- defer rs.Stop()
-
- require.NoError(t, rs.privVal.SignVote(chainID, want))
- require.NoError(t, sc.SignVote(chainID, have))
- assert.Equal(t, want.Signature, have.Signature)
- }
-
- func TestIPCPVVoteResetDeadline(t *testing.T) {
- var (
- chainID = cmn.RandStr(12)
- sc, rs = testSetupIPCSocketPair(t, chainID, types.NewMockPV())
-
- ts = time.Now()
- vType = types.PrecommitType
- want = &types.Vote{Timestamp: ts, Type: vType}
- have = &types.Vote{Timestamp: ts, Type: vType}
- )
- defer sc.Stop()
- defer rs.Stop()
-
- time.Sleep(3 * time.Millisecond)
-
- require.NoError(t, rs.privVal.SignVote(chainID, want))
- require.NoError(t, sc.SignVote(chainID, have))
- assert.Equal(t, want.Signature, have.Signature)
-
- // This would exceed the deadline if it was not extended by the previous message
- time.Sleep(3 * time.Millisecond)
-
- require.NoError(t, rs.privVal.SignVote(chainID, want))
- require.NoError(t, sc.SignVote(chainID, have))
- assert.Equal(t, want.Signature, have.Signature)
- }
-
- func TestIPCPVVoteKeepalive(t *testing.T) {
- var (
- chainID = cmn.RandStr(12)
- sc, rs = testSetupIPCSocketPair(t, chainID, types.NewMockPV())
-
- ts = time.Now()
- vType = types.PrecommitType
- want = &types.Vote{Timestamp: ts, Type: vType}
- have = &types.Vote{Timestamp: ts, Type: vType}
- )
- defer sc.Stop()
- defer rs.Stop()
-
- time.Sleep(10 * time.Millisecond)
-
- require.NoError(t, rs.privVal.SignVote(chainID, want))
- require.NoError(t, sc.SignVote(chainID, have))
- assert.Equal(t, want.Signature, have.Signature)
- }
-
- func testSetupIPCSocketPair(
- t *testing.T,
- chainID string,
- privValidator types.PrivValidator,
- ) (*IPCVal, *IPCRemoteSigner) {
- addr, err := testUnixAddr()
- require.NoError(t, err)
-
- var (
- logger = log.TestingLogger()
- privVal = privValidator
- readyc = make(chan struct{})
- rs = NewIPCRemoteSigner(
- logger,
- chainID,
- addr,
- privVal,
- )
- sc = NewIPCVal(
- logger,
- addr,
- )
- )
-
- IPCValConnTimeout(5 * time.Millisecond)(sc)
- IPCValHeartbeat(time.Millisecond)(sc)
-
- IPCRemoteSignerConnDeadline(time.Millisecond * 5)(rs)
-
- testStartIPCRemoteSigner(t, readyc, rs)
-
- <-readyc
-
- require.NoError(t, sc.Start())
- assert.True(t, sc.IsRunning())
-
- return sc, rs
- }
-
- func testStartIPCRemoteSigner(t *testing.T, readyc chan struct{}, rs *IPCRemoteSigner) {
- go func(rs *IPCRemoteSigner) {
- require.NoError(t, rs.Start())
- assert.True(t, rs.IsRunning())
-
- readyc <- struct{}{}
- }(rs)
- }
-
- func testUnixAddr() (string, error) {
- f, err := ioutil.TempFile("/tmp", "nettest")
- if err != nil {
- return "", err
- }
-
- addr := f.Name()
- err = f.Close()
- if err != nil {
- return "", err
- }
- err = os.Remove(addr)
- if err != nil {
- return "", err
- }
-
- return addr, nil
- }
|