github.com/adoriasoft/tendermint@v0.34.0-dev1.0.20200722151356-96d84601a75a/proxy/multi_app_conn_test.go (about)

     1  package proxy
     2  
     3  import (
     4  	"errors"
     5  	"os"
     6  	"os/signal"
     7  	"syscall"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/stretchr/testify/mock"
    12  	"github.com/stretchr/testify/require"
    13  
    14  	abcimocks "github.com/tendermint/tendermint/abci/client/mocks"
    15  	"github.com/tendermint/tendermint/proxy/mocks"
    16  )
    17  
    18  func TestAppConns_Start_Stop(t *testing.T) {
    19  	quitCh := make(<-chan struct{})
    20  
    21  	clientCreatorMock := &mocks.ClientCreator{}
    22  
    23  	clientMock := &abcimocks.Client{}
    24  	clientMock.On("SetLogger", mock.Anything).Return().Times(4)
    25  	clientMock.On("Start").Return(nil).Times(4)
    26  	clientMock.On("Stop").Return(nil).Times(4)
    27  	clientMock.On("Quit").Return(quitCh).Times(4)
    28  
    29  	clientCreatorMock.On("NewABCIClient").Return(clientMock, nil).Times(4)
    30  
    31  	appConns := NewAppConns(clientCreatorMock)
    32  
    33  	err := appConns.Start()
    34  	require.NoError(t, err)
    35  
    36  	time.Sleep(100 * time.Millisecond)
    37  
    38  	appConns.Stop()
    39  
    40  	clientMock.AssertExpectations(t)
    41  }
    42  
    43  // Upon failure, we call tmos.Kill
    44  func TestAppConns_Failure(t *testing.T) {
    45  	ok := make(chan struct{})
    46  	c := make(chan os.Signal, 1)
    47  	signal.Notify(c, syscall.SIGTERM)
    48  	go func() {
    49  		for range c {
    50  			close(ok)
    51  		}
    52  	}()
    53  
    54  	quitCh := make(chan struct{})
    55  	var recvQuitCh <-chan struct{} // nolint:gosimple
    56  	recvQuitCh = quitCh
    57  
    58  	clientCreatorMock := &mocks.ClientCreator{}
    59  
    60  	clientMock := &abcimocks.Client{}
    61  	clientMock.On("SetLogger", mock.Anything).Return()
    62  	clientMock.On("Start").Return(nil)
    63  	clientMock.On("Stop").Return(nil)
    64  
    65  	clientMock.On("Quit").Return(recvQuitCh)
    66  	clientMock.On("Error").Return(errors.New("EOF")).Once()
    67  
    68  	clientCreatorMock.On("NewABCIClient").Return(clientMock, nil)
    69  
    70  	appConns := NewAppConns(clientCreatorMock)
    71  
    72  	err := appConns.Start()
    73  	require.NoError(t, err)
    74  	defer appConns.Stop()
    75  
    76  	// simulate failure
    77  	close(quitCh)
    78  
    79  	select {
    80  	case <-ok:
    81  		t.Log("SIGTERM successfully received")
    82  	case <-time.After(5 * time.Second):
    83  		t.Fatal("expected process to receive SIGTERM signal")
    84  	}
    85  }