Add tests for checkpointer
This commit is contained in:
parent
51a29e4bb7
commit
6b96fa4554
|
@ -0,0 +1,97 @@
|
||||||
|
package stack
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
"github.com/tendermint/tmlibs/log"
|
||||||
|
|
||||||
|
"github.com/tendermint/basecoin"
|
||||||
|
"github.com/tendermint/basecoin/state"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestCheckpointer(t *testing.T) {
|
||||||
|
assert, require := assert.New(t), require.New(t)
|
||||||
|
|
||||||
|
good := writerHand{"foo", []byte{1, 2}, []byte("bar")}
|
||||||
|
bad := FailHandler{Err: errors.New("no go")}
|
||||||
|
|
||||||
|
app := New(
|
||||||
|
Checkpoint{OnCheck: true},
|
||||||
|
writerMid{"bing", []byte{1, 2}, []byte("bang")},
|
||||||
|
Checkpoint{OnDeliver: true},
|
||||||
|
).Use(
|
||||||
|
NewDispatcher(
|
||||||
|
WrapHandler(good),
|
||||||
|
WrapHandler(bad),
|
||||||
|
))
|
||||||
|
|
||||||
|
basecoin.TxMapper.RegisterImplementation(RawTx{}, good.Name(), byte(80))
|
||||||
|
|
||||||
|
mid := state.Model{
|
||||||
|
Key: []byte{'b', 'i', 'n', 'g', 0, 1, 2},
|
||||||
|
Value: []byte("bang"),
|
||||||
|
}
|
||||||
|
end := state.Model{
|
||||||
|
Key: []byte{'f', 'o', 'o', 0, 1, 2},
|
||||||
|
Value: []byte("bar"),
|
||||||
|
}
|
||||||
|
|
||||||
|
cases := []struct {
|
||||||
|
// tx to send down the line
|
||||||
|
tx basecoin.Tx
|
||||||
|
// expect no error?
|
||||||
|
valid bool
|
||||||
|
// models to check afterwards
|
||||||
|
toGetCheck []state.Model
|
||||||
|
// models to check afterwards
|
||||||
|
toGetDeliver []state.Model
|
||||||
|
}{
|
||||||
|
// everything writen on success
|
||||||
|
{
|
||||||
|
tx: NewRawTx([]byte{45, 67}),
|
||||||
|
valid: true,
|
||||||
|
toGetCheck: []state.Model{mid, end},
|
||||||
|
toGetDeliver: []state.Model{mid, end},
|
||||||
|
},
|
||||||
|
// mostly reverted on failure
|
||||||
|
{
|
||||||
|
tx: NewFailTx(),
|
||||||
|
valid: false,
|
||||||
|
toGetCheck: []state.Model{},
|
||||||
|
toGetDeliver: []state.Model{mid},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, tc := range cases {
|
||||||
|
ctx := NewContext("foo", 100, log.NewNopLogger())
|
||||||
|
|
||||||
|
store := state.NewMemKVStore()
|
||||||
|
_, err := app.CheckTx(ctx, store, tc.tx)
|
||||||
|
if tc.valid {
|
||||||
|
require.Nil(err, "%+v", err)
|
||||||
|
} else {
|
||||||
|
require.NotNil(err)
|
||||||
|
}
|
||||||
|
for _, m := range tc.toGetCheck {
|
||||||
|
val := store.Get(m.Key)
|
||||||
|
assert.EqualValues(m.Value, val, "%d: %#v", i, m)
|
||||||
|
}
|
||||||
|
|
||||||
|
store = state.NewMemKVStore()
|
||||||
|
_, err = app.DeliverTx(ctx, store, tc.tx)
|
||||||
|
if tc.valid {
|
||||||
|
require.Nil(err, "%+v", err)
|
||||||
|
} else {
|
||||||
|
require.NotNil(err)
|
||||||
|
}
|
||||||
|
for _, m := range tc.toGetDeliver {
|
||||||
|
val := store.Get(m.Key)
|
||||||
|
assert.EqualValues(m.Value, val, "%d: %#v", i, m)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,9 +20,11 @@ const (
|
||||||
const (
|
const (
|
||||||
ByteRawTx = 0xF0
|
ByteRawTx = 0xF0
|
||||||
ByteCheckTx = 0xF1
|
ByteCheckTx = 0xF1
|
||||||
|
ByteFailTx = 0xF2
|
||||||
|
|
||||||
TypeRawTx = NameOK + "/raw" // this will just say a-ok to RawTx
|
TypeRawTx = NameOK + "/raw" // this will just say a-ok to RawTx
|
||||||
TypeCheckTx = NameCheck + "/tx"
|
TypeCheckTx = NameCheck + "/tx"
|
||||||
|
TypeFailTx = NameFail + "/tx"
|
||||||
|
|
||||||
rawMaxSize = 2000 * 1000
|
rawMaxSize = 2000 * 1000
|
||||||
)
|
)
|
||||||
|
@ -30,7 +32,8 @@ const (
|
||||||
func init() {
|
func init() {
|
||||||
basecoin.TxMapper.
|
basecoin.TxMapper.
|
||||||
RegisterImplementation(RawTx{}, TypeRawTx, ByteRawTx).
|
RegisterImplementation(RawTx{}, TypeRawTx, ByteRawTx).
|
||||||
RegisterImplementation(CheckTx{}, TypeCheckTx, ByteCheckTx)
|
RegisterImplementation(CheckTx{}, TypeCheckTx, ByteCheckTx).
|
||||||
|
RegisterImplementation(FailTx{}, TypeFailTx, ByteFailTx)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RawTx just contains bytes that can be hex-ified
|
// RawTx just contains bytes that can be hex-ified
|
||||||
|
@ -72,6 +75,22 @@ func (CheckTx) ValidateBasic() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FailTx just gets routed to filaure
|
||||||
|
type FailTx struct{}
|
||||||
|
|
||||||
|
var _ basecoin.TxInner = FailTx{}
|
||||||
|
|
||||||
|
func NewFailTx() basecoin.Tx {
|
||||||
|
return FailTx{}.Wrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f FailTx) Wrap() basecoin.Tx {
|
||||||
|
return basecoin.Tx{f}
|
||||||
|
}
|
||||||
|
func (r FailTx) ValidateBasic() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// OKHandler just used to return okay to everything
|
// OKHandler just used to return okay to everything
|
||||||
type OKHandler struct {
|
type OKHandler struct {
|
||||||
Log string
|
Log string
|
||||||
|
|
|
@ -83,7 +83,7 @@ func (p prefixStore) Commit(sub state.SimpleDB) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// commit the wrapped data, don't worry about the prefix here
|
// commit the wrapped data, don't worry about the prefix here
|
||||||
p.store.Commit(ps)
|
p.store.Commit(ps.store)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue