Commit 4ebfbf02 authored by Christian Heimes's avatar Christian Heimes

Merged revisions 61644,61646-61647,61649-61652,61656-61658,61663,61665,61667 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r61644 | trent.nelson | 2008-03-19 22:51:16 +0100 (Mi, 19 Mär 2008) | 1 line

  Force a clean of the tcltk/tcltk64 directories now that we've completely changed the tcl/tk build environment.
........
  r61646 | gregory.p.smith | 2008-03-19 23:23:51 +0100 (Mi, 19 Mär 2008) | 2 lines

  Improve the error message when the CRCs don't match.
........
  r61647 | trent.nelson | 2008-03-19 23:41:10 +0100 (Mi, 19 Mär 2008) | 1 line

  Comment out tcltk/tcltk64 removal.
........
  r61649 | raymond.hettinger | 2008-03-19 23:47:48 +0100 (Mi, 19 Mär 2008) | 1 line

  Remove unnecessary traceback save/restore pair.
........
  r61650 | trent.nelson | 2008-03-19 23:51:42 +0100 (Mi, 19 Mär 2008) | 1 line

  Bump the SIGALM delay from 3 seconds to 20 seconds, mainly in an effort to see if it fixes the alarm failures in this test experienced by some of the buildbots.
........
  r61651 | brett.cannon | 2008-03-20 00:01:17 +0100 (Do, 20 Mär 2008) | 5 lines

  Make sure that the warnings filter is not reset or changed beyond the current
  running test file.

  Closes issue2407. Thanks Jerry Seutter.
........
  r61652 | gregory.p.smith | 2008-03-20 00:03:25 +0100 (Do, 20 Mär 2008) | 10 lines

  Prevent ioctl op codes from being sign extended from int to unsigned long
  when used on platforms that actually define ioctl as taking an unsigned long.
  (the BSDs and OS X / Darwin)

  Adds a unittest for fcntl.ioctl that tests what happens with both positive and
  negative numbers.

  This was done because of issue1471 but I'm not able to reproduce -that- problem
  in the first place on Linux 32bit or 64bit or OS X 10.4 & 10.5 32bit or 64 bit.
........
  r61656 | sean.reifschneider | 2008-03-20 01:46:50 +0100 (Do, 20 Mär 2008) | 2 lines

  Issue #2143: Fix embedded readline() hang on SSL socket EOF.
........
  r61657 | sean.reifschneider | 2008-03-20 01:50:07 +0100 (Do, 20 Mär 2008) | 2 lines

  Forgot to add NEWS item about smtplib SSL readline hang fix.
........
  r61658 | trent.nelson | 2008-03-20 01:58:44 +0100 (Do, 20 Mär 2008) | 1 line

  Revert r61650; the intent of this commit was to try and address alarm failures on some of the build slaves.  As Neal points out, it's called after test_main(), so it's not going to factor into the test when run via regrtest.py (and removes the original functionality that Jeffrey wanted that would kill the test if it took longer than 3 seconds to run when executing it directly during development).
........
  r61663 | sean.reifschneider | 2008-03-20 04:20:48 +0100 (Do, 20 Mär 2008) | 2 lines

  Issue 2188: Documentation hint about disabling proxy detection.
........
  r61665 | gregory.p.smith | 2008-03-20 06:41:53 +0100 (Do, 20 Mär 2008) | 7 lines

  Attempt to fix the Solaris Sparc 10 buildbot.  It was failing with an invalid
  argument error on ioctl.  This was caused by the added test_fcntl ioctl test
  that hard coded 0 as the fd to use.  Without a terminal, this fails on solaris.
  (it passed from the command line on sol 10, both 32 and 64 bit)

  Also, test_ioctl exists so I moved the test into there where it belongs.
........
  r61667 | georg.brandl | 2008-03-20 08:25:55 +0100 (Do, 20 Mär 2008) | 2 lines

  #2383: remove obsolete XXX comment in stat.py.
........
parent 3574c9ae
...@@ -49,6 +49,8 @@ The module defines the following functions: ...@@ -49,6 +49,8 @@ The module defines the following functions:
This function is identical to the :func:`fcntl` function, except that the This function is identical to the :func:`fcntl` function, except that the
argument handling is even more complicated. argument handling is even more complicated.
The op parameter is limited to values that can fit in 32-bits.
The parameter *arg* can be one of an integer, absent (treated identically to the The parameter *arg* can be one of an integer, absent (treated identically to the
integer ``0``), an object supporting the read-only buffer interface (most likely integer ``0``), an object supporting the read-only buffer interface (most likely
a plain Python string) or an object supporting the read-write buffer interface. a plain Python string) or an object supporting the read-write buffer interface.
......
...@@ -179,6 +179,7 @@ The following classes are provided: ...@@ -179,6 +179,7 @@ The following classes are provided:
Cause requests to go through a proxy. If *proxies* is given, it must be a Cause requests to go through a proxy. If *proxies* is given, it must be a
dictionary mapping protocol names to URLs of proxies. The default is to read the dictionary mapping protocol names to URLs of proxies. The default is to read the
list of proxies from the environment variables :envvar:`<protocol>_proxy`. list of proxies from the environment variables :envvar:`<protocol>_proxy`.
To disable autodetected proxy pass an empty dictionary.
.. class:: HTTPPasswordMgr() .. class:: HTTPPasswordMgr()
......
...@@ -5,7 +5,9 @@ ...@@ -5,7 +5,9 @@
import shutil import shutil
import tempfile import tempfile
from test.test_support import catch_warning
import warnings import warnings
try: try:
# For Pythons w/distutils and add-on pybsddb # For Pythons w/distutils and add-on pybsddb
from bsddb3 import db from bsddb3 import db
...@@ -33,12 +35,11 @@ class Context: ...@@ -33,12 +35,11 @@ class Context:
del self.the_txn del self.the_txn
warnings.filterwarnings('ignore', 'DBTxn aborted in destructor') with catch_warning():
try: warnings.filterwarnings('ignore', 'DBTxn aborted in destructor')
context = Context() context = Context()
del context del context
finally:
warnings.resetwarnings()
# try not to leave a turd # try not to leave a turd
try: try:
......
...@@ -321,7 +321,8 @@ class GzipFile: ...@@ -321,7 +321,8 @@ class GzipFile:
crc32 = read32(self.fileobj) crc32 = read32(self.fileobj)
isize = U32(read32(self.fileobj)) # may exceed 2GB isize = U32(read32(self.fileobj)) # may exceed 2GB
if U32(crc32) != U32(self.crc): if U32(crc32) != U32(self.crc):
raise IOError("CRC check failed") raise IOError("CRC check failed %s != %s" % (hex(U32(crc32)),
hex(U32(self.crc))))
elif isize != LOWU32(self.size): elif isize != LOWU32(self.size):
raise IOError("Incorrect length of data produced") raise IOError("Incorrect length of data produced")
......
...@@ -174,6 +174,7 @@ else: ...@@ -174,6 +174,7 @@ else:
chr = None chr = None
while chr != b"\n": while chr != b"\n":
chr = self.sslobj.read(1) chr = self.sslobj.read(1)
if not chr: break
str += chr str += chr
return str return str
......
...@@ -3,12 +3,7 @@ ...@@ -3,12 +3,7 @@
Suggested usage: from stat import * Suggested usage: from stat import *
""" """
# XXX Strictly spoken, this module may have to be adapted for each POSIX # Indices for stat struct members in the tuple returned by os.stat()
# implementation; in practice, however, the numeric constants used by
# stat() are almost universal (even for stat() emulations on non-UNIX
# systems like MS-DOS).
# Indices for stat struct members in tuple returned by os.stat()
ST_MODE = 0 ST_MODE = 0
ST_INO = 1 ST_INO = 1
......
...@@ -3,14 +3,14 @@ ...@@ -3,14 +3,14 @@
OS/2+EMX doesn't support the file locking operations. OS/2+EMX doesn't support the file locking operations.
""" """
import struct
import fcntl import fcntl
import os, sys import os
import struct
import sys
import unittest import unittest
from test.test_support import verbose, TESTFN, unlink, run_unittest from test.test_support import verbose, TESTFN, unlink, run_unittest
# TODO - Write tests for ioctl(), flock() and lockf(). # TODO - Write tests for flock() and lockf().
def get_lockdata(): def get_lockdata():
if sys.platform.startswith('atheos'): if sys.platform.startswith('atheos'):
......
...@@ -211,8 +211,8 @@ class TestVectorsTestCase(unittest.TestCase): ...@@ -211,8 +211,8 @@ class TestVectorsTestCase(unittest.TestCase):
def digest(self): def digest(self):
return self._x.digest() return self._x.digest()
warnings.simplefilter('error', RuntimeWarning) with test_support.catch_warning():
try: warnings.simplefilter('error', RuntimeWarning)
try: try:
hmac.HMAC(b'a', b'b', digestmod=MockCrazyHash) hmac.HMAC(b'a', b'b', digestmod=MockCrazyHash)
except RuntimeWarning: except RuntimeWarning:
...@@ -227,8 +227,6 @@ class TestVectorsTestCase(unittest.TestCase): ...@@ -227,8 +227,6 @@ class TestVectorsTestCase(unittest.TestCase):
pass pass
else: else:
self.fail('Expected warning about small block_size') self.fail('Expected warning about small block_size')
finally:
warnings.resetwarnings()
......
...@@ -14,6 +14,11 @@ try: ...@@ -14,6 +14,11 @@ try:
except IOError: except IOError:
raise TestSkipped("Unable to open /dev/tty") raise TestSkipped("Unable to open /dev/tty")
try:
import pty
except ImportError:
pty = None
class IoctlTests(unittest.TestCase): class IoctlTests(unittest.TestCase):
def test_ioctl(self): def test_ioctl(self):
# If this process has been put into the background, TIOCGPGRP returns # If this process has been put into the background, TIOCGPGRP returns
...@@ -34,6 +39,30 @@ class IoctlTests(unittest.TestCase): ...@@ -34,6 +39,30 @@ class IoctlTests(unittest.TestCase):
self.assertEquals(r, 0) self.assertEquals(r, 0)
self.assert_(rpgrp in ids, "%s not in %s" % (rpgrp, ids)) self.assert_(rpgrp in ids, "%s not in %s" % (rpgrp, ids))
def test_ioctl_signed_unsigned_code_param(self):
if not pty:
raise TestSkipped('pty module required')
mfd, sfd = pty.openpty()
try:
if termios.TIOCSWINSZ < 0:
set_winsz_opcode_maybe_neg = termios.TIOCSWINSZ
set_winsz_opcode_pos = termios.TIOCSWINSZ & 0xffffffff
else:
set_winsz_opcode_pos = termios.TIOCSWINSZ
set_winsz_opcode_maybe_neg, = struct.unpack("i",
struct.pack("I", termios.TIOCSWINSZ))
# We're just testing that these calls do not raise exceptions.
saved_winsz = fcntl.ioctl(mfd, termios.TIOCGWINSZ, "\0"*8)
our_winsz = struct.pack("HHHH",80,25,0,0)
# test both with a positive and potentially negative ioctl code
new_winsz = fcntl.ioctl(mfd, set_winsz_opcode_pos, our_winsz)
new_winsz = fcntl.ioctl(mfd, set_winsz_opcode_maybe_neg, our_winsz)
fcntl.ioctl(mfd, set_winsz_opcode_maybe_neg, saved_winsz)
finally:
os.close(mfd)
os.close(sfd)
def test_main(): def test_main():
run_unittest(IoctlTests) run_unittest(IoctlTests)
......
...@@ -49,6 +49,22 @@ class TestUnicodeFiles(unittest.TestCase): ...@@ -49,6 +49,22 @@ class TestUnicodeFiles(unittest.TestCase):
self.failUnless(base in file_list) self.failUnless(base in file_list)
# Do as many "equivalancy' tests as we can - ie, check that although we
# have different types for the filename, they refer to the same file.
def _do_equivalent(self, filename1, filename2):
# Note we only check "filename1 against filename2" - we don't bother
# checking "filename2 against 1", as we assume we are called again with
# the args reversed.
self.failUnless(type(filename1)!=type(filename2),
"No point checking equivalent filenames of the same type")
# stat and lstat should return the same results.
self.failUnlessEqual(os.stat(filename1),
os.stat(filename2))
self.failUnlessEqual(os.lstat(filename1),
os.lstat(filename2))
# Copy/rename etc tests using equivalent filename
self._do_copyish(filename1, filename2)
# Tests that copy, move, etc one file to another. # Tests that copy, move, etc one file to another.
def _do_copyish(self, filename1, filename2): def _do_copyish(self, filename1, filename2):
# Should be able to rename the file using either name. # Should be able to rename the file using either name.
...@@ -58,31 +74,20 @@ class TestUnicodeFiles(unittest.TestCase): ...@@ -58,31 +74,20 @@ class TestUnicodeFiles(unittest.TestCase):
os.rename(filename1 + ".new", filename2) os.rename(filename1 + ".new", filename2)
self.failUnless(os.path.isfile(filename2)) self.failUnless(os.path.isfile(filename2))
# Try using shutil on the filenames. shutil.copy(filename1, filename2 + ".new")
try: os.unlink(filename1 + ".new") # remove using equiv name.
filename1==filename2 # And a couple of moves, one using each name.
except UnicodeDecodeError: shutil.move(filename1, filename2 + ".new")
# these filenames can't be compared - shutil.copy tries to do self.failUnless(not os.path.exists(filename2))
# just that. This is really a bug in 'shutil' - if one of shutil's shutil.move(filename1 + ".new", filename2)
# 2 params are Unicode and the other isn't, it should coerce the self.failUnless(os.path.exists(filename1))
# string to Unicode with the filesystem encoding before comparison. # Note - due to the implementation of shutil.move,
pass # it tries a rename first. This only fails on Windows when on
else: # different file systems - and this test can't ensure that.
# filenames can be compared. # So we test the shutil.copy2 function, which is the thing most
shutil.copy(filename1, filename2 + ".new") # likely to fail.
os.unlink(filename1 + ".new") # remove using equiv name. shutil.copy2(filename1, filename2 + ".new")
# And a couple of moves, one using each name. os.unlink(filename1 + ".new")
shutil.move(filename1, filename2 + ".new")
self.failUnless(not os.path.exists(filename2))
shutil.move(filename1 + ".new", filename2)
self.failUnless(os.path.exists(filename1))
# Note - due to the implementation of shutil.move,
# it tries a rename first. This only fails on Windows when on
# different file systems - and this test can't ensure that.
# So we test the shutil.copy2 function, which is the thing most
# likely to fail.
shutil.copy2(filename1, filename2 + ".new")
os.unlink(filename1 + ".new")
def _do_directory(self, make_name, chdir_name, encoded): def _do_directory(self, make_name, chdir_name, encoded):
cwd = os.getcwd() cwd = os.getcwd()
...@@ -127,6 +132,16 @@ class TestUnicodeFiles(unittest.TestCase): ...@@ -127,6 +132,16 @@ class TestUnicodeFiles(unittest.TestCase):
finally: finally:
os.unlink(filename) os.unlink(filename)
def _test_equivalent(self, filename1, filename2):
remove_if_exists(filename1)
self.failUnless(not os.path.exists(filename2))
f = file(filename1, "w")
f.close()
try:
self._do_equivalent(filename1, filename2)
finally:
os.unlink(filename1)
# The 'test' functions are unittest entry points, and simply call our # The 'test' functions are unittest entry points, and simply call our
# _test functions with each of the filename combinations we wish to test # _test functions with each of the filename combinations we wish to test
def test_single_files(self): def test_single_files(self):
...@@ -135,6 +150,9 @@ class TestUnicodeFiles(unittest.TestCase): ...@@ -135,6 +150,9 @@ class TestUnicodeFiles(unittest.TestCase):
self._test_single(TESTFN_UNICODE_UNENCODEABLE) self._test_single(TESTFN_UNICODE_UNENCODEABLE)
def test_directories(self): def test_directories(self):
# For all 'equivalent' combinations:
# Make dir with encoded, chdir with unicode, checkdir with encoded
# (or unicode/encoded/unicode, etc
ext = ".dir" ext = ".dir"
self._do_directory(TESTFN_UNICODE+ext, TESTFN_UNICODE+ext, False) self._do_directory(TESTFN_UNICODE+ext, TESTFN_UNICODE+ext, False)
# Our directory name that can't use a non-unicode name. # Our directory name that can't use a non-unicode name.
......
...@@ -97,11 +97,20 @@ fcntl_ioctl(PyObject *self, PyObject *args) ...@@ -97,11 +97,20 @@ fcntl_ioctl(PyObject *self, PyObject *args)
{ {
#define IOCTL_BUFSZ 1024 #define IOCTL_BUFSZ 1024
int fd; int fd;
/* In PyArg_ParseTuple below, use the unsigned int 'I' format for /* In PyArg_ParseTuple below, we use the unsigned non-checked 'I'
the signed int 'code' variable, because Python turns 0x8000000 format for the 'code' parameter because Python turns 0x8000000
into a large positive number (PyLong, or PyInt on 64-bit into either a large positive number (PyLong or PyInt on 64-bit
platforms,) whereas C expects it to be a negative int */ platforms) or a negative number on others (32-bit PyInt)
int code; whereas the system expects it to be a 32bit bit field value
regardless of it being passed as an int or unsigned long on
various platforms. See the termios.TIOCSWINSZ constant across
platforms for an example of thise.
If any of the 64bit platforms ever decide to use more than 32bits
in their unsigned long ioctl codes this will break and need
special casing based on the platform being built on.
*/
unsigned int code;
int arg; int arg;
int ret; int ret;
char *str; char *str;
......
...@@ -2598,22 +2598,20 @@ int ...@@ -2598,22 +2598,20 @@ int
PyObject_IsInstance(PyObject *inst, PyObject *cls) PyObject_IsInstance(PyObject *inst, PyObject *cls)
{ {
static PyObject *name = NULL; static PyObject *name = NULL;
PyObject *t, *v, *tb;
PyObject *checker; PyObject *checker;
/* Quick test for an exact match */ /* Quick test for an exact match */
if (Py_TYPE(inst) == (PyTypeObject *)cls) if (Py_TYPE(inst) == (PyTypeObject *)cls)
return 1; return 1;
PyErr_Fetch(&t, &v, &tb);
if (name == NULL) { if (name == NULL) {
name = PyUnicode_InternFromString("__instancecheck__"); name = PyUnicode_InternFromString("__instancecheck__");
if (name == NULL) if (name == NULL)
return -1; return -1;
} }
checker = PyObject_GetAttr(cls, name); checker = PyObject_GetAttr(cls, name);
PyErr_Restore(t, v, tb); if (checker == NULL && PyErr_Occurred())
PyErr_Clear();
if (checker != NULL) { if (checker != NULL) {
PyObject *res; PyObject *res;
int ok = -1; int ok = -1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment