| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // Copyright 2014 The go-ethereum Authors | 
					
						
							|  |  |  | // This file is part of go-ethereum. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // go-ethereum is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | // it under the terms of the GNU General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // go-ethereum is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // GNU General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU General Public License | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2014-11-11 23:14:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-07 05:08:16 +02:00
										 |  |  | // ethtest executes Ethereum JSON tests. | 
					
						
							| 
									
										
										
										
											2014-10-16 21:34:59 +02:00
										 |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2015-06-14 17:55:03 -04:00
										 |  |  | 	"io" | 
					
						
							| 
									
										
										
										
											2015-06-11 15:23:49 -04:00
										 |  |  | 	"io/ioutil" | 
					
						
							| 
									
										
										
										
											2014-10-16 21:34:59 +02:00
										 |  |  | 	"os" | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 	"path/filepath" | 
					
						
							| 
									
										
										
										
											2015-06-19 11:38:23 +02:00
										 |  |  | 	"strings" | 
					
						
							| 
									
										
										
										
											2014-10-16 21:34:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 	"github.com/codegangsta/cli" | 
					
						
							| 
									
										
										
										
											2015-08-11 11:19:14 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/core/vm" | 
					
						
							| 
									
										
										
										
											2015-04-10 19:59:07 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/logger/glog" | 
					
						
							| 
									
										
										
										
											2015-06-10 18:14:04 -04:00
										 |  |  | 	"github.com/ethereum/go-ethereum/tests" | 
					
						
							| 
									
										
										
										
											2014-10-16 21:34:59 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | var ( | 
					
						
							|  |  |  | 	continueOnError = false | 
					
						
							|  |  |  | 	testExtension   = ".json" | 
					
						
							|  |  |  | 	defaultTest     = "all" | 
					
						
							|  |  |  | 	defaultDir      = "." | 
					
						
							| 
									
										
										
										
											2015-07-17 15:13:24 +02:00
										 |  |  | 	allTests        = []string{"BlockTests", "StateTests", "TransactionTests", "VMTests", "RLPTests"} | 
					
						
							| 
									
										
										
										
											2015-07-16 13:49:24 +02:00
										 |  |  | 	testDirMapping  = map[string]string{"BlockTests": "BlockchainTests"} | 
					
						
							| 
									
										
										
										
											2015-06-19 11:38:23 +02:00
										 |  |  | 	skipTests       = []string{} | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	TestFlag = cli.StringFlag{ | 
					
						
							|  |  |  | 		Name:  "test", | 
					
						
							|  |  |  | 		Usage: "Test type (string): VMTests, TransactionTests, StateTests, BlockTests", | 
					
						
							|  |  |  | 		Value: defaultTest, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	FileFlag = cli.StringFlag{ | 
					
						
							|  |  |  | 		Name:   "file", | 
					
						
							|  |  |  | 		Usage:  "Test file or directory. Directories are searched for .json files 1 level deep", | 
					
						
							|  |  |  | 		Value:  defaultDir, | 
					
						
							|  |  |  | 		EnvVar: "ETHEREUM_TEST_PATH", | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	ContinueOnErrorFlag = cli.BoolFlag{ | 
					
						
							|  |  |  | 		Name:  "continue", | 
					
						
							| 
									
										
										
										
											2015-06-12 09:13:39 -04:00
										 |  |  | 		Usage: "Continue running tests on error (true) or [default] exit immediately (false)", | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-06-14 17:55:03 -04:00
										 |  |  | 	ReadStdInFlag = cli.BoolFlag{ | 
					
						
							|  |  |  | 		Name:  "stdin", | 
					
						
							|  |  |  | 		Usage: "Accept input from stdin instead of reading from file", | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-06-19 11:38:23 +02:00
										 |  |  | 	SkipTestsFlag = cli.StringFlag{ | 
					
						
							|  |  |  | 		Name:  "skip", | 
					
						
							|  |  |  | 		Usage: "Tests names to skip", | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-08-11 11:19:14 +02:00
										 |  |  | 	TraceFlag = cli.BoolFlag{ | 
					
						
							|  |  |  | 		Name:  "trace", | 
					
						
							|  |  |  | 		Usage: "Enable VM tracing", | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-14 17:55:03 -04:00
										 |  |  | func runTestWithReader(test string, r io.Reader) error { | 
					
						
							|  |  |  | 	glog.Infoln("runTest", test) | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 	var err error | 
					
						
							| 
									
										
										
										
											2015-06-19 15:08:53 +02:00
										 |  |  | 	switch strings.ToLower(test) { | 
					
						
							|  |  |  | 	case "bk", "block", "blocktest", "blockchaintest", "blocktests", "blockchaintests": | 
					
						
							| 
									
										
										
										
											2015-06-19 11:38:23 +02:00
										 |  |  | 		err = tests.RunBlockTestWithReader(r, skipTests) | 
					
						
							| 
									
										
										
										
											2015-06-19 15:08:53 +02:00
										 |  |  | 	case "st", "state", "statetest", "statetests": | 
					
						
							| 
									
										
										
										
											2015-06-19 11:38:23 +02:00
										 |  |  | 		err = tests.RunStateTestWithReader(r, skipTests) | 
					
						
							| 
									
										
										
										
											2015-06-19 15:08:53 +02:00
										 |  |  | 	case "tx", "transactiontest", "transactiontests": | 
					
						
							| 
									
										
										
										
											2015-06-19 11:38:23 +02:00
										 |  |  | 		err = tests.RunTransactionTestsWithReader(r, skipTests) | 
					
						
							| 
									
										
										
										
											2015-06-19 15:08:53 +02:00
										 |  |  | 	case "vm", "vmtest", "vmtests": | 
					
						
							| 
									
										
										
										
											2015-06-19 11:38:23 +02:00
										 |  |  | 		err = tests.RunVmTestWithReader(r, skipTests) | 
					
						
							| 
									
										
										
										
											2015-07-17 15:13:24 +02:00
										 |  |  | 	case "rlp", "rlptest", "rlptests": | 
					
						
							|  |  |  | 		err = tests.RunRLPTestWithReader(r, skipTests) | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 	default: | 
					
						
							| 
									
										
										
										
											2015-06-14 17:55:03 -04:00
										 |  |  | 		err = fmt.Errorf("Invalid test type specified: %v", test) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-06-14 17:55:03 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-11 15:23:49 -04:00
										 |  |  | func getFiles(path string) ([]string, error) { | 
					
						
							| 
									
										
										
										
											2015-06-14 17:55:03 -04:00
										 |  |  | 	glog.Infoln("getFiles", path) | 
					
						
							| 
									
										
										
										
											2015-06-11 15:23:49 -04:00
										 |  |  | 	var files []string | 
					
						
							|  |  |  | 	f, err := os.Open(path) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer f.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	fi, err := f.Stat() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	switch mode := fi.Mode(); { | 
					
						
							|  |  |  | 	case mode.IsDir(): | 
					
						
							|  |  |  | 		fi, _ := ioutil.ReadDir(path) | 
					
						
							|  |  |  | 		files = make([]string, len(fi)) | 
					
						
							|  |  |  | 		for i, v := range fi { | 
					
						
							|  |  |  | 			// only go 1 depth and leave directory entires blank | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 			if !v.IsDir() && v.Name()[len(v.Name())-len(testExtension):len(v.Name())] == testExtension { | 
					
						
							|  |  |  | 				files[i] = filepath.Join(path, v.Name()) | 
					
						
							| 
									
										
										
										
											2015-06-14 17:55:03 -04:00
										 |  |  | 				glog.Infoln("Found file", files[i]) | 
					
						
							| 
									
										
										
										
											2015-06-11 15:23:49 -04:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	case mode.IsRegular(): | 
					
						
							|  |  |  | 		files = make([]string, 1) | 
					
						
							|  |  |  | 		files[0] = path | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return files, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-12 09:13:39 -04:00
										 |  |  | func runSuite(test, file string) { | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 	var tests []string | 
					
						
							| 
									
										
										
										
											2015-06-08 16:03:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-12 09:13:39 -04:00
										 |  |  | 	if test == defaultTest { | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 		tests = allTests | 
					
						
							|  |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2015-06-12 09:13:39 -04:00
										 |  |  | 		tests = []string{test} | 
					
						
							| 
									
										
										
										
											2015-06-11 15:23:49 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-06-08 16:03:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 	for _, curTest := range tests { | 
					
						
							| 
									
										
										
										
											2015-06-14 17:55:03 -04:00
										 |  |  | 		glog.Infoln("runSuite", curTest, file) | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 		var err error | 
					
						
							|  |  |  | 		var files []string | 
					
						
							| 
									
										
										
										
											2015-06-12 09:13:39 -04:00
										 |  |  | 		if test == defaultTest { | 
					
						
							| 
									
										
										
										
											2015-07-16 13:49:24 +02:00
										 |  |  | 			// check if we have an explicit directory mapping for the test | 
					
						
							|  |  |  | 			if _, ok := testDirMapping[curTest]; ok { | 
					
						
							|  |  |  | 				files, err = getFiles(filepath.Join(file, testDirMapping[curTest])) | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				// otherwise assume test name | 
					
						
							|  |  |  | 				files, err = getFiles(filepath.Join(file, curTest)) | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2015-06-12 09:13:39 -04:00
										 |  |  | 			files, err = getFiles(file) | 
					
						
							| 
									
										
										
										
											2015-06-08 16:03:21 -04:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			glog.Fatalln(err) | 
					
						
							| 
									
										
										
										
											2015-06-10 18:14:04 -04:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-06-11 15:23:49 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 		if len(files) == 0 { | 
					
						
							|  |  |  | 			glog.Warningln("No files matched path") | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-06-14 17:55:03 -04:00
										 |  |  | 		for _, curFile := range files { | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 			// Skip blank entries | 
					
						
							| 
									
										
										
										
											2015-06-14 17:55:03 -04:00
										 |  |  | 			if len(curFile) == 0 { | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 				continue | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-14 17:55:03 -04:00
										 |  |  | 			r, err := os.Open(curFile) | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				glog.Fatalln(err) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			defer r.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			err = runTestWithReader(curTest, r) | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				if continueOnError { | 
					
						
							|  |  |  | 					glog.Errorln(err) | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					glog.Fatalln(err) | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2015-06-10 18:14:04 -04:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-06-08 16:03:21 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-10-16 21:34:59 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-12 09:13:39 -04:00
										 |  |  | func setupApp(c *cli.Context) { | 
					
						
							|  |  |  | 	flagTest := c.GlobalString(TestFlag.Name) | 
					
						
							|  |  |  | 	flagFile := c.GlobalString(FileFlag.Name) | 
					
						
							|  |  |  | 	continueOnError = c.GlobalBool(ContinueOnErrorFlag.Name) | 
					
						
							| 
									
										
										
										
											2015-06-14 17:55:03 -04:00
										 |  |  | 	useStdIn := c.GlobalBool(ReadStdInFlag.Name) | 
					
						
							| 
									
										
										
										
											2015-06-19 11:38:23 +02:00
										 |  |  | 	skipTests = strings.Split(c.GlobalString(SkipTestsFlag.Name), " ") | 
					
						
							| 
									
										
										
										
											2015-08-11 11:19:14 +02:00
										 |  |  | 	vm.Debug = c.GlobalBool(TraceFlag.Name) | 
					
						
							| 
									
										
										
										
											2015-06-14 17:55:03 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if !useStdIn { | 
					
						
							|  |  |  | 		runSuite(flagTest, flagFile) | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		if err := runTestWithReader(flagTest, os.Stdin); err != nil { | 
					
						
							|  |  |  | 			glog.Fatalln(err) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-06-12 09:13:39 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-14 17:55:03 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-06-12 09:13:39 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | func main() { | 
					
						
							|  |  |  | 	glog.SetToStderr(true) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	app := cli.NewApp() | 
					
						
							|  |  |  | 	app.Name = "ethtest" | 
					
						
							|  |  |  | 	app.Usage = "go-ethereum test interface" | 
					
						
							| 
									
										
										
										
											2015-06-12 09:13:39 -04:00
										 |  |  | 	app.Action = setupApp | 
					
						
							|  |  |  | 	app.Version = "0.2.0" | 
					
						
							|  |  |  | 	app.Author = "go-ethereum team" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 	app.Flags = []cli.Flag{ | 
					
						
							|  |  |  | 		TestFlag, | 
					
						
							|  |  |  | 		FileFlag, | 
					
						
							|  |  |  | 		ContinueOnErrorFlag, | 
					
						
							| 
									
										
										
										
											2015-06-14 17:55:03 -04:00
										 |  |  | 		ReadStdInFlag, | 
					
						
							| 
									
										
										
										
											2015-06-19 11:38:23 +02:00
										 |  |  | 		SkipTestsFlag, | 
					
						
							| 
									
										
										
										
											2015-08-11 11:19:14 +02:00
										 |  |  | 		TraceFlag, | 
					
						
							| 
									
										
										
										
											2015-06-11 23:08:44 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err := app.Run(os.Args); err != nil { | 
					
						
							|  |  |  | 		glog.Fatalln(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |