| 
									
										
										
										
											2015-03-13 18:37:13 +01:00
										 |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/codegangsta/cli" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/cmd/utils" | 
					
						
							| 
									
										
										
										
											2015-03-20 09:13:17 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/common" | 
					
						
							| 
									
										
										
										
											2015-03-13 18:37:13 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/eth" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/ethdb" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/tests" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var blocktestCmd = 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) { | 
					
						
							| 
									
										
										
										
											2015-03-20 01:59:38 +01:00
										 |  |  | 	if len(ctx.Args()) != 3 { | 
					
						
							|  |  |  | 		utils.Fatalf("Usage: ethereum blocktest <path-to-test-file> <test-name> {rpc, norpc}") | 
					
						
							| 
									
										
										
										
											2015-03-13 18:37:13 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-03-20 01:59:38 +01:00
										 |  |  | 	file, testname, startrpc := ctx.Args()[0], ctx.Args()[1], ctx.Args()[2] | 
					
						
							| 
									
										
										
										
											2015-03-13 18:37:13 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	bt, err := tests.LoadBlockTests(file) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		utils.Fatalf("%v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	test, ok := bt[testname] | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							|  |  |  | 		utils.Fatalf("Test file does not contain test named %q", testname) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	cfg := utils.MakeEthConfig(ClientIdentifier, Version, ctx) | 
					
						
							| 
									
										
										
										
											2015-03-16 11:27:38 +01:00
										 |  |  | 	cfg.NewDB = func(path string) (common.Database, error) { return ethdb.NewMemDatabase() } | 
					
						
							| 
									
										
										
										
											2015-03-20 01:59:38 +01:00
										 |  |  | 	cfg.MaxPeers = 0 // disable network | 
					
						
							| 
									
										
										
										
											2015-03-13 18:37:13 +01:00
										 |  |  | 	ethereum, err := eth.New(cfg) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		utils.Fatalf("%v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// import the genesis block | 
					
						
							|  |  |  | 	ethereum.ResetWithGenesisBlock(test.Genesis) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// import pre accounts | 
					
						
							| 
									
										
										
										
											2015-03-20 09:10:13 +01:00
										 |  |  | 	statedb, err := test.InsertPreState(ethereum.StateDb()) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2015-03-13 18:37:13 +01:00
										 |  |  | 		utils.Fatalf("could not insert genesis accounts: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// insert the test blocks, which will execute all transactions | 
					
						
							|  |  |  | 	chain := ethereum.ChainManager() | 
					
						
							|  |  |  | 	if err := chain.InsertChain(test.Blocks); err != nil { | 
					
						
							|  |  |  | 		utils.Fatalf("Block Test load error: %v", err) | 
					
						
							|  |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2015-03-20 09:10:13 +01:00
										 |  |  | 		fmt.Println("Block Test chain loaded") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err := test.ValidatePostState(statedb); err != nil { | 
					
						
							|  |  |  | 		utils.Fatalf("post state validation failed: %v", err) | 
					
						
							| 
									
										
										
										
											2015-03-13 18:37:13 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-03-20 09:10:13 +01:00
										 |  |  | 	fmt.Println("Block Test post state validated, starting ethereum.") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-20 01:59:38 +01:00
										 |  |  | 	if startrpc == "rpc" { | 
					
						
							|  |  |  | 		startEth(ctx, ethereum) | 
					
						
							|  |  |  | 		utils.StartRPC(ethereum, ctx) | 
					
						
							|  |  |  | 		ethereum.WaitForShutdown() | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		startEth(ctx, ethereum) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-03-13 18:37:13 +01:00
										 |  |  | } |