diff options
author | Brett Cannon <bcannon@gmail.com> | 2009-02-10 02:10:16 (GMT) |
---|---|---|
committer | Brett Cannon <bcannon@gmail.com> | 2009-02-10 02:10:16 (GMT) |
commit | befb14fe2741fb583a059b2b6891c8692c61a5ba (patch) | |
tree | eb920260fc263a81f753d3f25225f82a855924db /Lib/test/test_compileall.py | |
parent | 6691772ff6ce5dbad9f088a0aeef3aed149900a3 (diff) | |
download | cpython-befb14fe2741fb583a059b2b6891c8692c61a5ba.zip cpython-befb14fe2741fb583a059b2b6891c8692c61a5ba.tar.gz cpython-befb14fe2741fb583a059b2b6891c8692c61a5ba.tar.bz2 |
Merged revisions 69481 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r69481 | brett.cannon | 2009-02-09 18:07:38 -0800 (Mon, 09 Feb 2009) | 4 lines
compileall used the ctime of bytecode and source to determine if the bytecode
should be recreated. This created a timing hole. Fixed by just doing what
import does; check the mtime and magic number.
........
Diffstat (limited to 'Lib/test/test_compileall.py')
-rw-r--r-- | Lib/test/test_compileall.py | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/Lib/test/test_compileall.py b/Lib/test/test_compileall.py new file mode 100644 index 0000000..49b6448 --- /dev/null +++ b/Lib/test/test_compileall.py @@ -0,0 +1,63 @@ +import compileall +import imp +import os +import py_compile +import shutil +import struct +import sys +import tempfile +import time +from test import support +import unittest + + +class CompileallTests(unittest.TestCase): + + def setUp(self): + self.directory = tempfile.mkdtemp() + self.source_path = os.path.join(self.directory, '_test.py') + self.bc_path = self.source_path + ('c' if __debug__ else 'o') + with open(self.source_path, 'w') as file: + file.write('x = 123\n') + + def tearDown(self): + shutil.rmtree(self.directory) + + def data(self): + with open(self.bc_path, 'rb') as file: + data = file.read(8) + mtime = int(os.stat(self.source_path).st_mtime) + compare = struct.pack('<4sl', imp.get_magic(), mtime) + return data, compare + + def recreation_check(self, metadata): + """Check that compileall recreates bytecode when the new metadata is + used.""" + if not hasattr(os, 'stat'): + return + py_compile.compile(self.source_path) + self.assertEqual(*self.data()) + with open(self.bc_path, 'rb') as file: + bc = file.read()[len(metadata):] + with open(self.bc_path, 'wb') as file: + file.write(metadata) + file.write(bc) + self.assertNotEqual(*self.data()) + compileall.compile_dir(self.directory, force=False, quiet=True) + self.assertTrue(*self.data()) + + def test_mtime(self): + # Test a change in mtime leads to a new .pyc. + self.recreation_check(struct.pack('<4sl', imp.get_magic(), 1)) + + def test_magic_number(self): + # Test a change in mtime leads to a new .pyc. + self.recreation_check(b'\0\0\0\0') + + +def test_main(): + support.run_unittest(CompileallTests) + + +if __name__ == "__main__": + test_main() |