package node import ( "fmt" "io/ioutil" "testing" "github.com/arnaucube/slowlorisdb/core" "github.com/arnaucube/slowlorisdb/db" "github.com/stretchr/testify/assert" ) func TestNode(t *testing.T) { dir, err := ioutil.TempDir("", "db") assert.Nil(t, err) db, err := db.New(dir) assert.Nil(t, err) privK, err := core.NewKey() assert.Nil(t, err) dif := uint64(1) bc := core.NewBlockchain(db, dif) node, err := NewNode(privK, bc, true) assert.Nil(t, err) assert.Equal(t, node.Addr, core.AddressFromPrivK(node.PrivK)) } func TestNodeSignature(t *testing.T) { dir, err := ioutil.TempDir("", "db") assert.Nil(t, err) db, err := db.New(dir) assert.Nil(t, err) privK, err := core.NewKey() assert.Nil(t, err) dif := uint64(1) bc := core.NewBlockchain(db, dif) node, err := NewNode(privK, bc, true) assert.Nil(t, err) m := []byte("test") sig, err := node.Sign(m) assert.Nil(t, err) pubK := node.PrivK.PublicKey assert.True(t, core.VerifySignature(&pubK, m, *sig)) } func TestBlockFromPendingTxs(t *testing.T) { dir, err := ioutil.TempDir("", "db") assert.Nil(t, err) db, err := db.New(dir) assert.Nil(t, err) privK, err := core.NewKey() assert.Nil(t, err) dif := uint64(1) bc := core.NewBlockchain(db, dif) node, err := NewNode(privK, bc, true) assert.Nil(t, err) privK0, err := core.NewKey() assert.Nil(t, err) pubK0 := privK0.PublicKey privK1, err := core.NewKey() assert.Nil(t, err) pubK1 := privK1.PublicKey tx := core.NewTx(&pubK0, &pubK1, []core.Input{}, []core.Output{}) node.AddToPendingTxs(*tx) block, err := node.BlockFromPendingTxs() assert.Nil(t, err) fmt.Println("h", block.Hash) assert.True(t, core.CheckBlockPoW(block, node.Bc.Difficulty)) assert.True(t, node.Bc.VerifyBlock(block)) } func TestBlockFromPendingTxsIteration(t *testing.T) { dir, err := ioutil.TempDir("", "db") assert.Nil(t, err) db, err := db.New(dir) assert.Nil(t, err) privK, err := core.NewKey() assert.Nil(t, err) dif := uint64(1) bc := core.NewBlockchain(db, dif) node, err := NewNode(privK, bc, true) assert.Nil(t, err) privK0, err := core.NewKey() assert.Nil(t, err) pubK0 := privK0.PublicKey privK1, err := core.NewKey() assert.Nil(t, err) pubK1 := privK1.PublicKey for i := 0; i < 10; i++ { tx := core.NewTx(&pubK0, &pubK1, []core.Input{}, []core.Output{}) node.AddToPendingTxs(*tx) } block, err := node.BlockFromPendingTxs() assert.Nil(t, err) assert.True(t, core.CheckBlockPoW(block, node.Bc.Difficulty)) assert.True(t, node.Bc.VerifyBlock(block)) } func TestFromGenesisToTenBlocks(t *testing.T) { dir, err := ioutil.TempDir("", "db") assert.Nil(t, err) db, err := db.New(dir) assert.Nil(t, err) privK, err := core.NewKey() assert.Nil(t, err) dif := uint64(1) bc := core.NewBlockchain(db, dif) node, err := NewNode(privK, bc, true) assert.Nil(t, err) // create the genesis block genesisBlock, err := node.CreateGenesis() assert.Nil(t, err) assert.NotEqual(t, genesisBlock.Signature, core.Signature{}) assert.NotEqual(t, genesisBlock.Hash, core.Hash{}) // add the genesis block into the blockchain err = node.Bc.AddBlock(genesisBlock) assert.Nil(t, err) assert.NotEqual(t, genesisBlock.Hash, core.Hash{}) assert.Equal(t, genesisBlock.Hash, node.Bc.LastBlock.Hash) // TODO add another block block := node.NewBlock([]core.Tx{}) err = node.Bc.AddBlock(block) assert.Nil(t, err) }