package abciclient_test import ( "context" "fmt" "testing" "time" "math/rand" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" abciclient "github.com/tendermint/tendermint/abci/client" "github.com/tendermint/tendermint/abci/server" "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/log" "github.com/tendermint/tendermint/libs/service" ) func TestProperSyncCalls(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() app := slowApp{} logger := log.NewNopLogger() _, c := setupClientServer(ctx, t, logger, app) resp := make(chan error, 1) go func() { rsp, err := c.FinalizeBlock(ctx, types.RequestFinalizeBlock{}) assert.NoError(t, err) assert.NoError(t, c.Flush(ctx)) assert.NotNil(t, rsp) select { case <-ctx.Done(): case resp <- c.Error(): } }() select { case <-time.After(time.Second): require.Fail(t, "No response arrived") case err, ok := <-resp: require.True(t, ok, "Must not close channel") assert.NoError(t, err, "This should return success") } } func setupClientServer( ctx context.Context, t *testing.T, logger log.Logger, app types.Application, ) (service.Service, abciclient.Client) { t.Helper() // some port between 20k and 30k port := 20000 + rand.Int31()%10000 addr := fmt.Sprintf("localhost:%d", port) s, err := server.NewServer(logger, addr, "socket", app) require.NoError(t, err) require.NoError(t, s.Start(ctx)) t.Cleanup(s.Wait) c := abciclient.NewSocketClient(logger, addr, true) require.NoError(t, c.Start(ctx)) t.Cleanup(c.Wait) require.True(t, s.IsRunning()) require.True(t, c.IsRunning()) return s, c } type slowApp struct { types.BaseApplication } func (slowApp) FinalizeBlock(req types.RequestFinalizeBlock) types.ResponseFinalizeBlock { time.Sleep(200 * time.Millisecond) return types.ResponseFinalizeBlock{} }