backend_test.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. package extension
  2. import (
  3. "math/big"
  4. "testing"
  5. "github.com/ethereum/go-ethereum"
  6. "github.com/ethereum/go-ethereum/accounts"
  7. "github.com/ethereum/go-ethereum/common"
  8. "github.com/ethereum/go-ethereum/common/hexutil"
  9. "github.com/ethereum/go-ethereum/core/types"
  10. "github.com/ethereum/go-ethereum/eth"
  11. "github.com/ethereum/go-ethereum/event"
  12. "github.com/ethereum/go-ethereum/internal/ethapi"
  13. "github.com/ethereum/go-ethereum/params"
  14. )
  15. type MockBackend struct {
  16. wallets []accounts.Wallet
  17. }
  18. func (backend *MockBackend) Wallets() []accounts.Wallet {
  19. return backend.wallets
  20. }
  21. func (backend *MockBackend) Subscribe(sink chan<- accounts.WalletEvent) event.Subscription {
  22. return nil
  23. }
  24. type MockWallet struct {
  25. isContained bool
  26. }
  27. func (wallet *MockWallet) URL() accounts.URL { panic("not implemented") }
  28. func (wallet *MockWallet) Status() (string, error) { panic("not implemented") }
  29. func (wallet *MockWallet) Open(passphrase string) error { panic("not implemented") }
  30. func (wallet *MockWallet) Close() error { panic("not implemented") }
  31. func (wallet *MockWallet) Accounts() []accounts.Account { panic("not implemented") }
  32. func (wallet *MockWallet) Contains(account accounts.Account) bool { return wallet.isContained }
  33. func (wallet *MockWallet) Derive(path accounts.DerivationPath, pin bool) (accounts.Account, error) {
  34. panic("not implemented")
  35. }
  36. func (wallet *MockWallet) SelfDerive(bases []accounts.DerivationPath, chain ethereum.ChainStateReader) {
  37. panic("not implemented")
  38. }
  39. func (wallet *MockWallet) SignData(account accounts.Account, mimeType string, data []byte) ([]byte, error) {
  40. panic("not implemented")
  41. }
  42. func (wallet *MockWallet) SignDataWithPassphrase(account accounts.Account, passphrase, mimeType string, data []byte) ([]byte, error) {
  43. panic("not implemented")
  44. }
  45. func (wallet *MockWallet) SignText(account accounts.Account, text []byte) ([]byte, error) {
  46. panic("not implemented")
  47. }
  48. func (wallet *MockWallet) SignTx(account accounts.Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) {
  49. panic("not implemented")
  50. }
  51. func (wallet *MockWallet) SignTxWithPassphrase(account accounts.Account, passphrase string, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) {
  52. panic("not implemented")
  53. }
  54. func (wallet *MockWallet) SignTextWithPassphrase(account accounts.Account, passphrase string, hash []byte) ([]byte, error) {
  55. panic("not implemented")
  56. }
  57. type MockEthAPIBackend struct {
  58. eth.EthAPIBackend
  59. }
  60. func (b *MockEthAPIBackend) IsPrivacyMarkerTransactionCreationEnabled() bool {
  61. return false
  62. }
  63. func TestGenerateTransactionOptionsErrorsWhenNoPrivateParticipants(t *testing.T) {
  64. sendTxArgs := ethapi.SendTxArgs{
  65. From: common.Address{},
  66. }
  67. mockBackend := MockBackend{}
  68. accountManager := accounts.NewManager(&accounts.Config{InsecureUnlockAllowed: true}, &mockBackend)
  69. service := &PrivacyService{
  70. accountManager: accountManager,
  71. }
  72. _, err := service.GenerateTransactOptions(sendTxArgs)
  73. if err == nil {
  74. t.Errorf("expected err to not be nil")
  75. return
  76. }
  77. expectedErr := "must specify private participants"
  78. if err.Error() != expectedErr {
  79. t.Errorf("expected err to be '%s', but was '%s'", expectedErr, err.Error())
  80. }
  81. }
  82. func TestGenerateTransactionOptionsErrorsWhenAccountNotFound(t *testing.T) {
  83. privateTxArgs := ethapi.PrivateTxArgs{PrivateFor: []string{}}
  84. sendTxArgs := ethapi.SendTxArgs{
  85. From: common.Address{},
  86. PrivateTxArgs: privateTxArgs,
  87. }
  88. mockBackend := MockBackend{}
  89. accountManager := accounts.NewManager(&accounts.Config{InsecureUnlockAllowed: true}, &mockBackend)
  90. service := &PrivacyService{
  91. accountManager: accountManager,
  92. }
  93. _, err := service.GenerateTransactOptions(sendTxArgs)
  94. if err == nil {
  95. t.Errorf("expected err to not be nil")
  96. return
  97. }
  98. expectedErr := "no wallet found for account 0x0000000000000000000000000000000000000000"
  99. if err.Error() != expectedErr {
  100. t.Errorf("expected err to be '%s', but was '%s'", expectedErr, err.Error())
  101. }
  102. }
  103. func TestGenerateTransactionOptionsGivesDefaults(t *testing.T) {
  104. from := common.HexToAddress("0x2222222222222222222222222222222222222222")
  105. privateTxArgs := ethapi.PrivateTxArgs{PrivateFor: []string{"privateFor1", "privateFor2"}, PrivateFrom: "privateFrom"}
  106. sendTxArgs := ethapi.SendTxArgs{
  107. From: from,
  108. PrivateTxArgs: privateTxArgs,
  109. }
  110. mockWallet := &MockWallet{isContained: true}
  111. mockBackend := MockBackend{wallets: []accounts.Wallet{mockWallet}}
  112. mockAPIBackendHelper := MockEthAPIBackend{}
  113. accountManager := accounts.NewManager(&accounts.Config{InsecureUnlockAllowed: true}, &mockBackend)
  114. config := params.ChainConfig{
  115. ChainID: big.NewInt(1337),
  116. }
  117. service := &PrivacyService{
  118. accountManager: accountManager,
  119. apiBackendHelper: &mockAPIBackendHelper,
  120. config: &config,
  121. }
  122. generatedOptions, err := service.GenerateTransactOptions(sendTxArgs)
  123. if err != nil {
  124. t.Errorf("expected err to be '%s', but was '%s'", "nil", err.Error())
  125. return
  126. }
  127. if generatedOptions.PrivateFrom != sendTxArgs.PrivateFrom {
  128. t.Errorf("expected PrivateFrom to be '%s', but was '%s'", sendTxArgs.PrivateFrom, generatedOptions.PrivateFrom)
  129. return
  130. }
  131. if len(generatedOptions.PrivateFor) != 2 || generatedOptions.PrivateFor[0] != sendTxArgs.PrivateFor[0] || generatedOptions.PrivateFor[1] != sendTxArgs.PrivateFor[1] {
  132. t.Errorf("expected PrivateFor to be '%s', but was '%s'", sendTxArgs.PrivateFor, generatedOptions.PrivateFor)
  133. return
  134. }
  135. if generatedOptions.GasLimit != 4712384 {
  136. t.Errorf("expected GasLimit to be '%d', but was '%d'", 4712384, generatedOptions.GasLimit)
  137. return
  138. }
  139. if generatedOptions.GasPrice == nil || generatedOptions.GasPrice.Cmp(new(big.Int)) != 0 {
  140. t.Errorf("expected GasLimit to be '%d', but was '%d'", new(big.Int), generatedOptions.GasPrice)
  141. return
  142. }
  143. if generatedOptions.From != from {
  144. t.Errorf("expected From to be '%d', but was '%d'", from, generatedOptions.From)
  145. return
  146. }
  147. }
  148. func TestGenerateTransactionOptionsGivesNonDefaultsWhenSpecified(t *testing.T) {
  149. from := common.HexToAddress("0x2222222222222222222222222222222222222222")
  150. gasLimit := hexutil.Uint64(5000)
  151. gasPrice := hexutil.Big(*big.NewInt(50))
  152. privateTxArgs := ethapi.PrivateTxArgs{PrivateFor: []string{}}
  153. sendTxArgs := ethapi.SendTxArgs{
  154. From: from,
  155. Gas: &gasLimit,
  156. GasPrice: &gasPrice,
  157. PrivateTxArgs: privateTxArgs,
  158. }
  159. mockWallet := &MockWallet{isContained: true}
  160. mockBackend := MockBackend{wallets: []accounts.Wallet{mockWallet}}
  161. mockAPIBackendHelper := MockEthAPIBackend{}
  162. accountManager := accounts.NewManager(&accounts.Config{InsecureUnlockAllowed: true}, &mockBackend)
  163. config := params.ChainConfig{
  164. ChainID: big.NewInt(1337),
  165. }
  166. service := &PrivacyService{
  167. accountManager: accountManager,
  168. apiBackendHelper: &mockAPIBackendHelper,
  169. config: &config,
  170. }
  171. generatedOptions, err := service.GenerateTransactOptions(sendTxArgs)
  172. if err != nil {
  173. t.Errorf("expected err to be '%s', but was '%s'", "nil", err.Error())
  174. return
  175. }
  176. if generatedOptions.GasLimit != 5000 {
  177. t.Errorf("expected GasLimit to be '%d', but was '%d'", 5000, generatedOptions.GasLimit)
  178. return
  179. }
  180. if generatedOptions.GasPrice == nil || generatedOptions.GasPrice.Cmp(big.NewInt(50)) != 0 {
  181. t.Errorf("expected GasLimit to be '%d', but was '%d'", big.NewInt(50), generatedOptions.GasPrice)
  182. return
  183. }
  184. }