b2526902159ada59fc9243614156e485f7fcb915
[gpgme.git] / lang / python / tests / t-idiomatic.py
1 #!/usr/bin/env python3
2
3 # Copyright (C) 2016 g10 Code GmbH
4 #
5 # This file is part of GPGME.
6 #
7 # GPGME is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 2 of the License, or
10 # (at your option) any later version.
11 #
12 # GPGME is distributed in the hope that it will be useful, but WITHOUT
13 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General
15 # Public License for more details.
16 #
17 # You should have received a copy of the GNU Lesser General Public
18 # License along with this program; if not, see <http://www.gnu.org/licenses/>.
19
20 import io
21 import os
22 import tempfile
23 from pyme import core, constants, errors
24 import support
25
26 support.init_gpgme(constants.PROTOCOL_OpenPGP)
27
28 # Both Context and Data can be used as context manager:
29 with core.Context() as c, core.Data() as d:
30     c.get_engine_info()
31     d.write(b"Halloechen")
32     leak_c = c
33     leak_d = d
34 assert leak_c.wrapped == None
35 assert leak_d.wrapped == None
36
37 def sign_and_verify(source, signed, sink):
38     with core.Context() as c:
39         c.op_sign(source, signed, constants.SIG_MODE_NORMAL)
40         signed.seek(0, os.SEEK_SET)
41         c.op_verify(signed, None, sink)
42         result = c.op_verify_result()
43
44     assert len(result.signatures) == 1, "Unexpected number of signatures"
45     sig = result.signatures[0]
46     assert sig.summary == 0
47     assert errors.GPGMEError(sig.status).getcode() == errors.NO_ERROR
48
49     sink.seek(0, os.SEEK_SET)
50     assert sink.read() == b"Hallo Leute\n"
51
52 # Demonstrate automatic wrapping of file-like objects with 'fileno'
53 # method.
54 with tempfile.TemporaryFile() as source, \
55      tempfile.TemporaryFile() as signed, \
56      tempfile.TemporaryFile() as sink:
57     source.write(b"Hallo Leute\n")
58     source.seek(0, os.SEEK_SET)
59
60     sign_and_verify(source, signed, sink)
61
62 # XXX: Python's io.BytesIo.truncate does not work as advertised.
63 # http://bugs.python.org/issue27261
64 bio = io.BytesIO()
65 bio.truncate(1)
66 if len(bio.getvalue()) != 1:
67     # This version of Python is affected, preallocate buffer.
68     preallocate = 128*b'\x00'
69 else:
70     preallocate = b''
71
72 # Demonstrate automatic wrapping of objects implementing the buffer
73 # interface, and the use of data objects with the 'with' statement.
74 with io.BytesIO(preallocate) as signed, core.Data() as sink:
75     sign_and_verify(b"Hallo Leute\n", signed, sink)