caching_proxy_test.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. package qlightptm
  2. import (
  3. "fmt"
  4. "testing"
  5. "github.com/ethereum/go-ethereum/common"
  6. "github.com/ethereum/go-ethereum/private/engine"
  7. "github.com/ethereum/go-ethereum/rpc"
  8. "github.com/golang/mock/gomock"
  9. "github.com/stretchr/testify/assert"
  10. )
  11. func TestCachingProxy_ReceiveWithDataAvailableInCache(t *testing.T) {
  12. assert := assert.New(t)
  13. cpTM := New()
  14. cpTM.Cache(&CachablePrivateTransactionData{
  15. Hash: common.BytesToEncryptedPayloadHash([]byte("encryptedpayloadhash1")),
  16. QuorumPrivateTxData: engine.QuorumPayloadExtra{
  17. Payload: fmt.Sprintf("0x%x", []byte("payload")),
  18. ExtraMetaData: &engine.ExtraMetadata{
  19. ACHashes: nil,
  20. ACMerkleRoot: common.Hash{},
  21. PrivacyFlag: 0,
  22. ManagedParties: nil,
  23. Sender: "sender1",
  24. MandatoryRecipients: nil,
  25. },
  26. IsSender: false,
  27. },
  28. })
  29. cpTM.Cache(&CachablePrivateTransactionData{
  30. Hash: common.BytesToEncryptedPayloadHash([]byte("encryptedpayloadhash2")),
  31. QuorumPrivateTxData: engine.QuorumPayloadExtra{
  32. Payload: fmt.Sprintf("0x%x", []byte("payload")),
  33. ExtraMetaData: &engine.ExtraMetadata{
  34. ACHashes: nil,
  35. ACMerkleRoot: common.Hash{},
  36. PrivacyFlag: 0,
  37. ManagedParties: nil,
  38. Sender: "sender2",
  39. MandatoryRecipients: nil,
  40. },
  41. IsSender: true,
  42. },
  43. })
  44. sender, _, payload, extraMetaData, err := cpTM.Receive(common.BytesToEncryptedPayloadHash([]byte("encryptedpayloadhash1")))
  45. assert.Nil(err)
  46. assert.Equal("sender1", sender)
  47. assert.Equal([]byte("payload"), payload)
  48. assert.NotNil(extraMetaData)
  49. isSender, err := cpTM.IsSender(common.BytesToEncryptedPayloadHash([]byte("encryptedpayloadhash1")))
  50. assert.Nil(err)
  51. assert.False(isSender)
  52. isSender, err = cpTM.IsSender(common.BytesToEncryptedPayloadHash([]byte("encryptedpayloadhash2")))
  53. assert.Nil(err)
  54. assert.True(isSender)
  55. }
  56. func TestCachingProxy_ReceiveWithDataNotAvailableInCache(t *testing.T) {
  57. assert := assert.New(t)
  58. cpTM := New()
  59. cpTM.CheckAndAddEmptyToCache(common.BytesToEncryptedPayloadHash([]byte("encryptedpayloadhash1")))
  60. _, _, payload, extraMetaData, err := cpTM.Receive(common.BytesToEncryptedPayloadHash([]byte("encryptedpayloadhash1")))
  61. assert.Nil(err)
  62. assert.Nil(payload)
  63. assert.Nil(extraMetaData)
  64. isSender, err := cpTM.IsSender(common.BytesToEncryptedPayloadHash([]byte("encryptedpayloadhash1")))
  65. assert.Nil(err)
  66. assert.False(isSender)
  67. }
  68. func TestCachingProxy_ReceiveWithDataMissingFromCacheAvailableRemotely(t *testing.T) {
  69. assert := assert.New(t)
  70. ctrl := gomock.NewController(t)
  71. defer ctrl.Finish()
  72. cpTM := New()
  73. mockRPCClient := NewMockRPCClientCaller(ctrl)
  74. mockRPCClient.EXPECT().Call(gomock.Any(), gomock.Eq("eth_getQuorumPayloadExtra"),
  75. gomock.Eq(common.BytesToEncryptedPayloadHash([]byte("encryptedpayloadhash1")).Hex())).DoAndReturn(
  76. func(result interface{}, method string, args ...interface{}) error {
  77. res, _ := result.(*engine.QuorumPayloadExtra)
  78. res.IsSender = false
  79. res.ExtraMetaData = &engine.ExtraMetadata{
  80. ACHashes: nil,
  81. ACMerkleRoot: common.Hash{},
  82. PrivacyFlag: 0,
  83. ManagedParties: nil,
  84. Sender: "sender1",
  85. MandatoryRecipients: nil,
  86. }
  87. res.Payload = fmt.Sprintf("0x%x", []byte("payload"))
  88. return nil
  89. })
  90. cpTM.SetRPCClientCaller(mockRPCClient)
  91. sender, _, payload, extraMetaData, err := cpTM.Receive(common.BytesToEncryptedPayloadHash([]byte("encryptedpayloadhash1")))
  92. assert.Nil(err)
  93. assert.Equal("sender1", sender)
  94. assert.Equal([]byte("payload"), payload)
  95. assert.NotNil(extraMetaData)
  96. }
  97. func TestCachingProxy_ReceiveWithDataMissingFromCacheUnavailableRemotely(t *testing.T) {
  98. assert := assert.New(t)
  99. ctrl := gomock.NewController(t)
  100. defer ctrl.Finish()
  101. cpTM := New()
  102. mockRPCClient := NewMockRPCClientCaller(ctrl)
  103. mockRPCClient.EXPECT().Call(gomock.Any(), gomock.Eq("eth_getQuorumPayloadExtra"),
  104. gomock.Eq(common.BytesToEncryptedPayloadHash([]byte("encryptedpayloadhash1")).Hex())).Return(nil)
  105. cpTM.SetRPCClientCaller(mockRPCClient)
  106. sender, _, payload, extraMetaData, err := cpTM.Receive(common.BytesToEncryptedPayloadHash([]byte("encryptedpayloadhash1")))
  107. assert.Nil(err)
  108. assert.Equal("", sender)
  109. assert.Nil(payload)
  110. assert.Nil(extraMetaData)
  111. }
  112. func TestCachingProxy_ReceiveWithDataMissingFromCacheAndRPCError(t *testing.T) {
  113. assert := assert.New(t)
  114. ctrl := gomock.NewController(t)
  115. defer ctrl.Finish()
  116. cpTM := New()
  117. mockRPCClient := NewMockRPCClientCaller(ctrl)
  118. mockRPCClient.EXPECT().Call(gomock.Any(), gomock.Eq("eth_getQuorumPayloadExtra"),
  119. gomock.Eq(common.BytesToEncryptedPayloadHash([]byte("encryptedpayloadhash1")).Hex())).Return(fmt.Errorf("RPC Error"))
  120. cpTM.SetRPCClientCaller(mockRPCClient)
  121. _, _, _, _, err := cpTM.Receive(common.BytesToEncryptedPayloadHash([]byte("encryptedpayloadhash1")))
  122. assert.EqualError(err, "RPC Error")
  123. }
  124. func TestCachingProxy_DecryptPayloadSuccess(t *testing.T) {
  125. assert := assert.New(t)
  126. ctrl := gomock.NewController(t)
  127. defer ctrl.Finish()
  128. cpTM := New()
  129. mockRPCClient := NewMockRPCClientCaller(ctrl)
  130. mockRPCClient.EXPECT().Call(gomock.Any(), gomock.Eq("eth_decryptQuorumPayload"),
  131. gomock.Any()).DoAndReturn(
  132. func(result interface{}, method string, args ...interface{}) error {
  133. res, _ := result.(*engine.QuorumPayloadExtra)
  134. res.IsSender = false
  135. res.ExtraMetaData = &engine.ExtraMetadata{
  136. ACHashes: nil,
  137. ACMerkleRoot: common.Hash{},
  138. PrivacyFlag: 0,
  139. ManagedParties: nil,
  140. Sender: "sender1",
  141. MandatoryRecipients: nil,
  142. }
  143. res.Payload = fmt.Sprintf("0x%x", []byte("payload"))
  144. return nil
  145. })
  146. cpTM.SetRPCClientCaller(mockRPCClient)
  147. payload, extraMetaData, err := cpTM.DecryptPayload(common.DecryptRequest{
  148. SenderKey: []byte("sender1"),
  149. CipherText: []byte("ciphertext"),
  150. CipherTextNonce: []byte("nonce"),
  151. RecipientBoxes: nil,
  152. RecipientNonce: []byte("nonce"),
  153. RecipientKeys: nil,
  154. })
  155. assert.Nil(err)
  156. assert.Equal("sender1", extraMetaData.Sender)
  157. assert.Equal([]byte("payload"), payload)
  158. assert.NotNil(extraMetaData)
  159. }
  160. func TestCachingProxy_DecryptPayloadErrorInCall(t *testing.T) {
  161. assert := assert.New(t)
  162. ctrl := gomock.NewController(t)
  163. defer ctrl.Finish()
  164. cpTM := New()
  165. mockRPCClient := NewMockRPCClientCaller(ctrl)
  166. mockRPCClient.EXPECT().Call(gomock.Any(), gomock.Eq("eth_decryptQuorumPayload"),
  167. gomock.Any()).Return(fmt.Errorf("RPC Error"))
  168. cpTM.SetRPCClientCaller(mockRPCClient)
  169. _, _, err := cpTM.DecryptPayload(common.DecryptRequest{
  170. SenderKey: []byte("sender1"),
  171. CipherText: []byte("ciphertext"),
  172. CipherTextNonce: []byte("nonce"),
  173. RecipientBoxes: nil,
  174. RecipientNonce: []byte("nonce"),
  175. RecipientKeys: nil,
  176. })
  177. assert.EqualError(err, "RPC Error")
  178. }
  179. type HasRPCClient interface {
  180. SetRPCClient(client *rpc.Client)
  181. }
  182. func TestCachingProxy_HasRPCClient(t *testing.T) {
  183. assert := assert.New(t)
  184. var cpTM interface{} = New()
  185. _, ok := cpTM.(HasRPCClient)
  186. assert.True(ok)
  187. }