package tests import ( "encoding/json" "fmt" "io" "io/ioutil" "net/http" "os" "path/filepath" "github.com/ethereum/go-ethereum/core" ) var ( baseDir = filepath.Join(".", "files") blockTestDir = filepath.Join(baseDir, "BlockchainTests") stateTestDir = filepath.Join(baseDir, "StateTests") transactionTestDir = filepath.Join(baseDir, "TransactionTests") vmTestDir = filepath.Join(baseDir, "VMTests") BlockSkipTests = []string{ "SimpleTx3", // these panic in block_processor.go:84 , see https://github.com/ethereum/go-ethereum/issues/1384 "TRANSCT_rvalue_TooShort", "TRANSCT_rvalue_TooLarge", "TRANSCT_svalue_TooLarge", // TODO: check why these fail "BLOCK__RandomByteAtTheEnd", "TRANSCT__RandomByteAtTheEnd", "BLOCK__ZeroByteAtTheEnd", "TRANSCT__ZeroByteAtTheEnd", // TODO: why does this fail? should be check in ethash now "DifficultyIsZero", // TODO: why does this fail? "wrongMixHash", } TransSkipTests = []string{"TransactionWithHihghNonce256"} StateSkipTests = []string{"mload32bitBound_return", "mload32bitBound_return2"} VmSkipTests = []string{} ) func readJson(reader io.Reader, value interface{}) error { data, err := ioutil.ReadAll(reader) if err != nil { return fmt.Errorf("Error reading JSON file", err.Error()) } core.DisableBadBlockReporting = true if err = json.Unmarshal(data, &value); err != nil { if syntaxerr, ok := err.(*json.SyntaxError); ok { line := findLine(data, syntaxerr.Offset) return fmt.Errorf("JSON syntax error at line %v: %v", line, err) } return fmt.Errorf("JSON unmarshal error: %v", err) } return nil } func readJsonHttp(uri string, value interface{}) error { resp, err := http.Get(uri) if err != nil { return err } defer resp.Body.Close() err = readJson(resp.Body, value) if err != nil { return err } return nil } func readJsonFile(fn string, value interface{}) error { file, err := os.Open(fn) if err != nil { return err } defer file.Close() err = readJson(file, value) if err != nil { return fmt.Errorf("%s in file %s", err.Error(), fn) } return nil } // findLine returns the line number for the given offset into data. func findLine(data []byte, offset int64) (line int) { line = 1 for i, r := range string(data) { if int64(i) >= offset { return } if r == '\n' { line++ } } return }