You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

343 lines
9.0 KiB

lint: Enable Golint (#4212) * Fix many golint errors * Fix golint errors in the 'lite' package * Don't export Pool.store * Fix typo * Revert unwanted changes * Fix errors in counter package * Fix linter errors in kvstore package * Fix linter error in example package * Fix error in tests package * Fix linter errors in v2 package * Fix linter errors in consensus package * Fix linter errors in evidence package * Fix linter error in fail package * Fix linter errors in query package * Fix linter errors in core package * Fix linter errors in node package * Fix linter errors in mempool package * Fix linter error in conn package * Fix linter errors in pex package * Rename PEXReactor export to Reactor * Fix linter errors in trust package * Fix linter errors in upnp package * Fix linter errors in p2p package * Fix linter errors in proxy package * Fix linter errors in mock_test package * Fix linter error in client_test package * Fix linter errors in coretypes package * Fix linter errors in coregrpc package * Fix linter errors in rpcserver package * Fix linter errors in rpctypes package * Fix linter errors in rpctest package * Fix linter error in json2wal script * Fix linter error in wal2json script * Fix linter errors in kv package * Fix linter error in state package * Fix linter error in grpc_client * Fix linter errors in types package * Fix linter error in version package * Fix remaining errors * Address review comments * Fix broken tests * Reconcile package coregrpc * Fix golangci bot error * Fix new golint errors * Fix broken reference * Enable golint linter * minor changes to bring golint into line * fix failing test * fix pex reactor naming * address PR comments
5 years ago
7 years ago
7 years ago
7 years ago
8 years ago
lint: Enable Golint (#4212) * Fix many golint errors * Fix golint errors in the 'lite' package * Don't export Pool.store * Fix typo * Revert unwanted changes * Fix errors in counter package * Fix linter errors in kvstore package * Fix linter error in example package * Fix error in tests package * Fix linter errors in v2 package * Fix linter errors in consensus package * Fix linter errors in evidence package * Fix linter error in fail package * Fix linter errors in query package * Fix linter errors in core package * Fix linter errors in node package * Fix linter errors in mempool package * Fix linter error in conn package * Fix linter errors in pex package * Rename PEXReactor export to Reactor * Fix linter errors in trust package * Fix linter errors in upnp package * Fix linter errors in p2p package * Fix linter errors in proxy package * Fix linter errors in mock_test package * Fix linter error in client_test package * Fix linter errors in coretypes package * Fix linter errors in coregrpc package * Fix linter errors in rpcserver package * Fix linter errors in rpctypes package * Fix linter errors in rpctest package * Fix linter error in json2wal script * Fix linter error in wal2json script * Fix linter errors in kv package * Fix linter error in state package * Fix linter error in grpc_client * Fix linter errors in types package * Fix linter error in version package * Fix remaining errors * Address review comments * Fix broken tests * Reconcile package coregrpc * Fix golangci bot error * Fix new golint errors * Fix broken reference * Enable golint linter * minor changes to bring golint into line * fix failing test * fix pex reactor naming * address PR comments
5 years ago
lint: Enable Golint (#4212) * Fix many golint errors * Fix golint errors in the 'lite' package * Don't export Pool.store * Fix typo * Revert unwanted changes * Fix errors in counter package * Fix linter errors in kvstore package * Fix linter error in example package * Fix error in tests package * Fix linter errors in v2 package * Fix linter errors in consensus package * Fix linter errors in evidence package * Fix linter error in fail package * Fix linter errors in query package * Fix linter errors in core package * Fix linter errors in node package * Fix linter errors in mempool package * Fix linter error in conn package * Fix linter errors in pex package * Rename PEXReactor export to Reactor * Fix linter errors in trust package * Fix linter errors in upnp package * Fix linter errors in p2p package * Fix linter errors in proxy package * Fix linter errors in mock_test package * Fix linter error in client_test package * Fix linter errors in coretypes package * Fix linter errors in coregrpc package * Fix linter errors in rpcserver package * Fix linter errors in rpctypes package * Fix linter errors in rpctest package * Fix linter error in json2wal script * Fix linter error in wal2json script * Fix linter errors in kv package * Fix linter error in state package * Fix linter error in grpc_client * Fix linter errors in types package * Fix linter error in version package * Fix remaining errors * Address review comments * Fix broken tests * Reconcile package coregrpc * Fix golangci bot error * Fix new golint errors * Fix broken reference * Enable golint linter * minor changes to bring golint into line * fix failing test * fix pex reactor naming * address PR comments
5 years ago
  1. package kvstore
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io/ioutil"
  6. "sort"
  7. "testing"
  8. "github.com/stretchr/testify/require"
  9. "github.com/tendermint/tendermint/libs/log"
  10. "github.com/tendermint/tendermint/libs/service"
  11. abcicli "github.com/tendermint/tendermint/abci/client"
  12. "github.com/tendermint/tendermint/abci/example/code"
  13. abciserver "github.com/tendermint/tendermint/abci/server"
  14. "github.com/tendermint/tendermint/abci/types"
  15. tmproto "github.com/tendermint/tendermint/proto/types"
  16. )
  17. const (
  18. testKey = "abc"
  19. testValue = "def"
  20. )
  21. func testKVStore(t *testing.T, app types.Application, tx []byte, key, value string) {
  22. req := types.RequestDeliverTx{Tx: tx}
  23. ar := app.DeliverTx(req)
  24. require.False(t, ar.IsErr(), ar)
  25. // repeating tx doesn't raise error
  26. ar = app.DeliverTx(req)
  27. require.False(t, ar.IsErr(), ar)
  28. // commit
  29. app.Commit()
  30. info := app.Info(types.RequestInfo{})
  31. require.NotZero(t, info.LastBlockHeight)
  32. // make sure query is fine
  33. resQuery := app.Query(types.RequestQuery{
  34. Path: "/store",
  35. Data: []byte(key),
  36. })
  37. require.Equal(t, code.CodeTypeOK, resQuery.Code)
  38. require.Equal(t, key, string(resQuery.Key))
  39. require.Equal(t, value, string(resQuery.Value))
  40. require.EqualValues(t, info.LastBlockHeight, resQuery.Height)
  41. // make sure proof is fine
  42. resQuery = app.Query(types.RequestQuery{
  43. Path: "/store",
  44. Data: []byte(key),
  45. Prove: true,
  46. })
  47. require.EqualValues(t, code.CodeTypeOK, resQuery.Code)
  48. require.Equal(t, key, string(resQuery.Key))
  49. require.Equal(t, value, string(resQuery.Value))
  50. require.EqualValues(t, info.LastBlockHeight, resQuery.Height)
  51. }
  52. func TestKVStoreKV(t *testing.T) {
  53. kvstore := NewApplication()
  54. key := testKey
  55. value := key
  56. tx := []byte(key)
  57. testKVStore(t, kvstore, tx, key, value)
  58. value = testValue
  59. tx = []byte(key + "=" + value)
  60. testKVStore(t, kvstore, tx, key, value)
  61. }
  62. func TestPersistentKVStoreKV(t *testing.T) {
  63. dir, err := ioutil.TempDir("/tmp", "abci-kvstore-test") // TODO
  64. if err != nil {
  65. t.Fatal(err)
  66. }
  67. kvstore := NewPersistentKVStoreApplication(dir)
  68. key := testKey
  69. value := key
  70. tx := []byte(key)
  71. testKVStore(t, kvstore, tx, key, value)
  72. value = testValue
  73. tx = []byte(key + "=" + value)
  74. testKVStore(t, kvstore, tx, key, value)
  75. }
  76. func TestPersistentKVStoreInfo(t *testing.T) {
  77. dir, err := ioutil.TempDir("/tmp", "abci-kvstore-test") // TODO
  78. if err != nil {
  79. t.Fatal(err)
  80. }
  81. kvstore := NewPersistentKVStoreApplication(dir)
  82. InitKVStore(kvstore)
  83. height := int64(0)
  84. resInfo := kvstore.Info(types.RequestInfo{})
  85. if resInfo.LastBlockHeight != height {
  86. t.Fatalf("expected height of %d, got %d", height, resInfo.LastBlockHeight)
  87. }
  88. // make and apply block
  89. height = int64(1)
  90. hash := []byte("foo")
  91. header := tmproto.Header{
  92. Height: height,
  93. }
  94. kvstore.BeginBlock(types.RequestBeginBlock{Hash: hash, Header: header})
  95. kvstore.EndBlock(types.RequestEndBlock{Height: header.Height})
  96. kvstore.Commit()
  97. resInfo = kvstore.Info(types.RequestInfo{})
  98. if resInfo.LastBlockHeight != height {
  99. t.Fatalf("expected height of %d, got %d", height, resInfo.LastBlockHeight)
  100. }
  101. }
  102. // add a validator, remove a validator, update a validator
  103. func TestValUpdates(t *testing.T) {
  104. dir, err := ioutil.TempDir("/tmp", "abci-kvstore-test") // TODO
  105. if err != nil {
  106. t.Fatal(err)
  107. }
  108. kvstore := NewPersistentKVStoreApplication(dir)
  109. // init with some validators
  110. total := 10
  111. nInit := 5
  112. vals := RandVals(total)
  113. // iniitalize with the first nInit
  114. kvstore.InitChain(types.RequestInitChain{
  115. Validators: vals[:nInit],
  116. })
  117. vals1, vals2 := vals[:nInit], kvstore.Validators()
  118. valsEqual(t, vals1, vals2)
  119. var v1, v2, v3 types.ValidatorUpdate
  120. // add some validators
  121. v1, v2 = vals[nInit], vals[nInit+1]
  122. diff := []types.ValidatorUpdate{v1, v2}
  123. tx1 := MakeValSetChangeTx(v1.PubKey, v1.Power)
  124. tx2 := MakeValSetChangeTx(v2.PubKey, v2.Power)
  125. makeApplyBlock(t, kvstore, 1, diff, tx1, tx2)
  126. vals1, vals2 = vals[:nInit+2], kvstore.Validators()
  127. valsEqual(t, vals1, vals2)
  128. // remove some validators
  129. v1, v2, v3 = vals[nInit-2], vals[nInit-1], vals[nInit]
  130. v1.Power = 0
  131. v2.Power = 0
  132. v3.Power = 0
  133. diff = []types.ValidatorUpdate{v1, v2, v3}
  134. tx1 = MakeValSetChangeTx(v1.PubKey, v1.Power)
  135. tx2 = MakeValSetChangeTx(v2.PubKey, v2.Power)
  136. tx3 := MakeValSetChangeTx(v3.PubKey, v3.Power)
  137. makeApplyBlock(t, kvstore, 2, diff, tx1, tx2, tx3)
  138. vals1 = append(vals[:nInit-2], vals[nInit+1]) // nolint: gocritic
  139. vals2 = kvstore.Validators()
  140. valsEqual(t, vals1, vals2)
  141. // update some validators
  142. v1 = vals[0]
  143. if v1.Power == 5 {
  144. v1.Power = 6
  145. } else {
  146. v1.Power = 5
  147. }
  148. diff = []types.ValidatorUpdate{v1}
  149. tx1 = MakeValSetChangeTx(v1.PubKey, v1.Power)
  150. makeApplyBlock(t, kvstore, 3, diff, tx1)
  151. vals1 = append([]types.ValidatorUpdate{v1}, vals1[1:]...)
  152. vals2 = kvstore.Validators()
  153. valsEqual(t, vals1, vals2)
  154. }
  155. func makeApplyBlock(
  156. t *testing.T,
  157. kvstore types.Application,
  158. heightInt int,
  159. diff []types.ValidatorUpdate,
  160. txs ...[]byte) {
  161. // make and apply block
  162. height := int64(heightInt)
  163. hash := []byte("foo")
  164. header := tmproto.Header{
  165. Height: height,
  166. }
  167. kvstore.BeginBlock(types.RequestBeginBlock{Hash: hash, Header: header})
  168. for _, tx := range txs {
  169. if r := kvstore.DeliverTx(types.RequestDeliverTx{Tx: tx}); r.IsErr() {
  170. t.Fatal(r)
  171. }
  172. }
  173. resEndBlock := kvstore.EndBlock(types.RequestEndBlock{Height: header.Height})
  174. kvstore.Commit()
  175. valsEqual(t, diff, resEndBlock.ValidatorUpdates)
  176. }
  177. // order doesn't matter
  178. func valsEqual(t *testing.T, vals1, vals2 []types.ValidatorUpdate) {
  179. if len(vals1) != len(vals2) {
  180. t.Fatalf("vals dont match in len. got %d, expected %d", len(vals2), len(vals1))
  181. }
  182. sort.Sort(types.ValidatorUpdates(vals1))
  183. sort.Sort(types.ValidatorUpdates(vals2))
  184. for i, v1 := range vals1 {
  185. v2 := vals2[i]
  186. if !bytes.Equal(v1.PubKey.Data, v2.PubKey.Data) ||
  187. v1.Power != v2.Power {
  188. t.Fatalf("vals dont match at index %d. got %X/%d , expected %X/%d", i, v2.PubKey, v2.Power, v1.PubKey, v1.Power)
  189. }
  190. }
  191. }
  192. func makeSocketClientServer(app types.Application, name string) (abcicli.Client, service.Service, error) {
  193. // Start the listener
  194. socket := fmt.Sprintf("unix://%s.sock", name)
  195. logger := log.TestingLogger()
  196. server := abciserver.NewSocketServer(socket, app)
  197. server.SetLogger(logger.With("module", "abci-server"))
  198. if err := server.Start(); err != nil {
  199. return nil, nil, err
  200. }
  201. // Connect to the socket
  202. client := abcicli.NewSocketClient(socket, false)
  203. client.SetLogger(logger.With("module", "abci-client"))
  204. if err := client.Start(); err != nil {
  205. server.Stop()
  206. return nil, nil, err
  207. }
  208. return client, server, nil
  209. }
  210. func makeGRPCClientServer(app types.Application, name string) (abcicli.Client, service.Service, error) {
  211. // Start the listener
  212. socket := fmt.Sprintf("unix://%s.sock", name)
  213. logger := log.TestingLogger()
  214. gapp := types.NewGRPCApplication(app)
  215. server := abciserver.NewGRPCServer(socket, gapp)
  216. server.SetLogger(logger.With("module", "abci-server"))
  217. if err := server.Start(); err != nil {
  218. return nil, nil, err
  219. }
  220. client := abcicli.NewGRPCClient(socket, true)
  221. client.SetLogger(logger.With("module", "abci-client"))
  222. if err := client.Start(); err != nil {
  223. server.Stop()
  224. return nil, nil, err
  225. }
  226. return client, server, nil
  227. }
  228. func TestClientServer(t *testing.T) {
  229. // set up socket app
  230. kvstore := NewApplication()
  231. client, server, err := makeSocketClientServer(kvstore, "kvstore-socket")
  232. require.NoError(t, err)
  233. defer server.Stop()
  234. defer client.Stop()
  235. runClientTests(t, client)
  236. // set up grpc app
  237. kvstore = NewApplication()
  238. gclient, gserver, err := makeGRPCClientServer(kvstore, "kvstore-grpc")
  239. require.NoError(t, err)
  240. defer gserver.Stop()
  241. defer gclient.Stop()
  242. runClientTests(t, gclient)
  243. }
  244. func runClientTests(t *testing.T, client abcicli.Client) {
  245. // run some tests....
  246. key := testKey
  247. value := key
  248. tx := []byte(key)
  249. testClient(t, client, tx, key, value)
  250. value = testValue
  251. tx = []byte(key + "=" + value)
  252. testClient(t, client, tx, key, value)
  253. }
  254. func testClient(t *testing.T, app abcicli.Client, tx []byte, key, value string) {
  255. ar, err := app.DeliverTxSync(types.RequestDeliverTx{Tx: tx})
  256. require.NoError(t, err)
  257. require.False(t, ar.IsErr(), ar)
  258. // repeating tx doesn't raise error
  259. ar, err = app.DeliverTxSync(types.RequestDeliverTx{Tx: tx})
  260. require.NoError(t, err)
  261. require.False(t, ar.IsErr(), ar)
  262. // commit
  263. _, err = app.CommitSync()
  264. require.NoError(t, err)
  265. info, err := app.InfoSync(types.RequestInfo{})
  266. require.NoError(t, err)
  267. require.NotZero(t, info.LastBlockHeight)
  268. // make sure query is fine
  269. resQuery, err := app.QuerySync(types.RequestQuery{
  270. Path: "/store",
  271. Data: []byte(key),
  272. })
  273. require.Nil(t, err)
  274. require.Equal(t, code.CodeTypeOK, resQuery.Code)
  275. require.Equal(t, key, string(resQuery.Key))
  276. require.Equal(t, value, string(resQuery.Value))
  277. require.EqualValues(t, info.LastBlockHeight, resQuery.Height)
  278. // make sure proof is fine
  279. resQuery, err = app.QuerySync(types.RequestQuery{
  280. Path: "/store",
  281. Data: []byte(key),
  282. Prove: true,
  283. })
  284. require.Nil(t, err)
  285. require.Equal(t, code.CodeTypeOK, resQuery.Code)
  286. require.Equal(t, key, string(resQuery.Key))
  287. require.Equal(t, value, string(resQuery.Value))
  288. require.EqualValues(t, info.LastBlockHeight, resQuery.Height)
  289. }