Merge pull request #3705 from karalabe/drop-legacy-commands
Drop legacy commands
This commit is contained in:
		
						commit
						50ee279f25
					
				| @ -1,224 +0,0 @@ | |||||||
| // 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
 |  | ||||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 |  | ||||||
| // GNU General Public License for more details.
 |  | ||||||
| //
 |  | ||||||
| // You should have received a copy of the GNU General Public License
 |  | ||||||
| // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
 |  | ||||||
| 
 |  | ||||||
| // ethtest executes Ethereum JSON tests.
 |  | ||||||
| package main |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"fmt" |  | ||||||
| 	"io" |  | ||||||
| 	"io/ioutil" |  | ||||||
| 	"os" |  | ||||||
| 	"path/filepath" |  | ||||||
| 	"strings" |  | ||||||
| 
 |  | ||||||
| 	"github.com/ethereum/go-ethereum/log" |  | ||||||
| 	"github.com/ethereum/go-ethereum/params" |  | ||||||
| 	"github.com/ethereum/go-ethereum/tests" |  | ||||||
| 	"gopkg.in/urfave/cli.v1" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| var ( |  | ||||||
| 	continueOnError = false |  | ||||||
| 	testExtension   = ".json" |  | ||||||
| 	defaultTest     = "all" |  | ||||||
| 	defaultDir      = "." |  | ||||||
| 	allTests        = []string{"BlockTests", "StateTests", "TransactionTests", "VMTests", "RLPTests"} |  | ||||||
| 	testDirMapping  = map[string]string{"BlockTests": "BlockchainTests"} |  | ||||||
| 	skipTests       = []string{} |  | ||||||
| 
 |  | ||||||
| 	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", |  | ||||||
| 		Usage: "Continue running tests on error (true) or [default] exit immediately (false)", |  | ||||||
| 	} |  | ||||||
| 	ReadStdInFlag = cli.BoolFlag{ |  | ||||||
| 		Name:  "stdin", |  | ||||||
| 		Usage: "Accept input from stdin instead of reading from file", |  | ||||||
| 	} |  | ||||||
| 	SkipTestsFlag = cli.StringFlag{ |  | ||||||
| 		Name:  "skip", |  | ||||||
| 		Usage: "Tests names to skip", |  | ||||||
| 	} |  | ||||||
| 	TraceFlag = cli.BoolFlag{ |  | ||||||
| 		Name:  "trace", |  | ||||||
| 		Usage: "Enable VM tracing", |  | ||||||
| 	} |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func runTestWithReader(test string, r io.Reader) error { |  | ||||||
| 	log.Info("Running test", "test", test) |  | ||||||
| 
 |  | ||||||
| 	var err error |  | ||||||
| 	switch strings.ToLower(test) { |  | ||||||
| 	case "bk", "block", "blocktest", "blockchaintest", "blocktests", "blockchaintests": |  | ||||||
| 		err = tests.RunBlockTestWithReader(params.MainNetHomesteadBlock, params.MainNetDAOForkBlock, params.MainNetHomesteadGasRepriceBlock, r, skipTests) |  | ||||||
| 	case "st", "state", "statetest", "statetests": |  | ||||||
| 		rs := ¶ms.ChainConfig{HomesteadBlock: params.MainNetHomesteadBlock, DAOForkBlock: params.MainNetDAOForkBlock, DAOForkSupport: true, EIP150Block: params.MainNetHomesteadGasRepriceBlock} |  | ||||||
| 		err = tests.RunStateTestWithReader(rs, r, skipTests) |  | ||||||
| 	case "tx", "transactiontest", "transactiontests": |  | ||||||
| 		rs := ¶ms.ChainConfig{HomesteadBlock: params.MainNetHomesteadBlock, DAOForkBlock: params.MainNetDAOForkBlock, DAOForkSupport: true, EIP150Block: params.MainNetHomesteadGasRepriceBlock} |  | ||||||
| 		err = tests.RunTransactionTestsWithReader(rs, r, skipTests) |  | ||||||
| 	case "vm", "vmtest", "vmtests": |  | ||||||
| 		err = tests.RunVmTestWithReader(r, skipTests) |  | ||||||
| 	case "rlp", "rlptest", "rlptests": |  | ||||||
| 		err = tests.RunRLPTestWithReader(r, skipTests) |  | ||||||
| 	default: |  | ||||||
| 		err = fmt.Errorf("Invalid test type specified: %v", test) |  | ||||||
| 	} |  | ||||||
| 	return err |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func getFiles(path string) ([]string, error) { |  | ||||||
| 	log.Info("Listing files", "path", path) |  | ||||||
| 
 |  | ||||||
| 	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
 |  | ||||||
| 			if !v.IsDir() && v.Name()[len(v.Name())-len(testExtension):len(v.Name())] == testExtension { |  | ||||||
| 				files[i] = filepath.Join(path, v.Name()) |  | ||||||
| 				log.Info("Found test file", "file", files[i]) |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	case mode.IsRegular(): |  | ||||||
| 		files = make([]string, 1) |  | ||||||
| 		files[0] = path |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return files, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func runSuite(test, file string) { |  | ||||||
| 	var tests []string |  | ||||||
| 
 |  | ||||||
| 	if test == defaultTest { |  | ||||||
| 		tests = allTests |  | ||||||
| 	} else { |  | ||||||
| 		tests = []string{test} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	for _, curTest := range tests { |  | ||||||
| 		suiteLogger := log.New("suite", file, "test", curTest) |  | ||||||
| 		suiteLogger.Info("Running test suite") |  | ||||||
| 
 |  | ||||||
| 		var err error |  | ||||||
| 		var files []string |  | ||||||
| 		if test == defaultTest { |  | ||||||
| 			// 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)) |  | ||||||
| 			} |  | ||||||
| 		} else { |  | ||||||
| 			files, err = getFiles(file) |  | ||||||
| 		} |  | ||||||
| 		if err != nil { |  | ||||||
| 			suiteLogger.Crit("Failed to gather files", "error", err) |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		if len(files) == 0 { |  | ||||||
| 			suiteLogger.Warn("No files matched path") |  | ||||||
| 		} |  | ||||||
| 		for _, curFile := range files { |  | ||||||
| 			// Skip blank entries
 |  | ||||||
| 			if len(curFile) == 0 { |  | ||||||
| 				continue |  | ||||||
| 			} |  | ||||||
| 			testLogger := suiteLogger.New("file", curFile) |  | ||||||
| 
 |  | ||||||
| 			r, err := os.Open(curFile) |  | ||||||
| 			if err != nil { |  | ||||||
| 				testLogger.Crit("Failed to open file") |  | ||||||
| 			} |  | ||||||
| 			defer r.Close() |  | ||||||
| 
 |  | ||||||
| 			err = runTestWithReader(curTest, r) |  | ||||||
| 			if err != nil { |  | ||||||
| 				if continueOnError { |  | ||||||
| 					testLogger.Error("Test failed, continuing", "error", err) |  | ||||||
| 				} else { |  | ||||||
| 					testLogger.Crit("Test failed, aborting", "error", err) |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func setupApp(c *cli.Context) error { |  | ||||||
| 	flagTest := c.GlobalString(TestFlag.Name) |  | ||||||
| 	flagFile := c.GlobalString(FileFlag.Name) |  | ||||||
| 	continueOnError = c.GlobalBool(ContinueOnErrorFlag.Name) |  | ||||||
| 	useStdIn := c.GlobalBool(ReadStdInFlag.Name) |  | ||||||
| 	skipTests = strings.Split(c.GlobalString(SkipTestsFlag.Name), " ") |  | ||||||
| 
 |  | ||||||
| 	if !useStdIn { |  | ||||||
| 		runSuite(flagTest, flagFile) |  | ||||||
| 	} else { |  | ||||||
| 		return runTestWithReader(flagTest, os.Stdin) |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func main() { |  | ||||||
| 	log.Root().SetHandler(log.StreamHandler(os.Stderr, log.TerminalFormat())) |  | ||||||
| 
 |  | ||||||
| 	app := cli.NewApp() |  | ||||||
| 	app.Name = "ethtest" |  | ||||||
| 	app.Usage = "go-ethereum test interface" |  | ||||||
| 	app.Action = setupApp |  | ||||||
| 	app.Version = "0.2.0" |  | ||||||
| 	app.Author = "go-ethereum team" |  | ||||||
| 
 |  | ||||||
| 	app.Flags = []cli.Flag{ |  | ||||||
| 		TestFlag, |  | ||||||
| 		FileFlag, |  | ||||||
| 		ContinueOnErrorFlag, |  | ||||||
| 		ReadStdInFlag, |  | ||||||
| 		SkipTestsFlag, |  | ||||||
| 		TraceFlag, |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if err := app.Run(os.Args); err != nil { |  | ||||||
| 		log.Crit("Failed to run the tester", "error", err) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| @ -19,7 +19,6 @@ package main | |||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"os" | 	"os" | ||||||
| 	"path/filepath" |  | ||||||
| 	"runtime" | 	"runtime" | ||||||
| 	"strconv" | 	"strconv" | ||||||
| 	"sync/atomic" | 	"sync/atomic" | ||||||
| @ -72,16 +71,6 @@ Requires a first argument of the file to write to. | |||||||
| Optional second and third arguments control the first and | Optional second and third arguments control the first and | ||||||
| last block to write. In this mode, the file will be appended | last block to write. In this mode, the file will be appended | ||||||
| if already existing. | if already existing. | ||||||
| `, |  | ||||||
| 	} |  | ||||||
| 	upgradedbCommand = cli.Command{ |  | ||||||
| 		Action:    upgradeDB, |  | ||||||
| 		Name:      "upgradedb", |  | ||||||
| 		Usage:     "Upgrade chainblock database", |  | ||||||
| 		ArgsUsage: " ", |  | ||||||
| 		Category:  "BLOCKCHAIN COMMANDS", |  | ||||||
| 		Description: ` |  | ||||||
| TODO: Please write this |  | ||||||
| `, | `, | ||||||
| 	} | 	} | ||||||
| 	removedbCommand = cli.Command{ | 	removedbCommand = cli.Command{ | ||||||
| @ -255,49 +244,6 @@ func removeDB(ctx *cli.Context) error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func upgradeDB(ctx *cli.Context) error { |  | ||||||
| 	log.Info(fmt.Sprint("Upgrading blockchain database")) |  | ||||||
| 
 |  | ||||||
| 	stack := utils.MakeNode(ctx, clientIdentifier, gitCommit) |  | ||||||
| 	chain, chainDb := utils.MakeChain(ctx, stack) |  | ||||||
| 	bcVersion := core.GetBlockChainVersion(chainDb) |  | ||||||
| 	if bcVersion == 0 { |  | ||||||
| 		bcVersion = core.BlockChainVersion |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Export the current chain.
 |  | ||||||
| 	filename := fmt.Sprintf("blockchain_%d_%s.chain", bcVersion, time.Now().Format("20060102_150405")) |  | ||||||
| 	exportFile := filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), filename) |  | ||||||
| 	if err := utils.ExportChain(chain, exportFile); err != nil { |  | ||||||
| 		utils.Fatalf("Unable to export chain for reimport %s", err) |  | ||||||
| 	} |  | ||||||
| 	chainDb.Close() |  | ||||||
| 	if dir := dbDirectory(chainDb); dir != "" { |  | ||||||
| 		os.RemoveAll(dir) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Import the chain file.
 |  | ||||||
| 	chain, chainDb = utils.MakeChain(ctx, stack) |  | ||||||
| 	core.WriteBlockChainVersion(chainDb, core.BlockChainVersion) |  | ||||||
| 	err := utils.ImportChain(chain, exportFile) |  | ||||||
| 	chainDb.Close() |  | ||||||
| 	if err != nil { |  | ||||||
| 		utils.Fatalf("Import error %v (a backup is made in %s, use the import command to import it)", err, exportFile) |  | ||||||
| 	} else { |  | ||||||
| 		os.Remove(exportFile) |  | ||||||
| 		log.Info(fmt.Sprint("Import finished")) |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func dbDirectory(db ethdb.Database) string { |  | ||||||
| 	ldb, ok := db.(*ethdb.LDBDatabase) |  | ||||||
| 	if !ok { |  | ||||||
| 		return "" |  | ||||||
| 	} |  | ||||||
| 	return ldb.Path() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func dump(ctx *cli.Context) error { | func dump(ctx *cli.Context) error { | ||||||
| 	stack := makeFullNode(ctx) | 	stack := makeFullNode(ctx) | ||||||
| 	chain, chainDb := utils.MakeChain(ctx, stack) | 	chain, chainDb := utils.MakeChain(ctx, stack) | ||||||
| @ -329,9 +275,3 @@ func hashish(x string) bool { | |||||||
| 	_, err := strconv.Atoi(x) | 	_, err := strconv.Atoi(x) | ||||||
| 	return err != nil | 	return err != nil | ||||||
| } | } | ||||||
| 
 |  | ||||||
| func closeAll(dbs ...ethdb.Database) { |  | ||||||
| 	for _, db := range dbs { |  | ||||||
| 		db.Close() |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | |||||||
| @ -65,7 +65,6 @@ func init() { | |||||||
| 		initCommand, | 		initCommand, | ||||||
| 		importCommand, | 		importCommand, | ||||||
| 		exportCommand, | 		exportCommand, | ||||||
| 		upgradedbCommand, |  | ||||||
| 		removedbCommand, | 		removedbCommand, | ||||||
| 		dumpCommand, | 		dumpCommand, | ||||||
| 		// See monitorcmd.go:
 | 		// See monitorcmd.go:
 | ||||||
|  | |||||||
| @ -1,161 +0,0 @@ | |||||||
| // Copyright 2015 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
 |  | ||||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 |  | ||||||
| // GNU General Public License for more details.
 |  | ||||||
| //
 |  | ||||||
| // You should have received a copy of the GNU General Public License
 |  | ||||||
| // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
 |  | ||||||
| 
 |  | ||||||
| // gethrpctest is a command to run the external RPC tests.
 |  | ||||||
| package main |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"flag" |  | ||||||
| 	"fmt" |  | ||||||
| 	"os" |  | ||||||
| 	"os/signal" |  | ||||||
| 
 |  | ||||||
| 	"github.com/ethereum/go-ethereum/accounts/keystore" |  | ||||||
| 	"github.com/ethereum/go-ethereum/crypto" |  | ||||||
| 	"github.com/ethereum/go-ethereum/eth" |  | ||||||
| 	"github.com/ethereum/go-ethereum/ethdb" |  | ||||||
| 	"github.com/ethereum/go-ethereum/log" |  | ||||||
| 	"github.com/ethereum/go-ethereum/node" |  | ||||||
| 	"github.com/ethereum/go-ethereum/params" |  | ||||||
| 	"github.com/ethereum/go-ethereum/tests" |  | ||||||
| 	whisper "github.com/ethereum/go-ethereum/whisper/whisperv2" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| const defaultTestKey = "b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291" |  | ||||||
| 
 |  | ||||||
| var ( |  | ||||||
| 	testFile = flag.String("json", "", "Path to the .json test file to load") |  | ||||||
| 	testName = flag.String("test", "", "Name of the test from the .json file to run") |  | ||||||
| 	testKey  = flag.String("key", defaultTestKey, "Private key of a test account to inject") |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func main() { |  | ||||||
| 	flag.Parse() |  | ||||||
| 
 |  | ||||||
| 	// Enable logging errors, we really do want to see those
 |  | ||||||
| 	log.Root().SetHandler(log.LvlFilterHandler(log.LvlError, log.StreamHandler(os.Stderr, log.TerminalFormat()))) |  | ||||||
| 
 |  | ||||||
| 	// Load the test suite to run the RPC against
 |  | ||||||
| 	tests, err := tests.LoadBlockTests(*testFile) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Crit(fmt.Sprintf("Failed to load test suite: %v", err)) |  | ||||||
| 	} |  | ||||||
| 	test, found := tests[*testName] |  | ||||||
| 	if !found { |  | ||||||
| 		log.Crit(fmt.Sprintf("Requested test (%s) not found within suite", *testName)) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	stack, err := MakeSystemNode(*testKey, test) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Crit(fmt.Sprintf("Failed to assemble test stack: %v", err)) |  | ||||||
| 	} |  | ||||||
| 	if err := stack.Start(); err != nil { |  | ||||||
| 		log.Crit(fmt.Sprintf("Failed to start test node: %v", err)) |  | ||||||
| 	} |  | ||||||
| 	defer stack.Stop() |  | ||||||
| 
 |  | ||||||
| 	log.Info("Test node started...") |  | ||||||
| 
 |  | ||||||
| 	// Make sure the tests contained within the suite pass
 |  | ||||||
| 	if err := RunTest(stack, test); err != nil { |  | ||||||
| 		log.Crit(fmt.Sprintf("Failed to run the pre-configured test: %v", err)) |  | ||||||
| 	} |  | ||||||
| 	log.Info("Initial test suite passed...") |  | ||||||
| 
 |  | ||||||
| 	quit := make(chan os.Signal, 1) |  | ||||||
| 	signal.Notify(quit, os.Interrupt) |  | ||||||
| 	<-quit |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // MakeSystemNode configures a protocol stack for the RPC tests based on a given
 |  | ||||||
| // keystore path and initial pre-state.
 |  | ||||||
| func MakeSystemNode(privkey string, test *tests.BlockTest) (*node.Node, error) { |  | ||||||
| 	// Create a networkless protocol stack
 |  | ||||||
| 	stack, err := node.New(&node.Config{ |  | ||||||
| 		UseLightweightKDF: true, |  | ||||||
| 		IPCPath:           node.DefaultIPCEndpoint(""), |  | ||||||
| 		HTTPHost:          node.DefaultHTTPHost, |  | ||||||
| 		HTTPPort:          node.DefaultHTTPPort, |  | ||||||
| 		HTTPModules:       []string{"admin", "db", "eth", "debug", "miner", "net", "shh", "txpool", "personal", "web3"}, |  | ||||||
| 		WSHost:            node.DefaultWSHost, |  | ||||||
| 		WSPort:            node.DefaultWSPort, |  | ||||||
| 		WSModules:         []string{"admin", "db", "eth", "debug", "miner", "net", "shh", "txpool", "personal", "web3"}, |  | ||||||
| 		NoDiscovery:       true, |  | ||||||
| 	}) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	// Create the keystore and inject an unlocked account if requested
 |  | ||||||
| 	ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) |  | ||||||
| 
 |  | ||||||
| 	if len(privkey) > 0 { |  | ||||||
| 		key, err := crypto.HexToECDSA(privkey) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return nil, err |  | ||||||
| 		} |  | ||||||
| 		a, err := ks.ImportECDSA(key, "") |  | ||||||
| 		if err != nil { |  | ||||||
| 			return nil, err |  | ||||||
| 		} |  | ||||||
| 		if err := ks.Unlock(a, ""); err != nil { |  | ||||||
| 			return nil, err |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	// Initialize and register the Ethereum protocol
 |  | ||||||
| 	db, _ := ethdb.NewMemDatabase() |  | ||||||
| 	if _, err := test.InsertPreState(db); err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	ethConf := ð.Config{ |  | ||||||
| 		TestGenesisState: db, |  | ||||||
| 		TestGenesisBlock: test.Genesis, |  | ||||||
| 		ChainConfig:      ¶ms.ChainConfig{HomesteadBlock: params.MainNetHomesteadBlock}, |  | ||||||
| 	} |  | ||||||
| 	if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { return eth.New(ctx, ethConf) }); err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	// Initialize and register the Whisper protocol
 |  | ||||||
| 	if err := stack.Register(func(*node.ServiceContext) (node.Service, error) { return whisper.New(), nil }); err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	return stack, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // RunTest executes the specified test against an already pre-configured protocol
 |  | ||||||
| // stack to ensure basic checks pass before running RPC tests.
 |  | ||||||
| func RunTest(stack *node.Node, test *tests.BlockTest) error { |  | ||||||
| 	var ethereum *eth.Ethereum |  | ||||||
| 	stack.Service(ðereum) |  | ||||||
| 	blockchain := ethereum.BlockChain() |  | ||||||
| 
 |  | ||||||
| 	// Process the blocks and verify the imported headers
 |  | ||||||
| 	blocks, err := test.TryBlocksInsert(blockchain) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 	if err := test.ValidateImportedHeaders(blockchain, blocks); err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 	// Retrieve the assembled state and validate it
 |  | ||||||
| 	stateDb, err := blockchain.State() |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 	if err := test.ValidatePostState(stateDb); err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user