diff --git a/cmd/ethtest/main.go b/cmd/ethtest/main.go index 07554c89f6..844c15e328 100644 --- a/cmd/ethtest/main.go +++ b/cmd/ethtest/main.go @@ -22,62 +22,92 @@ package main import ( + "io/ioutil" "os" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/tests" ) +func getFiles(path string) ([]string, error) { + var files []string + f, err := os.Open(path) + if err != nil { + return nil, err + } + defer f.Close() + + fi, err := f.Stat() + if err != nil { + return nil, err + } + + switch mode := fi.Mode(); { + case mode.IsDir(): + fi, _ := ioutil.ReadDir(path) + files = make([]string, len(fi)) + for i, v := range fi { + // only go 1 depth and leave directory entires blank + if !v.IsDir() { + files[i] = path + v.Name() + } + } + case mode.IsRegular(): + files = make([]string, 1) + files[0] = path + } + + return files, nil +} + func main() { glog.SetToStderr(true) - + var continueOnError bool = false // vm.Debug = true if len(os.Args) < 2 { glog.Exit("Must specify test type") } - test := os.Args[1] - - // var code int - switch test { - case "vm", "VMTests": - if len(os.Args) > 2 { - if err := tests.RunVmTest(os.Args[2]); err != nil { - glog.Errorln(err) - } - } else { - glog.Exit("Must supply file argument") - } - case "state", "StateTest": - if len(os.Args) > 2 { - if err := tests.RunStateTest(os.Args[2]); err != nil { - glog.Errorln(err) - } - // code = RunVmTest(strings.NewReader(os.Args[2])) - } else { - glog.Exit("Must supply file argument") - // code = RunVmTest(os.Stdin) - } - case "tx", "TransactionTests": - if len(os.Args) > 2 { - if err := tests.RunTransactionTests(os.Args[2]); err != nil { - glog.Errorln(err) - } - } else { - glog.Exit("Must supply file argument") - } - case "bc", "BlockChainTest": - if len(os.Args) > 2 { - if err := tests.RunBlockTest(os.Args[2]); err != nil { - glog.Errorln(err) - } - } else { - glog.Exit("Must supply file argument") - } - default: - glog.Exit("Invalid test type specified") + testtype := os.Args[1] + var pattern string + if len(os.Args) > 2 { + pattern = os.Args[2] } - // os.Exit(code) + files, err := getFiles(pattern) + if err != nil { + glog.Fatal(err) + } + + for _, testfile := range files { + // Skip blank entries + if len(testfile) == 0 { + continue + } + // TODO allow io.Reader to be passed so Stdin can be piped + // RunVmTest(strings.NewReader(os.Args[2])) + // RunVmTest(os.Stdin) + var err error + switch testtype { + case "vm", "VMTests": + err = tests.RunVmTest(testfile) + case "state", "StateTest": + err = tests.RunStateTest(testfile) + case "tx", "TransactionTests": + err = tests.RunTransactionTests(testfile) + case "bc", "BlockChainTest": + err = tests.RunBlockTest(testfile) + default: + glog.Fatalln("Invalid test type specified") + } + + if err != nil { + if continueOnError { + glog.Errorln(err) + } else { + glog.Fatalln(err) + } + } + } }