summaryrefslogtreecommitdiff
path: root/runner.go
diff options
context:
space:
mode:
authorflu0r1ne <flu0r1ne@flu0r1ne.net>2021-09-05 20:37:19 -0500
committerflu0r1ne <flu0r1ne@flu0r1ne.net>2021-09-05 20:37:19 -0500
commitf5b60238e05b124eb40f805eb4a0bbfc0b043da5 (patch)
treef461bff108f5ddafc4078aa7394d7bf2a6309cc9 /runner.go
parent8f22bd4f5b4eb6996c524bcb6948d36cef0ac822 (diff)
parentfd66fb134967067ed7e1c3182325f646b73c730b (diff)
downloaddeb-planr-f5b60238e05b124eb40f805eb4a0bbfc0b043da5.tar.xz
deb-planr-f5b60238e05b124eb40f805eb4a0bbfc0b043da5.zip
Merge branch 'upstream' into ppa
Merge v0.1.0
Diffstat (limited to 'runner.go')
-rw-r--r--runner.go161
1 files changed, 116 insertions, 45 deletions
diff --git a/runner.go b/runner.go
index 3bee17a..15f08ae 100644
--- a/runner.go
+++ b/runner.go
@@ -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
}