From b448390889685fc87f221c152b16b82849f7797f Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Mon, 20 Apr 2015 18:14:57 +0200 Subject: Further fixes to block test wrapper * Move go test wrapper for block tests from cmd/geth to tests * Fix logic for when tests are valid or not, by adding correct validations for expected valid/invalid blocks * Change block insertion helper to work on single blocks * Add one test case for each file in BlockTests and comment out the tests which are currently failing * Add Skip call in all block tests in lieu of performance fixes around ethash cache which are needed before it will be fast enough to start / stop the node between each test --- tests/block_test.go | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 tests/block_test.go (limited to 'tests/block_test.go') diff --git a/tests/block_test.go b/tests/block_test.go new file mode 100644 index 000000000..bffaf50da --- /dev/null +++ b/tests/block_test.go @@ -0,0 +1,126 @@ +package tests + +import ( + "path" + "testing" + + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/ethdb" +) + +// TODO: refactor test setup & execution to better align with vm and tx tests +func TestBcValidBlockTests(t *testing.T) { + t.Skip("Skipped in lieu of performance fixes.") + runBlockTestsInFile("files/BlockTests/bcValidBlockTest.json", []string{}, t) +} + +func TestBcUncleTests(t *testing.T) { + t.Skip("Skipped in lieu of performance fixes.") + runBlockTestsInFile("files/BlockTests/bcUncleTest.json", []string{}, t) +} + +func TestBcUncleHeaderValidityTests(t *testing.T) { + t.Skip("Skipped in lieu of performance fixes.") + runBlockTestsInFile("files/BlockTests/bcUncleHeaderValiditiy.json", []string{}, t) +} + +func TestBcInvalidHeaderTests(t *testing.T) { + t.Skip("Skipped in lieu of performance fixes.") + snafus := []string{ + "wrongUncleHash", // TODO: why does this fail? + } + runBlockTestsInFile("files/BlockTests/bcInvalidHeaderTest.json", snafus, t) +} + +func TestBcInvalidRLPTests(t *testing.T) { + t.Skip("Skipped in lieu of performance fixes.") + snafus := []string{ + // TODO: why does these fail? + "TRANSCT__ZeroByteAtTheEnd", + "TRANSCT__RandomByteAtTheEnd", + "BLOCK__ZeroByteAtTheEnd", + "BLOCK__RandomByteAtTheEnd", + } + runBlockTestsInFile("files/BlockTests/bcInvalidRLPTest.json", snafus, t) +} + +func TestBcJSAPITests(t *testing.T) { + t.Skip("Skipped in lieu of performance fixes.") + runBlockTestsInFile("files/BlockTests/bcJS_API_Test.json", []string{}, t) +} + +func TestBcRPCAPITests(t *testing.T) { + t.Skip("Skipped in lieu of performance fixes.") + runBlockTestsInFile("files/BlockTests/bcRPC_API_Test.json", []string{}, t) +} + +func TestBcForkBlockTests(t *testing.T) { + t.Skip("Skipped in lieu of performance fixes.") + runBlockTestsInFile("files/BlockTests/bcForkBlockTest.json", []string{}, t) +} + +func runBlockTestsInFile(filepath string, snafus []string, t *testing.T) { + bt, err := LoadBlockTests(filepath) + if err != nil { + t.Fatal(err) + } + + notWorking := make(map[string]bool, 100) + for _, name := range snafus { + notWorking[name] = true + } + + for name, test := range bt { + if !notWorking[name] { + runBlockTest(name, test, t) + } + } +} + +func runBlockTest(name string, test *BlockTest, t *testing.T) { + t.Log("Running test: ", name) + cfg := testEthConfig() + ethereum, err := eth.New(cfg) + if err != nil { + t.Fatalf("%v", err) + } + + err = ethereum.Start() + if err != nil { + t.Fatalf("%v", err) + } + + // import the genesis block + ethereum.ResetWithGenesisBlock(test.Genesis) + + // import pre accounts + statedb, err := test.InsertPreState(ethereum.StateDb()) + if err != nil { + t.Fatalf("InsertPreState: %v", err) + } + + err = test.TryBlocksInsert(ethereum.ChainManager()) + if err != nil { + t.Fatal(err) + } + + if err = test.ValidatePostState(statedb); err != nil { + t.Fatal("post state validation failed: %v", err) + } + t.Log("Test passed: ", name) +} + +func testEthConfig() *eth.Config { + ks := crypto.NewKeyStorePassphrase(path.Join(common.DefaultDataDir(), "keys")) + + return ð.Config{ + DataDir: common.DefaultDataDir(), + LogLevel: 5, + Etherbase: "primary", + AccountManager: accounts.NewManager(ks), + NewDB: func(path string) (common.Database, error) { return ethdb.NewMemDatabase() }, + } +} -- cgit