flags_test.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. // Copyright 2019 The go-ethereum Authors
  2. // This file is part of go-ethereum.
  3. //
  4. // go-ethereum is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // go-ethereum is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU General Public License
  15. // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
  16. // Package utils contains internal helper functions for go-ethereum commands.
  17. package utils
  18. import (
  19. "flag"
  20. "io/ioutil"
  21. "os"
  22. "path"
  23. "reflect"
  24. "strconv"
  25. "testing"
  26. "time"
  27. "github.com/ethereum/go-ethereum/common"
  28. "github.com/ethereum/go-ethereum/eth"
  29. "github.com/ethereum/go-ethereum/node"
  30. "github.com/stretchr/testify/assert"
  31. "github.com/stretchr/testify/require"
  32. "gopkg.in/urfave/cli.v1"
  33. )
  34. func TestAuthorizationList(t *testing.T) {
  35. value := "1=" + common.HexToHash("0xfa").Hex() + ",2=" + common.HexToHash("0x12").Hex()
  36. result := map[uint64]common.Hash{
  37. 1: common.HexToHash("0xfa"),
  38. 2: common.HexToHash("0x12"),
  39. }
  40. arbitraryNodeConfig := &eth.Config{}
  41. fs := &flag.FlagSet{}
  42. fs.String(AuthorizationListFlag.Name, value, "")
  43. arbitraryCLIContext := cli.NewContext(nil, fs, nil)
  44. arbitraryCLIContext.GlobalSet(AuthorizationListFlag.Name, value)
  45. setAuthorizationList(arbitraryCLIContext, arbitraryNodeConfig)
  46. assert.Equal(t, result, arbitraryNodeConfig.AuthorizationList)
  47. fs = &flag.FlagSet{}
  48. fs.String(AuthorizationListFlag.Name, value, "")
  49. arbitraryCLIContext = cli.NewContext(nil, fs, nil)
  50. arbitraryCLIContext.GlobalSet(DeprecatedAuthorizationListFlag.Name, value) // old wlist flag
  51. setAuthorizationList(arbitraryCLIContext, arbitraryNodeConfig)
  52. assert.Equal(t, result, arbitraryNodeConfig.AuthorizationList)
  53. }
  54. func TestSetPlugins_whenPluginsNotEnabled(t *testing.T) {
  55. arbitraryNodeConfig := &node.Config{}
  56. arbitraryCLIContext := cli.NewContext(nil, &flag.FlagSet{}, nil)
  57. assert.NoError(t, SetPlugins(arbitraryCLIContext, arbitraryNodeConfig))
  58. assert.Nil(t, arbitraryNodeConfig.Plugins)
  59. }
  60. func TestSetPlugins_whenInvalidFlagsCombination(t *testing.T) {
  61. arbitraryNodeConfig := &node.Config{}
  62. fs := &flag.FlagSet{}
  63. fs.String(PluginSettingsFlag.Name, "", "")
  64. fs.Bool(PluginSkipVerifyFlag.Name, true, "")
  65. fs.Bool(PluginLocalVerifyFlag.Name, true, "")
  66. fs.String(PluginPublicKeyFlag.Name, "", "")
  67. arbitraryCLIContext := cli.NewContext(nil, fs, nil)
  68. assert.NoError(t, arbitraryCLIContext.GlobalSet(PluginSettingsFlag.Name, "arbitrary value"))
  69. verifyErrorMessage(t, arbitraryCLIContext, arbitraryNodeConfig, "only --plugins.skipverify or --plugins.localverify must be set")
  70. assert.NoError(t, arbitraryCLIContext.GlobalSet(PluginSkipVerifyFlag.Name, "false"))
  71. assert.NoError(t, arbitraryCLIContext.GlobalSet(PluginLocalVerifyFlag.Name, "false"))
  72. assert.NoError(t, arbitraryCLIContext.GlobalSet(PluginPublicKeyFlag.Name, "arbitrary value"))
  73. verifyErrorMessage(t, arbitraryCLIContext, arbitraryNodeConfig, "--plugins.localverify is required for setting --plugins.publickey")
  74. }
  75. func TestSetPlugins_whenInvalidPluginSettingsURL(t *testing.T) {
  76. arbitraryNodeConfig := &node.Config{}
  77. fs := &flag.FlagSet{}
  78. fs.String(PluginSettingsFlag.Name, "", "")
  79. arbitraryCLIContext := cli.NewContext(nil, fs, nil)
  80. assert.NoError(t, arbitraryCLIContext.GlobalSet(PluginSettingsFlag.Name, "arbitrary value"))
  81. verifyErrorMessage(t, arbitraryCLIContext, arbitraryNodeConfig, "plugins: unable to create reader due to unsupported scheme ")
  82. }
  83. func TestSetImmutabilityThreshold(t *testing.T) {
  84. fs := &flag.FlagSet{}
  85. fs.Int(QuorumImmutabilityThreshold.Name, 0, "")
  86. arbitraryCLIContext := cli.NewContext(nil, fs, nil)
  87. assert.NoError(t, arbitraryCLIContext.GlobalSet(QuorumImmutabilityThreshold.Name, strconv.Itoa(100000)))
  88. assert.True(t, arbitraryCLIContext.GlobalIsSet(QuorumImmutabilityThreshold.Name), "immutability threshold flag not set")
  89. assert.Equal(t, 100000, arbitraryCLIContext.GlobalInt(QuorumImmutabilityThreshold.Name), "immutability threshold value not set")
  90. }
  91. func TestSetPlugins_whenTypical(t *testing.T) {
  92. tmpDir, err := ioutil.TempDir("", "q-")
  93. if err != nil {
  94. t.Fatal(err)
  95. }
  96. defer func() {
  97. _ = os.RemoveAll(tmpDir)
  98. }()
  99. arbitraryJSONFile := path.Join(tmpDir, "arbitary.json")
  100. if err := ioutil.WriteFile(arbitraryJSONFile, []byte("{}"), 0644); err != nil {
  101. t.Fatal(err)
  102. }
  103. arbitraryNodeConfig := &node.Config{}
  104. fs := &flag.FlagSet{}
  105. fs.String(PluginSettingsFlag.Name, "", "")
  106. arbitraryCLIContext := cli.NewContext(nil, fs, nil)
  107. assert.NoError(t, arbitraryCLIContext.GlobalSet(PluginSettingsFlag.Name, "file://"+arbitraryJSONFile))
  108. assert.NoError(t, SetPlugins(arbitraryCLIContext, arbitraryNodeConfig))
  109. assert.NotNil(t, arbitraryNodeConfig.Plugins)
  110. }
  111. func verifyErrorMessage(t *testing.T, ctx *cli.Context, cfg *node.Config, expectedMsg string) {
  112. err := SetPlugins(ctx, cfg)
  113. assert.EqualError(t, err, expectedMsg)
  114. }
  115. func Test_SplitTagsFlag(t *testing.T) {
  116. tests := []struct {
  117. name string
  118. args string
  119. want map[string]string
  120. }{
  121. {
  122. "2 tags case",
  123. "host=localhost,bzzkey=123",
  124. map[string]string{
  125. "host": "localhost",
  126. "bzzkey": "123",
  127. },
  128. },
  129. {
  130. "1 tag case",
  131. "host=localhost123",
  132. map[string]string{
  133. "host": "localhost123",
  134. },
  135. },
  136. {
  137. "empty case",
  138. "",
  139. map[string]string{},
  140. },
  141. {
  142. "garbage",
  143. "smth=smthelse=123",
  144. map[string]string{},
  145. },
  146. }
  147. for _, tt := range tests {
  148. t.Run(tt.name, func(t *testing.T) {
  149. if got := SplitTagsFlag(tt.args); !reflect.DeepEqual(got, tt.want) {
  150. t.Errorf("splitTagsFlag() = %v, want %v", got, tt.want)
  151. }
  152. })
  153. }
  154. }
  155. func TestQuorumConfigFlags(t *testing.T) {
  156. fs := &flag.FlagSet{}
  157. arbitraryCLIContext := cli.NewContext(nil, fs, nil)
  158. arbitraryEthConfig := &eth.Config{}
  159. fs.Int(EVMCallTimeOutFlag.Name, 0, "")
  160. assert.NoError(t, arbitraryCLIContext.GlobalSet(EVMCallTimeOutFlag.Name, strconv.Itoa(12)))
  161. fs.Bool(MultitenancyFlag.Name, false, "")
  162. assert.NoError(t, arbitraryCLIContext.GlobalSet(MultitenancyFlag.Name, "true"))
  163. fs.Bool(QuorumEnablePrivacyMarker.Name, true, "")
  164. assert.NoError(t, arbitraryCLIContext.GlobalSet(QuorumEnablePrivacyMarker.Name, "true"))
  165. fs.Uint64(IstanbulRequestTimeoutFlag.Name, 0, "")
  166. assert.NoError(t, arbitraryCLIContext.GlobalSet(IstanbulRequestTimeoutFlag.Name, "23"))
  167. fs.Uint64(IstanbulBlockPeriodFlag.Name, 0, "")
  168. assert.NoError(t, arbitraryCLIContext.GlobalSet(IstanbulBlockPeriodFlag.Name, "34"))
  169. fs.Bool(RaftModeFlag.Name, false, "")
  170. assert.NoError(t, arbitraryCLIContext.GlobalSet(RaftModeFlag.Name, "true"))
  171. require.NoError(t, setQuorumConfig(arbitraryCLIContext, arbitraryEthConfig))
  172. assert.True(t, arbitraryCLIContext.GlobalIsSet(EVMCallTimeOutFlag.Name), "EVMCallTimeOutFlag not set")
  173. assert.True(t, arbitraryCLIContext.GlobalIsSet(MultitenancyFlag.Name), "MultitenancyFlag not set")
  174. assert.True(t, arbitraryCLIContext.GlobalIsSet(RaftModeFlag.Name), "RaftModeFlag not set")
  175. assert.Equal(t, 12*time.Second, arbitraryEthConfig.EVMCallTimeOut, "EVMCallTimeOut value is incorrect")
  176. assert.Equal(t, true, arbitraryEthConfig.QuorumChainConfig.MultiTenantEnabled(), "MultitenancyFlag value is incorrect")
  177. assert.Equal(t, true, arbitraryEthConfig.QuorumChainConfig.PrivacyMarkerEnabled(), "QuorumEnablePrivacyMarker value is incorrect")
  178. config := arbitraryEthConfig.Istanbul.GetConfig(nil)
  179. assert.Equal(t, uint64(23), config.RequestTimeout, "IstanbulRequestTimeoutFlag value is incorrect")
  180. assert.Equal(t, uint64(34), config.BlockPeriod, "IstanbulBlockPeriodFlag value is incorrect")
  181. assert.Equal(t, uint64(0), config.EmptyBlockPeriod, "IstanbulEmptyBlockPeriodFlag value is incorrect")
  182. assert.Equal(t, true, arbitraryEthConfig.RaftMode, "RaftModeFlag value is incorrect")
  183. }