tendermint/blocks/block_test.go

114 lines
2.6 KiB
Go
Raw Normal View History

2014-06-05 02:34:45 -07:00
package blocks
import (
. "github.com/tendermint/tendermint/binary"
"testing"
"math/rand"
2014-06-05 18:17:09 -07:00
"bytes"
2014-06-05 02:34:45 -07:00
)
// Distributed pseudo-exponentially to test for various cases
func randVar() UInt64 {
bits := rand.Uint32() % 64
if bits == 0 { return 0 }
n := uint64(1 << (bits-1))
n += uint64(rand.Int63()) & ((1 << (bits-1)) - 1)
return UInt64(n)
}
func randBytes(n int) ByteSlice {
bs := make([]byte, n)
for i:=0; i<n; i++ {
bs[i] = byte(rand.Intn(256))
}
return bs
}
2014-06-05 21:20:55 -07:00
func randSig() Signature {
return Signature{AccountNumber(randVar()), randBytes(32)}
}
2014-06-05 02:34:45 -07:00
func TestBlock(t *testing.T) {
2014-06-05 21:20:55 -07:00
// Txs
2014-06-05 02:34:45 -07:00
sendTx := &SendTx{
2014-06-05 21:20:55 -07:00
Signature: randSig(),
2014-06-05 02:34:45 -07:00
Fee: randVar(),
To: AccountNumber(randVar()),
Amount: randVar(),
}
2014-06-05 18:17:09 -07:00
nameTx := &NameTx{
2014-06-05 21:20:55 -07:00
Signature: randSig(),
2014-06-05 18:17:09 -07:00
Fee: randVar(),
Name: String(randBytes(12)),
PubKey: randBytes(32),
}
2014-06-05 21:20:55 -07:00
// Adjs
bond := &Bond{
Signature: randSig(),
Fee: randVar(),
UnbondTo: AccountNumber(randVar()),
Amount: randVar(),
}
unbond := &Unbond{
Signature: randSig(),
Fee: randVar(),
Amount: randVar(),
}
timeout := &Timeout{
Account: AccountNumber(randVar()),
Penalty: randVar(),
}
dupeout := &Dupeout{
VoteA: Vote{
Height: randVar(),
BlockHash: randBytes(32),
Signature: randSig(),
},
VoteB: Vote{
Height: randVar(),
BlockHash: randBytes(32),
Signature: randSig(),
},
}
// Block
2014-06-05 18:17:09 -07:00
block := &Block{
Header{
Name: "Tendermint",
Height: randVar(),
Fees: randVar(),
Time: randVar(),
PrevHash: randBytes(32),
ValidationHash: randBytes(32),
DataHash: randBytes(32),
},
Validation{
2014-06-05 21:20:55 -07:00
Signatures: []Signature{randSig(),randSig()},
Adjustments:[]Adjustment{bond,unbond,timeout,dupeout},
},
Data{
Txs: []Tx{sendTx, nameTx},
2014-06-05 18:17:09 -07:00
},
}
2014-06-05 21:20:55 -07:00
// Write the block, read it in again, write it again.
// Then, compare.
2014-06-05 18:17:09 -07:00
blockBytes := BinaryBytes(block)
block2 := ReadBlock(bytes.NewReader(blockBytes))
blockBytes2 := BinaryBytes(block2)
if !BinaryEqual(blockBytes, blockBytes2) {
t.Fatal("Write->Read of block failed.")
}
}