mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-29 08:03:48 +00:00
Conflicts: Godeps/Godeps.json Godeps/_workspace/src/github.com/expanse-project/ethash/ethash_test.go Makefile VERSION cmd/gexp/blocktestcmd.go cmd/gexp/js.go cmd/gexp/js_test.go cmd/gexp/main.go cmd/utils/cmd.go cmd/utils/flags.go common/natspec/natspec.go common/natspec/natspec_e2e_test.go common/natspec/natspec_e2e_test.go.orig common/path.go common/registrar/registrar.go core/block_processor.go core/block_processor_test.go core/chain_manager.go core/chain_manager_test.go core/chain_util_test.go core/events.go core/execution.go core/filter.go core/state/errors.go core/state/statedb.go core/state_transition.go core/transaction_util.go core/types/bloom9.go core/types/common.go core/types/derive_sha.go core/types/receipt.go core/vm/common.go core/vm/environment.go core/vm/instructions.go core/vm/jit.go core/vm/jit_test.go core/vm/vm.go docker/Dockerfile docker/supervisord.conf eth/downloader/modes.go event/filter/eth_filter.go exp/backend.go exp/downloader/downloader.go exp/downloader/downloader_test.go exp/downloader/peer.go exp/downloader/queue.go exp/gasprice.go exp/handler.go exp/sync.go miner/worker.go rpc/api/admin.go rpc/api/debug.go rpc/api/eth.go rpc/api/eth_args.go rpc/api/miner.go rpc/api/personal.go rpc/comms/ipc.go rpc/comms/ipc_unix.go rpc/comms/ipc_windows.go tests/block_test_util.go tests/files/BlockchainTests/bcUncleTest.json trie/cache.go trie/fullnode.go trie/hashnode.go trie/secure_trie.go trie/shortnode.go trie/trie.go trie/trie_test.go trie/valuenode.go xeth/xeth.go
139 lines
3.8 KiB
Go
139 lines
3.8 KiB
Go
// Copyright 2015 The go-expanse Authors
|
|
// This file is part of go-expanse.
|
|
//
|
|
// go-expanse 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-expanse 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-expanse. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/codegangsta/cli"
|
|
"github.com/expanse-project/go-expanse/cmd/utils"
|
|
"github.com/expanse-project/go-expanse/exp"
|
|
"github.com/expanse-project/go-expanse/ethdb"
|
|
"github.com/expanse-project/go-expanse/tests"
|
|
)
|
|
|
|
var blocktestCommand = cli.Command{
|
|
Action: runBlockTest,
|
|
Name: "blocktest",
|
|
Usage: `loads a block test file`,
|
|
Description: `
|
|
The first argument should be a block test file.
|
|
The second argument is the name of a block test from the file.
|
|
|
|
The block test will be loaded into an in-memory database.
|
|
If loading succeeds, the RPC server is started. Clients will
|
|
be able to interact with the chain defined by the test.
|
|
`,
|
|
}
|
|
|
|
func runBlockTest(ctx *cli.Context) {
|
|
var (
|
|
file, testname string
|
|
rpc bool
|
|
)
|
|
args := ctx.Args()
|
|
switch {
|
|
case len(args) == 1:
|
|
file = args[0]
|
|
case len(args) == 2:
|
|
file, testname = args[0], args[1]
|
|
case len(args) == 3:
|
|
file, testname = args[0], args[1]
|
|
rpc = true
|
|
default:
|
|
utils.Fatalf(`Usage: expanse blocktest <path-to-test-file> [ <test-name> [ "rpc" ] ]`)
|
|
}
|
|
bt, err := tests.LoadBlockTests(file)
|
|
if err != nil {
|
|
utils.Fatalf("%v", err)
|
|
}
|
|
|
|
// run all tests if no test name is specified
|
|
if testname == "" {
|
|
ecode := 0
|
|
for name, test := range bt {
|
|
fmt.Printf("----------------- Running Block Test %q\n", name)
|
|
expanse, err := runOneBlockTest(ctx, test)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
fmt.Println("FAIL")
|
|
ecode = 1
|
|
}
|
|
if expanse != nil {
|
|
expanse.Stop()
|
|
expanse.WaitForShutdown()
|
|
}
|
|
}
|
|
os.Exit(ecode)
|
|
return
|
|
}
|
|
// otherwise, run the given test
|
|
test, ok := bt[testname]
|
|
if !ok {
|
|
utils.Fatalf("Test file does not contain test named %q", testname)
|
|
}
|
|
expanse, err := runOneBlockTest(ctx, test)
|
|
if err != nil {
|
|
utils.Fatalf("%v", err)
|
|
}
|
|
|
|
if rpc {
|
|
fmt.Println("Block Test post state validated, starting RPC interface.")
|
|
startEth(ctx, expanse)
|
|
utils.StartRPC(expanse, ctx)
|
|
expanse.WaitForShutdown()
|
|
}
|
|
}
|
|
|
|
func runOneBlockTest(ctx *cli.Context, test *tests.BlockTest) (*exp.Expanse, error) {
|
|
cfg := utils.MakeEthConfig(ClientIdentifier, Version, ctx)
|
|
db, _ := ethdb.NewMemDatabase()
|
|
cfg.NewDB = func(path string) (ethdb.Database, error) { return db, nil }
|
|
cfg.MaxPeers = 0 // disable network
|
|
cfg.Shh = false // disable whisper
|
|
cfg.NAT = nil // disable port mapping
|
|
|
|
expanse, err := exp.New(cfg)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// import the genesis block
|
|
expanse.ResetWithGenesisBlock(test.Genesis)
|
|
// import pre accounts
|
|
_, err = test.InsertPreState(db, cfg.AccountManager)
|
|
|
|
if err != nil {
|
|
return expanse, fmt.Errorf("InsertPreState: %v", err)
|
|
}
|
|
|
|
cm := expanse.BlockChain()
|
|
validBlocks, err := test.TryBlocksInsert(cm)
|
|
if err != nil {
|
|
return expanse, fmt.Errorf("Block Test load error: %v", err)
|
|
}
|
|
newDB, err := cm.State()
|
|
if err != nil {
|
|
return expanse, fmt.Errorf("Block Test get state error: %v", err)
|
|
}
|
|
if err := test.ValidatePostState(newDB); err != nil {
|
|
return expanse, fmt.Errorf("post state validation failed: %v", err)
|
|
}
|
|
return expanse, test.ValidateImportedHeaders(cm, validBlocks)
|
|
|
|
}
|