package blocks
|
|
|
|
import (
|
|
"bytes"
|
|
. "github.com/tendermint/tendermint/binary"
|
|
"math/rand"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// Distributed pseudo-exponentially to test for various cases
|
|
func randUInt64() uint64 {
|
|
bits := rand.Uint32() % 64
|
|
if bits == 0 {
|
|
return 0
|
|
}
|
|
n := uint64(1 << (bits - 1))
|
|
n += uint64(rand.Int63()) & ((1 << (bits - 1)) - 1)
|
|
return n
|
|
}
|
|
|
|
func randUInt32() uint32 {
|
|
bits := rand.Uint32() % 32
|
|
if bits == 0 {
|
|
return 0
|
|
}
|
|
n := uint32(1 << (bits - 1))
|
|
n += uint32(rand.Int31()) & ((1 << (bits - 1)) - 1)
|
|
return n
|
|
}
|
|
|
|
func randTime() time.Time {
|
|
return time.Unix(int64(randUInt64()), 0)
|
|
}
|
|
|
|
func randBytes(n int) []byte {
|
|
bs := make([]byte, n)
|
|
for i := 0; i < n; i++ {
|
|
bs[i] = byte(rand.Intn(256))
|
|
}
|
|
return bs
|
|
}
|
|
|
|
func randSig() Signature {
|
|
return Signature{randUInt64(), randBytes(32)}
|
|
}
|
|
|
|
func TestBlock(t *testing.T) {
|
|
|
|
// Account Txs
|
|
|
|
sendTx := &SendTx{
|
|
Signature: randSig(),
|
|
Fee: randUInt64(),
|
|
To: randUInt64(),
|
|
Amount: randUInt64(),
|
|
}
|
|
|
|
nameTx := &NameTx{
|
|
Signature: randSig(),
|
|
Fee: randUInt64(),
|
|
Name: string(randBytes(12)),
|
|
PubKey: randBytes(32),
|
|
}
|
|
|
|
// Validation Txs
|
|
|
|
bond := &Bond{
|
|
Signature: randSig(),
|
|
Fee: randUInt64(),
|
|
UnbondTo: randUInt64(),
|
|
Amount: randUInt64(),
|
|
}
|
|
|
|
unbond := &Unbond{
|
|
Signature: randSig(),
|
|
Fee: randUInt64(),
|
|
Amount: randUInt64(),
|
|
}
|
|
|
|
timeout := &Timeout{
|
|
AccountId: randUInt64(),
|
|
Penalty: randUInt64(),
|
|
}
|
|
|
|
dupeout := &Dupeout{
|
|
VoteA: BlockVote{
|
|
Height: randUInt64(),
|
|
BlockHash: randBytes(32),
|
|
Signature: randSig(),
|
|
},
|
|
VoteB: BlockVote{
|
|
Height: randUInt64(),
|
|
BlockHash: randBytes(32),
|
|
Signature: randSig(),
|
|
},
|
|
}
|
|
|
|
// Block
|
|
|
|
block := &Block{
|
|
Header: Header{
|
|
Network: "Tendermint",
|
|
Height: randUInt32(),
|
|
Fees: randUInt64(),
|
|
Time: randTime(),
|
|
LastBlockHash: randBytes(32),
|
|
ValidationHash: randBytes(32),
|
|
DataHash: randBytes(32),
|
|
},
|
|
Validation: Validation{
|
|
Signatures: []Signature{randSig(), randSig()},
|
|
Txs: []Txs{bond, unbond, timeout, dupeout},
|
|
},
|
|
Data: Data{
|
|
Txs: []Tx{sendTx, nameTx},
|
|
},
|
|
}
|
|
|
|
// Write the block, read it in again, write it again.
|
|
// Then, compare.
|
|
|
|
blockBytes := BinaryBytes(block)
|
|
var n int64
|
|
var err error
|
|
block2 := ReadBlock(bytes.NewReader(blockBytes), &n, &err)
|
|
blockBytes2 := BinaryBytes(block2)
|
|
|
|
if !bytes.Equal(blockBytes, blockBytes2) {
|
|
t.Fatal("Write->Read of block failed.")
|
|
}
|
|
}
|