From 97a7f79ed879e9b2b5dbc440868cfa54273f3b7c Mon Sep 17 00:00:00 2001 From: rhuairahrighairigh Date: Fri, 13 Jul 2018 16:22:58 +0100 Subject: [PATCH] add initial keeper tests --- internal/x/paychan/keeper_test.go | 249 +++++++++++++++++++++--------- 1 file changed, 179 insertions(+), 70 deletions(-) diff --git a/internal/x/paychan/keeper_test.go b/internal/x/paychan/keeper_test.go index a4fd2525..b965f9de 100644 --- a/internal/x/paychan/keeper_test.go +++ b/internal/x/paychan/keeper_test.go @@ -3,90 +3,199 @@ package paychan import ( "testing" //"github.com/stretchr/testify/assert" + + abci "github.com/tendermint/abci/types" + dbm "github.com/tendermint/tmlibs/db" + "github.com/tendermint/tmlibs/log" + + "github.com/cosmos/cosmos-sdk/store" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/bank" ) -// example from x/bank +// GetPaychan +// - gets a paychan if it exists, and not if it doesn't +// setPaychan +// - sets a paychan +// CreatePaychan +// - creates a paychan under normal conditions +// ClosePaychan +// - closes a paychan under normal conditions +// GetPaychans +// paychanKey + +func setupMultiStore() (sdk.MultiStore, *sdk.KVStoreKey, *sdk.KVStoreKey) { + // create db + db := dbm.NewMemDB() + // create keys + authKey := sdk.NewKVStoreKey("authkey") + paychanKey := sdk.NewKVStoreKey("paychankey") + // create new multistore around db + ms := store.NewCommitMultiStore(db) // DB handle plus store key maps + // register separate stores in the multistore + ms.MountStoreWithDB(authKey, sdk.StoreTypeIAVL, db) // sets store key map + ms.MountStoreWithDB(paychanKey, sdk.StoreTypeIAVL, db) + ms.LoadLatestVersion() + + return ms, authKey, paychanKey +} + +func setupCodec() *wire.Codec { + cdc := wire.NewCodec() + auth.RegisterBaseAccount(cdc) + // TODO might need to register paychan struct + return cdc +} + func TestKeeper(t *testing.T) { - // ms, authKey := setupMultiStore() + // Setup + // create multistore and key + ms, authKey, paychanKey := setupMultiStore() - // cdc := wire.NewCodec() - // auth.RegisterBaseAccount(cdc) + // create and initialise codec(s) + cdc := setupCodec() - // ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) - // accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) - // coinKeeper := NewKeeper(accountMapper) + // create context + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) - // addr := sdk.Address([]byte("addr1")) - // addr2 := sdk.Address([]byte("addr2")) - // addr3 := sdk.Address([]byte("addr3")) - // acc := accountMapper.NewAccountWithAddress(ctx, addr) + // create accountMapper + accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) - // // Test GetCoins/SetCoins - // accountMapper.SetAccount(ctx, acc) - // assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{})) + // create coinkeeper + coinKeeper := bank.NewKeeper(accountMapper) - // coinKeeper.SetCoins(ctx, addr, sdk.Coins{{"foocoin", 10}}) - // assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 10}})) + // create keeper + paychanKeeper := NewKeeper(cdc, paychanKey, coinKeeper) - // // Test HasCoins - // assert.True(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 10}})) - // assert.True(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 5}})) - // assert.False(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 15}})) - // assert.False(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"barcoin", 5}})) + // Test no paychans exist + _, exists := paychanKeeper.GetPaychan(ctx, sdk.Address{}, sdk.Address{}, 0) + if exists { + t.Error("payment channel found when none exist") + } - // // Test AddCoins - // coinKeeper.AddCoins(ctx, addr, sdk.Coins{{"foocoin", 15}}) - // assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 25}})) + // Test paychan can be set and get + p := Paychan{ + sender: sdk.Address([]byte("senderAddress")), + receiver: sdk.Address([]byte("receiverAddress")), + id: 0, + balance: sdk.Coins{{"KVA", 100}}, + } + paychanKeeper.setPaychan(ctx, p) - // coinKeeper.AddCoins(ctx, addr, sdk.Coins{{"barcoin", 15}}) - // assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 15}, {"foocoin", 25}})) + _, exists = paychanKeeper.GetPaychan(ctx, p.sender, p.receiver, p.id) + if !exists { + t.Error("payment channel not found") + } - // // Test SubtractCoins - // coinKeeper.SubtractCoins(ctx, addr, sdk.Coins{{"foocoin", 10}}) - // coinKeeper.SubtractCoins(ctx, addr, sdk.Coins{{"barcoin", 5}}) - // assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 15}})) + // Test create paychan under normal conditions + senderAddress := sdk.Address([]byte("senderAddress")) + senderFunds := sdk.Coins{{"KVA", 100}} + receiverAddress := sdk.Address([]byte("receiverAddress")) + balance := sdk.Coins{{"KVA", 10}} - // coinKeeper.SubtractCoins(ctx, addr, sdk.Coins{{"barcoin", 11}}) - // assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 15}})) + coinKeeper.SetCoins(ctx, senderAddress, senderFunds) - // coinKeeper.SubtractCoins(ctx, addr, sdk.Coins{{"barcoin", 10}}) - // assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 15}})) - // assert.False(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"barcoin", 1}})) + _, err := paychanKeeper.CreatePaychan(ctx, senderAddress, receiverAddress, balance) + if err != nil { + t.Error("unexpected error created payment channel", err) + } - // // Test SendCoins - // coinKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{{"foocoin", 5}}) - // assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 10}})) - // assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"foocoin", 5}})) - - // _, err2 := coinKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{{"foocoin", 50}}) - // assert.Implements(t, (*sdk.Error)(nil), err2) - // assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 10}})) - // assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"foocoin", 5}})) - - // coinKeeper.AddCoins(ctx, addr, sdk.Coins{{"barcoin", 30}}) - // coinKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{{"barcoin", 10}, {"foocoin", 5}}) - // assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 20}, {"foocoin", 5}})) - // assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 10}})) - - // // Test InputOutputCoins - // input1 := NewInput(addr2, sdk.Coins{{"foocoin", 2}}) - // output1 := NewOutput(addr, sdk.Coins{{"foocoin", 2}}) - // coinKeeper.InputOutputCoins(ctx, []Input{input1}, []Output{output1}) - // assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 20}, {"foocoin", 7}})) - // assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 8}})) - - // inputs := []Input{ - // NewInput(addr, sdk.Coins{{"foocoin", 3}}), - // NewInput(addr2, sdk.Coins{{"barcoin", 3}, {"foocoin", 2}}), - // } - - // outputs := []Output{ - // NewOutput(addr, sdk.Coins{{"barcoin", 1}}), - // NewOutput(addr3, sdk.Coins{{"barcoin", 2}, {"foocoin", 5}}), - // } - // coinKeeper.InputOutputCoins(ctx, inputs, outputs) - // assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 21}, {"foocoin", 4}})) - // assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"barcoin", 7}, {"foocoin", 6}})) - // assert.True(t, coinKeeper.GetCoins(ctx, addr3).IsEqual(sdk.Coins{{"barcoin", 2}, {"foocoin", 5}})) + p, _ = paychanKeeper.GetPaychan(ctx, senderAddress, receiverAddress, 0) + if !p.balance.IsEqual(balance) { + t.Error("payment channel balance incorrect", p.balance, balance) + } + expectedNewSenderFunds := senderFunds.Minus(balance) + if !coinKeeper.GetCoins(ctx, senderAddress).IsEqual(expectedNewSenderFunds) { + t.Error("sender has incorrect balance after paychan creation") + } } + +// example from x/bank + +//func TestKeeper(t *testing.T) { +// ms, authKey := setupMultiStore() + +// cdc := wire.NewCodec() +// auth.RegisterBaseAccount(cdc) + +// ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) +// accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) +// coinKeeper := NewKeeper(accountMapper) + +// addr := sdk.Address([]byte("addr1")) +// addr2 := sdk.Address([]byte("addr2")) +// addr3 := sdk.Address([]byte("addr3")) +// acc := accountMapper.NewAccountWithAddress(ctx, addr) + +// // Test GetCoins/SetCoins +// accountMapper.SetAccount(ctx, acc) +// assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{})) + +// coinKeeper.SetCoins(ctx, addr, sdk.Coins{{"foocoin", 10}}) +// assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 10}})) + +// // Test HasCoins +// assert.True(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 10}})) +// assert.True(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 5}})) +// assert.False(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 15}})) +// assert.False(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"barcoin", 5}})) + +// // Test AddCoins +// coinKeeper.AddCoins(ctx, addr, sdk.Coins{{"foocoin", 15}}) +// assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 25}})) + +// coinKeeper.AddCoins(ctx, addr, sdk.Coins{{"barcoin", 15}}) +// assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 15}, {"foocoin", 25}})) + +// // Test SubtractCoins +// coinKeeper.SubtractCoins(ctx, addr, sdk.Coins{{"foocoin", 10}}) +// coinKeeper.SubtractCoins(ctx, addr, sdk.Coins{{"barcoin", 5}}) +// assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 15}})) + +// coinKeeper.SubtractCoins(ctx, addr, sdk.Coins{{"barcoin", 11}}) +// assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 15}})) + +// coinKeeper.SubtractCoins(ctx, addr, sdk.Coins{{"barcoin", 10}}) +// assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 15}})) +// assert.False(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"barcoin", 1}})) + +// // Test SendCoins +// coinKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{{"foocoin", 5}}) +// assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 10}})) +// assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"foocoin", 5}})) + +// _, err2 := coinKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{{"foocoin", 50}}) +// assert.Implements(t, (*sdk.Error)(nil), err2) +// assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 10}})) +// assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"foocoin", 5}})) + +// coinKeeper.AddCoins(ctx, addr, sdk.Coins{{"barcoin", 30}}) +// coinKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{{"barcoin", 10}, {"foocoin", 5}}) +// assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 20}, {"foocoin", 5}})) +// assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 10}})) + +// // Test InputOutputCoins +// input1 := NewInput(addr2, sdk.Coins{{"foocoin", 2}}) +// output1 := NewOutput(addr, sdk.Coins{{"foocoin", 2}}) +// coinKeeper.InputOutputCoins(ctx, []Input{input1}, []Output{output1}) +// assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 20}, {"foocoin", 7}})) +// assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 8}})) + +// inputs := []Input{ +// NewInput(addr, sdk.Coins{{"foocoin", 3}}), +// NewInput(addr2, sdk.Coins{{"barcoin", 3}, {"foocoin", 2}}), +// } + +// outputs := []Output{ +// NewOutput(addr, sdk.Coins{{"barcoin", 1}}), +// NewOutput(addr3, sdk.Coins{{"barcoin", 2}, {"foocoin", 5}}), +// } +// coinKeeper.InputOutputCoins(ctx, inputs, outputs) +// assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 21}, {"foocoin", 4}})) +// assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"barcoin", 7}, {"foocoin", 6}})) +// assert.True(t, coinKeeper.GetCoins(ctx, addr3).IsEqual(sdk.Coins{{"barcoin", 2}, {"foocoin", 5}})) + +//}