--- /dev/null
+package chainmgr
+
+import (
+ "io/ioutil"
+ "os"
+ "testing"
+
+ "github.com/davecgh/go-spew/spew"
+
+ dbm "github.com/vapor/database/leveldb"
+ "github.com/vapor/protocol/bc/types"
+)
+
+func TestReadWriteBlocks(t *testing.T) {
+ tmp, err := ioutil.TempDir(".", "")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(tmp)
+
+ testDB := dbm.NewDB("testdb", "leveldb", tmp)
+ defer testDB.Close()
+
+ s := newStorage(testDB)
+
+ cases := []struct {
+ storageRAMLimit int
+ blocks []*types.Block
+ peerID string
+ isRAM bool
+ }{
+ {
+ storageRAMLimit: 800 * 1024 * 1024,
+ blocks: mockBlocks(nil, 500),
+ peerID: "testPeer",
+ isRAM: true,
+ },
+ {
+ storageRAMLimit: 1,
+ blocks: mockBlocks(nil, 500),
+ peerID: "testPeer",
+ isRAM: false,
+ },
+ }
+
+ for index, c := range cases {
+ maxByteOfStorageRAM = c.storageRAMLimit
+ s.writeBlocks(c.peerID, c.blocks)
+
+ for i := 0; i < len(c.blocks); i++ {
+ blockStorage, err := s.readBlock(uint64(i))
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if blockStorage.isRAM != c.isRAM {
+ t.Fatalf("case %d: TestReadWriteBlocks block %d isRAM: got %t want %t", index, i, blockStorage.isRAM, c.isRAM)
+ }
+
+ if blockStorage.block.Hash() != c.blocks[i].Hash() {
+ t.Fatalf("case %d: TestReadWriteBlocks block %d: got %s want %s", index, i, spew.Sdump(blockStorage.block), spew.Sdump(c.blocks[i]))
+ }
+ }
+ }
+}
+
+func TestDeleteBlock(t *testing.T) {
+ tmp, err := ioutil.TempDir(".", "")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(tmp)
+
+ testDB := dbm.NewDB("testdb", "leveldb", tmp)
+ defer testDB.Close()
+
+ maxByteOfStorageRAM = 1024
+ blocks := mockBlocks(nil, 500)
+ s := newStorage(testDB)
+ for i, block := range blocks {
+ if err := s.writeBlocks("testPeer", []*types.Block{block}); err != nil {
+ t.Fatal(err)
+ }
+
+ blockStorage, err := s.readBlock(block.Height)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if !blockStorage.isRAM {
+ t.Fatalf("TestReadWriteBlocks block %d isRAM: got %t want %t", i, blockStorage.isRAM, true)
+ }
+
+ s.deleteBlock(block.Height)
+ }
+
+}
+
+func TestLevelDBStorageReadWrite(t *testing.T) {
+ tmp, err := ioutil.TempDir(".", "")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(tmp)
+
+ testDB := dbm.NewDB("testdb", "leveldb", tmp)
+ defer testDB.Close()
+
+ blocks := mockBlocks(nil, 16)
+ s := newDBStore(testDB)
+
+ for i, block := range blocks {
+ err := s.writeBlock(block)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ gotBlock, err := s.readBlock(block.Height)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if gotBlock.Hash() != block.Hash() {
+ t.Fatalf("TestLevelDBStorageReadWrite block %d: got %s want %s", i, spew.Sdump(gotBlock), spew.Sdump(block))
+ }
+
+ s.clearData()
+ _, err = s.readBlock(block.Height)
+ if err == nil {
+ t.Fatalf("TestLevelDBStorageReadWrite clear data err block %d", i)
+ }
+ }
+}