summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
Diffstat (limited to 'Lib')
-rw-r--r--Lib/distutils/sysconfig.py7
-rw-r--r--Lib/hashlib.py3
-rwxr-xr-xLib/test/regrtest.py8
-rw-r--r--Lib/test/test_import.py14
-rw-r--r--Lib/test/test_int_literal.py4
-rw-r--r--Lib/test/test_nis.py10
-rw-r--r--Lib/test/test_posix.py28
-rw-r--r--Lib/test/test_print.py14
-rw-r--r--Lib/test/test_winsound.py36
-rw-r--r--Lib/test/test_zlib.py7
-rw-r--r--Lib/zipfile.py68
11 files changed, 133 insertions, 66 deletions
diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
index 39216a5..d2b2c9a 100644
--- a/Lib/distutils/sysconfig.py
+++ b/Lib/distutils/sysconfig.py
@@ -23,7 +23,8 @@ PREFIX = os.path.normpath(sys.prefix)
EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
# Path to the base directory of the project. On Windows the binary may
-# live in project/PCBuild9
+# live in project/PCBuild9. If we're dealing with an x64 Windows build,
+# it'll live in project/PCbuild/amd64.
project_base = os.path.dirname(os.path.abspath(sys.executable))
if os.name == "nt" and "pcbuild" in project_base[-8:].lower():
project_base = os.path.abspath(os.path.join(project_base, os.path.pardir))
@@ -31,6 +32,10 @@ if os.name == "nt" and "pcbuild" in project_base[-8:].lower():
if os.name == "nt" and "\\pc\\v" in project_base[-10:].lower():
project_base = os.path.abspath(os.path.join(project_base, os.path.pardir,
os.path.pardir))
+# PC/AMD64
+if os.name == "nt" and "\\pcbuild\\amd64" in project_base[-14:].lower():
+ project_base = os.path.abspath(os.path.join(project_base, os.path.pardir,
+ os.path.pardir))
# python_build: (Boolean) if true, we're either building Python or
# building an extension with an un-installed Python, so we use
diff --git a/Lib/hashlib.py b/Lib/hashlib.py
index a39cb57..efe66ec 100644
--- a/Lib/hashlib.py
+++ b/Lib/hashlib.py
@@ -18,6 +18,9 @@ md5(), sha1(), sha224(), sha256(), sha384(), and sha512()
More algorithms may be available on your platform but the above are
guaranteed to exist.
+NOTE: If you want the adler32 or crc32 hash functions they are available in
+the zlib module.
+
Choose your hash function wisely. Some have known collision weaknesses.
sha384 and sha512 will be slow on 32 bit platforms.
diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py
index 2212af5..100b26f 100755
--- a/Lib/test/regrtest.py
+++ b/Lib/test/regrtest.py
@@ -1157,6 +1157,14 @@ class _ExpectedSkips:
if sys.platform != 'sunos5':
self.expected.add('test_nis')
+ # TODO: This is a hack to raise TestSkipped if -3 is not enabled.
+ # Instead of relying on callable to have a warning, we should expose
+ # the -3 flag to Python code somehow
+ with test_support.catch_warning() as w:
+ callable(int)
+ if w.message is None:
+ self.expected.add('test_py3kwarn')
+
self.valid = True
def isvalid(self):
diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py
index 6eac67e..fe1da52 100644
--- a/Lib/test/test_import.py
+++ b/Lib/test/test_import.py
@@ -255,8 +255,20 @@ class PathsTests(unittest.TestCase):
self.assertEqual(mod.testdata, 'test_trailing_slash')
unload("test_trailing_slash")
+class RelativeImport(unittest.TestCase):
+ def tearDown(self):
+ try:
+ del sys.modules["test.relimport"]
+ except:
+ pass
+
+ def test_relimport_star(self):
+ # This will import * from .test_import.
+ from . import relimport
+ self.assertTrue(hasattr(relimport, "RelativeImport"))
+
def test_main(verbose=None):
- run_unittest(ImportTest, PathsTests)
+ run_unittest(ImportTest, PathsTests, RelativeImport)
if __name__ == '__main__':
test_main()
diff --git a/Lib/test/test_int_literal.py b/Lib/test/test_int_literal.py
index c9ad2a3..9bd0c41 100644
--- a/Lib/test/test_int_literal.py
+++ b/Lib/test/test_int_literal.py
@@ -6,7 +6,7 @@ This is complex because of changes due to PEP 237.
import unittest
from test import test_support
-class TextHexOctBin(unittest.TestCase):
+class TestHexOctBin(unittest.TestCase):
def test_hex_baseline(self):
# A few upper/lowercase tests
@@ -141,7 +141,7 @@ class TextHexOctBin(unittest.TestCase):
self.assertEqual(-0b1111111111111111111111111111111111111111111111111111111111111111, -18446744073709551615)
def test_main():
- test_support.run_unittest(TextHexOctBin)
+ test_support.run_unittest(TestHexOctBin)
if __name__ == "__main__":
test_main()
diff --git a/Lib/test/test_nis.py b/Lib/test/test_nis.py
index 55dd32c..757edd6 100644
--- a/Lib/test/test_nis.py
+++ b/Lib/test/test_nis.py
@@ -1,4 +1,4 @@
-from test.test_support import verbose, run_unittest
+from test import test_support
import unittest
import nis
@@ -8,8 +8,10 @@ class NisTests(unittest.TestCase):
maps = nis.maps()
except nis.error as msg:
# NIS is probably not active, so this test isn't useful
- if verbose:
- self.fail("(failing because of verbose mode) %s" % msg)
+ if test_support.verbose:
+ print("Test Skipped:", msg)
+ # Can't raise TestSkipped as regrtest only recognizes the exception
+ # import time.
return
try:
# On some systems, this map is only accessible to the
@@ -35,7 +37,7 @@ class NisTests(unittest.TestCase):
break
def test_main():
- run_unittest(NisTests)
+ test_support.run_unittest(NisTests)
if __name__ == '__main__':
test_main()
diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py
index 13f8f9e..57e9d15 100644
--- a/Lib/test/test_posix.py
+++ b/Lib/test/test_posix.py
@@ -9,6 +9,7 @@ except ImportError:
import time
import os
+import pwd
import unittest
import warnings
warnings.filterwarnings('ignore', '.* potential security risk .*',
@@ -141,6 +142,33 @@ class PosixTester(unittest.TestCase):
if hasattr(posix, 'stat'):
self.assert_(posix.stat(test_support.TESTFN))
+ if hasattr(posix, 'chown'):
+ def test_chown(self):
+ # raise an OSError if the file does not exist
+ os.unlink(test_support.TESTFN)
+ self.assertRaises(OSError, posix.chown, test_support.TESTFN, -1, -1)
+
+ # re-create the file
+ open(test_support.TESTFN, 'w').close()
+ if os.getuid() == 0:
+ try:
+ # Many linux distros have a nfsnobody user as MAX_UID-2
+ # that makes a good test case for signedness issues.
+ # http://bugs.python.org/issue1747858
+ # This part of the test only runs when run as root.
+ # Only scary people run their tests as root.
+ ent = pwd.getpwnam('nfsnobody')
+ posix.chown(test_support.TESTFN, ent.pw_uid, ent.pw_gid)
+ except KeyError:
+ pass
+ else:
+ # non-root cannot chown to root, raises OSError
+ self.assertRaises(OSError, posix.chown,
+ test_support.TESTFN, 0, 0)
+
+ # test a successful chown call
+ posix.chown(test_support.TESTFN, os.getuid(), os.getgid())
+
def test_chdir(self):
if hasattr(posix, 'chdir'):
posix.chdir(os.curdir)
diff --git a/Lib/test/test_print.py b/Lib/test/test_print.py
index baeab3d..10ef60a 100644
--- a/Lib/test/test_print.py
+++ b/Lib/test/test_print.py
@@ -12,8 +12,6 @@ except ImportError:
# 2.x
from StringIO import StringIO
-from contextlib import contextmanager
-
NotDefined = object()
# A dispatch table all 8 combinations of providing
@@ -40,15 +38,6 @@ dispatch = {
lambda args, sep, end, file: print(sep=sep, end=end, file=file, *args),
}
-@contextmanager
-def stdout_redirected(new_stdout):
- save_stdout = sys.stdout
- sys.stdout = new_stdout
- try:
- yield None
- finally:
- sys.stdout = save_stdout
-
# Class used to test __str__ and print
class ClassWith__str__:
def __init__(self, x):
@@ -69,8 +58,7 @@ class TestPrint(unittest.TestCase):
end is not NotDefined,
file is not NotDefined)]
- t = StringIO()
- with stdout_redirected(t):
+ with test_support.captured_stdout() as t:
fn(args, sep, end, file)
self.assertEqual(t.getvalue(), expected)
diff --git a/Lib/test/test_winsound.py b/Lib/test/test_winsound.py
index 7cdc275..dac569c 100644
--- a/Lib/test/test_winsound.py
+++ b/Lib/test/test_winsound.py
@@ -23,25 +23,27 @@ class BeepTest(unittest.TestCase):
self.assertRaises(ValueError, winsound.Beep, 32768, 75)
def test_extremes(self):
- if _have_soundcard():
- winsound.Beep(37, 75)
- winsound.Beep(32767, 75)
- else:
- # The behaviour of winsound.Beep() seems to differ between
- # different versions of Windows when there's either a) no
- # sound card entirely, b) legacy beep driver has been disabled,
- # or c) the legacy beep driver has been uninstalled. Sometimes
- # RuntimeErrors are raised, sometimes they're not. Meh.
- try:
- winsound.Beep(37, 75)
- winsound.Beep(32767, 75)
- except RuntimeError:
- pass
+ self._beep(37, 75)
+ self._beep(32767, 75)
def test_increasingfrequency(self):
- if _have_soundcard():
- for i in range(100, 2000, 100):
- winsound.Beep(i, 75)
+ for i in xrange(100, 2000, 100):
+ self._beep(i, 75)
+
+ def _beep(self, *args):
+ # these tests used to use _have_soundcard(), but it's quite
+ # possible to have a soundcard, and yet have the beep driver
+ # disabled. So basically, we have no way of knowing whether
+ # a beep should be produced or not, so currently if these
+ # tests fail we're ignoring them
+ #
+ # XXX the right fix for this is to define something like
+ # _have_enabled_beep_driver() and use that instead of the
+ # try/except below
+ try:
+ winsound.Beep(*args)
+ except RuntimeError:
+ pass
class MessageBeepTest(unittest.TestCase):
diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py
index 0adf507..d2fd504 100644
--- a/Lib/test/test_zlib.py
+++ b/Lib/test/test_zlib.py
@@ -1,6 +1,7 @@
import unittest
from test import test_support
import zlib
+import binascii
import random
@@ -46,6 +47,12 @@ class ChecksumTestCase(unittest.TestCase):
self.assertEqual(zlib.adler32(foo+foo), 3573550353)
self.assertEqual(zlib.adler32('spam'), 72286642)
+ def test_same_as_binascii_crc32(self):
+ foo = 'abcdefghijklmnop'
+ crc = -1808088941
+ self.assertEqual(binascii.crc32(foo), crc)
+ self.assertEqual(zlib.crc32(foo), crc)
+ self.assertEqual(binascii.crc32('spam'), zlib.crc32('spam'))
diff --git a/Lib/zipfile.py b/Lib/zipfile.py
index 2865c0a..719ed44 100644
--- a/Lib/zipfile.py
+++ b/Lib/zipfile.py
@@ -8,8 +8,10 @@ import binascii, io
try:
import zlib # We may need its compression method
+ crc32 = zlib.crc32
except ImportError:
zlib = None
+ crc32 = binascii.crc32
__all__ = ["BadZipfile", "error", "ZIP_STORED", "ZIP_DEFLATED", "is_zipfile",
"ZipInfo", "ZipFile", "PyZipFile", "LargeZipFile" ]
@@ -36,13 +38,13 @@ ZIP_DEFLATED = 8
# Here are some struct module formats for reading headers
structEndArchive = "<4s4H2LH" # 9 items, end of archive, 22 bytes
stringEndArchive = b"PK\005\006" # magic number for end of archive record
-structCentralDir = "<4s4B4HlLL5HLL"# 19 items, central directory, 46 bytes
+structCentralDir = "<4s4B4HLLL5HLL"# 19 items, central directory, 46 bytes
stringCentralDir = b"PK\001\002" # magic number for central directory
-structFileHeader = "<4s2B4HlLL2H" # 12 items, file header record, 30 bytes
+structFileHeader = "<4s2B4HLLL2H" # 12 items, file header record, 30 bytes
stringFileHeader = b"PK\003\004" # magic number for file header
-structEndArchive64Locator = "<4slql" # 4 items, locate Zip64 header, 20 bytes
+structEndArchive64Locator = "<4sLQL" # 4 items, locate Zip64 header, 20 bytes
stringEndArchive64Locator = b"PK\x06\x07" # magic token for locator header
-structEndArchive64 = "<4sqhhllqqqq" # 10 items, end of archive (Zip64), 56 bytes
+structEndArchive64 = "<4sQHHLLQQQQ" # 10 items, end of archive (Zip64), 56 bytes
stringEndArchive64 = b"PK\x06\x06" # magic token for Zip64 header
@@ -140,7 +142,7 @@ def _EndRecData(fpin):
endrec = list(endrec)
endrec.append("") # Append the archive comment
endrec.append(filesize - 22) # Append the record start offset
- if endrec[-4] == -1 or endrec[-4] == 0xffffffff:
+ if endrec[-4] == 0xffffffff:
return _EndRecData64(fpin, -22, endrec)
return endrec
# Search the last END_BLOCK bytes of the file for the record signature.
@@ -160,7 +162,7 @@ def _EndRecData(fpin):
# Append the archive comment and start offset
endrec.append(comment)
endrec.append(filesize - END_BLOCK + start)
- if endrec[-4] == -1 or endrec[-4] == 0xffffffff:
+ if endrec[-4] == 0xffffffff:
return _EndRecData64(fpin, - END_BLOCK + start, endrec)
return endrec
return # Error, return None
@@ -247,7 +249,7 @@ class ZipInfo (object):
if file_size > ZIP64_LIMIT or compress_size > ZIP64_LIMIT:
# File is larger than what fits into a 4 byte integer,
# fall back to the ZIP64 extension
- fmt = '<hhqq'
+ fmt = '<HHQQ'
extra = extra + struct.pack(fmt,
1, struct.calcsize(fmt)-4, file_size, compress_size)
file_size = 0xffffffff # -1
@@ -267,14 +269,14 @@ class ZipInfo (object):
extra = self.extra
unpack = struct.unpack
while extra:
- tp, ln = unpack('<hh', extra[:4])
+ tp, ln = unpack('<HH', extra[:4])
if tp == 1:
if ln >= 24:
- counts = unpack('<qqq', extra[4:28])
+ counts = unpack('<QQQ', extra[4:28])
elif ln == 16:
- counts = unpack('<qq', extra[4:20])
+ counts = unpack('<QQ', extra[4:20])
elif ln == 8:
- counts = unpack('<q', extra[4:12])
+ counts = unpack('<Q', extra[4:12])
elif ln == 0:
counts = ()
else:
@@ -283,7 +285,8 @@ class ZipInfo (object):
idx = 0
# ZIP64 extension (large files and/or large archives)
- if self.file_size == -1 or self.file_size == 0xFFFFFFFF:
+ # XXX Is this correct? won't this exclude 2**32-1 byte files?
+ if self.file_size in (0xffffffffffffffff, 0xffffffff):
self.file_size = counts[idx]
idx += 1
@@ -950,7 +953,7 @@ class ZipFile:
if not buf:
break
file_size = file_size + len(buf)
- CRC = binascii.crc32(buf, CRC)
+ CRC = crc32(buf, CRC) & 0xffffffff
if cmpr:
buf = cmpr.compress(buf)
compress_size = compress_size + len(buf)
@@ -968,7 +971,7 @@ class ZipFile:
# Seek backwards and write CRC and file sizes
position = self.fp.tell() # Preserve current position in file
self.fp.seek(zinfo.header_offset + 14, 0)
- self.fp.write(struct.pack("<lLL", zinfo.CRC, zinfo.compress_size,
+ self.fp.write(struct.pack("<LLL", zinfo.CRC, zinfo.compress_size,
zinfo.file_size))
self.fp.seek(position, 0)
self.filelist.append(zinfo)
@@ -997,7 +1000,7 @@ class ZipFile:
zinfo.header_offset = self.fp.tell() # Start of header data
self._writecheck(zinfo)
self._didModify = True
- zinfo.CRC = binascii.crc32(data) # CRC-32 checksum
+ zinfo.CRC = crc32(data) & 0xffffffff # CRC-32 checksum
if zinfo.compress_type == ZIP_DEFLATED:
co = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
zlib.DEFLATED, -15)
@@ -1047,7 +1050,7 @@ class ZipFile:
if zinfo.header_offset > ZIP64_LIMIT:
extra.append(zinfo.header_offset)
- header_offset = -1 # struct "l" format: 32 one bits
+ header_offset = 0xffffffff # -1 32 bit
else:
header_offset = zinfo.header_offset
@@ -1055,7 +1058,7 @@ class ZipFile:
if extra:
# Append a ZIP64 field to the extra's
extra_data = struct.pack(
- '<hh' + 'q'*len(extra),
+ '<HH' + 'Q'*len(extra),
1, 8*len(extra), *extra) + extra_data
extract_version = max(45, zinfo.extract_version)
@@ -1064,14 +1067,25 @@ class ZipFile:
extract_version = zinfo.extract_version
create_version = zinfo.create_version
- centdir = struct.pack(structCentralDir,
- stringCentralDir, create_version,
- zinfo.create_system, extract_version, zinfo.reserved,
- zinfo.flag_bits, zinfo.compress_type, dostime, dosdate,
- zinfo.CRC, compress_size, file_size,
- len(zinfo.filename), len(extra_data), len(zinfo.comment),
- 0, zinfo.internal_attr, zinfo.external_attr,
- header_offset)
+ try:
+ centdir = struct.pack(structCentralDir,
+ stringCentralDir, create_version,
+ zinfo.create_system, extract_version, zinfo.reserved,
+ zinfo.flag_bits, zinfo.compress_type, dostime, dosdate,
+ zinfo.CRC, compress_size, file_size,
+ len(zinfo.filename), len(extra_data), len(zinfo.comment),
+ 0, zinfo.internal_attr, zinfo.external_attr,
+ header_offset)
+ except DeprecationWarning:
+ print >>sys.stderr, (structCentralDir,
+ stringCentralDir, create_version,
+ zinfo.create_system, extract_version, zinfo.reserved,
+ zinfo.flag_bits, zinfo.compress_type, dostime, dosdate,
+ zinfo.CRC, compress_size, file_size,
+ len(zinfo.filename), len(extra_data), len(zinfo.comment),
+ 0, zinfo.internal_attr, zinfo.external_attr,
+ header_offset)
+ raise
self.fp.write(centdir)
self.fp.write(zinfo.filename.encode("utf-8"))
self.fp.write(extra_data)
@@ -1091,10 +1105,8 @@ class ZipFile:
stringEndArchive64Locator, 0, pos2, 1)
self.fp.write(zip64locrec)
- # XXX Why is `pos3` computed next? It's never referenced.
- pos3 = self.fp.tell()
endrec = struct.pack(structEndArchive, stringEndArchive,
- 0, 0, count, count, pos2 - pos1, -1, 0)
+ 0, 0, count, count, pos2 - pos1, 0xffffffff, 0)
self.fp.write(endrec)
else: