[pypy-commit] pypy py3k: merge default
pjenvey
noreply at buildbot.pypy.org
Tue Jul 23 03:26:03 CEST 2013
Author: Philip Jenvey <pjenvey at underboss.org>
Branch: py3k
Changeset: r65530:2398c0569891
Date: 2013-07-22 18:17 -0700
http://bitbucket.org/pypy/pypy/changeset/2398c0569891/
Log: merge default
diff --git a/lib_pypy/greenlet.py b/lib_pypy/greenlet.py
--- a/lib_pypy/greenlet.py
+++ b/lib_pypy/greenlet.py
@@ -7,7 +7,7 @@
# ____________________________________________________________
# Exceptions
-class GreenletExit(Exception):
+class GreenletExit(BaseException):
"""This special exception does not propagate to the parent greenlet; it
can be used to kill a single greenlet."""
diff --git a/pypy/module/test_lib_pypy/test_ctypes_config_cache.py b/pypy/module/test_lib_pypy/test_ctypes_config_cache.py
--- a/pypy/module/test_lib_pypy/test_ctypes_config_cache.py
+++ b/pypy/module/test_lib_pypy/test_ctypes_config_cache.py
@@ -33,10 +33,8 @@
def test_resource():
- try:
- import lib_pypy.resource
- except ImportError:
- py.test.skip('no syslog on this platform')
+ if sys.platform == 'win32':
+ py.test.skip('no resource module on this platform')
d = run('resource.ctc.py', '_resource_cache.py')
assert 'RLIM_NLIMITS' in d
diff --git a/pypy/module/test_lib_pypy/test_md5_extra.py b/pypy/module/test_lib_pypy/test_md5_extra.py
--- a/pypy/module/test_lib_pypy/test_md5_extra.py
+++ b/pypy/module/test_lib_pypy/test_md5_extra.py
@@ -1,210 +1,71 @@
"""A test script to compare MD5 implementations.
-A note about performance: the pure Python MD5 takes roughly
-160 sec. per MB of data on a 233 MHz Intel Pentium CPU.
+A note about performance: the pure Python MD5 takes roughly 160 sec. per
+MB of data on a 233 MHz Intel Pentium CPU.
"""
+import md5
-import md5 # CPython's implementation in C.
-from lib_pypy import _md5 as pymd5
+from pypy.module.test_lib_pypy.support import import_lib_pypy
-# Helpers...
+def compare_host(message, d2, d2h):
+ """Compare results against the host Python's builtin md5.
-def formatHex(str):
- "Print a string's HEX code in groups of two digits."
-
- d = list(str)
- d = map(ord, d)
- d = ["%02x" % x for x in d]
- return ' '.join(d)
-
-
-def format(str):
- "Print a string as-is in groups of two characters."
-
- s = ''
- for i in range(0, len(str)-1, 2):
- s = s + "%03s" % str[i:i+2]
- return s[1:]
-
-
-def printDiff(message, d1, d2, expectedResult=None):
- "Print different outputs for same message."
-
- print("Message: '%s'" % message)
- print("Message length: %d" % len(message))
- if expectedResult:
- print("%-48s (expected)" % format(expectedResult))
- print("%-48s (Std. lib. MD5)" % formatHex(d1))
- print("%-48s (Pure Python MD5)" % formatHex(d2))
- print()
-
-
-# The real comparison function.
-
-def compareImp(message):
- """Compare two MD5 implementations, C vs. pure Python module.
-
- For equal digests this returns None, otherwise it returns
- a tuple of both digests.
+ For equal digests this returns None, otherwise it returns a tuple of
+ both digests.
"""
-
- # Use Python's standard library MD5 compiled C module.
+ # Use the host Python's standard library MD5 compiled C module.
m1 = md5.md5()
m1.update(message)
d1 = m1.digest()
d1h = m1.hexdigest()
-
- # Use MD5 module in pure Python.
- m2 = pymd5.new()
- m2.update(message)
- d2 = m2.digest()
- d2h = m2.hexdigest()
+ # Return None if equal or the different digests if not equal.
+ return None if d1 == d2 and d1h == d2h else (d1, d2)
- # Return None if equal or the different digests if not equal.
- if d1 == d2 and d1h == d2h:
- return
- else:
- return d1, d2
+class TestMD5Update:
-class TestMD5Compare:
- "Compare pure Python MD5 against Python's std. lib. version."
-
- def test1(self):
- "Test cases with known digest result."
-
+ spaceconfig = dict(usemodules=('struct',))
+
+ def test_update(self):
+ """Test updating cloned objects."""
cases = (
- ("",
- "d41d8cd98f00b204e9800998ecf8427e"),
- ("a",
- "0cc175b9c0f1b6a831c399e269772661"),
- ("abc",
- "900150983cd24fb0d6963f7d28e17f72"),
- ("message digest",
- "f96b697d7cb7938d525a2f31aaf161d0"),
- ("abcdefghijklmnopqrstuvwxyz",
- "c3fcd3d76192e4007dfb496cca67e13b"),
- ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
- "d174ab98d277d9f5a5611c2c9f419d9f"),
- ("1234567890"*8,
- "57edf4a22be3c955ac49da2e2107b67a"),
- )
+ "123",
+ "1234",
+ "12345",
+ "123456",
+ "1234567",
+ "12345678",
+ "123456789 123456789 123456789 ",
+ "123456789 123456789 ",
+ "123456789 123456789 1",
+ "123456789 123456789 12",
+ "123456789 123456789 123",
+ "123456789 123456789 1234",
+ "123456789 123456789 123456789 1",
+ "123456789 123456789 123456789 12",
+ "123456789 123456789 123456789 123",
+ "123456789 123456789 123456789 1234",
+ "123456789 123456789 123456789 12345",
+ "123456789 123456789 123456789 123456",
+ "123456789 123456789 123456789 1234567",
+ "123456789 123456789 123456789 12345678",
+ )
+ space = self.space
+ w__md5 = import_lib_pypy(space, '_md5')
- for i in range(len(cases)):
- res = compareImp(cases[i][0])
- if res is not None:
- d1, d2 = res
- message, expectedResult = cases[i][0], None
- if len(cases[i]) == 2:
- expectedResult = cases[i][1]
- printDiff(message, d1, d2, expectedResult)
- assert res is None
-
-
- def test2(self):
- "Test cases without known digest result."
-
- cases = (
- "123",
- "1234",
- "12345",
- "123456",
- "1234567",
- "12345678",
- "123456789 123456789 123456789 ",
- "123456789 123456789 ",
- "123456789 123456789 1",
- "123456789 123456789 12",
- "123456789 123456789 123",
- "123456789 123456789 1234",
- "123456789 123456789 123456789 1",
- "123456789 123456789 123456789 12",
- "123456789 123456789 123456789 123",
- "123456789 123456789 123456789 1234",
- "123456789 123456789 123456789 12345",
- "123456789 123456789 123456789 123456",
- "123456789 123456789 123456789 1234567",
- "123456789 123456789 123456789 12345678",
- )
-
- for i in range(len(cases)):
- res = compareImp(cases[i][0])
- if res is not None:
- d1, d2 = res
- message = cases[i][0]
- printDiff(message, d1, d2)
- assert res is None
-
-
- def test3(self):
- "Test cases with long messages (can take a while)."
-
- cases = (
- (2**10*'a',),
- (2**10*'abcd',),
-## (2**20*'a',), ## 1 MB, takes about 160 sec. on a 233 Mhz Pentium.
- )
-
- for i in range(len(cases)):
- res = compareImp(cases[i][0])
- if res is not None:
- d1, d2 = res
- message = cases[i][0]
- printDiff(message, d1, d2)
- assert res is None
-
-
- def test4(self):
- "Test cases with increasingly growing message lengths."
-
- i = 0
- while i < 2**5:
- message = i * 'a'
- res = compareImp(message)
- if res is not None:
- d1, d2 = res
- printDiff(message, d1, d2)
- assert res is None
- i = i + 1
-
-
- def test5(self):
- "Test updating cloned objects."
-
- cases = (
- "123",
- "1234",
- "12345",
- "123456",
- "1234567",
- "12345678",
- "123456789 123456789 123456789 ",
- "123456789 123456789 ",
- "123456789 123456789 1",
- "123456789 123456789 12",
- "123456789 123456789 123",
- "123456789 123456789 1234",
- "123456789 123456789 123456789 1",
- "123456789 123456789 123456789 12",
- "123456789 123456789 123456789 123",
- "123456789 123456789 123456789 1234",
- "123456789 123456789 123456789 12345",
- "123456789 123456789 123456789 123456",
- "123456789 123456789 123456789 1234567",
- "123456789 123456789 123456789 12345678",
- )
-
- # Load both with same prefix.
+ # Load both with same prefix.
prefix1 = 2**10 * 'a'
+ # The host md5
m1 = md5.md5()
m1.update(prefix1)
m1c = m1.copy()
- m2 = pymd5.new()
- m2.update(prefix1)
- m2c = m2.copy()
+ # The app-level _md5
+ w_m2 = space.call_method(w__md5, 'new')
+ space.call_method(w_m2, 'update', space.wrap(prefix1))
+ w_m2c = space.call_method(w_m2, 'copy')
# Update and compare...
for i in range(len(cases)):
@@ -213,14 +74,153 @@
m1c.update(message)
d1 = m1c.hexdigest()
- m2c.update(message)
- d2 = m2c.hexdigest()
+ space.call_method(w_m2c, 'update', space.wrap(message))
+ w_d2 = space.call_method(w_m2c, 'hexdigest')
+ d2 = space.str_w(w_d2)
assert d1 == d2
-def test_attributes():
- assert pymd5.digest_size == 16
- assert pymd5.new().digest_size == 16
- assert pymd5.new().digestsize == 16
- assert pymd5.new().block_size == 64
+class AppTestMD5Compare:
+ """Compare pure Python MD5 against Python's std. lib. version."""
+
+ spaceconfig = dict(usemodules=('struct',))
+
+ def setup_class(cls):
+ from pypy.interpreter import gateway
+ space = cls.space
+ cls.w__md5 = import_lib_pypy(space, '_md5')
+ if cls.runappdirect:
+ # interp2app doesn't work in appdirect mode
+ cls.w_compare_host = staticmethod(compare_host)
+ else:
+ compare_host.unwrap_spec = [str, str, str]
+ cls.w_compare_host = space.wrap(gateway.interp2app(compare_host))
+
+ def w_compare(self, message):
+ # Generate results against the app-level pure Python MD5 and
+ # pass them off for comparison against the host Python's MD5
+ m2 = self._md5.new()
+ m2.update(message)
+ return self.compare_host(message, m2.digest(), m2.hexdigest())
+
+ def w__format_hex(self, string):
+ """Print a string's HEX code in groups of two digits."""
+ d = map(None, string)
+ d = map(ord, d)
+ d = map(lambda x: "%02x" % x, d)
+ return ' '.join(d)
+
+ def w__format(self, string):
+ """Print a string as-is in groups of two characters."""
+ s = ''
+ for i in range(0, len(string) - 1, 2):
+ s = s + "%03s" % string[i:i + 2]
+ return s[1:]
+
+ def w_print_diff(self, message, d1, d2, expectedResult=None):
+ """Print different outputs for same message."""
+ print("Message: '%s'" % message)
+ print("Message length: %d" % len(message))
+ if expectedResult:
+ print("%-48s (expected)" % self._format(expectedResult))
+ print("%-48s (Std. lib. MD5)" % self._format_hex(d1))
+ print("%-48s (Pure Python MD5)" % self._format_hex(d2))
+ print()
+
+ def test1(self):
+ """Test cases with known digest result."""
+ cases = (
+ ("",
+ "d41d8cd98f00b204e9800998ecf8427e"),
+ ("a",
+ "0cc175b9c0f1b6a831c399e269772661"),
+ ("abc",
+ "900150983cd24fb0d6963f7d28e17f72"),
+ ("message digest",
+ "f96b697d7cb7938d525a2f31aaf161d0"),
+ ("abcdefghijklmnopqrstuvwxyz",
+ "c3fcd3d76192e4007dfb496cca67e13b"),
+ ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
+ "d174ab98d277d9f5a5611c2c9f419d9f"),
+ ("1234567890"*8,
+ "57edf4a22be3c955ac49da2e2107b67a"),
+ )
+
+ for i in range(len(cases)):
+ res = self.compare(cases[i][0])
+ if res is not None:
+ d1, d2 = res
+ message, expectedResult = cases[i][0], None
+ if len(cases[i]) == 2:
+ expectedResult = cases[i][1]
+ self.print_diff(message, d1, d2, expectedResult)
+ assert res is None
+
+ def test2(self):
+ """Test cases without known digest result."""
+ cases = (
+ "123",
+ "1234",
+ "12345",
+ "123456",
+ "1234567",
+ "12345678",
+ "123456789 123456789 123456789 ",
+ "123456789 123456789 ",
+ "123456789 123456789 1",
+ "123456789 123456789 12",
+ "123456789 123456789 123",
+ "123456789 123456789 1234",
+ "123456789 123456789 123456789 1",
+ "123456789 123456789 123456789 12",
+ "123456789 123456789 123456789 123",
+ "123456789 123456789 123456789 1234",
+ "123456789 123456789 123456789 12345",
+ "123456789 123456789 123456789 123456",
+ "123456789 123456789 123456789 1234567",
+ "123456789 123456789 123456789 12345678",
+ )
+
+ for i in range(len(cases)):
+ res = self.compare(cases[i][0])
+ if res is not None:
+ d1, d2 = res
+ message = cases[i][0]
+ self.print_diff(message, d1, d2)
+ assert res is None
+
+ def test3(self):
+ """Test cases with long messages (can take a while)."""
+ cases = (
+ (2**10*'a',),
+ (2**10*'abcd',),
+ #(2**20*'a',), # 1 MB, takes about 160 sec. on a 233 Mhz Pentium.
+ )
+
+ for i in range(len(cases)):
+ res = self.compare(cases[i][0])
+ if res is not None:
+ d1, d2 = res
+ message = cases[i][0]
+ self.print_diff(message, d1, d2)
+ assert res is None
+
+ def test4(self):
+ """Test cases with increasingly growing message lengths."""
+ i = 0
+ while i < 2**5:
+ message = i * 'a'
+ res = self.compare(message)
+ if res is not None:
+ d1, d2 = res
+ self.print_diff(message, d1, d2)
+ assert res is None
+ i += 1
+
+ def test_attributes(self):
+ _md5 = self._md5
+ assert _md5.digest_size == 16
+ assert _md5.new().digest_size == 16
+ assert _md5.new().digestsize == 16
+ assert _md5.new().block_size == 64
More information about the pypy-commit
mailing list