13ce4864df85f428a5e67947e17359565612a902
[gpgme.git] / lang / python / tests / t-callbacks.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 from pyme import core, constants
21 import support
22
23 support.init_gpgme(constants.PROTOCOL_OpenPGP)
24
25 c = core.Context()
26 c.set_pinentry_mode(constants.PINENTRY_MODE_LOOPBACK)
27
28 source = core.Data("Hallo Leute\n")
29 sink = core.Data()
30
31 # Valid passphrases, both as string and bytes.
32 for passphrase in ('foo', b'foo'):
33     def passphrase_cb(hint, desc, prev_bad, hook=None):
34         assert hook == passphrase
35         return hook
36
37     c.set_passphrase_cb(passphrase_cb, passphrase)
38     c.op_encrypt([], 0, source, sink)
39
40 # Returning an invalid type.
41 def passphrase_cb(hint, desc, prev_bad, hook=None):
42     return 0
43
44 c.set_passphrase_cb(passphrase_cb, None)
45 try:
46     c.op_encrypt([], 0, source, sink)
47 except Exception as e:
48     assert type(e) == TypeError
49     assert str(e) == "expected str or bytes from passphrase callback, got int"
50 else:
51     assert False, "Expected an error, got none"
52
53 # Raising an exception inside callback.
54 myException = Exception()
55 def passphrase_cb(hint, desc, prev_bad, hook=None):
56     raise myException
57
58 c.set_passphrase_cb(passphrase_cb, None)
59 try:
60     c.op_encrypt([], 0, source, sink)
61 except Exception as e:
62     assert e == myException
63 else:
64     assert False, "Expected an error, got none"
65
66 # Wrong kind of callback function.
67 def bad_passphrase_cb():
68     pass
69
70 c.set_passphrase_cb(bad_passphrase_cb, None)
71 try:
72     c.op_encrypt([], 0, source, sink)
73 except Exception as e:
74     assert type(e) == TypeError
75 else:
76     assert False, "Expected an error, got none"
77
78
79
80 # Test the progress callback.
81 parms = """<GnupgKeyParms format="internal">
82 Key-Type: RSA
83 Key-Length: 1024
84 Name-Real: Joe Tester
85 Name-Comment: with stupid passphrase
86 Name-Email: joe+pyme@example.org
87 Passphrase: Crypt0R0cks
88 Expire-Date: 2020-12-31
89 </GnupgKeyParms>
90 """
91
92 messages = []
93 def progress_cb(what, typ, current, total, hook=None):
94     messages.append(
95         "PROGRESS UPDATE: what = {}, type = {}, current = {}, total = {}"
96         .format(what, typ, current, total))
97
98 c = core.Context()
99 c.set_progress_cb(progress_cb, None)
100 c.op_genkey(parms, None, None)
101 assert len(messages) > 0
102
103 # Test exception handling.
104 def progress_cb(what, typ, current, total, hook=None):
105     raise myException
106
107 c = core.Context()
108 c.set_progress_cb(progress_cb, None)
109 try:
110     c.op_genkey(parms, None, None)
111 except Exception as e:
112     assert e == myException
113 else:
114     assert False, "Expected an error, got none"