aboutsummaryrefslogtreecommitdiffstats
path: root/lang/python/tests
diff options
context:
space:
mode:
authorJustus Winter <[email protected]>2016-06-08 15:56:33 +0000
committerJustus Winter <[email protected]>2016-06-16 12:19:17 +0000
commit616929b6edf00b4a774b727385d39b785a112b90 (patch)
treec39e618d99d3257888ac68d2fed08b70fab81435 /lang/python/tests
parentpython: Add properties to wrapped object. (diff)
downloadgpgme-616929b6edf00b4a774b727385d39b785a112b90.tar.gz
gpgme-616929b6edf00b4a774b727385d39b785a112b90.zip
python: Wrap objects implementing the buffer protocol.
* lang/python/Makefile.am: Add the toplevel source directory to CFLAGS when compiling the bindings so that we can use private header files. * lang/python/gpgme.i (gpgme_data_t): Rework the object wrapping. Do not create a Python wrapper object, merely a gpgme_data_t object, and keep references to buffer objects, if any. If necessary, update the buffer after the function call. (pygpgme_wrap_gpgme_data_t): New function. * lang/python/helpers.c (object_to_gpgme_data_t): Rework object wrapping. Also wrap objects implementing the buffer protocol. * lang/python/helpers.h (object_to_gpgme_data_t): Update prototype. (pygpgme_wrap_gpgme_data_t): New prototype. * lang/python/tests/t-idiomatic.py: Demonstrate this. Signed-off-by: Justus Winter <[email protected]>
Diffstat (limited to 'lang/python/tests')
-rwxr-xr-xlang/python/tests/t-idiomatic.py35
1 files changed, 27 insertions, 8 deletions
diff --git a/lang/python/tests/t-idiomatic.py b/lang/python/tests/t-idiomatic.py
index 37cfb64a..b2526902 100755
--- a/lang/python/tests/t-idiomatic.py
+++ b/lang/python/tests/t-idiomatic.py
@@ -17,6 +17,7 @@
# You should have received a copy of the GNU Lesser General Public
# License along with this program; if not, see <http://www.gnu.org/licenses/>.
+import io
import os
import tempfile
from pyme import core, constants, errors
@@ -33,14 +34,7 @@ with core.Context() as c, core.Data() as d:
assert leak_c.wrapped == None
assert leak_d.wrapped == None
-# Demonstrate automatic wrapping of file-like objects with 'fileno'
-# method.
-with tempfile.TemporaryFile() as source, \
- tempfile.TemporaryFile() as signed, \
- tempfile.TemporaryFile() as sink:
- source.write(b"Hallo Leute\n")
- source.seek(0, os.SEEK_SET)
-
+def sign_and_verify(source, signed, sink):
with core.Context() as c:
c.op_sign(source, signed, constants.SIG_MODE_NORMAL)
signed.seek(0, os.SEEK_SET)
@@ -54,3 +48,28 @@ with tempfile.TemporaryFile() as source, \
sink.seek(0, os.SEEK_SET)
assert sink.read() == b"Hallo Leute\n"
+
+# Demonstrate automatic wrapping of file-like objects with 'fileno'
+# method.
+with tempfile.TemporaryFile() as source, \
+ tempfile.TemporaryFile() as signed, \
+ tempfile.TemporaryFile() as sink:
+ source.write(b"Hallo Leute\n")
+ source.seek(0, os.SEEK_SET)
+
+ sign_and_verify(source, signed, sink)
+
+# XXX: Python's io.BytesIo.truncate does not work as advertised.
+# http://bugs.python.org/issue27261
+bio = io.BytesIO()
+bio.truncate(1)
+if len(bio.getvalue()) != 1:
+ # This version of Python is affected, preallocate buffer.
+ preallocate = 128*b'\x00'
+else:
+ preallocate = b''
+
+# Demonstrate automatic wrapping of objects implementing the buffer
+# interface, and the use of data objects with the 'with' statement.
+with io.BytesIO(preallocate) as signed, core.Data() as sink:
+ sign_and_verify(b"Hallo Leute\n", signed, sink)