/plugin/store/mpt/mpt_test.go

https://github.com/33cn/plugin · Go · 321 lines · 277 code · 37 blank · 7 comment · 23 complexity · 057f4d4607bbe60e132443ae175c4223 MD5 · raw file

  1. // Copyright Fuzamei Corp. 2018 All Rights Reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package mpt
  5. import (
  6. "io/ioutil"
  7. "os"
  8. "testing"
  9. "fmt"
  10. "time"
  11. "github.com/33cn/chain33/common"
  12. drivers "github.com/33cn/chain33/system/store"
  13. "github.com/33cn/chain33/types"
  14. "github.com/stretchr/testify/assert"
  15. )
  16. const MaxKeylenth int = 64
  17. func newStoreCfg(dir string) *types.Store {
  18. return &types.Store{Name: "mpt_test", Driver: "leveldb", DbPath: dir, DbCache: 100}
  19. }
  20. func TestKvdbNewClose(t *testing.T) {
  21. dir, err := ioutil.TempDir("", "example")
  22. assert.Nil(t, err)
  23. defer os.RemoveAll(dir) // clean up
  24. os.RemoveAll(dir) //删除已存在目录
  25. var storeCfg = newStoreCfg(dir)
  26. store := New(storeCfg, nil, nil)
  27. assert.NotNil(t, store)
  28. store.Close()
  29. }
  30. func TestKvddbSetGet(t *testing.T) {
  31. dir, err := ioutil.TempDir("", "example")
  32. assert.Nil(t, err)
  33. defer os.RemoveAll(dir) // clean up
  34. os.RemoveAll(dir) //删除已存在目录
  35. var storeCfg = newStoreCfg(dir)
  36. store := New(storeCfg, nil, nil).(*Store)
  37. assert.NotNil(t, store)
  38. keys0 := [][]byte{[]byte("mk1"), []byte("mk2")}
  39. get0 := &types.StoreGet{StateHash: drivers.EmptyRoot[:], Keys: keys0}
  40. values0 := store.Get(get0)
  41. mlog.Info("info", "info", values0)
  42. // Get exist key, result nil
  43. assert.Len(t, values0, 2)
  44. assert.Equal(t, []byte(nil), values0[0])
  45. assert.Equal(t, []byte(nil), values0[1])
  46. var kv []*types.KeyValue
  47. kv = append(kv, &types.KeyValue{Key: []byte("k1"), Value: []byte("v1")})
  48. kv = append(kv, &types.KeyValue{Key: []byte("k2"), Value: []byte("v2")})
  49. datas := &types.StoreSet{
  50. StateHash: drivers.EmptyRoot[:],
  51. KV: kv,
  52. Height: 0}
  53. hash, err := store.Set(datas, true)
  54. assert.Nil(t, err)
  55. keys := [][]byte{[]byte("k1"), []byte("k2")}
  56. get1 := &types.StoreGet{StateHash: hash, Keys: keys}
  57. values := store.Get(get1)
  58. assert.Len(t, values, 2)
  59. assert.Equal(t, []byte("v1"), values[0])
  60. assert.Equal(t, []byte("v2"), values[1])
  61. keys = [][]byte{[]byte("k1")}
  62. get2 := &types.StoreGet{StateHash: hash, Keys: keys}
  63. values2 := store.Get(get2)
  64. assert.Len(t, values2, 1)
  65. assert.Equal(t, []byte("v1"), values2[0])
  66. get3 := &types.StoreGet{StateHash: drivers.EmptyRoot[:], Keys: keys}
  67. values3 := store.Get(get3)
  68. assert.Len(t, values3, 1)
  69. assert.Equal(t, []byte(nil), values3[0])
  70. }
  71. func TestKvdbMemSet(t *testing.T) {
  72. dir, err := ioutil.TempDir("", "example")
  73. assert.Nil(t, err)
  74. defer os.RemoveAll(dir) // clean up
  75. os.RemoveAll(dir) //删除已存在目录
  76. var storeCfg = newStoreCfg(dir)
  77. store := New(storeCfg, nil, nil).(*Store)
  78. assert.NotNil(t, store)
  79. var kv []*types.KeyValue
  80. kv = append(kv, &types.KeyValue{Key: []byte("mk1"), Value: []byte("v1")})
  81. kv = append(kv, &types.KeyValue{Key: []byte("mk2"), Value: []byte("v2")})
  82. datas := &types.StoreSet{
  83. StateHash: drivers.EmptyRoot[:],
  84. KV: kv,
  85. Height: 0}
  86. hash, err := store.MemSet(datas, true)
  87. assert.Nil(t, err)
  88. keys := [][]byte{[]byte("mk1"), []byte("mk2")}
  89. get1 := &types.StoreGet{StateHash: hash, Keys: keys}
  90. values := store.Get(get1)
  91. assert.Len(t, values, 2)
  92. actHash, _ := store.Commit(&types.ReqHash{Hash: hash})
  93. assert.Equal(t, hash, actHash)
  94. notExistHash, _ := store.Commit(&types.ReqHash{Hash: drivers.EmptyRoot[:]})
  95. assert.Nil(t, notExistHash)
  96. }
  97. func TestKvmvccdbMemSetUpgrade(t *testing.T) {
  98. // not support
  99. dir, err := ioutil.TempDir("", "example")
  100. assert.Nil(t, err)
  101. defer os.RemoveAll(dir) // clean up
  102. os.RemoveAll(dir) //删除已存在目录
  103. var storeCfg = newStoreCfg(dir)
  104. store := New(storeCfg, nil, nil).(*Store)
  105. assert.NotNil(t, store)
  106. store.MemSetUpgrade(nil, false)
  107. }
  108. func TestKvmvccdbCommitUpgrade(t *testing.T) {
  109. // not support
  110. dir, err := ioutil.TempDir("", "example")
  111. assert.Nil(t, err)
  112. defer os.RemoveAll(dir) // clean up
  113. os.RemoveAll(dir) //删除已存在目录
  114. var storeCfg = newStoreCfg(dir)
  115. store := New(storeCfg, nil, nil).(*Store)
  116. assert.NotNil(t, store)
  117. store.CommitUpgrade(nil)
  118. }
  119. func TestKvdbRollback(t *testing.T) {
  120. dir, err := ioutil.TempDir("", "example")
  121. assert.Nil(t, err)
  122. defer os.RemoveAll(dir) // clean up
  123. os.RemoveAll(dir) //删除已存在目录
  124. var storeCfg = newStoreCfg(dir)
  125. store := New(storeCfg, nil, nil).(*Store)
  126. assert.NotNil(t, store)
  127. var kv []*types.KeyValue
  128. kv = append(kv, &types.KeyValue{Key: []byte("mk1"), Value: []byte("v1")})
  129. kv = append(kv, &types.KeyValue{Key: []byte("mk2"), Value: []byte("v2")})
  130. datas := &types.StoreSet{
  131. StateHash: drivers.EmptyRoot[:],
  132. KV: kv,
  133. Height: 0}
  134. hash, err := store.MemSet(datas, true)
  135. assert.Nil(t, err)
  136. keys := [][]byte{[]byte("mk1"), []byte("mk2")}
  137. get1 := &types.StoreGet{StateHash: hash, Keys: keys}
  138. values := store.Get(get1)
  139. assert.Len(t, values, 2)
  140. actHash, _ := store.Rollback(&types.ReqHash{Hash: hash})
  141. assert.Equal(t, hash, actHash)
  142. notExistHash, _ := store.Rollback(&types.ReqHash{Hash: drivers.EmptyRoot[:]})
  143. assert.Nil(t, notExistHash)
  144. }
  145. func GetRandomString(length int) string {
  146. return common.GetRandPrintString(20, length)
  147. }
  148. //目前正常情况下get 都是一个一个获取的
  149. func BenchmarkGet(b *testing.B) {
  150. dir, err := ioutil.TempDir("", "example")
  151. assert.Nil(b, err)
  152. defer os.RemoveAll(dir) // clean up
  153. os.RemoveAll(dir) //删除已存在目录
  154. var storeCfg = newStoreCfg(dir)
  155. store := New(storeCfg, nil, nil).(*Store)
  156. assert.NotNil(b, store)
  157. var kv []*types.KeyValue
  158. var keys [][]byte
  159. var hash = drivers.EmptyRoot[:]
  160. for i := 0; i < b.N; i++ {
  161. key := GetRandomString(MaxKeylenth)
  162. value := fmt.Sprintf("%s%d", key, i)
  163. keys = append(keys, []byte(key))
  164. kv = append(kv, &types.KeyValue{Key: []byte(key), Value: []byte(value)})
  165. if i%10000 == 0 {
  166. datas := &types.StoreSet{StateHash: hash, KV: kv, Height: 0}
  167. hash, err = store.Set(datas, true)
  168. assert.Nil(b, err)
  169. kv = nil
  170. }
  171. }
  172. if kv != nil {
  173. datas := &types.StoreSet{StateHash: hash, KV: kv, Height: 0}
  174. hash, err = store.Set(datas, true)
  175. assert.Nil(b, err)
  176. }
  177. start := time.Now()
  178. b.ResetTimer()
  179. for _, key := range keys {
  180. getData := &types.StoreGet{
  181. StateHash: hash,
  182. Keys: [][]byte{key}}
  183. store.Get(getData)
  184. }
  185. end := time.Now()
  186. fmt.Println("mpt BenchmarkGet cost time is", end.Sub(start), "num is", b.N)
  187. }
  188. func BenchmarkSet(b *testing.B) {
  189. dir, err := ioutil.TempDir("", "example")
  190. assert.Nil(b, err)
  191. defer os.RemoveAll(dir) // clean up
  192. os.RemoveAll(dir) //删除已存在目录
  193. var storeCfg = newStoreCfg(dir)
  194. store := New(storeCfg, nil, nil).(*Store)
  195. assert.NotNil(b, store)
  196. var kv []*types.KeyValue
  197. var keys [][]byte
  198. var hash = drivers.EmptyRoot[:]
  199. start := time.Now()
  200. for i := 0; i < b.N; i++ {
  201. key := GetRandomString(MaxKeylenth)
  202. value := fmt.Sprintf("%s%d", key, i)
  203. keys = append(keys, []byte(key))
  204. kv = append(kv, &types.KeyValue{Key: []byte(key), Value: []byte(value)})
  205. if i%10000 == 0 {
  206. datas := &types.StoreSet{StateHash: hash, KV: kv, Height: 0}
  207. hash, err = store.Set(datas, true)
  208. assert.Nil(b, err)
  209. kv = nil
  210. }
  211. }
  212. if kv != nil {
  213. datas := &types.StoreSet{StateHash: hash, KV: kv, Height: 0}
  214. _, err = store.Set(datas, true)
  215. assert.Nil(b, err)
  216. }
  217. end := time.Now()
  218. fmt.Println("mpt BenchmarkSet cost time is", end.Sub(start), "num is", b.N)
  219. }
  220. func BenchmarkMemSet(b *testing.B) {
  221. dir, err := ioutil.TempDir("", "example")
  222. assert.Nil(b, err)
  223. defer os.RemoveAll(dir) // clean up
  224. os.RemoveAll(dir) //删除已存在目录
  225. var storeCfg = newStoreCfg(dir)
  226. store := New(storeCfg, nil, nil).(*Store)
  227. assert.NotNil(b, store)
  228. var kv []*types.KeyValue
  229. var key string
  230. var value string
  231. var keys [][]byte
  232. for i := 0; i < b.N; i++ {
  233. key = GetRandomString(MaxKeylenth)
  234. value = fmt.Sprintf("v%d", i)
  235. keys = append(keys, []byte(key))
  236. kv = append(kv, &types.KeyValue{Key: []byte(key), Value: []byte(value)})
  237. }
  238. datas := &types.StoreSet{
  239. StateHash: drivers.EmptyRoot[:],
  240. KV: kv,
  241. Height: 0}
  242. start := time.Now()
  243. b.ResetTimer()
  244. hash, err := store.MemSet(datas, true)
  245. assert.Nil(b, err)
  246. assert.NotNil(b, hash)
  247. end := time.Now()
  248. fmt.Println("mpt BenchmarkMemSet cost time is", end.Sub(start), "num is", b.N)
  249. }
  250. func BenchmarkCommit(b *testing.B) {
  251. dir, err := ioutil.TempDir("", "example")
  252. assert.Nil(b, err)
  253. defer os.RemoveAll(dir) // clean up
  254. os.RemoveAll(dir) //删除已存在目录
  255. var storeCfg = newStoreCfg(dir)
  256. store := New(storeCfg, nil, nil).(*Store)
  257. assert.NotNil(b, store)
  258. var kv []*types.KeyValue
  259. var key string
  260. var value string
  261. var keys [][]byte
  262. for i := 0; i < b.N; i++ {
  263. key = GetRandomString(MaxKeylenth)
  264. value = fmt.Sprintf("v%d", i)
  265. keys = append(keys, []byte(key))
  266. kv = append(kv, &types.KeyValue{Key: []byte(key), Value: []byte(value)})
  267. }
  268. datas := &types.StoreSet{
  269. StateHash: drivers.EmptyRoot[:],
  270. KV: kv,
  271. Height: 0}
  272. hash, err := store.MemSet(datas, true)
  273. assert.Nil(b, err)
  274. req := &types.ReqHash{
  275. Hash: hash,
  276. }
  277. start := time.Now()
  278. b.ResetTimer()
  279. _, err = store.Commit(req)
  280. assert.NoError(b, err, "NoError")
  281. end := time.Now()
  282. fmt.Println("mpt BenchmarkCommit cost time is", end.Sub(start), "num is", b.N)
  283. b.StopTimer()
  284. }