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 }