Index: tools/isolate/isolate_test.py |
diff --git a/tools/isolate/isolate_test.py b/tools/isolate/isolate_test.py |
index aa1dd69106fd4af0f5e44b00c5d925b3bd29916f..f2d9252d4f6fdb107c62f9faf30f2ae787635ef0 100755 |
--- a/tools/isolate/isolate_test.py |
+++ b/tools/isolate/isolate_test.py |
@@ -4,6 +4,8 @@ |
# found in the LICENSE file. |
import hashlib |
+import json |
+import logging |
import os |
import re |
import shutil |
@@ -13,6 +15,7 @@ import tempfile |
import unittest |
ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) |
+VERBOSE = False |
class Isolate(unittest.TestCase): |
@@ -23,27 +26,62 @@ class Isolate(unittest.TestCase): |
self.isolate = isolate |
self.tempdir = tempfile.mkdtemp() |
self.result = os.path.join(self.tempdir, 'result') |
+ if VERBOSE: |
csharp
2012/03/08 21:53:39
Why print a new line?
M-A Ruel
2012/03/08 21:56:41
Makes reading the output much easier. It's only wh
|
def tearDown(self): |
shutil.rmtree(self.tempdir) |
+ def _expected_tree(self, files): |
+ self.assertEquals(sorted(files), sorted(os.listdir(self.tempdir))) |
+ |
+ def _expected_result(self, with_hash, files, args, read_only): |
+ # 4 modes are supported, 0755 (rwx), 0644 (rw), 0555 (rx), 0444 (r) |
+ min_mode = 0444 |
+ if not read_only: |
+ min_mode |= 0200 |
+ def mode(filename): |
+ return (min_mode | 0111) if filename.endswith('.py') else min_mode |
+ expected = { |
+ u'command': |
+ [unicode(sys.executable), u'isolate_test.py'] + |
+ [unicode(x) for x in args], |
+ u'files': dict((unicode(f), {u'mode': mode(f)}) for f in files), |
+ } |
+ if with_hash: |
+ for filename in expected[u'files']: |
+ # Calculate our hash. |
+ h = hashlib.sha1() |
+ h.update(open(os.path.join(ROOT_DIR, filename), 'rb').read()) |
+ expected[u'files'][filename][u'sha-1'] = h.hexdigest() |
+ |
+ actual = json.load(open(self.result, 'rb')) |
+ self.assertEquals(expected, actual) |
+ return expected |
+ |
def _execute(self, args): |
cmd = [ |
sys.executable, os.path.join(ROOT_DIR, 'isolate.py'), |
'--root', ROOT_DIR, |
'--result', self.result, |
] |
+ if VERBOSE: |
+ cmd.extend(['-v'] * 3) |
+ stdout = None |
+ stderr = None |
+ else: |
+ stdout = subprocess.PIPE |
+ stderr = subprocess.STDOUT |
subprocess.check_call( |
- cmd + args, |
- stdout=subprocess.PIPE, |
- stderr=subprocess.STDOUT) |
+ cmd + args, stdout=stdout, stderr=stderr, cwd=ROOT_DIR) |
def test_help_modes(self): |
# Check coherency in the help and implemented modes. |
p = subprocess.Popen( |
[sys.executable, os.path.join(ROOT_DIR, 'isolate.py'), '--help'], |
stdout=subprocess.PIPE, |
- stderr=subprocess.STDOUT) |
+ stderr=subprocess.STDOUT, |
+ cwd=ROOT_DIR) |
out = p.communicate()[0].splitlines() |
self.assertEquals(0, p.returncode) |
out = out[out.index('') + 1:] |
@@ -53,6 +91,7 @@ class Isolate(unittest.TestCase): |
self.assertEquals(self.isolate.VALID_MODES, modes) |
for mode in modes: |
self.assertTrue(hasattr(self, 'test_%s' % mode), mode) |
+ self._expected_tree([]) |
def test_check(self): |
cmd = [ |
@@ -60,7 +99,8 @@ class Isolate(unittest.TestCase): |
'isolate_test.py', |
] |
self._execute(cmd) |
- self.assertTrue(os.path.isfile(self.result)) |
+ self._expected_tree(['result']) |
+ self._expected_result(False, ['isolate_test.py'], [], False) |
def test_check_non_existant(self): |
cmd = [ |
@@ -72,24 +112,33 @@ class Isolate(unittest.TestCase): |
self.fail() |
except subprocess.CalledProcessError: |
pass |
- self.assertFalse(os.path.isfile(self.result)) |
+ self._expected_tree([]) |
+ |
+ def test_check_directory_no_slash(self): |
+ cmd = [ |
+ '--mode', 'check', |
+ # Trailing slash missing. |
+ 'data', |
+ ] |
+ try: |
+ self._execute(cmd) |
+ self.fail() |
+ except subprocess.CalledProcessError: |
+ pass |
+ self._expected_tree([]) |
def test_hashtable(self): |
cmd = [ |
'--mode', 'hashtable', |
'--outdir', self.tempdir, |
'isolate_test.py', |
+ 'data/', |
] |
self._execute(cmd) |
- # Calculate our hash. |
- h = hashlib.sha1() |
- h.update(open(__file__, 'rb').read()) |
- digest = h.hexdigest() |
- self.assertEquals( |
- '{"files": {"isolate_test.py": {"sha1": "%s"}}}' % digest, |
- open(self.result, 'rb').read()) |
- self.assertEquals( |
- sorted([digest, 'result']), sorted(os.listdir(self.tempdir))) |
+ files = ['isolate_test.py', 'data/test_file1.txt', 'data/test_file2.txt'] |
+ data = self._expected_result(True, files, [], False) |
+ self._expected_tree( |
+ [f['sha-1'] for f in data['files'].itervalues()] + ['result']) |
def test_remap(self): |
cmd = [ |
@@ -98,9 +147,8 @@ class Isolate(unittest.TestCase): |
'isolate_test.py', |
] |
self._execute(cmd) |
- self.assertEquals('isolate_test.py\n', open(self.result, 'rb').read()) |
- self.assertEquals( |
- ['isolate_test.py', 'result'], sorted(os.listdir(self.tempdir))) |
+ self._expected_tree(['isolate_test.py', 'result']) |
+ self._expected_result(False, ['isolate_test.py'], [], False) |
def test_run(self): |
cmd = [ |
@@ -110,7 +158,8 @@ class Isolate(unittest.TestCase): |
sys.executable, 'isolate_test.py', '--ok', |
] |
self._execute(cmd) |
- self.assertTrue(os.path.isfile(self.result)) |
+ self._expected_tree(['result']) |
+ self._expected_result(False, ['isolate_test.py'], ['--ok'], False) |
def test_run_fail(self): |
cmd = [ |
@@ -124,10 +173,14 @@ class Isolate(unittest.TestCase): |
self.fail() |
except subprocess.CalledProcessError: |
pass |
- self.assertFalse(os.path.isfile(self.result)) |
+ self._expected_tree([]) |
def main(): |
+ global VERBOSE |
+ VERBOSE = '-v' in sys.argv |
+ level = logging.DEBUG if VERBOSE else logging.ERROR |
+ logging.basicConfig(level=level) |
if len(sys.argv) == 1: |
unittest.main() |
if sys.argv[1] == '--ok': |