package proxy import ( "errors" "os" "os/signal" "syscall" "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" abciclient "github.com/tendermint/tendermint/abci/client" abcimocks "github.com/tendermint/tendermint/abci/client/mocks" ) func TestAppConns_Start_Stop(t *testing.T) { quitCh := make(<-chan struct{}) clientMock := &abcimocks.Client{} clientMock.On("SetLogger", mock.Anything).Return().Times(4) clientMock.On("Start").Return(nil).Times(4) clientMock.On("Stop").Return(nil).Times(4) clientMock.On("Quit").Return(quitCh).Times(4) creatorCallCount := 0 creator := func() (abciclient.Client, error) { creatorCallCount++ return clientMock, nil } appConns := NewAppConns(creator, NopMetrics()) err := appConns.Start() require.NoError(t, err) time.Sleep(100 * time.Millisecond) err = appConns.Stop() require.NoError(t, err) clientMock.AssertExpectations(t) assert.Equal(t, 4, creatorCallCount) } // Upon failure, we call tmos.Kill func TestAppConns_Failure(t *testing.T) { ok := make(chan struct{}) c := make(chan os.Signal, 1) signal.Notify(c, syscall.SIGTERM) go func() { for range c { close(ok) } }() quitCh := make(chan struct{}) var recvQuitCh <-chan struct{} // nolint:gosimple recvQuitCh = quitCh clientMock := &abcimocks.Client{} clientMock.On("SetLogger", mock.Anything).Return() clientMock.On("Start").Return(nil) clientMock.On("Stop").Return(nil) clientMock.On("Quit").Return(recvQuitCh) clientMock.On("Error").Return(errors.New("EOF")).Once() creator := func() (abciclient.Client, error) { return clientMock, nil } appConns := NewAppConns(creator, NopMetrics()) err := appConns.Start() require.NoError(t, err) t.Cleanup(func() { if err := appConns.Stop(); err != nil { t.Error(err) } }) // simulate failure close(quitCh) select { case <-ok: t.Log("SIGTERM successfully received") case <-time.After(5 * time.Second): t.Fatal("expected process to receive SIGTERM signal") } }