mirror of
https://github.com/tendermint/tendermint.git
synced 2026-01-05 04:55:18 +00:00
* libs/bits: inline defer and change order of mutexes Closes #3217 * abci/client: unexpose StopForError func a) it's not called outside b) the reason for exposing it in the first place is unclear c) Stop already exist if someone from outside wants to stop the client
121 lines
2.7 KiB
Go
121 lines
2.7 KiB
Go
package abcicli_test
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
abcicli "github.com/tendermint/tendermint/abci/client"
|
|
"github.com/tendermint/tendermint/abci/server"
|
|
"github.com/tendermint/tendermint/abci/types"
|
|
tmrand "github.com/tendermint/tendermint/libs/rand"
|
|
"github.com/tendermint/tendermint/libs/service"
|
|
)
|
|
|
|
func TestProperSyncCalls(t *testing.T) {
|
|
app := slowApp{}
|
|
|
|
s, c := setupClientServer(t, app)
|
|
t.Cleanup(func() {
|
|
if err := s.Stop(); err != nil {
|
|
t.Error(err)
|
|
}
|
|
})
|
|
t.Cleanup(func() {
|
|
if err := c.Stop(); err != nil {
|
|
t.Error(err)
|
|
}
|
|
})
|
|
|
|
resp := make(chan error, 1)
|
|
go func() {
|
|
// This is BeginBlockSync unrolled....
|
|
reqres := c.BeginBlockAsync(types.RequestBeginBlock{})
|
|
err := c.FlushSync()
|
|
require.NoError(t, err)
|
|
res := reqres.Response.GetBeginBlock()
|
|
require.NotNil(t, res)
|
|
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 TestHangingSyncCalls(t *testing.T) {
|
|
app := slowApp{}
|
|
|
|
s, c := setupClientServer(t, app)
|
|
t.Cleanup(func() {
|
|
if err := s.Stop(); err != nil {
|
|
t.Log(err)
|
|
}
|
|
})
|
|
t.Cleanup(func() {
|
|
if err := c.Stop(); err != nil {
|
|
t.Log(err)
|
|
}
|
|
})
|
|
|
|
resp := make(chan error, 1)
|
|
go func() {
|
|
// Start BeginBlock and flush it
|
|
reqres := c.BeginBlockAsync(types.RequestBeginBlock{})
|
|
flush := c.FlushAsync()
|
|
// wait 20 ms for all events to travel socket, but
|
|
// no response yet from server
|
|
time.Sleep(20 * time.Millisecond)
|
|
// kill the server, so the connections break
|
|
err := s.Stop()
|
|
require.NoError(t, err)
|
|
|
|
// wait for the response from BeginBlock
|
|
reqres.Wait()
|
|
flush.Wait()
|
|
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.Error(t, err, "We should get EOF error")
|
|
}
|
|
}
|
|
|
|
func setupClientServer(t *testing.T, app types.Application) (
|
|
service.Service, abcicli.Client) {
|
|
// some port between 20k and 30k
|
|
port := 20000 + tmrand.Int32()%10000
|
|
addr := fmt.Sprintf("localhost:%d", port)
|
|
|
|
s, err := server.NewServer(addr, "socket", app)
|
|
require.NoError(t, err)
|
|
err = s.Start()
|
|
require.NoError(t, err)
|
|
|
|
c := abcicli.NewSocketClient(addr, true)
|
|
err = c.Start()
|
|
require.NoError(t, err)
|
|
|
|
return s, c
|
|
}
|
|
|
|
type slowApp struct {
|
|
types.BaseApplication
|
|
}
|
|
|
|
func (slowApp) BeginBlock(req types.RequestBeginBlock) types.ResponseBeginBlock {
|
|
time.Sleep(200 * time.Millisecond)
|
|
return types.ResponseBeginBlock{}
|
|
}
|