Skip to content

Commit

Permalink
add test
Browse files Browse the repository at this point in the history
  • Loading branch information
mossid committed Jun 17, 2019
1 parent 7b9f471 commit fa4d98e
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 46 deletions.
6 changes: 2 additions & 4 deletions x/ibc/02-client/tendermint/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package tendermint
import (
"bytes"
"errors"
"fmt"

lerr "github.com/tendermint/tendermint/lite/errors"
"github.com/tendermint/tendermint/types"
Expand Down Expand Up @@ -55,13 +54,11 @@ func (cs ConsensusState) Validate(cheader client.Header) (client.ConsensusState,
if cs.Height == uint64(header.Height-1) {
nexthash = cs.NextValidatorSet.Hash()
if !bytes.Equal(header.ValidatorsHash, nexthash) {
fmt.Println(111)
return nil, lerr.ErrUnexpectedValidators(header.ValidatorsHash, nexthash)
}
}

if !bytes.Equal(header.NextValidatorsHash, header.NextValidatorSet.Hash()) {
fmt.Println(header)
return nil, lerr.ErrUnexpectedValidators(header.NextValidatorsHash, header.NextValidatorSet.Hash())
}

Expand All @@ -70,7 +67,7 @@ func (cs ConsensusState) Validate(cheader client.Header) (client.ConsensusState,
return nil, err
}

err = cs.NextValidatorSet.VerifyCommit(cs.ChainID, header.Commit.BlockID, header.Height, header.Commit)
err = cs.NextValidatorSet.VerifyFutureCommit(header.ValidatorSet, cs.ChainID, header.Commit.BlockID, header.Height, header.Commit)
if err != nil {
return nil, err
}
Expand All @@ -87,6 +84,7 @@ var _ client.Header = Header{}
type Header struct {
// XXX: don't take the entire struct
types.SignedHeader
ValidatorSet *types.ValidatorSet
NextValidatorSet *types.ValidatorSet
}

Expand Down
108 changes: 97 additions & 11 deletions x/ibc/02-client/tendermint/types_test.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package tendermint

import (
"math/rand"
"testing"

"github.com/stretchr/testify/require"

abci "github.com/tendermint/tendermint/abci/types"
cmn "github.com/tendermint/tendermint/libs/common"
dbm "github.com/tendermint/tendermint/libs/db"
"github.com/tendermint/tendermint/libs/log"
tmtypes "github.com/tendermint/tendermint/types"
Expand All @@ -14,6 +16,9 @@ import (
"github.com/cosmos/cosmos-sdk/store"
stypes "github.com/cosmos/cosmos-sdk/store/types"
sdk "github.com/cosmos/cosmos-sdk/types"

"github.com/cosmos/cosmos-sdk/x/ibc/23-commitment"
"github.com/cosmos/cosmos-sdk/x/ibc/23-commitment/merkle"
)

const chainid = "testchain"
Expand All @@ -33,7 +38,8 @@ func defaultComponents() (sdk.StoreKey, sdk.Context, stypes.CommitMultiStore, *c
}

type node struct {
valset MockValidators
prevvalset MockValidators
valset MockValidators

cms sdk.CommitMultiStore
store sdk.KVStore
Expand All @@ -60,7 +66,7 @@ func (node *node) last() tmtypes.SignedHeader {

func (node *node) Commit() tmtypes.SignedHeader {
valsethash := node.valset.ValidatorSet().Hash()
nextvalset := node.valset.Mutate(false)
nextvalset := node.valset.Mutate()
nextvalsethash := nextvalset.ValidatorSet().Hash()
commitid := node.cms.Commit()

Expand All @@ -78,15 +84,13 @@ func (node *node) Commit() tmtypes.SignedHeader {

commit := node.valset.Sign(header)

node.prevvalset = node.valset
node.valset = nextvalset
node.commits = append(node.commits, commit)

return commit
}

func (node *node) Set(key, value string) {
node.store.Set(append([]byte{0x00}, []byte(key)...), []byte(value))
}

type Verifier struct {
ConsensusState
}
Expand All @@ -102,10 +106,11 @@ func NewVerifier(header tmtypes.SignedHeader, nextvalset MockValidators) *Verifi
}
}

func (v *Verifier) Validate(header tmtypes.SignedHeader, nextvalset MockValidators) error {
func (v *Verifier) Validate(header tmtypes.SignedHeader, valset, nextvalset MockValidators) error {
newcs, err := v.ConsensusState.Validate(
Header{
SignedHeader: header,
ValidatorSet: valset.ValidatorSet(),
NextValidatorSet: nextvalset.ValidatorSet(),
},
)
Expand All @@ -117,15 +122,96 @@ func (v *Verifier) Validate(header tmtypes.SignedHeader, nextvalset MockValidato
return nil
}

func TestUpdate(t *testing.T) {
func testUpdate(t *testing.T, interval int, ok bool) {
node := NewNode(NewMockValidators(100, 10))

node.Commit()

verifier := NewVerifier(node.last(), node.valset)

header := node.Commit()
for i := 0; i < 100; i++ {
header := node.Commit()

if i%interval == 0 {
err := verifier.Validate(header, node.prevvalset, node.valset)
if ok {
require.NoError(t, err)
} else {
require.Error(t, err)
}
}
}
}

func TestEveryBlockUpdate(t *testing.T) {
testUpdate(t, 1, true)
}

func TestEvenBlockUpdate(t *testing.T) {
testUpdate(t, 2, true)
}

func TestSixthBlockUpdate(t *testing.T) {
testUpdate(t, 6, true)
}

/*
// This should fail, since the amount of mutation is so large
// Commented out because it sometimes success
func TestTenthBlockUpdate(t *testing.T) {
testUpdate(t, 10, false)
}
*/

func key(str []byte) []byte {
return append([]byte{0x00}, str...)
}

func (node *node) query(t *testing.T, k []byte) ([]byte, commitment.Proof) {
qres := node.cms.(stypes.Queryable).Query(abci.RequestQuery{Path: "/ibc/key", Data: key(k), Prove: true})
require.Equal(t, uint32(0), qres.Code, qres.Log)
proof := merkle.Proof{
Key: []byte(k),
Proof: qres.Proof,
}
return qres.Value, proof
}

func (node *node) Set(k, value []byte) {
node.store.Set(key(k), value)
}

func testProof(t *testing.T) {
node := NewNode(NewMockValidators(100, 10))

node.Commit()

kvps := cmn.KVPairs{}
for h := 0; h < 20; h++ {
for i := 0; i < 100; i++ {
k := make([]byte, 32)
v := make([]byte, 32)
rand.Read(k)
rand.Read(v)
kvps = append(kvps, cmn.KVPair{Key: k, Value: v})
node.Set(k, v)
}
header := node.Commit()
proofs := []commitment.Proof{}
for _, kvp := range kvps {
v, p := node.query(t, []byte(kvp.Key))
require.Equal(t, kvp.Value, v)
proofs = append(proofs, p)
}
cstore, err := commitment.NewStore([]byte(header.AppHash), proofs)
require.NoError(t, err)

for _, kvp := range kvps {
require.True(t, cstore.Prove(kvp.Key, kvp.Value))
}
}
}

err := verifier.Validate(header, node.valset)
require.NoError(t, err)
func TestProofs(t *testing.T) {
testProof(t)
}
46 changes: 15 additions & 31 deletions x/ibc/02-client/tendermint/valset_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package tendermint

import (
"bytes"
"fmt"
"sort"

"github.com/tendermint/tendermint/crypto"
Expand Down Expand Up @@ -91,13 +90,8 @@ func NewMockValidators(num int, power int64) MockValidators {
res[i] = NewMockValidator(sdk.NewDec(power))
}

// ddd
fmt.Println(333)
for _, val := range res {
fmt.Println(val)
}
sort.Sort(res)

// ddd
return res
}

Expand All @@ -124,18 +118,20 @@ func (vals MockValidators) TotalPower() sdk.Dec {
}

func (vals MockValidators) Sign(header tmtypes.Header) tmtypes.SignedHeader {

precommits := make([]*tmtypes.CommitSig, len(vals))
for i, val := range vals {
precommits[i] = (&tmtypes.Vote{
vote := &tmtypes.Vote{
BlockID: tmtypes.BlockID{
Hash: header.Hash(),
},
ValidatorAddress: val.MockPV.GetAddress(),
ValidatorIndex: i,
Height: header.Height,
Type: tmtypes.PrecommitType,
}).CommitSig()
val.MockPV.SignVote("", (*tmtypes.Vote)(precommits[i]))
}
val.MockPV.SignVote(chainid, vote)
precommits[i] = vote.CommitSig()
}

return tmtypes.SignedHeader{
Expand All @@ -150,13 +146,8 @@ func (vals MockValidators) Sign(header tmtypes.Header) tmtypes.SignedHeader {
}

// Mutate valset
func (vals MockValidators) Mutate(majority bool) MockValidators {
var num int
if majority {
num = len(vals) * 2 / 3
} else {
num = len(vals) * 1 / 6
}
func (vals MockValidators) Mutate() MockValidators {
num := len(vals) / 20 // 5% change each block

res := make(MockValidators, len(vals))

Expand All @@ -168,15 +159,15 @@ func (vals MockValidators) Mutate(majority bool) MockValidators {
res[i] = NewMockValidator(vals[0].Power)
}

// ddd
fmt.Println(333)
for _, val := range res {
fmt.Println(val)
}
sort.Sort(res)

// ddd
for i, val := range vals {
if val != res[i] {
return res
}
}

return res
panic("not mutated")
}

func (vals MockValidators) ValidatorSet() *tmtypes.ValidatorSet {
Expand All @@ -186,12 +177,5 @@ func (vals MockValidators) ValidatorSet() *tmtypes.ValidatorSet {
tmvals[i] = val.Validator()
}

// ddd
fmt.Println(333444)
for _, val := range tmvals {
fmt.Println(val)
}

// ddd
return tmtypes.NewValidatorSet(tmvals)
}

0 comments on commit fa4d98e

Please sign in to comment.