Mercurial > public > mercurial-scm > hg-stable
diff tests/test-hashutil.py @ 44087:dc9b53482689
sha1dc: use buffer protocol when parsing arguments
Without this, functions won't accept bytearray, memoryview,
or other types that can be exposed as bytes to the C API.
The most resilient way to obtain a bytes-like object from
the C API is using the Py_buffer interface.
This commit converts use of s#/y# to s*/y* and uses
Py_buffer for accessing the underlying bytes array.
I checked how hashlib is implemented in CPython and the
the implementation agrees with its use of the Py_buffer
interface as well as using BufferError in cases of bad
buffer types. Sadly, there's no good way to test for
ndim > 1 without writing our own C-backed Python type.
Differential Revision: https://phab.mercurial-scm.org/D7879
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Tue, 14 Jan 2020 18:59:49 -0800 |
parents | bde1cd4c99d9 |
children | 6000f5b25c9b |
line wrap: on
line diff
--- a/tests/test-hashutil.py Tue Jan 14 20:05:37 2020 -0500 +++ b/tests/test-hashutil.py Tue Jan 14 18:59:49 2020 -0800 @@ -45,6 +45,26 @@ h.digest(), ) + def test_bytes_like_types(self): + h = self.hasher() + h.update(bytearray(b'foo')) + h.update(memoryview(b'baz')) + self.assertEqual( + '21eb6533733a5e4763acacd1d45a60c2e0e404e1', h.hexdigest() + ) + + h = self.hasher(bytearray(b'foo')) + h.update(b'baz') + self.assertEqual( + '21eb6533733a5e4763acacd1d45a60c2e0e404e1', h.hexdigest() + ) + + h = self.hasher(memoryview(b'foo')) + h.update(b'baz') + self.assertEqual( + '21eb6533733a5e4763acacd1d45a60c2e0e404e1', h.hexdigest() + ) + class hashlibtests(unittest.TestCase, hashertestsbase): hasher = hashlib.sha1