Chromium Code Reviews| Index: tests/trial_dir.py |
| diff --git a/tests/trial_dir.py b/tests/trial_dir.py |
| new file mode 100755 |
| index 0000000000000000000000000000000000000000..fc285018e525e09b0e9868dad93bd0195a5148e6 |
| --- /dev/null |
| +++ b/tests/trial_dir.py |
| @@ -0,0 +1,91 @@ |
| +#!/usr/bin/python |
| +# Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| +# Use of this source code is governed by a BSD-style license that can be |
| +# found in the LICENSE file. |
| + |
| +"""Base unittest class that cleans off a trial directory.""" |
|
Evan Martin
2011/03/04 19:46:11
Can you elaborate on this? (English note: "cleans
Evan Martin
2011/03/04 21:44:28
This comment is now wrong, too. :)
"""Helper cla
|
| + |
| +import atexit |
| +import logging |
| +import os |
| +import sys |
| +import tempfile |
| +import unittest |
| + |
| +ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) |
| +sys.path.insert(0, os.path.dirname(ROOT_DIR)) |
|
Evan Martin
2011/03/04 19:46:11
Isn't this implicit in how Python imports work?
M-A Ruel
2011/03/04 20:00:49
No because I'm adding the parent's directory.
|
| + |
| +import gclient_utils |
| + |
| + |
| +class TrialDir(object): |
| + """Manages temporary directories. On first object creation, |
| + TrialDir.TRIAL_ROOT will be set to a new temporary directory. It will be |
| + deleted on process exit unless TrialDir.SHOULD_LEAK is set to True. |
| + """ |
| + # When SHOULD_LEAK is set to True, temporary directories created while the |
| + # tests are running aren't deleted at the end of the tests. Expect failures |
| + # when running more than one test due to inter-test side-effects. Helps with |
| + # debugging. |
| + SHOULD_LEAK = False |
| + |
| + # Main root directory. |
| + TRIAL_ROOT = None |
| + |
| + def __init__(self, subdir, leak=False): |
| + self.leak = self.SHOULD_LEAK or leak |
| + self.subdir = subdir |
| + self.root_dir = None |
| + |
| + def set_up(self): |
| + """All late initialization comes here. |
| + |
| + Note that it deletes all trial_dir() and not only repos_dir. |
|
Evan Martin
2011/03/04 19:46:11
repos_dir isn't meaningful in this file, I'm not s
M-A Ruel
2011/03/04 20:00:49
Copy-paste fail.
|
| + """ |
| + # You can override self.TRIAL_ROOT. |
| + if not self.TRIAL_ROOT: |
| + # Was not yet initialized. |
| + TrialDir.TRIAL_ROOT = os.path.realpath(tempfile.mkdtemp(prefix='trial')) |
| + atexit.register(self._clean) |
| + self.root_dir = os.path.join(TrialDir.TRIAL_ROOT, self.subdir) |
| + gclient_utils.RemoveDirectory(self.root_dir) |
| + os.makedirs(self.root_dir) |
| + |
| + def tear_down(self): |
| + """Cleans the trial subdirectory for this instance.""" |
| + if not self.leak: |
| + logging.debug('Removing %s' % self.root_dir) |
| + gclient_utils.RemoveDirectory(self.root_dir) |
| + else: |
| + logging.error('Leaking %s' % self.root_dir) |
| + self.root_dir = None |
| + |
| + @staticmethod |
| + def _clean(): |
| + """Cleans the root trial directory.""" |
| + if not TrialDir.SHOULD_LEAK: |
| + logging.debug('Removing %s' % TrialDir.TRIAL_ROOT) |
| + gclient_utils.RemoveDirectory(TrialDir.TRIAL_ROOT) |
| + else: |
| + logging.error('Leaking' % TrialDir.TRIAL_ROOT) |
| + |
| + |
| +class TestCase(unittest.TestCase): |
| + def setUp(self): |
| + # Create a specific directory just for the test. |
| + self.trial = TrialDir(self.id()) |
| + self.trial.set_up() |
| + |
| + def tearDown(self): |
| + self.trial.tear_down() |
| + |
| + @property |
| + def root_dir(self): |
| + return self.trial.root_dir |
| + |
| + |
| +if '-l' in sys.argv: |
|
Evan Martin
2011/03/04 19:46:11
This feels fragile, but I'll let you judge. gyp u
M-A Ruel
2011/03/04 20:00:49
It's only used when testing manually to inspect th
|
| + # See SHOULD_LEAK definition in TrialDir for its purpose. |
| + TrialDir.SHOULD_LEAK = True |
| + print 'Leaking!' |
| + sys.argv.remove('-l') |