30
31
class SuitesPrompt(Plugin):
32
# Plugin default for running suite types
33
plugin_default = String(default="external")
35
# Plugin priorities for running suites
33
# Plugin priorities for running jobs
36
34
plugin_priorities = List(String(), default_factory=lambda:"internal")
38
# Space separated list of directories where suite files are stored.
39
directories = List(Path(),
40
default_factory=lambda:"%(checkbox_share)s/suites")
42
# List of suites to blacklist
43
blacklist = List(String(), default_factory=lambda:"")
45
# List of suites to whitelist
46
whitelist = List(String(), default_factory=lambda:"")
48
def _suites_compare(self, a, b):
49
priorities = self.plugin_priorities
50
if a["plugin"] in priorities:
51
if b["plugin"] in priorities:
52
ia = priorities.index(a["plugin"])
53
ib = priorities.index(b["plugin"])
58
elif b["plugin"] in priorities:
61
return cmp(a["name"], b["name"])
63
def _suites_exclude(self, suite):
64
suites_ignore = self.persist.get("ignore", [])
65
if "description" in suite and suite["description"] in suites_ignore:
70
36
def register(self, manager):
71
37
super(SuitesPrompt, self).register(manager)
72
38
self._iterator = None
78
("gather", self.gather),
79
44
("gather-persist", self.gather_persist),
45
("ignore-jobs", self.ignore_jobs),
80
46
("report-suite", self.report_suite),
81
("prompt-suite", self.prompt_suite),
47
("report-test", self.report_test),
82
48
("prompt-suites", self.prompt_suites)]:
83
49
self._manager.reactor.call_on(rt, rh)
85
51
self._manager.reactor.call_on("prompt-gather", self.prompt_gather, 100)
86
self._manager.reactor.call_on("report-(attachment|test)",
87
self.report_attachment_or_test, -100)
90
for directory in self.directories:
91
self._manager.reactor.fire("message-directory", directory)
93
53
def gather_persist(self, persist):
94
54
self.persist = persist.root_at("suites_prompt")
96
def report_attachment_or_test(self, element):
98
element.setdefault("suite", self._suite["name"])
99
if element["plugin"] != "attachment":
100
self._tests.setdefault(self._suite["name"], [])
101
self._tests[self._suite["name"]].append(element["name"])
56
def ignore_jobs(self, jobs):
103
59
def report_suite(self, suite):
104
whitelist_patterns = [re.compile(r"^%s$" % r) for r in self.whitelist if r]
105
blacklist_patterns = [re.compile(r"^%s$" % r) for r in self.blacklist if r]
107
60
name = suite["name"]
108
if whitelist_patterns:
109
if not [name for p in whitelist_patterns if p.match(name)]:
111
elif blacklist_patterns:
112
if [name for p in blacklist_patterns if p.match(name)]:
61
suite.update(self._suites.get(name, {}))
62
suite.setdefault("type", "suite")
63
self._suites[name] = suite
115
if suite["name"] not in self._suites:
116
suite.setdefault("plugin", self.plugin_default)
117
self._suites[suite["name"]] = self._suite = suite
65
def report_test(self, test):
67
self._tests[name] = test
119
69
def prompt_gather(self, interface):
120
if len(self._suites) > 1:
121
suites_tree = dict((s["description"], self._tests.get(s["name"], []))
122
for s in self._suites.values() if "description" in s)
123
suites_default = self.persist.get("default")
124
if suites_default is None:
125
suites_default = dict(suites_tree)
127
suites_results = interface.show_tree(
128
_("Select the suites to test"),
129
suites_tree, suites_default)
130
self.persist.set("default", suites_results)
133
for suite, tests in suites_tree.items():
134
if suite not in suites_results:
135
ignore_tests.extend(tests)
139
if test not in suites_results[suite]:
140
ignore_tests.append(test)
142
self._manager.reactor.fire("ignore-tests", ignore_tests)
144
def prompt_suite(self, interface, suite):
145
self._manager.reactor.fire("prompt-%s" % suite["plugin"],
70
# Resolve dependencies
71
compare = lambda a, b: cmp(a["name"], b["name"])
72
resolver = Resolver(compare=compare, key=lambda e: e["name"])
73
jobs = dict((k, v) for k, v in self._suites.items() + self._tests.items())
74
for job in jobs.values():
75
depends = [jobs[job["suite"]]] if "suite" in job else []
76
resolver.add(job, *depends)
80
for job in resolver.get_dependents():
82
dependencies = resolver.get_dependencies(job)
83
for dependency in dependencies:
84
if dependency.get("type") == "suite":
85
attribute = "description"
89
suboptions = suboptions.setdefault(dependency[attribute], {})
92
defaults = self.persist.get("default")
94
defaults = copy.deepcopy(options)
97
results = interface.show_tree(_("Select the suites to test"),
99
self.persist.set("default", results)
101
# Get tests to ignore
102
def get_ignore_jobs(options, results):
104
for k, v in options.iteritems():
105
if not v and k not in results:
109
jobs.extend(get_ignore_jobs(options[k], results.get(k, {})))
113
ignore_jobs = get_ignore_jobs(options, results)
114
self._manager.reactor.fire("ignore-jobs", ignore_jobs)
148
116
def prompt_suites(self, interface):
149
117
if not self._iterator: