package tests import ( "encoding/json" "fmt" "io" "io/ioutil" "net/http" "os" "path/filepath" // "github.com/ethereum/go-ethereum/logger/glog" ) var ( baseDir = filepath.Join(".", "files") blockTestDir = filepath.Join(baseDir, "BlockTests") stateTestDir = filepath.Join(baseDir, "StateTests") transactionTestDir = filepath.Join(baseDir, "TransactionTests") vmTestDir = filepath.Join(baseDir, "VMTests") BlockSkipTests = []string{"SimpleTx3"} TransSkipTests = []string{"TransactionWithHihghNonce256"} StateSkipTests = []string{"mload32bitBound_return", "mload32bitBound_return2"} VmSkipTests = []string{} ) // type TestRunner interface { // // LoadTest() // RunTest() error // } // func RunTests(bt map[string]TestRunner, skipTests []string) error { // // map skipped tests to boolean set // skipTest := make(map[string]bool, len(skipTests)) // for _, name := range skipTests { // skipTest[name] = true // } // for name, test := range bt { // // if the test should be skipped, return // if skipTest[name] { // glog.Infoln("Skipping block test", name) // return nil // } // // test the block // if err := test.RunTest(); err != nil { // return err // } // glog.Infoln("Block test passed: ", name) // } // return nil // } 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()) } 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 }