Fix all tests for CheckTx/DeliverTx split

This commit is contained in:
Ethan Frey 2017-07-30 12:41:41 -04:00
parent cbfd2cd611
commit eb08136104
8 changed files with 54 additions and 21 deletions

View File

@ -57,6 +57,12 @@ func (c SetOptionFunc) SetOption(l log.Logger, store state.SimpleDB, module, key
return c(l, store, module, key, value) return c(l, store, module, key, value)
} }
//---------- results and some wrappers --------
type Dataer interface {
GetData() data.Bytes
}
// CheckResult captures any non-error abci result // CheckResult captures any non-error abci result
// to make sure people use error for error cases // to make sure people use error for error cases
type CheckResult struct { type CheckResult struct {
@ -66,6 +72,8 @@ type CheckResult struct {
GasPrice uint GasPrice uint
} }
var _ Dataer = CheckResult{}
func (r CheckResult) ToABCI() abci.Result { func (r CheckResult) ToABCI() abci.Result {
return abci.Result{ return abci.Result{
Data: r.Data, Data: r.Data,
@ -73,6 +81,10 @@ func (r CheckResult) ToABCI() abci.Result {
} }
} }
func (r CheckResult) GetData() data.Bytes {
return r.Data
}
// DeliverResult captures any non-error abci result // DeliverResult captures any non-error abci result
// to make sure people use error for error cases // to make sure people use error for error cases
type DeliverResult struct { type DeliverResult struct {
@ -82,6 +94,8 @@ type DeliverResult struct {
GasUsed uint GasUsed uint
} }
var _ Dataer = DeliverResult{}
func (r DeliverResult) ToABCI() abci.Result { func (r DeliverResult) ToABCI() abci.Result {
return abci.Result{ return abci.Result{
Data: r.Data, Data: r.Data,
@ -89,6 +103,10 @@ func (r DeliverResult) ToABCI() abci.Result {
} }
} }
func (r DeliverResult) GetData() data.Bytes {
return r.Data
}
// placeholders // placeholders
// holders // holders
type NopCheck struct{} type NopCheck struct{}

View File

@ -82,10 +82,10 @@ func TestChain(t *testing.T) {
i := strconv.Itoa(idx) i := strconv.Itoa(idx)
// make sure check returns error, not a panic crash // make sure check returns error, not a panic crash
res, err := app.CheckTx(ctx, store, tc.tx) cres, err := app.CheckTx(ctx, store, tc.tx)
if tc.valid { if tc.valid {
assert.Nil(err, "%d: %+v", idx, err) assert.Nil(err, "%d: %+v", idx, err)
assert.Equal(msg, res.Log, i) assert.Equal(msg, cres.Log, i)
} else { } else {
if assert.NotNil(err, i) { if assert.NotNil(err, i) {
assert.Contains(err.Error(), tc.errorMsg, i) assert.Contains(err.Error(), tc.errorMsg, i)
@ -93,10 +93,10 @@ func TestChain(t *testing.T) {
} }
// make sure deliver returns error, not a panic crash // make sure deliver returns error, not a panic crash
res, err = app.DeliverTx(ctx, store, tc.tx) dres, err := app.DeliverTx(ctx, store, tc.tx)
if tc.valid { if tc.valid {
assert.Nil(err, "%d: %+v", idx, err) assert.Nil(err, "%d: %+v", idx, err)
assert.Equal(msg, res.Log, i) assert.Equal(msg, dres.Log, i)
} else { } else {
if assert.NotNil(err, i) { if assert.NotNil(err, i) {
assert.Contains(err.Error(), tc.errorMsg, i) assert.Contains(err.Error(), tc.errorMsg, i)

View File

@ -18,13 +18,13 @@ func TestEncoding(t *testing.T) {
require := require.New(t) require := require.New(t)
raw := stack.NewRawTx([]byte{0x34, 0xa7}) raw := stack.NewRawTx([]byte{0x34, 0xa7})
raw2 := stack.NewRawTx([]byte{0x73, 0x86, 0x22}) // raw2 := stack.NewRawTx([]byte{0x73, 0x86, 0x22})
cases := []struct { cases := []struct {
Tx basecoin.Tx Tx basecoin.Tx
}{ }{
{raw}, {raw},
{NewMultiTx(raw, raw2)}, // {NewMultiTx(raw, raw2)},
{NewChainTx("foobar", 0, raw)}, {NewChainTx("foobar", 0, raw)},
} }

View File

@ -12,6 +12,7 @@ import (
var ( var (
errInsufficientFees = fmt.Errorf("Insufficient fees") errInsufficientFees = fmt.Errorf("Insufficient fees")
errWrongFeeDenom = fmt.Errorf("Required fee denomination") errWrongFeeDenom = fmt.Errorf("Required fee denomination")
errSkipFees = fmt.Errorf("Skip fees")
invalidInput = abci.CodeType_BaseInvalidInput invalidInput = abci.CodeType_BaseInvalidInput
) )
@ -29,3 +30,10 @@ func ErrWrongFeeDenom(denom string) errors.TMError {
func IsWrongFeeDenomErr(err error) bool { func IsWrongFeeDenomErr(err error) bool {
return errors.IsSameError(errWrongFeeDenom, err) return errors.IsSameError(errWrongFeeDenom, err)
} }
func ErrSkipFees() errors.TMError {
return errors.WithCode(errSkipFees, invalidInput)
}
func IsSkipFeesErr(err error) bool {
return errors.IsSameError(errSkipFees, err)
}

View File

@ -47,6 +47,9 @@ func (SimpleFeeMiddleware) Name() string {
// CheckTx - check the transaction // CheckTx - check the transaction
func (h SimpleFeeMiddleware) CheckTx(ctx basecoin.Context, store state.SimpleDB, tx basecoin.Tx, next basecoin.Checker) (res basecoin.CheckResult, err error) { func (h SimpleFeeMiddleware) CheckTx(ctx basecoin.Context, store state.SimpleDB, tx basecoin.Tx, next basecoin.Checker) (res basecoin.CheckResult, err error) {
fee, err := h.verifyFee(ctx, tx) fee, err := h.verifyFee(ctx, tx)
if IsSkipFeesErr(err) {
return next.CheckTx(ctx, store, tx)
}
if err != nil { if err != nil {
return res, err return res, err
} }
@ -58,12 +61,16 @@ func (h SimpleFeeMiddleware) CheckTx(ctx basecoin.Context, store state.SimpleDB,
return res, err return res, err
} }
} }
return next.CheckTx(ctx, store, fee.Tx) return next.CheckTx(ctx, store, fee.Tx)
} }
// DeliverTx - send the fee handler transaction // DeliverTx - send the fee handler transaction
func (h SimpleFeeMiddleware) DeliverTx(ctx basecoin.Context, store state.SimpleDB, tx basecoin.Tx, next basecoin.Deliver) (res basecoin.DeliverResult, err error) { func (h SimpleFeeMiddleware) DeliverTx(ctx basecoin.Context, store state.SimpleDB, tx basecoin.Tx, next basecoin.Deliver) (res basecoin.DeliverResult, err error) {
fee, err := h.verifyFee(ctx, tx) fee, err := h.verifyFee(ctx, tx)
if IsSkipFeesErr(err) {
return next.DeliverTx(ctx, store, tx)
}
if err != nil { if err != nil {
return res, err return res, err
} }
@ -83,7 +90,7 @@ func (h SimpleFeeMiddleware) verifyFee(ctx basecoin.Context, tx basecoin.Tx) (Fe
if !ok { if !ok {
// the fee wrapper is not required if there is no minimum // the fee wrapper is not required if there is no minimum
if h.MinFee.IsZero() { if h.MinFee.IsZero() {
return feeTx, nil return feeTx, ErrSkipFees()
} }
return feeTx, errors.ErrInvalidFormat(TypeFees, tx) return feeTx, errors.ErrInvalidFormat(TypeFees, tx)
} }

View File

@ -25,9 +25,9 @@ func TestOK(t *testing.T) {
assert.Nil(err, "%+v", err) assert.Nil(err, "%+v", err)
assert.Equal(data, res.Log) assert.Equal(data, res.Log)
res, err = ok.DeliverTx(ctx, store, tx) dres, err := ok.DeliverTx(ctx, store, tx)
assert.Nil(err, "%+v", err) assert.Nil(err, "%+v", err)
assert.Equal(data, res.Log) assert.Equal(data, dres.Log)
} }
func TestFail(t *testing.T) { func TestFail(t *testing.T) {

View File

@ -72,20 +72,20 @@ func TestPermissionSandbox(t *testing.T) {
Apps(CheckMiddleware{Required: tc.require}). Apps(CheckMiddleware{Required: tc.require}).
Use(EchoHandler{}) Use(EchoHandler{})
res, err := app.CheckTx(ctx, store, raw) cres, err := app.CheckTx(ctx, store, raw)
checkPerm(t, i, tc.expectedRes, tc.expected, res, err) checkPerm(t, i, tc.expectedRes, tc.expected, cres, err)
res, err = app.DeliverTx(ctx, store, raw) dres, err := app.DeliverTx(ctx, store, raw)
checkPerm(t, i, tc.expectedRes, tc.expected, res, err) checkPerm(t, i, tc.expectedRes, tc.expected, dres, err)
} }
} }
func checkPerm(t *testing.T, idx int, data []byte, check func(error) bool, res basecoin.Result, err error) { func checkPerm(t *testing.T, idx int, data []byte, check func(error) bool, res basecoin.Dataer, err error) {
assert := assert.New(t) assert := assert.New(t)
if len(data) > 0 { if len(data) > 0 {
assert.Nil(err, "%d: %+v", idx, err) assert.Nil(err, "%d: %+v", idx, err)
assert.EqualValues(data, res.Data) assert.EqualValues(data, res.GetData())
} else { } else {
assert.NotNil(err, "%d", idx) assert.NotNil(err, "%d", idx)
// check error code! // check error code!

View File

@ -24,13 +24,13 @@ var _ Middleware = writerMid{}
func (w writerMid) Name() string { return w.name } func (w writerMid) Name() string { return w.name }
func (w writerMid) CheckTx(ctx basecoin.Context, store state.SimpleDB, func (w writerMid) CheckTx(ctx basecoin.Context, store state.SimpleDB,
tx basecoin.Tx, next basecoin.Checker) (basecoin.Result, error) { tx basecoin.Tx, next basecoin.Checker) (basecoin.CheckResult, error) {
store.Set(w.key, w.value) store.Set(w.key, w.value)
return next.CheckTx(ctx, store, tx) return next.CheckTx(ctx, store, tx)
} }
func (w writerMid) DeliverTx(ctx basecoin.Context, store state.SimpleDB, func (w writerMid) DeliverTx(ctx basecoin.Context, store state.SimpleDB,
tx basecoin.Tx, next basecoin.Deliver) (basecoin.Result, error) { tx basecoin.Tx, next basecoin.Deliver) (basecoin.DeliverResult, error) {
store.Set(w.key, w.value) store.Set(w.key, w.value)
return next.DeliverTx(ctx, store, tx) return next.DeliverTx(ctx, store, tx)
} }
@ -52,15 +52,15 @@ var _ basecoin.Handler = writerHand{}
func (w writerHand) Name() string { return w.name } func (w writerHand) Name() string { return w.name }
func (w writerHand) CheckTx(ctx basecoin.Context, store state.SimpleDB, func (w writerHand) CheckTx(ctx basecoin.Context, store state.SimpleDB,
tx basecoin.Tx) (basecoin.Result, error) { tx basecoin.Tx) (basecoin.CheckResult, error) {
store.Set(w.key, w.value) store.Set(w.key, w.value)
return basecoin.Result{}, nil return basecoin.CheckResult{}, nil
} }
func (w writerHand) DeliverTx(ctx basecoin.Context, store state.SimpleDB, func (w writerHand) DeliverTx(ctx basecoin.Context, store state.SimpleDB,
tx basecoin.Tx) (basecoin.Result, error) { tx basecoin.Tx) (basecoin.DeliverResult, error) {
store.Set(w.key, w.value) store.Set(w.key, w.value)
return basecoin.Result{}, nil return basecoin.DeliverResult{}, nil
} }
func (w writerHand) SetOption(l log.Logger, store state.SimpleDB, module, func (w writerHand) SetOption(l log.Logger, store state.SimpleDB, module,