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 := &params.ChainConfig{HomesteadBlock: params.MainNetHomesteadBlock, EIP150Block: params.MainNetHomesteadGasRepriceBlock}
    80  		err = tests.RunStateTestWithReader(rs, r, skipTests)
    81  	case "tx", "transactiontest", "transactiontests":
    82  		rs := &params.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  }