* 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
		
			
				
	
	
		
			127 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
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() },
 | 
						|
	}
 | 
						|
}
 |