Author: Alex Gaynor <alex.gay...@gmail.com> Branch: Changeset: r65535:42cc3499acc4 Date: 2013-07-22 20:58 -0700 http://bitbucket.org/pypy/pypy/changeset/42cc3499acc4/
Log: merged upstream diff --git a/pypy/doc/coding-guide.rst b/pypy/doc/coding-guide.rst --- a/pypy/doc/coding-guide.rst +++ b/pypy/doc/coding-guide.rst @@ -626,7 +626,7 @@ Here is the order in which PyPy looks up Python modules: -*pypy/modules* +*pypy/module* mixed interpreter/app-level builtin modules, such as the ``sys`` and ``__builtin__`` module. @@ -657,7 +657,7 @@ on some classes being old-style. We just maintain those changes in place, -to see what is changed we have a branch called `vendot/stdlib` +to see what is changed we have a branch called `vendor/stdlib` wich contains the unmodified cpython stdlib .. _`mixed module mechanism`: diff --git a/pypy/doc/rffi.rst b/pypy/doc/rffi.rst --- a/pypy/doc/rffi.rst +++ b/pypy/doc/rffi.rst @@ -43,7 +43,7 @@ See cbuild_ for more info on ExternalCompilationInfo. .. _`low level types`: rtyper.html#low-level-type -.. _cbuild: https://bitbucket.org/pypy/pypy/src/tip/pypy/translator/tool/cbuild.py +.. _cbuild: https://bitbucket.org/pypy/pypy/src/tip/rpython/translator/tool/cbuild.py Types @@ -69,9 +69,3 @@ as a fake low-level implementation for tests performed by an llinterp. .. _`extfunc.py`: https://bitbucket.org/pypy/pypy/src/tip/pypy/rpython/extfunc.py - - -OO backends ------------ - -XXX to be written 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,227 +1,226 @@ """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 -from __future__ import absolute_import -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 = map(None, str) - d = map(ord, d) - d = map(lambda x:"%02x" % x, 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." - + spaceconfig = dict(usemodules=('struct',)) + + def test_update(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", + ) + space = self.space + w__md5 = import_lib_pypy(space, '_md5') + + # Load both with same prefix. + prefix1 = 2**10 * 'a' + + # The host md5 + m1 = md5.md5() + m1.update(prefix1) + m1c = m1.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)): + message = cases[i][0] + + m1c.update(message) + d1 = m1c.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 + + +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." - + """Test cases with known digest result.""" cases = ( - ("", - "d41d8cd98f00b204e9800998ecf8427e"), - ("a", - "0cc175b9c0f1b6a831c399e269772661"), - ("abc", - "900150983cd24fb0d6963f7d28e17f72"), - ("message digest", - "f96b697d7cb7938d525a2f31aaf161d0"), - ("abcdefghijklmnopqrstuvwxyz", - "c3fcd3d76192e4007dfb496cca67e13b"), - ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", - "d174ab98d277d9f5a5611c2c9f419d9f"), - ("1234567890"*8, - "57edf4a22be3c955ac49da2e2107b67a"), - ) + ("", + "d41d8cd98f00b204e9800998ecf8427e"), + ("a", + "0cc175b9c0f1b6a831c399e269772661"), + ("abc", + "900150983cd24fb0d6963f7d28e17f72"), + ("message digest", + "f96b697d7cb7938d525a2f31aaf161d0"), + ("abcdefghijklmnopqrstuvwxyz", + "c3fcd3d76192e4007dfb496cca67e13b"), + ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + "d174ab98d277d9f5a5611c2c9f419d9f"), + ("1234567890"*8, + "57edf4a22be3c955ac49da2e2107b67a"), + ) - for i in xrange(len(cases)): - res = compareImp(cases[i][0]) + 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] - printDiff(message, d1, d2, expectedResult) + 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", + ) - 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 xrange(len(cases)): - res = compareImp(cases[i][0]) + for i in range(len(cases)): + res = self.compare(cases[i][0]) if res is not None: d1, d2 = res message = cases[i][0] - printDiff(message, d1, d2) + 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. + ) - 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 xrange(len(cases)): - res = compareImp(cases[i][0]) + for i in range(len(cases)): + res = self.compare(cases[i][0]) if res is not None: d1, d2 = res message = cases[i][0] - printDiff(message, d1, d2) + self.print_diff(message, d1, d2) assert res is None - def test4(self): - "Test cases with increasingly growing message lengths." - + """Test cases with increasingly growing message lengths.""" i = 0 - while i < 2**5: + while i < 2**5: message = i * 'a' - res = compareImp(message) + res = self.compare(message) if res is not None: d1, d2 = res - printDiff(message, d1, d2) + self.print_diff(message, d1, d2) assert res is None - i = i + 1 + 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. - prefix1 = 2**10 * 'a' - - m1 = md5.md5() - m1.update(prefix1) - m1c = m1.copy() - - m2 = pymd5.new() - m2.update(prefix1) - m2c = m2.copy() - - # Update and compare... - for i in xrange(len(cases)): - message = cases[i][0] - - m1c.update(message) - d1 = m1c.hexdigest() - - m2c.update(message) - d2 = m2c.hexdigest() - - 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 + 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 _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit