diff options
Diffstat (limited to 'runner.go')
-rw-r--r-- | runner.go | 161 |
1 files changed, 116 insertions, 45 deletions
@@ -3,14 +3,13 @@ package planr import ( "log" "os" + "path" + "sort" ) type Runner struct { - adapters []Adapter -} - -func (r *Runner) RegisterAdapter(a Adapter) { - r.adapters = append(r.adapters, a) + adapters map[string] Adapter + dirs DirConfig } func (r Runner) adapterCfgs() []AdapterConfig { @@ -23,71 +22,143 @@ func (r Runner) adapterCfgs() []AdapterConfig { return cgs } -type TcTab map[string] []*TestCase - -func (r Runner) buildTcLUT(tcs []TestCase) TcTab { - m := make(TcTab, 0) - - for i := range tcs { - tc := &tcs[i] - nm := *tc.Config.Adapter - m[nm] = append(m[nm], tc) - } - - return m -} - +// TODO: Move into configuration parsing func (r Runner) checkConfig(tcs []TestCase) { for _, tc := range tcs { tc.Config.ensureSatisfied(tc.Path) } } -func cdBuild(adapter Adapter) { - dir := adapter.Config().Dir() +func (r Runner) setupEnv(adapter Adapter) { + nm := adapter.Config().Name + wd := path.Join(r.dirs.Build(), nm) - if err := os.Chdir(dir); err != nil { - log.Fatal(err) - } + if !directoryExists(wd) { + if err := os.Mkdir(wd, 0755); err != nil { + log.Fatalf("Could not create adapter config %s %v\n", wd, err) + } + } + + safeCd(wd) +} + +type adapterTestSet struct { + adapter Adapter + tcs []TestCase } -func (r Runner) build(tcs []TestCase) { +func (r Runner) groupByAdapter(tcs []TestCase) []adapterTestSet { r.checkConfig(tcs) + + pairs := make(map[string] adapterTestSet, 0) - tcTab := r.buildTcLUT(tcs) + for _, tc := range tcs { + // TODO: Make non-pointer + adptNm := *tc.Config.Adapter + + // See if adapter if contained in map + adapter, contained := r.adapters[adptNm] - for _, adapter := range r.adapters { - nm := adapter.Config().Name - cdBuild(adapter) + if !contained { + log.Fatalf("Cannot find adapter \"%s\" for testcase \"%s\"", adptNm, tc.Cname) + } - adapter.Build(tcTab[nm]) + pair, exists := pairs[adptNm] + + if !exists { + pair.adapter = adapter + } + + pair.tcs = append(pair.tcs, tc) + + pairs[adptNm] = pair } + + + // Convert to slice + set := make([]adapterTestSet, 0) + + for _, pair := range pairs { + set = append(set, pair) + } + + return set } -func (r Runner) units(root string) []TestCase { - return collectUnits(root, r.adapterCfgs()) +func (r Runner) CollectCases() []TestCase { + return collectUnits(r.dirs.Rubric(), r.adapterCfgs()) } -func (r Runner) Build(root string) { - units := r.units(root) - r.build(units) +func (r Runner) Build(tcs []TestCase) { + + if !directoryExists(r.dirs.Build()) { + r.dirs.MkBuild() + } + + testSets := r.groupByAdapter(tcs) + + for _, pair := range testSets { + adapter := pair.adapter + cases := pair.tcs + + r.setupEnv(adapter) + + adapter.Build(cases) + } + + safeCd(r.dirs.Config()) } -func (r Runner) evaluate(tcs []TestCase) { - tcTab := r.buildTcLUT(tcs) +func (r Runner) Evaluate(tcs []TestCase) []TestResult { + testSets := r.groupByAdapter(tcs) + results := make([]TestResult, 0) - for _, adapter := range r.adapters { - nm := adapter.Config().Name - cdBuild(adapter) + c := make(chan []TestResult) + for _, pair := range testSets { + go func (pair adapterTestSet) { + adapter := pair.adapter + cases := pair.tcs - adapter.Evaluate(tcTab[nm]) + r.setupEnv(adapter) + resultSet := adapter.Evaluate(cases) + + c <- resultSet + }(pair) + } + + for range testSets { + results = append(results, (<-c)...) } + + sort.Sort(ByReadIdx(results)) + + safeCd(r.dirs.Config()) + + return results +} + +func (r Runner) Clean() { + r.dirs.CleanBuild() } -func (r Runner) Evaluate(root string) []TestCase { - units := r.units(root) +func (r Runner) BuildDir() string { + return r.dirs.Build(); +} + +func (r Runner) ConfigDir() string { + return r.dirs.Config() +} - r.evaluate(units) +func (r Runner) SrcDir() string { + return r.dirs.Src() +} + +func NewRunner(adapters map[string]Adapter, dirs DirConfig) Runner { + r := Runner{adapters, dirs} + + for _, adapter := range r.adapters { + adapter.Init(dirs) + } - return units + return r } |