Commit 5a3e37b1 authored by vipwzw's avatar vipwzw

add kvcreator

parent e4a889a0
......@@ -7,12 +7,13 @@ package table
import (
"testing"
"github.com/33cn/chain33/util"
"github.com/stretchr/testify/assert"
)
func TestCount(t *testing.T) {
dir, leveldb, kvdb := getdb()
defer dbclose(dir, leveldb)
dir, ldb, kvdb := util.CreateTestDB()
defer util.CloseTestDB(dir, ldb)
count := NewCount("prefix", "name#hello", kvdb)
count.Inc()
count.Dec()
......@@ -22,7 +23,7 @@ func TestCount(t *testing.T) {
assert.Equal(t, i, int64(1))
kvs, err := count.Save()
assert.Nil(t, err)
setKV(leveldb, kvs)
setKV(ldb, kvs)
count = NewCount("prefix", "name#hello", kvdb)
i, err = count.Get()
......
......@@ -5,6 +5,7 @@ import (
"testing"
protodata "github.com/33cn/chain33/common/db/table/proto"
"github.com/33cn/chain33/util"
"github.com/golang/protobuf/proto"
"github.com/stretchr/testify/assert"
......@@ -12,8 +13,8 @@ import (
)
func TestJoin(t *testing.T) {
dir, leveldb, kvdb := getdb()
defer dbclose(dir, leveldb)
dir, ldb, kvdb := util.CreateTestDB()
defer util.CloseTestDB(dir, ldb)
table1, err := NewTable(NewGameRow(), kvdb, optgame)
assert.Nil(t, err)
table2, err := NewTable(NewGameAddrRow(), kvdb, optgameaddr)
......@@ -32,7 +33,7 @@ func TestJoin(t *testing.T) {
kvs, err := tablejoin.Save()
assert.Nil(t, err)
assert.Equal(t, 7, len(kvs))
setKV(leveldb, kvs)
setKV(ldb, kvs)
//query table
//每个表的查询,用 tablejoin.MustGetTable("gameaddr")
//join query 用 tablejoin.Query
......@@ -53,7 +54,7 @@ func TestJoin(t *testing.T) {
kvs, err = tablejoin.Save()
assert.Nil(t, err)
assert.Equal(t, 7, len(kvs))
setKV(leveldb, kvs)
setKV(ldb, kvs)
rows, err = tablejoin.ListIndex("addr#status", JoinKey([]byte("addr1"), []byte("2")), nil, 0, 0)
assert.Nil(t, err)
assert.Equal(t, 1, len(rows))
......@@ -77,7 +78,7 @@ func TestJoin(t *testing.T) {
kvs, err = tablejoin.Save()
assert.Nil(t, err)
assert.Equal(t, 5, len(kvs))
setKV(leveldb, kvs)
setKV(ldb, kvs)
//改回到全部是1的情况
rightdata = &protodata.Game{GameID: "gameid1", Status: 1}
......@@ -87,7 +88,7 @@ func TestJoin(t *testing.T) {
kvs, err = tablejoin.Save()
assert.Nil(t, err)
assert.Equal(t, 10, len(kvs))
setKV(leveldb, kvs)
setKV(ldb, kvs)
rows, err = tablejoin.ListIndex("addr#status", JoinKey([]byte("addr1"), []byte("1")), nil, 0, 0)
assert.Nil(t, err)
assert.Equal(t, 1, len(rows))
......
......@@ -6,8 +6,6 @@ package table
import (
"bytes"
"fmt"
"io/ioutil"
"os"
"testing"
"github.com/33cn/chain33/common"
......@@ -19,8 +17,8 @@ import (
)
func TestTransactinList(t *testing.T) {
dir, leveldb, kvdb := getdb()
defer dbclose(dir, leveldb)
dir, ldb, kvdb := util.CreateTestDB()
defer util.CloseTestDB(dir, ldb)
opt := &Option{
Prefix: "prefix",
Name: "name",
......@@ -51,7 +49,7 @@ func TestTransactinList(t *testing.T) {
assert.Nil(t, err)
assert.Equal(t, len(kvs), 12)
//save to database
setKV(leveldb, kvs)
setKV(ldb, kvs)
//测试查询
query := table.GetQuery(kvdb)
......@@ -157,8 +155,8 @@ func TestTransactinList(t *testing.T) {
}
func TestTransactinListAuto(t *testing.T) {
dir, leveldb, kvdb := getdb()
defer dbclose(dir, leveldb)
dir, ldb, kvdb := util.CreateTestDB()
defer util.CloseTestDB(dir, ldb)
opt := &Option{
Prefix: "prefix",
Name: "name",
......@@ -189,7 +187,7 @@ func TestTransactinListAuto(t *testing.T) {
assert.Nil(t, err)
assert.Equal(t, len(kvs), 13)
//save to database
setKV(leveldb, kvs)
setKV(ldb, kvs)
//测试查询
query := table.GetQuery(kvdb)
......@@ -298,8 +296,8 @@ func TestRow(t *testing.T) {
}
func TestDel(t *testing.T) {
dir, leveldb, kvdb := getdb()
defer dbclose(dir, leveldb)
dir, ldb, kvdb := util.CreateTestDB()
defer util.CloseTestDB(dir, ldb)
opt := &Option{
Prefix: "prefix",
Name: "name",
......@@ -327,7 +325,7 @@ func TestDel(t *testing.T) {
assert.Nil(t, err)
assert.Equal(t, len(kvs), 6)
//save to database
setKV(leveldb, kvs)
setKV(ldb, kvs)
//printKV(kvs)
query := table.GetQuery(kvdb)
rows, err := query.ListIndex("From", []byte(addr1[0:10]), nil, 0, 0)
......@@ -344,8 +342,8 @@ func printAllKey(db db.DB) {
}
func TestUpdate(t *testing.T) {
dir, leveldb, kvdb := getdb()
defer dbclose(dir, leveldb)
dir, ldb, kvdb := util.CreateTestDB()
defer util.CloseTestDB(dir, ldb)
opt := &Option{
Prefix: "prefix",
Name: "name",
......@@ -369,7 +367,7 @@ func TestUpdate(t *testing.T) {
assert.Nil(t, err)
assert.Equal(t, len(kvs), 3)
//save to database
setKV(leveldb, kvs)
setKV(ldb, kvs)
query := table.GetQuery(kvdb)
rows, err := query.ListIndex("From", []byte(tx1.From()), nil, 0, 0)
assert.Nil(t, err)
......@@ -377,8 +375,8 @@ func TestUpdate(t *testing.T) {
}
func TestReplace(t *testing.T) {
dir, leveldb, kvdb := getdb()
defer dbclose(dir, leveldb)
dir, ldb, kvdb := util.CreateTestDB()
defer util.CloseTestDB(dir, ldb)
opt := &Option{
Prefix: "prefix",
Name: "name",
......@@ -405,7 +403,7 @@ func TestReplace(t *testing.T) {
assert.Nil(t, err)
assert.Equal(t, 3, len(kvs))
//save to database
setKV(leveldb, kvs)
setKV(ldb, kvs)
query := table.GetQuery(kvdb)
_, err = query.ListIndex("From", []byte(addr1[0:10]), nil, 0, 0)
assert.Equal(t, err, types.ErrNotFound)
......@@ -445,20 +443,3 @@ func (tx *TransactionRow) Get(key string) ([]byte, error) {
}
return nil, types.ErrNotFound
}
func getdb() (string, db.DB, db.KVDB) {
dir, err := ioutil.TempDir("", "goleveldb")
if err != nil {
panic(err)
}
leveldb, err := db.NewGoLevelDB("goleveldb", dir, 128)
if err != nil {
panic(err)
}
return dir, leveldb, db.NewKVDB(leveldb)
}
func dbclose(dir string, dbm db.DB) {
os.RemoveAll(dir)
dbm.Close()
}
package dapp
import (
"testing"
"github.com/33cn/chain33/types"
"github.com/stretchr/testify/assert"
)
type demoApp struct {
*DriverBase
}
func newdemoApp() Driver {
demo := &demoApp{DriverBase: &DriverBase{}}
demo.SetChild(demo)
return demo
}
func (demo *demoApp) GetDriverName() string {
return "demo"
}
type noneApp struct {
*DriverBase
}
func newnoneApp() Driver {
none := &noneApp{DriverBase: &DriverBase{}}
none.SetChild(none)
return none
}
func (none *noneApp) GetDriverName() string {
return "none"
}
func TestReigister(t *testing.T) {
Register("none", newnoneApp, 0)
Register("demo", newdemoApp, 1)
_, err := LoadDriver("demo", 0)
assert.Equal(t, err, types.ErrUnknowDriver)
_, err = LoadDriver("demo", 1)
assert.Equal(t, err, nil)
tx := &types.Transaction{Execer: []byte("demo")}
driver := LoadDriverAllow(tx, 0, 0)
assert.Equal(t, "none", driver.GetDriverName())
driver = LoadDriverAllow(tx, 0, 1)
assert.Equal(t, "demo", driver.GetDriverName())
types.SetTitleOnlyForTest("user.p.hello.")
tx = &types.Transaction{Execer: []byte("demo")}
driver = LoadDriverAllow(tx, 0, 0)
assert.Equal(t, "none", driver.GetDriverName())
driver = LoadDriverAllow(tx, 0, 1)
assert.Equal(t, "demo", driver.GetDriverName())
tx.Execer = []byte("user.p.hello.demo")
driver = LoadDriverAllow(tx, 0, 1)
assert.Equal(t, "demo", driver.GetDriverName())
tx.Execer = []byte("user.p.hello2.demo")
driver = LoadDriverAllow(tx, 0, 1)
assert.Equal(t, "none", driver.GetDriverName())
}
func TestExecAddress(t *testing.T) {
assert.Equal(t, "16htvcBNSEA7fZhAdLJphDwQRQJaHpyHTp", ExecAddress("ticket"))
}
......@@ -7,6 +7,7 @@ package dapp
import (
"fmt"
"github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/types"
)
......@@ -15,3 +16,37 @@ func HeightIndexStr(height, index int64) string {
v := height*types.MaxTxsPerBlock + index
return fmt.Sprintf("%018d", v)
}
//KVCreator 创建KV的辅助工具
type KVCreator struct {
kvs []*types.KeyValue
kvdb db.KV
}
//NewKVCreator 创建创建者
func NewKVCreator(kv db.KV) *KVCreator {
return &KVCreator{kvdb: kv}
}
func (c *KVCreator) add(key, value []byte, set bool) *KVCreator {
c.kvs = append(c.kvs, &types.KeyValue{Key: key, Value: value})
if set {
c.kvdb.Set(key, value)
}
return c
}
//Add add and set to kvdb
func (c *KVCreator) Add(key, value []byte) *KVCreator {
return c.add(key, value, true)
}
//AddKV only add KV
func (c *KVCreator) AddKV(key, value []byte) *KVCreator {
return c.add(key, value, false)
}
//KVList 读取所有的kv列表
func (c *KVCreator) KVList() []*types.KeyValue {
return c.kvs
}
package dapp
import (
"testing"
"github.com/33cn/chain33/types"
"github.com/33cn/chain33/util"
"github.com/stretchr/testify/assert"
)
func TestKVCreator(t *testing.T) {
dir, ldb, kvdb := util.CreateTestDB()
defer util.CloseTestDB(dir, ldb)
creator := NewKVCreator(kvdb)
creator.AddKV([]byte("a"), []byte("b"))
_, err := kvdb.Get([]byte("a"))
assert.Equal(t, err, types.ErrNotFound)
creator.Add([]byte("a"), []byte("b"))
value, err := kvdb.Get([]byte("a"))
assert.Equal(t, err, nil)
assert.Equal(t, value, []byte("b"))
}
func TestHeightIndexStr(t *testing.T) {
assert.Equal(t, "000000000000100001", HeightIndexStr(1, 1))
}
......@@ -10,12 +10,37 @@ import (
"github.com/33cn/chain33/common"
"github.com/33cn/chain33/common/crypto"
"github.com/golang/protobuf/proto"
proto "github.com/golang/protobuf/proto"
)
// Hash 获取block的hash值
func (block *Block) Hash() []byte {
data, err := proto.Marshal(block.GetHeader())
if IsFork(block.Height, "ForkBlockHash") {
return block.HashNew()
}
return block.HashOld()
}
//HashByForkHeight hash 通过自己设置的fork 高度计算 hash
func (block *Block) HashByForkHeight(forkheight int64) []byte {
if block.Height >= forkheight {
return block.HashNew()
}
return block.HashOld()
}
//HashNew 新版本的Hash
func (block *Block) HashNew() []byte {
data, err := proto.Marshal(block.getHeaderHashNew())
if err != nil {
panic(err)
}
return common.Sha256(data)
}
//HashOld 老版本的hash
func (block *Block) HashOld() []byte {
data, err := proto.Marshal(block.getHeaderHashOld())
if err != nil {
panic(err)
}
......@@ -35,11 +60,32 @@ func (block *Block) GetHeader() *Header {
head.TxHash = block.TxHash
head.BlockTime = block.BlockTime
head.Height = block.Height
if IsFork(head.Height, "ForkBlockHash") {
head.Difficulty = block.Difficulty
head.StateHash = block.StateHash
head.TxCount = int64(len(block.Txs))
}
return head
}
func (block *Block) getHeaderHashOld() *Header {
head := &Header{}
head.Version = block.Version
head.ParentHash = block.ParentHash
head.TxHash = block.TxHash
head.BlockTime = block.BlockTime
head.Height = block.Height
return head
}
func (block *Block) getHeaderHashNew() *Header {
head := &Header{}
head.Version = block.Version
head.ParentHash = block.ParentHash
head.TxHash = block.TxHash
head.BlockTime = block.BlockTime
head.Height = block.Height
head.Difficulty = block.Difficulty
head.StateHash = block.StateHash
head.TxCount = int64(len(block.Txs))
return head
}
......
package types
import (
"encoding/hex"
"testing"
"github.com/stretchr/testify/assert"
)
func TestBlock(t *testing.T) {
b := &Block{}
assert.Equal(t, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", hex.EncodeToString(b.Hash()))
assert.Equal(t, b.HashOld(), b.HashNew())
assert.Equal(t, b.HashOld(), b.Hash())
b.Height = 10
b.Difficulty = 1
assert.NotEqual(t, b.HashOld(), b.HashNew())
assert.NotEqual(t, b.HashOld(), b.HashNew())
assert.Equal(t, b.HashNew(), b.HashByForkHeight(10))
assert.Equal(t, b.HashOld(), b.HashByForkHeight(11))
assert.Equal(t, true, b.CheckSign())
b.Txs = append(b.Txs, &Transaction{})
assert.Equal(t, false, b.CheckSign())
b.Txs = append(b.Txs, &Transaction{})
b.Txs = append(b.Txs, &Transaction{})
b.Txs = append(b.Txs, &Transaction{})
b.Txs = append(b.Txs, &Transaction{})
assert.Equal(t, false, b.CheckSign())
}
......@@ -262,7 +262,6 @@ func TestIterateCallBack_PrefixWithoutExecAddr(t *testing.T) {
value := Encode(acc)
fmt.Println("TestIterateCallBack_PrefixWithoutExecAddr--test case 1---")
bRet := reply.IterateCallBack([]byte(key), value)
assert.Equal(t, false, bRet)
assert.Equal(t, 1, len(reply.Keys))
......@@ -270,7 +269,6 @@ func TestIterateCallBack_PrefixWithoutExecAddr(t *testing.T) {
assert.Equal(t, int64(1), reply.Num)
assert.Equal(t, 0, len(reply.NextKey))
fmt.Println("TestIterateCallBack_PrefixWithoutExecAddr--test case 2---")
bRet = reply.IterateCallBack([]byte(key), value)
assert.Equal(t, false, bRet)
assert.Equal(t, 2, len(reply.Keys))
......@@ -278,7 +276,6 @@ func TestIterateCallBack_PrefixWithoutExecAddr(t *testing.T) {
assert.Equal(t, int64(2), reply.Num)
assert.Equal(t, 0, len(reply.NextKey))
fmt.Println("TestIterateCallBack_PrefixWithoutExecAddr--test case 3---")
key2 := "mavl-coins-bty-exec-16htvcBNSEA7fZhAdLJphDwQRQJaHpyHTp:2JmFaA6unrCFYEWPGRi7uuXY1KthTJxJEP"
bRet = reply.IterateCallBack([]byte(key2), value)
assert.Equal(t, false, bRet)
......@@ -287,7 +284,6 @@ func TestIterateCallBack_PrefixWithoutExecAddr(t *testing.T) {
assert.Equal(t, int64(2), reply.Num)
assert.Equal(t, 0, len(reply.NextKey))
fmt.Println("TestIterateCallBack_PrefixWithoutExecAddr--test case 4---")
key3 := "mavl-coins-bty-exec-26htvcBNSEA7fZhAdLJphDwQRQJaHpyHTp:1JmFaA6unrCFYEWPGRi7uuXY1KthTJxJEP"
bRet = reply.IterateCallBack([]byte(key3), value)
assert.Equal(t, false, bRet)
......@@ -296,7 +292,6 @@ func TestIterateCallBack_PrefixWithoutExecAddr(t *testing.T) {
assert.Equal(t, int64(3), reply.Num)
assert.Equal(t, 0, len(reply.NextKey))
fmt.Println("TestIterateCallBack_PrefixWithoutExecAddr--test case 5---")
reply.Count = int64(4)
bRet = reply.IterateCallBack([]byte(key3), value)
......@@ -331,7 +326,6 @@ func TestIterateCallBack_PrefixWithExecAddr(t *testing.T) {
value := Encode(acc)
fmt.Println("TestIterateCallBack_PrefixWithExecAddr--test case 1---")
key2 := "mavl-coins-bty-exec-16htvcBNSEA7fZhAdLJphDwQRQJaHpyHTp:2JmFaA6unrCFYEWPGRi7uuXY1KthTJxJEP"
bRet := reply.IterateCallBack([]byte(key2), value)
assert.Equal(t, false, bRet)
......@@ -340,7 +334,6 @@ func TestIterateCallBack_PrefixWithExecAddr(t *testing.T) {
assert.Equal(t, int64(0), reply.Num)
assert.Equal(t, 0, len(reply.NextKey))
fmt.Println("TestIterateCallBack_PrefixWithExecAddr--test case 2---")
bRet = reply.IterateCallBack([]byte(key), value)
assert.Equal(t, true, bRet)
assert.Equal(t, 1, len(reply.Keys))
......@@ -348,7 +341,6 @@ func TestIterateCallBack_PrefixWithExecAddr(t *testing.T) {
assert.Equal(t, int64(1), reply.Num)
assert.Equal(t, len(key), len(reply.NextKey))
fmt.Println("TestIterateCallBack_PrefixWithExecAddr--test case 3---")
//key2 := "mavl-coins-bty-exec-16htvcBNSEA7fZhAdLJphDwQRQJaHpyHTp:2JmFaA6unrCFYEWPGRi7uuXY1KthTJxJEP"
reply.NextKey = nil
reply.Count = int64(2)
......@@ -359,7 +351,6 @@ func TestIterateCallBack_PrefixWithExecAddr(t *testing.T) {
assert.Equal(t, int64(1), reply.Num)
assert.Equal(t, 0, len(reply.NextKey))
fmt.Println("TestIterateCallBack_PrefixWithExecAddr--test case 4---")
reply.NextKey = nil
key3 := "mavl-coins-bty-exec-26htvcBNSEA7fZhAdLJphDwQRQJaHpyHTp:1JmFaA6unrCFYEWPGRi7uuXY1KthTJxJEP"
bRet = reply.IterateCallBack([]byte(key3), value)
......@@ -369,7 +360,6 @@ func TestIterateCallBack_PrefixWithExecAddr(t *testing.T) {
assert.Equal(t, int64(2), reply.Num)
assert.Equal(t, len(key3), len(reply.NextKey))
fmt.Println("TestIterateCallBack_PrefixWithExecAddr--test case 5---")
bRet = reply.IterateCallBack([]byte(key), value)
assert.Equal(t, true, bRet)
assert.Equal(t, 3, len(reply.Keys))
......
......@@ -10,6 +10,7 @@ import (
"fmt"
"io/ioutil"
"math/rand"
"os"
"os/user"
"path/filepath"
"strings"
......@@ -18,6 +19,7 @@ import (
"github.com/33cn/chain33/common/address"
"github.com/33cn/chain33/common/crypto"
"github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/common/log/log15"
"github.com/33cn/chain33/common/merkle"
"github.com/33cn/chain33/queue"
......@@ -407,3 +409,22 @@ func ResetDatadir(cfg *types.Config, datadir string) string {
cfg.Store.DbPath = filepath.Join(datadir, cfg.Store.DbPath)
return datadir
}
//CreateTestDB 创建一个测试数据库
func CreateTestDB() (string, db.DB, db.KVDB) {
dir, err := ioutil.TempDir("", "goleveldb")
if err != nil {
panic(err)
}
leveldb, err := db.NewGoLevelDB("goleveldb", dir, 128)
if err != nil {
panic(err)
}
return dir, leveldb, db.NewKVDB(leveldb)
}
//CloseTestDB 创建一个测试数据库
func CloseTestDB(dir string, dbm db.DB) {
os.RemoveAll(dir)
dbm.Close()
}
......@@ -177,3 +177,13 @@ func TestDelDupTx(t *testing.T) {
txcache = DelDupTx(txcache)
assert.Equal(t, txcache, txcacheresult)
}
func TestDB(t *testing.T) {
dir, db, kvdb := CreateTestDB()
defer CloseTestDB(dir, db)
err := kvdb.Set([]byte("a"), []byte("b"))
assert.Nil(t, err)
value, err := kvdb.Get([]byte("a"))
assert.Nil(t, err)
assert.Equal(t, value, []byte("b"))
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment