- package proxy
-
- import (
- "fmt"
- "os"
- "testing"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-
- "github.com/tendermint/abci/example/kvstore"
-
- "github.com/tendermint/tendermint/lite"
- certclient "github.com/tendermint/tendermint/lite/client"
- nm "github.com/tendermint/tendermint/node"
- "github.com/tendermint/tendermint/rpc/client"
- rpctest "github.com/tendermint/tendermint/rpc/test"
- "github.com/tendermint/tendermint/types"
- )
-
- var node *nm.Node
-
- // TODO fix tests!!
-
- func TestMain(m *testing.M) {
- app := kvstore.NewKVStoreApplication()
-
- node = rpctest.StartTendermint(app)
-
- code := m.Run()
-
- node.Stop()
- node.Wait()
- os.Exit(code)
- }
-
- func kvstoreTx(k, v []byte) []byte {
- return []byte(fmt.Sprintf("%s=%s", k, v))
- }
-
- func _TestAppProofs(t *testing.T) {
- assert, require := assert.New(t), require.New(t)
-
- cl := client.NewLocal(node)
- client.WaitForHeight(cl, 1, nil)
-
- k := []byte("my-key")
- v := []byte("my-value")
-
- tx := kvstoreTx(k, v)
- br, err := cl.BroadcastTxCommit(tx)
- require.NoError(err, "%+v", err)
- require.EqualValues(0, br.CheckTx.Code, "%#v", br.CheckTx)
- require.EqualValues(0, br.DeliverTx.Code)
- brh := br.Height
-
- // This sets up our trust on the node based on some past point.
- source := certclient.NewProvider(cl)
- seed, err := source.GetByHeight(brh - 2)
- require.NoError(err, "%+v", err)
- cert := lite.NewStaticCertifier("my-chain", seed.Validators)
-
- client.WaitForHeight(cl, 3, nil)
- latest, err := source.LatestCommit()
- require.NoError(err, "%+v", err)
- rootHash := latest.Header.AppHash
-
- // verify a query before the tx block has no data (and valid non-exist proof)
- bs, height, proof, err := GetWithProof(k, brh-1, cl, cert)
- fmt.Println(bs, height, proof, err)
- require.NotNil(err)
- require.True(IsNoDataErr(err), err.Error())
- require.Nil(bs)
-
- // but given that block it is good
- bs, height, proof, err = GetWithProof(k, brh, cl, cert)
- require.NoError(err, "%+v", err)
- require.NotNil(proof)
- require.True(height >= int64(latest.Header.Height))
-
- // Alexis there is a bug here, somehow the above code gives us rootHash = nil
- // and proof.Verify doesn't care, while proofNotExists.Verify fails.
- // I am hacking this in to make it pass, but please investigate further.
- rootHash = proof.Root()
-
- //err = wire.ReadBinaryBytes(bs, &data)
- //require.NoError(err, "%+v", err)
- assert.EqualValues(v, bs)
- err = proof.Verify(k, bs, rootHash)
- assert.NoError(err, "%+v", err)
-
- // Test non-existing key.
- missing := []byte("my-missing-key")
- bs, _, proof, err = GetWithProof(missing, 0, cl, cert)
- require.True(IsNoDataErr(err))
- require.Nil(bs)
- require.NotNil(proof)
- err = proof.Verify(missing, nil, rootHash)
- assert.NoError(err, "%+v", err)
- err = proof.Verify(k, nil, rootHash)
- assert.Error(err)
- }
-
- func _TestTxProofs(t *testing.T) {
- assert, require := assert.New(t), require.New(t)
-
- cl := client.NewLocal(node)
- client.WaitForHeight(cl, 1, nil)
-
- tx := kvstoreTx([]byte("key-a"), []byte("value-a"))
- br, err := cl.BroadcastTxCommit(tx)
- require.NoError(err, "%+v", err)
- require.EqualValues(0, br.CheckTx.Code, "%#v", br.CheckTx)
- require.EqualValues(0, br.DeliverTx.Code)
- brh := br.Height
-
- source := certclient.NewProvider(cl)
- seed, err := source.GetByHeight(brh - 2)
- require.NoError(err, "%+v", err)
- cert := lite.NewStaticCertifier("my-chain", seed.Validators)
-
- // First let's make sure a bogus transaction hash returns a valid non-existence proof.
- key := types.Tx([]byte("bogus")).Hash()
- res, err := cl.Tx(key, true)
- require.NotNil(err)
- require.Contains(err.Error(), "not found")
-
- // Now let's check with the real tx hash.
- key = types.Tx(tx).Hash()
- res, err = cl.Tx(key, true)
- require.NoError(err, "%+v", err)
- require.NotNil(res)
- err = res.Proof.Validate(key)
- assert.NoError(err, "%+v", err)
-
- commit, err := GetCertifiedCommit(br.Height, cl, cert)
- require.Nil(err, "%+v", err)
- require.Equal(res.Proof.RootHash, commit.Header.DataHash)
- }
|