client_cache_test.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package test
  2. import (
  3. "fmt"
  4. "testing"
  5. "github.com/ethereum/go-ethereum/common"
  6. "github.com/ethereum/go-ethereum/core/rawdb"
  7. "github.com/ethereum/go-ethereum/private/cache"
  8. "github.com/ethereum/go-ethereum/private/engine"
  9. "github.com/ethereum/go-ethereum/private/engine/qlightptm"
  10. "github.com/ethereum/go-ethereum/qlight"
  11. "github.com/golang/mock/gomock"
  12. gocache "github.com/patrickmn/go-cache"
  13. "github.com/stretchr/testify/assert"
  14. )
  15. func TestClientCache_AddPrivateBlock(t *testing.T) {
  16. assert := assert.New(t)
  17. ctrl := gomock.NewController(t)
  18. defer ctrl.Finish()
  19. memDB := rawdb.NewMemoryDatabase()
  20. cacheWithEmpty := NewMockCacheWithEmpty(ctrl)
  21. gocache := gocache.New(cache.DefaultExpiration, cache.CleanupInterval)
  22. clientCache, _ := qlight.NewClientCacheWithEmpty(memDB, cacheWithEmpty, gocache)
  23. txHash1 := common.BytesToEncryptedPayloadHash([]byte("TXHash1"))
  24. ptd1 := qlight.PrivateTransactionData{
  25. Hash: &txHash1,
  26. Payload: []byte("payload"),
  27. Extra: &engine.ExtraMetadata{
  28. ACHashes: nil,
  29. ACMerkleRoot: common.Hash{},
  30. PrivacyFlag: 0,
  31. ManagedParties: nil,
  32. Sender: "",
  33. MandatoryRecipients: nil,
  34. },
  35. IsSender: false,
  36. }
  37. blockPrivateData := qlight.BlockPrivateData{
  38. BlockHash: common.StringToHash("BlockHash"),
  39. PSI: "",
  40. PrivateStateRoot: common.StringToHash("PrivateStateRoot"),
  41. PrivateTransactions: []qlight.PrivateTransactionData{ptd1},
  42. }
  43. var capturedCacheItem *qlightptm.CachablePrivateTransactionData
  44. cacheWithEmpty.EXPECT().Cache(gomock.Any()).DoAndReturn(func(privateTxData *qlightptm.CachablePrivateTransactionData) error {
  45. capturedCacheItem = privateTxData
  46. return nil
  47. })
  48. clientCache.AddPrivateBlock(blockPrivateData)
  49. assert.Equal(fmt.Sprintf("0x%x", ptd1.Payload), capturedCacheItem.QuorumPrivateTxData.Payload)
  50. assert.Equal(ptd1.Hash, &capturedCacheItem.Hash)
  51. psr, _ := gocache.Get(blockPrivateData.BlockHash.ToBase64())
  52. assert.Equal(blockPrivateData.PrivateStateRoot.ToBase64(), psr)
  53. }
  54. func TestClientCache_ValidatePrivateStateRootSuccess(t *testing.T) {
  55. assert := assert.New(t)
  56. ctrl := gomock.NewController(t)
  57. defer ctrl.Finish()
  58. memDB := rawdb.NewMemoryDatabase()
  59. cacheWithEmpty := NewMockCacheWithEmpty(ctrl)
  60. gocache := gocache.New(cache.DefaultExpiration, cache.CleanupInterval)
  61. clientCache, _ := qlight.NewClientCacheWithEmpty(memDB, cacheWithEmpty, gocache)
  62. publicStateRoot := common.StringToHash("PublicStateRoot")
  63. blockPrivateData := qlight.BlockPrivateData{
  64. BlockHash: common.StringToHash("BlockHash"),
  65. PSI: "",
  66. PrivateStateRoot: common.StringToHash("PrivateStateRoot"),
  67. PrivateTransactions: []qlight.PrivateTransactionData{},
  68. }
  69. clientCache.AddPrivateBlock(blockPrivateData)
  70. rawdb.WritePrivateStateRoot(memDB, publicStateRoot, blockPrivateData.PrivateStateRoot)
  71. err := clientCache.ValidatePrivateStateRoot(blockPrivateData.BlockHash, publicStateRoot)
  72. assert.Nil(err)
  73. }
  74. func TestClientCache_ValidatePrivateStateRootMismatch(t *testing.T) {
  75. assert := assert.New(t)
  76. ctrl := gomock.NewController(t)
  77. defer ctrl.Finish()
  78. memDB := rawdb.NewMemoryDatabase()
  79. cacheWithEmpty := NewMockCacheWithEmpty(ctrl)
  80. gocache := gocache.New(cache.DefaultExpiration, cache.CleanupInterval)
  81. clientCache, _ := qlight.NewClientCacheWithEmpty(memDB, cacheWithEmpty, gocache)
  82. publicStateRoot := common.StringToHash("PublicStateRoot")
  83. blockPrivateData := qlight.BlockPrivateData{
  84. BlockHash: common.StringToHash("BlockHash"),
  85. PSI: "",
  86. PrivateStateRoot: common.StringToHash("PrivateStateRoot"),
  87. PrivateTransactions: []qlight.PrivateTransactionData{},
  88. }
  89. clientCache.AddPrivateBlock(blockPrivateData)
  90. rawdb.WritePrivateStateRoot(memDB, publicStateRoot, common.StringToHash("Mismatch"))
  91. err := clientCache.ValidatePrivateStateRoot(blockPrivateData.BlockHash, publicStateRoot)
  92. assert.Error(err)
  93. }
  94. func TestClientCache_ValidatePrivateStateRootNoDataInClientCache(t *testing.T) {
  95. assert := assert.New(t)
  96. ctrl := gomock.NewController(t)
  97. defer ctrl.Finish()
  98. memDB := rawdb.NewMemoryDatabase()
  99. cacheWithEmpty := NewMockCacheWithEmpty(ctrl)
  100. gocache := gocache.New(cache.DefaultExpiration, cache.CleanupInterval)
  101. clientCache, _ := qlight.NewClientCacheWithEmpty(memDB, cacheWithEmpty, gocache)
  102. publicStateRoot := common.StringToHash("PublicStateRoot")
  103. blockPrivateData := qlight.BlockPrivateData{
  104. BlockHash: common.StringToHash("BlockHash"),
  105. PSI: "",
  106. PrivateStateRoot: common.StringToHash("PrivateStateRoot"),
  107. PrivateTransactions: []qlight.PrivateTransactionData{},
  108. }
  109. rawdb.WritePrivateStateRoot(memDB, publicStateRoot, blockPrivateData.PrivateStateRoot)
  110. err := clientCache.ValidatePrivateStateRoot(blockPrivateData.BlockHash, publicStateRoot)
  111. assert.Nil(err)
  112. }