github.com/klaytn/klaytn@v1.10.2/cmd/utils/nodecmd/flags_test.go (about)

     1  // Modifications Copyright 2019 The klaytn Authors
     2  // Copyright 2016 The go-ethereum Authors
     3  // This file is part of go-ethereum.
     4  //
     5  // go-ethereum is free software: you can redistribute it and/or modify
     6  // it under the terms of the GNU General Public License as published by
     7  // the Free Software Foundation, either version 3 of the License, or
     8  // (at your option) any later version.
     9  //
    10  // go-ethereum is distributed in the hope that it will be useful,
    11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    13  // GNU General Public License for more details.
    14  //
    15  // You should have received a copy of the GNU General Public License
    16  // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
    17  //
    18  // This file is derived from cmd/geth/genesis_test.go (2018/06/04).
    19  // Modified and improved for the klaytn development.
    20  
    21  package nodecmd
    22  
    23  import (
    24  	"io/ioutil"
    25  	"os"
    26  	"path/filepath"
    27  	"testing"
    28  )
    29  
    30  var genesis = `{"config":{"chainId":2019,"istanbul":{"epoch":30,"policy":2,"sub":13},"unitPrice":25000000000,"deriveShaImpl":2,"governance":{"governingNode":"0xdddfb991127b43e209c2f8ed08b8b3d0b5843d36","governanceMode":"single","reward":{"mintingAmount":9600000000000000000,"ratio":"34/54/12","useGiniCoeff":false,"deferredTxFee":true,"stakingUpdateInterval":60,"proposerUpdateInterval":30,"minimumStake":5000000}}},"timestamp":"0x5ce33d6e","extraData":"0x0000000000000000000000000000000000000000000000000000000000000000f89af85494dddfb991127b43e209c2f8ed08b8b3d0b5843d3694195ba9cc787b00796a7ae6356e5b656d4360353794777fd033b5e3bcaad6006bc9f481ffed6b83cf5a94d473284239f704adccd24647c7ca132992a28973b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","governanceData":null,"blockScore":"0x1","alloc":{"195ba9cc787b00796a7ae6356e5b656d43603537":{"balance":"0x446c3b15f9926687d2c40534fdb564000000000000"},"777fd033b5e3bcaad6006bc9f481ffed6b83cf5a":{"balance":"0x446c3b15f9926687d2c40534fdb564000000000000"},"d473284239f704adccd24647c7ca132992a28973":{"balance":"0x446c3b15f9926687d2c40534fdb564000000000000"},"dddfb991127b43e209c2f8ed08b8b3d0b5843d36":{"balance":"0x446c3b15f9926687d2c40534fdb564000000000000"},"f4316f69d9522667c0674afcd8638288489f0333":{"balance":"0x446c3b15f9926687d2c40534fdb564000000000000"}},"number":"0x0","gasUsed":"0x0","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000"}`
    31  
    32  const (
    33  	FlagTypeBoolean = iota
    34  	FlagTypeArgument
    35  )
    36  
    37  const (
    38  	ErrorIncorrectUsage = iota
    39  	ErrorInvalidValue
    40  	ErrorFatal
    41  	// TODO-Klaytn-Node fix the configuration to filter wrong input flags before the klay server is launched
    42  	NonError // This error case expects an error, but currently it does not filter the wrong value.
    43  )
    44  
    45  var (
    46  	commonThreeErrors = []string{"abcdefg", "1234567", "!@#$%^&"}
    47  	commonTwoErrors   = []string{"abcdefg", "!@#$%^&"}
    48  )
    49  
    50  var flagsWithValues = []struct {
    51  	flag        string
    52  	flagType    uint16
    53  	values      []string
    54  	wrongValues []string
    55  	errors      []int
    56  }{
    57  	// TODO-Klaytn-Node the flag is not defined on any klay binaries
    58  	//{
    59  	//	flag:     "--networktype",
    60  	//	flagType: FlagTypeArgument,
    61  	//	// values: []string{"mn", "scn"},
    62  	//	values: []string{},
    63  	//	wrongValues: []string{"baobab", "abcdefg", "1234567", "!@#$%^&"},
    64  	//	errors: []string{},
    65  	//},
    66  	{
    67  		flag:        "--dbtype",
    68  		flagType:    FlagTypeArgument,
    69  		values:      []string{"LevelDB", "BadgerDB", "MemoryDB", "DynamoDBS3"},
    70  		wrongValues: append(commonThreeErrors, "oracle"),
    71  		errors:      []int{NonError, NonError, NonError, NonError},
    72  	},
    73  	{
    74  		flag:        "--srvtype",
    75  		flagType:    FlagTypeArgument,
    76  		values:      []string{"http", "fasthttp"},
    77  		wrongValues: commonThreeErrors,
    78  		errors:      []int{NonError, NonError, NonError},
    79  	},
    80  	{
    81  		flag:        "--keystore",
    82  		flagType:    FlagTypeArgument,
    83  		values:      []string{""},
    84  		wrongValues: []string{},
    85  		errors:      []int{},
    86  	},
    87  	{
    88  		flag:        "--networkid",
    89  		flagType:    FlagTypeArgument,
    90  		values:      []string{"1", "1000", "1001", "12312"},
    91  		wrongValues: commonTwoErrors,
    92  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
    93  	},
    94  	{
    95  		flag:        "--identity",
    96  		flagType:    FlagTypeArgument,
    97  		values:      []string{"abc", "abde-", "oai121"},
    98  		wrongValues: []string{},
    99  		errors:      []int{},
   100  	},
   101  	//TODO-Klaytn-Node the flag is not defined on any klay binaries
   102  	//{
   103  	//	flag:        "--docroot",
   104  	//	flagType:    FlagTypeBoolean,
   105  	//	values:      []string{},
   106  	//},
   107  	{
   108  		flag:        "--syncmode",
   109  		flagType:    FlagTypeArgument,
   110  		values:      []string{"full"}, //[]string{"fast", "full"},
   111  		wrongValues: commonThreeErrors,
   112  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue, ErrorInvalidValue},
   113  	},
   114  	{
   115  		flag:        "--gcmode",
   116  		flagType:    FlagTypeArgument,
   117  		values:      []string{"full", "archive"},
   118  		wrongValues: commonThreeErrors,
   119  		errors:      []int{ErrorFatal, ErrorFatal, ErrorFatal},
   120  	},
   121  	{
   122  		flag:     "--lightkdf",
   123  		flagType: FlagTypeBoolean,
   124  	},
   125  	{
   126  		flag:     "--txpool.nolocals",
   127  		flagType: FlagTypeBoolean,
   128  	},
   129  	{
   130  		flag:        "--txpool.journal",
   131  		flagType:    FlagTypeArgument,
   132  		values:      []string{"transactions.rlp"},
   133  		wrongValues: []string{},
   134  		errors:      []int{},
   135  	},
   136  	{
   137  		flag:        "--txpool.journal-interval",
   138  		flagType:    FlagTypeArgument,
   139  		values:      []string{"1h0m0s", "0h0m0s", "0h0m1s", "0h1m0s", "0.5h0.5m0.5s"},
   140  		wrongValues: commonThreeErrors,
   141  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue, ErrorInvalidValue},
   142  	},
   143  	{
   144  		flag:        "--txpool.pricelimit",
   145  		flagType:    FlagTypeArgument,
   146  		values:      []string{"1"},
   147  		wrongValues: commonTwoErrors,
   148  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   149  	},
   150  	{
   151  		flag:        "--txpool.pricebump",
   152  		flagType:    FlagTypeArgument,
   153  		values:      []string{"10"},
   154  		wrongValues: commonTwoErrors,
   155  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   156  	},
   157  	{
   158  		flag:        "--txpool.exec-slots.account",
   159  		flagType:    FlagTypeArgument,
   160  		values:      []string{"16"},
   161  		wrongValues: commonTwoErrors,
   162  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   163  	},
   164  	{
   165  		flag:        "--txpool.exec-slots.all",
   166  		flagType:    FlagTypeArgument,
   167  		values:      []string{"4096"},
   168  		wrongValues: commonTwoErrors,
   169  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   170  	},
   171  	{
   172  		flag:        "--txpool.nonexec-slots.account",
   173  		flagType:    FlagTypeArgument,
   174  		values:      []string{"64"},
   175  		wrongValues: commonTwoErrors,
   176  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   177  	},
   178  	{
   179  		flag:        "--txpool.nonexec-slots.all",
   180  		flagType:    FlagTypeArgument,
   181  		values:      []string{"1024"},
   182  		wrongValues: commonTwoErrors,
   183  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   184  	},
   185  	//TODO-Klaytn-Node the flag is not defined on any klay binaries
   186  	//{
   187  	//	flag:        "--txpool.keeplocals",
   188  	//	flagType:    FlagTypeBoolean,
   189  	//	values:      []string{},
   190  	//},
   191  	{
   192  		flag:        "--txpool.lifetime",
   193  		flagType:    FlagTypeArgument,
   194  		values:      []string{"0h20m0s"},
   195  		wrongValues: commonThreeErrors,
   196  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue, ErrorInvalidValue},
   197  	},
   198  	{
   199  		flag:     "--db.single",
   200  		flagType: FlagTypeBoolean,
   201  	},
   202  	{
   203  		flag:     "--db.num-statetrie-shards",
   204  		flagType: FlagTypeArgument,
   205  		// values:    []string{"1", "2"},
   206  		values:      []string{"1"},
   207  		wrongValues: commonTwoErrors,
   208  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   209  	},
   210  	{
   211  		flag:        "--db.leveldb.cache-size",
   212  		flagType:    FlagTypeArgument,
   213  		values:      []string{"768"},
   214  		wrongValues: commonTwoErrors,
   215  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   216  	},
   217  	{
   218  		flag:        "--db.leveldb.compression",
   219  		flagType:    FlagTypeArgument,
   220  		values:      []string{"0", "1", "2", "3"},
   221  		wrongValues: commonTwoErrors,
   222  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   223  	},
   224  	{
   225  		flag:     "--db.leveldb.no-buffer-pool",
   226  		flagType: FlagTypeBoolean,
   227  	},
   228  	{
   229  		flag:     "--db.no-parallel-write",
   230  		flagType: FlagTypeBoolean,
   231  	},
   232  	{
   233  		flag:        "--state.cache-size",
   234  		flagType:    FlagTypeArgument,
   235  		values:      []string{"64", "128", "256", "512"},
   236  		wrongValues: commonTwoErrors,
   237  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   238  	},
   239  	{
   240  		flag:        "--state.block-interval",
   241  		flagType:    FlagTypeArgument,
   242  		values:      []string{"64", "128", "256"},
   243  		wrongValues: commonTwoErrors,
   244  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   245  	},
   246  	{
   247  		flag:        "--cache.type",
   248  		flagType:    FlagTypeArgument,
   249  		values:      []string{"0", "1", "2"},
   250  		wrongValues: commonTwoErrors,
   251  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   252  	},
   253  	{
   254  		flag:        "--cache.scale",
   255  		flagType:    FlagTypeArgument,
   256  		values:      []string{"100"},
   257  		wrongValues: commonTwoErrors,
   258  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   259  	},
   260  	{
   261  		flag:        "--cache.level",
   262  		flagType:    FlagTypeBoolean,
   263  		values:      []string{"saving", "normal", "extreme"},
   264  		wrongValues: commonThreeErrors,
   265  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue, ErrorInvalidValue},
   266  	},
   267  	{
   268  		flag:        "--cache.memory",
   269  		flagType:    FlagTypeArgument,
   270  		values:      []string{"16"},
   271  		wrongValues: commonTwoErrors,
   272  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   273  	},
   274  	{
   275  		flag:        "--state.trie-cache-limit",
   276  		flagType:    FlagTypeArgument,
   277  		values:      []string{"512", "1024", "2048", "4096"},
   278  		wrongValues: commonTwoErrors,
   279  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   280  	},
   281  	{
   282  		flag:     "--sendertxhashindexing",
   283  		flagType: FlagTypeBoolean,
   284  	},
   285  	{
   286  		flag:     "--childchainindexing",
   287  		flagType: FlagTypeBoolean,
   288  	},
   289  	{
   290  		flag:        "--targetgaslimit",
   291  		flagType:    FlagTypeArgument,
   292  		values:      []string{"4712388"},
   293  		wrongValues: commonTwoErrors,
   294  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   295  	},
   296  	{
   297  		flag:        "--scsigner",
   298  		flagType:    FlagTypeArgument,
   299  		values:      []string{"0x777fd033b5e3bcaad6006bc9f481ffed6b83cf5a"},
   300  		wrongValues: commonThreeErrors,
   301  		errors:      []int{ErrorFatal, ErrorFatal, ErrorFatal},
   302  	},
   303  	{
   304  		flag:        "--rewardbase",
   305  		flagType:    FlagTypeArgument,
   306  		values:      []string{"0x777fd033b5e3bcaad6006bc9f481ffed6b83cf5a"},
   307  		wrongValues: commonThreeErrors,
   308  		errors:      []int{ErrorFatal, ErrorFatal, ErrorFatal},
   309  	},
   310  	{
   311  		flag:        "--extradata",
   312  		flagType:    FlagTypeArgument,
   313  		values:      []string{"0x0000000000000000000000000000000000000000000000000000000000000000f89af85494dddfb991127b43e209c2f8ed08b8b3d0b5843d3694195ba9cc787b00796a7ae6356e5b656d4360353794777fd033b5e3bcaad6006bc9f481ffed6b83cf5a94d473284239f704adccd24647c7ca132992a28973b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0"},
   314  		wrongValues: []string{},
   315  		errors:      []int{},
   316  	},
   317  	{
   318  		flag:        "--txresend.interval",
   319  		flagType:    FlagTypeArgument,
   320  		values:      []string{"3", "5", "7"},
   321  		wrongValues: commonTwoErrors,
   322  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   323  	},
   324  	{
   325  		flag:        "--txresend.max-count",
   326  		flagType:    FlagTypeArgument,
   327  		values:      []string{"1000", "2000"},
   328  		wrongValues: commonTwoErrors,
   329  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   330  	},
   331  	{
   332  		flag:     "--txresend.use-legacy",
   333  		flagType: FlagTypeBoolean,
   334  	},
   335  	{
   336  		flag:        "--unlock",
   337  		flagType:    FlagTypeArgument,
   338  		values:      []string{"", "0x0", "0x777fd033b5e3bcaad6006bc9f481ffed6b83cf5a"},
   339  		wrongValues: []string{"abcdefg", "!@#$%^&", "0x921jfinowaae333"},
   340  		errors:      []int{NonError, NonError, NonError},
   341  	},
   342  	{
   343  		flag:        "--password",
   344  		flagType:    FlagTypeArgument,
   345  		values:      []string{"abcd", "aoije091"},
   346  		wrongValues: []string{},
   347  		errors:      []int{},
   348  	},
   349  	{
   350  		flag:     "--vmdebug",
   351  		flagType: FlagTypeBoolean,
   352  	},
   353  	{
   354  		flag:        "--vmlog",
   355  		flagType:    FlagTypeArgument,
   356  		values:      []string{"0", "1", "2", "3"},
   357  		wrongValues: append(commonThreeErrors, "4"),
   358  		errors:      []int{NonError, NonError, NonError, NonError},
   359  	},
   360  	{
   361  		flag:     "--metrics",
   362  		flagType: FlagTypeBoolean,
   363  	},
   364  	{
   365  		flag:     "--prometheus",
   366  		flagType: FlagTypeBoolean,
   367  	},
   368  	{
   369  		flag:        "--prometheusport",
   370  		flagType:    FlagTypeArgument,
   371  		values:      []string{"61001"},
   372  		wrongValues: commonThreeErrors,
   373  		errors:      []int{ErrorInvalidValue, NonError, ErrorInvalidValue},
   374  	},
   375  	{
   376  		flag:     "--rpc",
   377  		flagType: FlagTypeBoolean,
   378  	},
   379  	{
   380  		flag:        "--rpcaddr",
   381  		flagType:    FlagTypeArgument,
   382  		values:      []string{"localhost", "123.123.123.123"},
   383  		wrongValues: append(commonThreeErrors, "123.123.123.256"),
   384  		errors:      []int{NonError, NonError, NonError, NonError},
   385  	},
   386  	{
   387  		flag:        "--rpcport",
   388  		flagType:    FlagTypeArgument,
   389  		values:      []string{"8551"},
   390  		wrongValues: commonThreeErrors,
   391  		errors:      []int{ErrorInvalidValue, NonError, ErrorInvalidValue},
   392  	},
   393  	{
   394  		flag:        "--rpccorsdomain",
   395  		flagType:    FlagTypeArgument,
   396  		values:      []string{"", "localhost", "123.123.123.123"},
   397  		wrongValues: append(commonThreeErrors, "123.123.123.256"),
   398  		errors:      []int{NonError, NonError, NonError, NonError},
   399  	},
   400  	{
   401  		flag:        "--rpcvhosts",
   402  		flagType:    FlagTypeArgument,
   403  		values:      []string{"*"},
   404  		wrongValues: commonThreeErrors,
   405  		errors:      []int{NonError, NonError, NonError},
   406  	},
   407  	{
   408  		flag:        "--rpcapi",
   409  		flagType:    FlagTypeArgument,
   410  		values:      []string{"", "klay", "klay,personal,istanbul,debug,miner"},
   411  		wrongValues: commonThreeErrors,
   412  		errors:      []int{NonError, NonError, NonError},
   413  	},
   414  	{
   415  		flag:     "--ipcdisable",
   416  		flagType: FlagTypeBoolean,
   417  	},
   418  	{
   419  		flag:     "--ipcpath",
   420  		flagType: FlagTypeBoolean,
   421  	},
   422  	{
   423  		flag:     "--ws",
   424  		flagType: FlagTypeBoolean,
   425  	},
   426  	{
   427  		flag:        "--wsaddr",
   428  		flagType:    FlagTypeArgument,
   429  		values:      []string{"localhost"},
   430  		wrongValues: commonThreeErrors,
   431  		errors:      []int{NonError, NonError, NonError},
   432  	},
   433  	{
   434  		flag:        "--wsport",
   435  		flagType:    FlagTypeArgument,
   436  		values:      []string{"8552"},
   437  		wrongValues: commonThreeErrors,
   438  		errors:      []int{NonError, NonError, NonError},
   439  	},
   440  	{
   441  		flag:     "--grpc",
   442  		flagType: FlagTypeBoolean,
   443  	},
   444  	{
   445  		flag:        "--grpcaddr",
   446  		flagType:    FlagTypeArgument,
   447  		values:      []string{"localhost", "123.123.123.123"},
   448  		wrongValues: commonThreeErrors,
   449  		errors:      []int{NonError, NonError, NonError},
   450  	},
   451  	{
   452  		flag:        "--grpcport",
   453  		flagType:    FlagTypeArgument,
   454  		values:      []string{"8553"},
   455  		wrongValues: commonThreeErrors,
   456  		errors:      []int{ErrorInvalidValue, NonError, ErrorInvalidValue},
   457  	},
   458  	{
   459  		flag:        "--wsapi",
   460  		flagType:    FlagTypeArgument,
   461  		values:      []string{"", "klay", "klay,personal,istanbul,debug,miner"},
   462  		wrongValues: commonThreeErrors,
   463  		errors:      []int{NonError, NonError, NonError},
   464  	},
   465  	{
   466  		flag:        "--wsorigins",
   467  		flagType:    FlagTypeArgument,
   468  		values:      []string{""},
   469  		wrongValues: []string{},
   470  		errors:      []int{},
   471  	},
   472  	{
   473  		flag:        "--exec",
   474  		flagType:    FlagTypeArgument,
   475  		values:      []string{"klay.blockNumber", "klat.getBlock(0)", "governance.chainConfig.governance.reward.proposerUpdateInterval"},
   476  		wrongValues: commonThreeErrors,
   477  		errors:      []int{NonError, NonError, NonError},
   478  	},
   479  	{
   480  		flag:        "--preload",
   481  		flagType:    FlagTypeArgument,
   482  		values:      []string{"abc.js", "tmp.js", "tmp"},
   483  		wrongValues: []string{},
   484  		errors:      []int{},
   485  	},
   486  	//TODO-Klaytn-Node the flag is not defined on any klay binaries
   487  	//{
   488  	//	flag:        "--nodetype",
   489  	//	flagType:    FlagTypeArgument,
   490  	//	values:      []string{"cn", "pn", "en"},
   491  	//  wrongValues: []string{},
   492  	//  errors:      []int{},
   493  	//},
   494  	{
   495  		flag:        "--maxconnections",
   496  		flagType:    FlagTypeArgument,
   497  		values:      []string{"0", "30", "25000"},
   498  		wrongValues: commonTwoErrors,
   499  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   500  	},
   501  	{
   502  		flag:        "--maxpendpeers",
   503  		flagType:    FlagTypeArgument,
   504  		values:      []string{"0", "30", "50"},
   505  		wrongValues: commonTwoErrors,
   506  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   507  	},
   508  	{
   509  		flag:        "--port",
   510  		flagType:    FlagTypeArgument,
   511  		values:      []string{"32323", "30303"},
   512  		wrongValues: commonThreeErrors,
   513  		errors:      []int{ErrorInvalidValue, NonError, ErrorInvalidValue},
   514  	},
   515  	{
   516  		flag:        "--subport",
   517  		flagType:    FlagTypeArgument,
   518  		values:      []string{"32324", "32325", "32327"},
   519  		wrongValues: commonThreeErrors,
   520  		errors:      []int{ErrorInvalidValue, NonError, ErrorInvalidValue},
   521  	},
   522  	{
   523  		flag:     "--multichannel",
   524  		flagType: FlagTypeBoolean,
   525  	},
   526  	{
   527  		flag:        "--bootnodes",
   528  		flagType:    FlagTypeArgument,
   529  		values:      []string{"0xf4316f69d9522667c0674afcd8638288489f0333", "", "0xf4316f69d9522667c0674afcd8638288489f0333, d473284239f704adccd24647c7ca132992a28973"},
   530  		wrongValues: []string{},
   531  		errors:      []int{},
   532  	},
   533  	{
   534  		flag:        "--nodekey",
   535  		flagType:    FlagTypeArgument,
   536  		values:      []string{""},
   537  		wrongValues: []string{},
   538  		errors:      []int{},
   539  	},
   540  	{
   541  		flag:        "--nodekeyhex",
   542  		flagType:    FlagTypeArgument,
   543  		values:      []string{"8da4ef21b864d2cc526dbdb2a120bd2874c36c9d0a1fb7f8c63d7f7a8b41de8f"},
   544  		wrongValues: commonThreeErrors,
   545  		errors:      []int{ErrorFatal, ErrorFatal, ErrorFatal},
   546  	},
   547  	{
   548  		flag:        "--nat",
   549  		flagType:    FlagTypeArgument,
   550  		values:      []string{"any", "none", "upnp", "pmp", "extip:127.0.0.1"},
   551  		wrongValues: []string{},
   552  		errors:      []int{},
   553  	},
   554  	{
   555  		flag:     "--nodiscover",
   556  		flagType: FlagTypeBoolean,
   557  	},
   558  	{
   559  		flag:        "--netrestrict",
   560  		flagType:    FlagTypeArgument,
   561  		values:      []string{},
   562  		wrongValues: []string{},
   563  		errors:      []int{},
   564  	},
   565  	{
   566  		flag:        "--chaintxperiod",
   567  		flagType:    FlagTypeArgument,
   568  		values:      []string{"1", "5", "100"},
   569  		wrongValues: commonTwoErrors,
   570  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   571  	},
   572  	{
   573  		flag:        "--chaintxlimit",
   574  		flagType:    FlagTypeArgument,
   575  		values:      []string{"100", "200"},
   576  		wrongValues: commonTwoErrors,
   577  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   578  	},
   579  	{
   580  		flag:        "--jspath",
   581  		flagType:    FlagTypeArgument,
   582  		values:      []string{".", "root/abc/efg"},
   583  		wrongValues: commonThreeErrors,
   584  		errors:      []int{NonError, NonError, NonError},
   585  	},
   586  	{
   587  		flag:     "--baobab",
   588  		flagType: FlagTypeBoolean,
   589  	},
   590  	//TODO-Klaytn-Node the flag is not defined on any klay binaries
   591  	//{
   592  	//	flag:        "--bnaddr",
   593  	//	flagType:    FlagTypeArgument,
   594  	//	values:      []string{},
   595  	//	wrongValues: []string{},
   596  	//	errors:      []int{},
   597  	//},
   598  	//TODO-Klaytn-Node the flag is not defined on any klay binaries
   599  	//{
   600  	//	flag:        "--genkey",
   601  	//	flagType:    FlagTypeArgument,
   602  	//	values:      []string{},
   603  	//	wrongValues: []string{},
   604  	//	errors:      []int{},
   605  	//},
   606  	//TODO-Klaytn-Node the flag is not defined on any klay binaries
   607  	//{
   608  	//	flag:        "--writeaddress",
   609  	//	flagType:    FlagTypeBoolean,
   610  	//},
   611  	{
   612  		flag:     "--mainbridge",
   613  		flagType: FlagTypeBoolean,
   614  	},
   615  	{
   616  		flag:     "--subbridge",
   617  		flagType: FlagTypeBoolean,
   618  	},
   619  	{
   620  		flag:        "--mainbridgeport",
   621  		flagType:    FlagTypeArgument,
   622  		values:      []string{"50505", "23232"},
   623  		wrongValues: commonThreeErrors,
   624  		errors:      []int{ErrorInvalidValue, NonError, ErrorInvalidValue},
   625  	},
   626  	{
   627  		flag:        "--subbridgeport",
   628  		flagType:    FlagTypeArgument,
   629  		values:      []string{"50505", "23232"},
   630  		wrongValues: commonThreeErrors,
   631  		errors:      []int{ErrorInvalidValue, NonError, ErrorInvalidValue},
   632  	},
   633  	{
   634  		flag:     "--vtrecovery",
   635  		flagType: FlagTypeBoolean,
   636  	},
   637  	{
   638  		flag:        "--vtrecoveryinterval",
   639  		flagType:    FlagTypeArgument,
   640  		values:      []string{"60", "100", "200"},
   641  		wrongValues: commonTwoErrors,
   642  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   643  	},
   644  	{
   645  		flag:     "--scnewaccount",
   646  		flagType: FlagTypeBoolean,
   647  	},
   648  	{
   649  		flag:     "--dbsyncer",
   650  		flagType: FlagTypeBoolean,
   651  	},
   652  	{
   653  		flag:        "--dbsyncer.db.host",
   654  		flagType:    FlagTypeArgument,
   655  		values:      []string{"localhost", "123.123.123.123", "127.0.0.1"},
   656  		wrongValues: commonThreeErrors,
   657  		errors:      []int{NonError, NonError, NonError},
   658  	},
   659  	{
   660  		flag:        "--dbsyncer.db.port",
   661  		flagType:    FlagTypeArgument,
   662  		values:      []string{"3306", "32323"},
   663  		wrongValues: commonThreeErrors,
   664  		errors:      []int{NonError, NonError, NonError},
   665  	},
   666  	{
   667  		flag:     "--dbsyncer.db.name",
   668  		flagType: FlagTypeBoolean,
   669  	},
   670  	{
   671  		flag:     "--dbsyncer.db.user",
   672  		flagType: FlagTypeBoolean,
   673  	},
   674  	{
   675  		flag:        "--dbsyncer.db.password",
   676  		flagType:    FlagTypeArgument,
   677  		values:      []string{"aboaise", "jaooao122!@", "18231@#!@412!"},
   678  		wrongValues: []string{},
   679  		errors:      []int{},
   680  	},
   681  	{
   682  		flag:     "--dbsyncer.logmode",
   683  		flagType: FlagTypeBoolean,
   684  	},
   685  	{
   686  		flag:        "--dbsyncer.db.max.idle",
   687  		flagType:    FlagTypeArgument,
   688  		values:      []string{"50", "100"},
   689  		wrongValues: commonTwoErrors,
   690  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   691  	},
   692  	{
   693  		flag:        "--dbsyncer.db.max.open",
   694  		flagType:    FlagTypeArgument,
   695  		values:      []string{"30", "50", "100"},
   696  		wrongValues: commonTwoErrors,
   697  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   698  	},
   699  	{
   700  		flag:        "--dbsyncer.db.max.lifetime",
   701  		flagType:    FlagTypeArgument,
   702  		values:      []string{"1h0m0s", "0h0m10s"},
   703  		wrongValues: commonThreeErrors,
   704  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue, ErrorInvalidValue},
   705  	},
   706  	{
   707  		flag:        "--dbsyncer.block.channel.size",
   708  		flagType:    FlagTypeArgument,
   709  		values:      []string{"5"},
   710  		wrongValues: commonTwoErrors,
   711  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   712  	},
   713  	{
   714  		flag:        "--dbsyncer.mode",
   715  		flagType:    FlagTypeArgument,
   716  		values:      []string{"single", "multi", "context"},
   717  		wrongValues: commonThreeErrors,
   718  		errors:      []int{NonError, NonError, NonError},
   719  	},
   720  	{
   721  		flag:        "--dbsyncer.genquery.th",
   722  		flagType:    FlagTypeArgument,
   723  		values:      []string{"50", "123"},
   724  		wrongValues: commonTwoErrors,
   725  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   726  	},
   727  	{
   728  		flag:        "--dbsyncer.insert.th",
   729  		flagType:    FlagTypeArgument,
   730  		values:      []string{"30", "123"},
   731  		wrongValues: commonTwoErrors,
   732  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   733  	},
   734  	{
   735  		flag:        "--dbsyncer.bulk.size",
   736  		flagType:    FlagTypeArgument,
   737  		values:      []string{"200"},
   738  		wrongValues: commonTwoErrors,
   739  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   740  	},
   741  	{
   742  		flag:        "--dbsyncer.event.mode",
   743  		flagType:    FlagTypeArgument,
   744  		values:      []string{"block", "head"},
   745  		wrongValues: commonThreeErrors,
   746  		errors:      []int{NonError, NonError, NonError},
   747  	},
   748  	{
   749  		flag:        "--dbsyncer.max.block.diff",
   750  		flagType:    FlagTypeArgument,
   751  		values:      []string{"0", "5", "100"},
   752  		wrongValues: commonTwoErrors,
   753  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue},
   754  	},
   755  	{
   756  		flag:        "--autorestart.daemon.path",
   757  		flagType:    FlagTypeArgument,
   758  		values:      []string{"~/klaytn/bin/kcnd", "~/klaytn/bin/kpnd", "~/klaytn/bin/kend"},
   759  		wrongValues: commonThreeErrors,
   760  		errors:      []int{NonError, NonError, NonError},
   761  	},
   762  	{
   763  		flag:     "--autorestart.enable",
   764  		flagType: FlagTypeBoolean,
   765  	},
   766  	{
   767  		flag:        "--autorestart.timeout",
   768  		flagType:    FlagTypeArgument,
   769  		values:      []string{"10m", "60s", "1h"},
   770  		wrongValues: commonThreeErrors,
   771  		errors:      []int{ErrorInvalidValue, ErrorInvalidValue, ErrorInvalidValue},
   772  	},
   773  }
   774  
   775  func testFlags(t *testing.T, flag string, value string, idx int) {
   776  	datadir := tmpdir(t)
   777  	defer os.RemoveAll(datadir)
   778  
   779  	json := filepath.Join(datadir, "genesis.json")
   780  	if err := ioutil.WriteFile(json, []byte(genesis), 0o600); err != nil {
   781  		t.Fatalf("test %d: failed to write genesis file: %v", idx, err)
   782  	}
   783  
   784  	runKlay(t, "klay-test-flag", "--verbosity", "0", "--datadir", datadir, "init", json).WaitExit()
   785  
   786  	klay := runKlay(t, "klay-test-flag", "--datadir", datadir, flag, value)
   787  	klay.ExpectExit()
   788  }
   789  
   790  func testWrongFlags(t *testing.T, flag string, value string, idx int, expectedError string) {
   791  	datadir := tmpdir(t)
   792  	defer os.RemoveAll(datadir)
   793  
   794  	json := filepath.Join(datadir, "genesis.json")
   795  	if err := ioutil.WriteFile(json, []byte(genesis), 0o600); err != nil {
   796  		t.Fatalf("test %d: failed to write genesis file: %v", idx, err)
   797  	}
   798  
   799  	runKlay(t, "klay-test-flag", "--verbosity", "0", "--datadir", datadir, "init", json).WaitExit()
   800  
   801  	klay := runKlay(t, "klay-test-flag", "--datadir", datadir, flag, value)
   802  	klay.ExpectRegexp(expectedError)
   803  }
   804  
   805  func TestFlags(t *testing.T) {
   806  	expectedError := []string{
   807  		"Incorrect Usage. flag provided but not defined: (.*)",
   808  		"Incorrect Usage. invalid value (.*)",
   809  		"Fatal:(.*)",
   810  		"(.*)",
   811  	}
   812  	for idx, fwv := range flagsWithValues {
   813  		switch fwv.flagType {
   814  		case FlagTypeBoolean:
   815  			t.Run("klay-test-flag"+fwv.flag, func(t *testing.T) {
   816  				testFlags(t, fwv.flag, "", idx)
   817  			})
   818  		case FlagTypeArgument:
   819  			for _, item := range fwv.values {
   820  				t.Run("klay-test-flag"+fwv.flag+"-"+item, func(t *testing.T) {
   821  					testFlags(t, fwv.flag, item, idx)
   822  				})
   823  			}
   824  			for idx2, wrongItem := range fwv.wrongValues {
   825  				t.Run("klay-test-flag"+fwv.flag+"-"+wrongItem, func(t *testing.T) {
   826  					testWrongFlags(t, fwv.flag, wrongItem, idx, expectedError[fwv.errors[idx2]])
   827  				})
   828  			}
   829  		}
   830  	}
   831  }