summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@gmail.com>2014-10-11 23:53:28 +0100
committerRichard Maw <richard.maw@gmail.com>2014-10-15 14:10:05 +0000
commit69dcbb0a55db2422759819e46d8d5ce0121a1a82 (patch)
tree72f752202d4a8d39b85c397be088b46dc7fab5e8
parent16c307a779b929eb4c0010fc20e12df4f28b3247 (diff)
downloadcmdtest-69dcbb0a55db2422759819e46d8d5ce0121a1a82.tar.gz
yarn: Move scenario setup into ScenarioRunner
Now you should call .run_scenarios instead of .run_scenario, and pass testdir to the ScenarioRunner class. You can still call .run_scenario directly instead. The testdir argument isn't required when used that way.
-rwxr-xr-xyarn52
-rw-r--r--yarnlib/scenario_runner.py49
2 files changed, 55 insertions, 46 deletions
diff --git a/yarn b/yarn
index 15b279a..bb5759a 100755
--- a/yarn
+++ b/yarn
@@ -162,13 +162,12 @@ class YarnRunner(cliapp.Application):
pre_step_cb=self.pre_step,
post_step_cb=self.post_step,
pre_scenario_cb=self.pre_scenario,
- post_scenario_cb=self.post_scenario)
+ post_scenario_cb=self.post_scenario,
+ testdir=self.tempdir)
start_time = time.time()
- failed_scenarios = []
- for scenario in self.select_scenarios(scenarios):
- if not self.run_scenario(scenario_runner, scenario):
- failed_scenarios.append(scenario)
+ failed_scenarios = (
+ scenario_runner.run_scenarios(self.select_scenarios(scenarios)))
duration = time.time() - start_time
if not self.settings['snapshot']:
@@ -250,22 +249,6 @@ class YarnRunner(cliapp.Application):
return scenarios
- def run_scenario(self, scenario_runner, scenario):
- os.mkdir(self.scenario_dir(self.tempdir, scenario))
- datadir = self.datadir(self.tempdir, scenario)
- os.mkdir(datadir)
- homedir = self.homedir(datadir)
- os.mkdir(homedir)
-
- ud = self.pre_scenario(scenario, datadir, homedir)
- ok = scenario_runner.run_scenario(scenario, datadir, homedir)
- self.post_scenario(scenario, datadir, homedir, ud)
-
- return ok
-
- def homedir(self, datadir):
- return os.path.join(datadir, 'HOME')
-
def parse_env(self):
for option_arg in self.settings['env']:
if '=' not in option_arg:
@@ -339,16 +322,10 @@ class YarnRunner(cliapp.Application):
self.snapshot_datadir(self.tempdir, step_env['DATADIR'],
scenario, step_number, step)
- def scenario_dir(self, tempdir, scenario):
- return os.path.join(tempdir, self.nice(scenario.name))
-
- def datadir(self, tempdir, scenario):
- sd = self.scenario_dir(tempdir, scenario)
- return os.path.join(sd, 'datadir')
-
def snapshot_dir(self, tempdir, scenario, step, step_number):
- sd = self.scenario_dir(tempdir, scenario)
- base = '%03d-%s-%s' % (step_number, step.what, self.nice(step.text))
+ sd = yarnlib.ScenarioRunner.scenario_dir(tempdir, scenario)
+ base = '%03d-%s-%s' % (step_number, step.what,
+ yarnlib.ScenarioRunner.nice(step.text))
return os.path.join(sd, base)
def snapshot_datadir(self, tempdir, datadir, scenario, step_number, step):
@@ -358,21 +335,6 @@ class YarnRunner(cliapp.Application):
if exit != 0:
logging.warning('Snapshot copy failed:\n%s\n%s' % (out, err))
- def nice(self, name):
- # Quote a scenario or step name so it forms a nice filename.
- nice_chars = "abcdefghijklmnopqrstuvwxyz"
- nice_chars += nice_chars.upper()
- nice_chars += "0123456789-."
-
- nice = []
- for c in name:
- if c in nice_chars:
- nice.append(c)
- elif not nice or nice[-1] != '_':
- nice.append('_')
- nice = ''.join(nice)
- return nice
-
def indent(self, s):
return ''.join(' %s\n' % line for line in s.splitlines())
diff --git a/yarnlib/scenario_runner.py b/yarnlib/scenario_runner.py
index 28172e4..cb74859 100644
--- a/yarnlib/scenario_runner.py
+++ b/yarnlib/scenario_runner.py
@@ -103,13 +103,32 @@ class ScenarioRunner(object):
pre_step_cb=default_pre_step, post_step_cb=default_post_step,
pre_scenario_cb=lambda *x: None,
post_scenario_cb=lambda *x: None,
- cmdrunner=cliapp.runcmd_unchecked):
+ cmdrunner=cliapp.runcmd_unchecked, testdir=None):
self.shell_prelude = shell_prelude
self.srcdir = srcdir
self.env = self.clean_env(extra_env, SRCDIR=srcdir)
self.pre_step_cb = pre_step_cb
self.post_step_cb = post_step_cb
+ self.pre_scenario_cb = pre_scenario_cb
+ self.post_scenario_cb = post_scenario_cb
self.cmdrunner = cmdrunner
+ self.testdir = testdir
+
+ def run_scenarios(self, scenarios):
+ failed = []
+ for scenario in scenarios:
+ scenario_dir = self.scenario_dir(self.testdir, scenario)
+ os.mkdir(scenario_dir)
+ datadir = self.datadir(scenario_dir)
+ os.mkdir(datadir)
+ homedir = self.homedir(datadir)
+ os.mkdir(homedir)
+
+ ud = self.pre_scenario_cb(scenario, datadir, homedir)
+ if not self.run_scenario(scenario, datadir, homedir):
+ failed.append(scenario)
+ self.post_scenario_cb(scenario, datadir, homedir, ud)
+ return failed
def run_scenario(self, scenario, datadir, homedir):
assuming = [s for s in scenario.steps if s.what == 'ASSUMING']
@@ -202,3 +221,31 @@ class ScenarioRunner(object):
env.update(kwarg_env)
return env
+
+ @classmethod
+ def scenario_dir(cls, testdir, scenario):
+ return os.path.join(testdir, cls.nice(scenario.name))
+
+ @staticmethod
+ def datadir(scenario_dir):
+ return os.path.join(scenario_dir, 'datadir')
+
+ @staticmethod
+ def homedir(datadir):
+ return os.path.join(datadir, 'HOME')
+
+ @staticmethod
+ def nice(name):
+ # Quote a scenario or step name so it forms a nice filename.
+ nice_chars = "abcdefghijklmnopqrstuvwxyz"
+ nice_chars += nice_chars.upper()
+ nice_chars += "0123456789-."
+
+ nice = []
+ for c in name:
+ if c in nice_chars:
+ nice.append(c)
+ elif not nice or nice[-1] != '_':
+ nice.append('_')
+ nice = ''.join(nice)
+ return nice