Index: tools/isolate/isolate_smoke_test.py |
diff --git a/tools/isolate/isolate_smoke_test.py b/tools/isolate/isolate_smoke_test.py |
index d0dd9a7239df6c4693b9e593f3fe5655ba899fd7..92f28ce481b38a58889844f227dc141e15a1c264 100755 |
--- a/tools/isolate/isolate_smoke_test.py |
+++ b/tools/isolate/isolate_smoke_test.py |
@@ -65,6 +65,14 @@ class CalledProcessError(subprocess.CalledProcessError): |
'cwd=%s\n%s') % (self.cwd, self.output) |
+def list_files_tree(directory): |
+ """Returns the list of all the files in a tree.""" |
+ actual = [] |
+ for root, _dirs, files in os.walk(directory): |
+ actual.extend(os.path.join(root, f)[len(directory)+1:] for f in files) |
+ return sorted(actual) |
+ |
+ |
class IsolateBase(unittest.TestCase): |
# To be defined by the subclass, it defines the amount of meta data saved by |
# isolate.py for each file. Should be one of (NO_INFO, STATS_ONLY, WITH_HASH). |
@@ -74,9 +82,8 @@ class IsolateBase(unittest.TestCase): |
# The tests assume the current directory is the file's directory. |
os.chdir(ROOT_DIR) |
self.tempdir = tempfile.mkdtemp() |
- self.result = os.path.join(self.tempdir, 'isolate_smoke_test.result') |
+ self.result = os.path.join(self.tempdir, 'isolate_smoke_test.results') |
self.outdir = os.path.join(self.tempdir, 'isolated') |
- self.maxDiff = None |
def tearDown(self): |
shutil.rmtree(self.tempdir) |
@@ -85,10 +92,7 @@ class IsolateBase(unittest.TestCase): |
self.assertFalse(os.path.exists(self.outdir)) |
def _result_tree(self): |
- actual = [] |
- for root, _dirs, files in os.walk(self.outdir): |
- actual.extend(os.path.join(root, f)[len(self.outdir)+1:] for f in files) |
- return sorted(actual) |
+ return list_files_tree(self.outdir) |
def _expected_tree(self): |
"""Verifies the files written in the temporary directory.""" |
@@ -466,11 +470,12 @@ class Isolate_trace(IsolateBase): |
out = e.output |
self._expect_no_tree() |
self._expect_results(['fail.py'], None, None) |
- # In theory, there should be 2 \n at the end of expected but for an |
- # unknown reason there's 3 \n on Windows so just rstrip() and compare the |
- # text, that's sufficient for this test. |
expected = 'Failing' |
- self.assertEquals(expected, out.rstrip()) |
+ if sys.platform == 'win32': |
+ # Includes spew from tracerpt.exe. |
+ self.assertTrue(out.startswith(expected)) |
+ else: |
+ self.assertEquals(expected, out.rstrip()) |
def test_missing_trailing_slash(self): |
try: |
@@ -554,6 +559,141 @@ class Isolate_trace(IsolateBase): |
self.assertEquals(self._to_string(expected), out) |
+class IsolateNoOutdir(IsolateBase): |
+ # Test without the --outdir flag. |
+ # So all the files are first copied in the tempdir and the test is run from |
+ # there. |
+ def setUp(self): |
+ super(IsolateNoOutdir, self).setUp() |
+ self.root = os.path.join(self.tempdir, 'root') |
+ os.makedirs(os.path.join(self.root, 'data', 'isolate')) |
+ for i in ('touch_root.isolate', 'touch_root.py'): |
+ shutil.copy( |
+ os.path.join(ROOT_DIR, 'data', 'isolate', i), |
+ os.path.join(self.root, 'data', 'isolate', i)) |
+ shutil.copy( |
+ os.path.join(ROOT_DIR, 'isolate.py'), |
+ os.path.join(self.root, 'isolate.py')) |
+ |
+ def _execute(self, mode, case, args, need_output): |
+ """Executes isolate.py.""" |
+ self.assertEquals( |
+ mode, self.mode(), 'Rename the test fixture to Isolate_%s' % mode) |
+ self.assertEquals( |
+ case, |
+ self.case() + '.isolate', |
+ 'Rename the test case to test_%s()' % case) |
+ cmd = [ |
+ sys.executable, os.path.join(ROOT_DIR, 'isolate.py'), |
+ '--result', self.result, |
+ self.filename(), |
+ '--mode', self.mode(), |
+ ] |
+ cmd.extend(args) |
+ |
+ env = os.environ.copy() |
+ if 'ISOLATE_DEBUG' in env: |
+ del env['ISOLATE_DEBUG'] |
+ |
+ if need_output or not VERBOSE: |
+ stdout = subprocess.PIPE |
+ stderr = subprocess.STDOUT |
+ else: |
+ cmd.extend(['-v'] * 3) |
+ stdout = None |
+ stderr = None |
+ |
+ cwd = self.tempdir |
+ p = subprocess.Popen( |
+ cmd, |
+ stdout=stdout, |
+ stderr=stderr, |
+ cwd=cwd, |
+ env=env, |
+ universal_newlines=True) |
+ out = p.communicate()[0] |
+ if p.returncode: |
+ raise CalledProcessError(p.returncode, cmd, out, cwd) |
+ return out |
+ |
+ def mode(self): |
+ """Returns the execution mode corresponding to this test case.""" |
+ test_id = self.id().split('.') |
+ self.assertEquals(3, len(test_id)) |
+ self.assertEquals('__main__', test_id[0]) |
+ return re.match('^test_([a-z]+)$', test_id[2]).group(1) |
+ |
+ def case(self): |
+ """Returns the filename corresponding to this test case.""" |
+ return 'touch_root' |
+ |
+ def filename(self): |
+ """Returns the filename corresponding to this test case.""" |
+ filename = os.path.join( |
+ self.root, 'data', 'isolate', self.case() + '.isolate') |
+ self.assertTrue(os.path.isfile(filename), filename) |
+ return filename |
+ |
+ def test_check(self): |
+ self._execute('check', 'touch_root.isolate', [], False) |
+ files = [ |
+ 'isolate_smoke_test.results', |
+ 'isolate_smoke_test.state', |
+ os.path.join('root', 'data', 'isolate', 'touch_root.isolate'), |
+ os.path.join('root', 'data', 'isolate', 'touch_root.py'), |
+ os.path.join('root', 'isolate.py'), |
+ ] |
+ self.assertEquals(files, list_files_tree(self.tempdir)) |
+ |
+ def test_hashtable(self): |
+ self._execute('hashtable', 'touch_root.isolate', [], False) |
+ files = [ |
+ os.path.join('hashtable', '99a015fd7df97416caf25576df502a70a3f32078'), |
+ os.path.join('hashtable', 'ddcd30d62a6df9964a43541b14536ddaeafc8598'), |
+ 'isolate_smoke_test.results', |
+ 'isolate_smoke_test.state', |
+ os.path.join('root', 'data', 'isolate', 'touch_root.isolate'), |
+ os.path.join('root', 'data', 'isolate', 'touch_root.py'), |
+ os.path.join('root', 'isolate.py'), |
+ ] |
+ self.assertEquals(files, list_files_tree(self.tempdir)) |
+ |
+ def test_remap(self): |
+ self._execute('remap', 'touch_root.isolate', [], False) |
+ files = [ |
+ 'isolate_smoke_test.results', |
+ 'isolate_smoke_test.state', |
+ os.path.join('root', 'data', 'isolate', 'touch_root.isolate'), |
+ os.path.join('root', 'data', 'isolate', 'touch_root.py'), |
+ os.path.join('root', 'isolate.py'), |
+ ] |
+ self.assertEquals(files, list_files_tree(self.tempdir)) |
+ |
+ def test_run(self): |
+ self._execute('run', 'touch_root.isolate', [], False) |
+ files = [ |
+ 'isolate_smoke_test.results', |
+ 'isolate_smoke_test.state', |
+ os.path.join('root', 'data', 'isolate', 'touch_root.isolate'), |
+ os.path.join('root', 'data', 'isolate', 'touch_root.py'), |
+ os.path.join('root', 'isolate.py'), |
+ ] |
+ self.assertEquals(files, list_files_tree(self.tempdir)) |
+ |
+ def test_trace(self): |
+ self._execute('trace', 'touch_root.isolate', [], False) |
+ files = [ |
+ 'isolate_smoke_test.results', |
+ 'isolate_smoke_test.state', |
+ os.path.join('root', 'data', 'isolate', 'touch_root.isolate'), |
+ os.path.join('root', 'data', 'isolate', 'touch_root.py'), |
+ os.path.join('root', 'isolate.py'), |
+ ] |
+ # Clean the directory from the logs, which are OS-specific. |
+ isolate.trace_inputs.get_api().clean_trace( |
+ os.path.join(self.tempdir, 'isolate_smoke_test.results.log')) |
+ self.assertEquals(files, list_files_tree(self.tempdir)) |
+ |
if __name__ == '__main__': |
VERBOSE = '-v' in sys.argv |