71 lines
2.0 KiB
Go
71 lines
2.0 KiB
Go
|
package stack
|
||
|
|
||
|
import (
|
||
|
"testing"
|
||
|
|
||
|
"github.com/stretchr/testify/assert"
|
||
|
"github.com/stretchr/testify/require"
|
||
|
"github.com/tendermint/basecoin"
|
||
|
"github.com/tendermint/basecoin/errors"
|
||
|
"github.com/tendermint/basecoin/txs"
|
||
|
"github.com/tendermint/basecoin/types"
|
||
|
"github.com/tendermint/go-wire/data"
|
||
|
"github.com/tendermint/tmlibs/log"
|
||
|
)
|
||
|
|
||
|
func TestPermissionSandbox(t *testing.T) {
|
||
|
require := require.New(t)
|
||
|
|
||
|
// generic args
|
||
|
ctx := NewContext(log.NewNopLogger())
|
||
|
store := types.NewMemKVStore()
|
||
|
raw := txs.NewRaw([]byte{1, 2, 3, 4}).Wrap()
|
||
|
rawBytes, err := data.ToWire(raw)
|
||
|
require.Nil(err)
|
||
|
|
||
|
// test cases to make sure permissioning is solid
|
||
|
grantee := basecoin.Actor{App: NameGrant, Address: []byte{1}}
|
||
|
grantee2 := basecoin.Actor{App: NameGrant, Address: []byte{2}}
|
||
|
signer := basecoin.Actor{App: NameSigs, Address: []byte{1}}
|
||
|
cases := []struct {
|
||
|
grant basecoin.Actor
|
||
|
require basecoin.Actor
|
||
|
expectedRes data.Bytes
|
||
|
expectedErr error
|
||
|
}{
|
||
|
{grantee, grantee, rawBytes, nil},
|
||
|
{grantee, grantee2, nil, errors.Unauthorized()},
|
||
|
{grantee, signer, nil, errors.Unauthorized()},
|
||
|
{signer, signer, nil, errors.InternalError("panic")},
|
||
|
}
|
||
|
|
||
|
for i, tc := range cases {
|
||
|
app := New(
|
||
|
Recovery{}, // we need this so panics turn to errors
|
||
|
GrantMiddleware{tc.grant},
|
||
|
CheckMiddleware{tc.require},
|
||
|
).Use(EchoHandler{})
|
||
|
|
||
|
res, err := app.CheckTx(ctx, store, raw)
|
||
|
checkPerm(t, i, tc.expectedRes, tc.expectedErr, res, err)
|
||
|
|
||
|
res, err = app.DeliverTx(ctx, store, raw)
|
||
|
checkPerm(t, i, tc.expectedRes, tc.expectedErr, res, err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func checkPerm(t *testing.T, idx int, data []byte, expected error, res basecoin.Result, err error) {
|
||
|
assert := assert.New(t)
|
||
|
|
||
|
if expected == nil {
|
||
|
assert.Nil(err, "%d: %+v", idx, err)
|
||
|
assert.EqualValues(data, res.Data)
|
||
|
} else {
|
||
|
assert.NotNil(err, "%d", idx)
|
||
|
// check error code!
|
||
|
shouldCode := errors.Wrap(expected).ErrorCode()
|
||
|
isCode := errors.Wrap(err).ErrorCode()
|
||
|
assert.Equal(shouldCode, isCode, "%d: %+v", idx, err)
|
||
|
}
|
||
|
}
|