github.com/digdeepmining/go-atheios@v1.5.13-0.20180902133602-d5687a2e6f43/cmd/ethtest/main.go (about) 1 // Copyright 2014 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 17 // ethtest executes Ethereum JSON tests. 18 package main 19 20 import ( 21 "fmt" 22 "io" 23 "io/ioutil" 24 "os" 25 "path/filepath" 26 "strings" 27 28 "github.com/atheioschain/go-atheios/logger/glog" 29 "github.com/atheioschain/go-atheios/params" 30 "github.com/atheioschain/go-atheios/tests" 31 "gopkg.in/urfave/cli.v1" 32 ) 33 34 var ( 35 continueOnError = false 36 testExtension = ".json" 37 defaultTest = "all" 38 defaultDir = "." 39 allTests = []string{"BlockTests", "StateTests", "TransactionTests", "VMTests", "RLPTests"} 40 testDirMapping = map[string]string{"BlockTests": "BlockchainTests"} 41 skipTests = []string{} 42 43 TestFlag = cli.StringFlag{ 44 Name: "test", 45 Usage: "Test type (string): VMTests, TransactionTests, StateTests, BlockTests", 46 Value: defaultTest, 47 } 48 FileFlag = cli.StringFlag{ 49 Name: "file", 50 Usage: "Test file or directory. Directories are searched for .json files 1 level deep", 51 Value: defaultDir, 52 EnvVar: "ETHEREUM_TEST_PATH", 53 } 54 ContinueOnErrorFlag = cli.BoolFlag{ 55 Name: "continue", 56 Usage: "Continue running tests on error (true) or [default] exit immediately (false)", 57 } 58 ReadStdInFlag = cli.BoolFlag{ 59 Name: "stdin", 60 Usage: "Accept input from stdin instead of reading from file", 61 } 62 SkipTestsFlag = cli.StringFlag{ 63 Name: "skip", 64 Usage: "Tests names to skip", 65 } 66 TraceFlag = cli.BoolFlag{ 67 Name: "trace", 68 Usage: "Enable VM tracing", 69 } 70 ) 71 72 func runTestWithReader(test string, r io.Reader) error { 73 glog.Infoln("runTest", test) 74 var err error 75 switch strings.ToLower(test) { 76 case "bk", "block", "blocktest", "blockchaintest", "blocktests", "blockchaintests": 77 err = tests.RunBlockTestWithReader(params.MainNetHomesteadBlock, params.MainNetHomesteadGasRepriceBlock, r, skipTests) 78 case "st", "state", "statetest", "statetests": 79 rs := ¶ms.ChainConfig{HomesteadBlock: params.MainNetHomesteadBlock, EIP150Block: params.MainNetHomesteadGasRepriceBlock} 80 err = tests.RunStateTestWithReader(rs, r, skipTests) 81 case "tx", "transactiontest", "transactiontests": 82 rs := ¶ms.ChainConfig{HomesteadBlock: params.MainNetHomesteadBlock, EIP150Block: params.MainNetHomesteadGasRepriceBlock} 83 err = tests.RunTransactionTestsWithReader(rs, r, skipTests) 84 case "vm", "vmtest", "vmtests": 85 err = tests.RunVmTestWithReader(r, skipTests) 86 case "rlp", "rlptest", "rlptests": 87 err = tests.RunRLPTestWithReader(r, skipTests) 88 default: 89 err = fmt.Errorf("Invalid test type specified: %v", test) 90 } 91 return err 92 } 93 94 func getFiles(path string) ([]string, error) { 95 glog.Infoln("getFiles", path) 96 var files []string 97 f, err := os.Open(path) 98 if err != nil { 99 return nil, err 100 } 101 defer f.Close() 102 103 fi, err := f.Stat() 104 if err != nil { 105 return nil, err 106 } 107 108 switch mode := fi.Mode(); { 109 case mode.IsDir(): 110 fi, _ := ioutil.ReadDir(path) 111 files = make([]string, len(fi)) 112 for i, v := range fi { 113 // only go 1 depth and leave directory entires blank 114 if !v.IsDir() && v.Name()[len(v.Name())-len(testExtension):len(v.Name())] == testExtension { 115 files[i] = filepath.Join(path, v.Name()) 116 glog.Infoln("Found file", files[i]) 117 } 118 } 119 case mode.IsRegular(): 120 files = make([]string, 1) 121 files[0] = path 122 } 123 124 return files, nil 125 } 126 127 func runSuite(test, file string) { 128 var tests []string 129 130 if test == defaultTest { 131 tests = allTests 132 } else { 133 tests = []string{test} 134 } 135 136 for _, curTest := range tests { 137 glog.Infoln("runSuite", curTest, file) 138 var err error 139 var files []string 140 if test == defaultTest { 141 // check if we have an explicit directory mapping for the test 142 if _, ok := testDirMapping[curTest]; ok { 143 files, err = getFiles(filepath.Join(file, testDirMapping[curTest])) 144 } else { 145 // otherwise assume test name 146 files, err = getFiles(filepath.Join(file, curTest)) 147 } 148 } else { 149 files, err = getFiles(file) 150 } 151 if err != nil { 152 glog.Fatalln(err) 153 } 154 155 if len(files) == 0 { 156 glog.Warningln("No files matched path") 157 } 158 for _, curFile := range files { 159 // Skip blank entries 160 if len(curFile) == 0 { 161 continue 162 } 163 164 r, err := os.Open(curFile) 165 if err != nil { 166 glog.Fatalln(err) 167 } 168 defer r.Close() 169 170 err = runTestWithReader(curTest, r) 171 if err != nil { 172 if continueOnError { 173 glog.Errorln(err) 174 } else { 175 glog.Fatalln(err) 176 } 177 } 178 } 179 } 180 } 181 182 func setupApp(c *cli.Context) error { 183 flagTest := c.GlobalString(TestFlag.Name) 184 flagFile := c.GlobalString(FileFlag.Name) 185 continueOnError = c.GlobalBool(ContinueOnErrorFlag.Name) 186 useStdIn := c.GlobalBool(ReadStdInFlag.Name) 187 skipTests = strings.Split(c.GlobalString(SkipTestsFlag.Name), " ") 188 189 if !useStdIn { 190 runSuite(flagTest, flagFile) 191 } else { 192 if err := runTestWithReader(flagTest, os.Stdin); err != nil { 193 glog.Fatalln(err) 194 } 195 } 196 return nil 197 } 198 199 func main() { 200 glog.SetToStderr(true) 201 202 app := cli.NewApp() 203 app.Name = "ethtest" 204 app.Usage = "go-atheios test interface" 205 app.Action = setupApp 206 app.Version = "0.2.0" 207 app.Author = "go-atheios team" 208 209 app.Flags = []cli.Flag{ 210 TestFlag, 211 FileFlag, 212 ContinueOnErrorFlag, 213 ReadStdInFlag, 214 SkipTestsFlag, 215 TraceFlag, 216 } 217 218 if err := app.Run(os.Args); err != nil { 219 glog.Fatalln(err) 220 } 221 222 }