/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5557.1.15 by John Arbash Meinel
Merge bzr.dev 5597 to resolve NEWS, aka bzr-2.3.txt
1
# Copyright (C) 2005, 2006, 2007, 2009, 2011 Canonical Ltd
1442.1.55 by Robert Collins
move environment preservation up to the root test case, making it available to all tests
2
#   Authors: Robert Collins <robert.collins@canonical.com>
3
#
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1442.1.55 by Robert Collins
move environment preservation up to the root test case, making it available to all tests
17
18
"""Tests for signing and verifying blobs of data via gpg."""
19
20
# import system imports here
21
import sys
22
6123.1.16 by Jelmer Vernooij
Add test.
23
from bzrlib import (
6351.3.10 by Vincent Ladeuil
Inherit from TestCaseWithTransport as we need some disk support, add a
24
    config,
6123.1.16 by Jelmer Vernooij
Add test.
25
    errors,
26
    gpg,
6351.3.10 by Vincent Ladeuil
Inherit from TestCaseWithTransport as we need some disk support, add a
27
    tests,
6123.1.16 by Jelmer Vernooij
Add test.
28
    trace,
29
    ui,
30
    )
31
from bzrlib.tests import (
32
    TestCase,
33
    features,
34
    )
1442.1.55 by Robert Collins
move environment preservation up to the root test case, making it available to all tests
35
6351.3.10 by Vincent Ladeuil
Inherit from TestCaseWithTransport as we need some disk support, add a
36
6351.3.11 by Vincent Ladeuil
Simplify by using an in-memory config store and stack.
37
class FakeConfig(config.Stack):
38
39
    def __init__(self):
40
        store = config.IniFileStore()
41
        store._load_from_string('''
42
gpg_signing_key=amy@example.com
43
gpg_signing_command=false''')
44
        super(FakeConfig, self).__init__([store.get_sections])
45
46
47
class TestCommandLine(tests.TestCase):
6351.3.10 by Vincent Ladeuil
Inherit from TestCaseWithTransport as we need some disk support, add a
48
49
    def setUp(self):
50
        super(TestCommandLine, self).setUp()
6351.3.11 by Vincent Ladeuil
Simplify by using an in-memory config store and stack.
51
        self.my_gpg = gpg.GPGStrategy(FakeConfig())
1442.1.57 by Robert Collins
check that we get the right command line from the default gpg strategy.
52
53
    def test_signing_command_line(self):
6012.2.14 by Jonathan Riddell
fix tests
54
        self.assertEqual(['false',  '--clearsign', '-u', 'amy@example.com'],
6351.3.10 by Vincent Ladeuil
Inherit from TestCaseWithTransport as we need some disk support, add a
55
                         self.my_gpg._command_line())
1442.1.58 by Robert Collins
gpg signing of content
56
57
    def test_checks_return_code(self):
58
        # This test needs a unix like platform - one with 'false' to run.
59
        # if you have one, please make this work :)
6351.3.10 by Vincent Ladeuil
Inherit from TestCaseWithTransport as we need some disk support, add a
60
        self.assertRaises(errors.SigningFailed, self.my_gpg.sign, 'content')
1442.1.58 by Robert Collins
gpg signing of content
61
1551.8.12 by Aaron Bentley
Add test case for clearing PB
62
    def assertProduces(self, content):
63
        # This needs a 'cat' command or similar to work.
1185.31.54 by John Arbash Meinel
Win32 not only doesn't have cat, it changes line-endings too. Should be fixed.
64
        if sys.platform == 'win32':
65
            # Windows doesn't come with cat, and we don't require it
66
            # so lets try using python instead.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
67
            # But stupid windows and line-ending conversions.
1185.31.54 by John Arbash Meinel
Win32 not only doesn't have cat, it changes line-endings too. Should be fixed.
68
            # It is too much work to make sys.stdout be in binary mode.
69
            # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65443
6351.3.10 by Vincent Ladeuil
Inherit from TestCaseWithTransport as we need some disk support, add a
70
            self.my_gpg._command_line = lambda:[sys.executable, '-c',
1185.78.4 by John Arbash Meinel
Reverting gpg changes, should not be mainline, see gpg_uses_tempfile plugin.
71
                    'import sys; sys.stdout.write(sys.stdin.read())']
1185.31.54 by John Arbash Meinel
Win32 not only doesn't have cat, it changes line-endings too. Should be fixed.
72
            new_content = content.replace('\n', '\r\n')
73
6351.3.10 by Vincent Ladeuil
Inherit from TestCaseWithTransport as we need some disk support, add a
74
            self.assertEqual(new_content, self.my_gpg.sign(content))
1185.31.54 by John Arbash Meinel
Win32 not only doesn't have cat, it changes line-endings too. Should be fixed.
75
        else:
6351.3.10 by Vincent Ladeuil
Inherit from TestCaseWithTransport as we need some disk support, add a
76
            self.my_gpg._command_line = lambda:['cat', '-']
77
            self.assertEqual(content, self.my_gpg.sign(content))
1442.1.62 by Robert Collins
Allow creation of testaments from uncommitted data, and use that to get signatures before committing revisions.
78
1551.8.12 by Aaron Bentley
Add test case for clearing PB
79
    def test_returns_output(self):
80
        content = "some content\nwith newlines\n"
81
        self.assertProduces(content)
82
83
    def test_clears_progress(self):
84
        content = "some content\nwith newlines\n"
85
        old_clear_term = ui.ui_factory.clear_term
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
86
        clear_term_called = []
1551.8.12 by Aaron Bentley
Add test case for clearing PB
87
        def clear_term():
88
            old_clear_term()
1551.8.13 by Aaron Bentley
Tweak test_clears_progress
89
            clear_term_called.append(True)
1551.8.12 by Aaron Bentley
Add test case for clearing PB
90
        ui.ui_factory.clear_term = clear_term
91
        try:
92
            self.assertProduces(content)
93
        finally:
94
            ui.ui_factory.clear_term = old_clear_term
95
        self.assertEqual([True], clear_term_called)
96
2273.1.1 by John Arbash Meinel
``GPGStrategy.sign()`` will now raise ``BzrBadParameterUnicode`` if
97
    def test_aborts_on_unicode(self):
2273.1.2 by John Arbash Meinel
Cleanup docstring for Aaron Bentley
98
        """You can't sign Unicode text; it must be encoded first."""
2273.1.1 by John Arbash Meinel
``GPGStrategy.sign()`` will now raise ``BzrBadParameterUnicode`` if
99
        self.assertRaises(errors.BzrBadParameterUnicode,
100
                          self.assertProduces, u'foo')
101
6043.2.4 by Jonathan Riddell
add test for valid_but_unacceptable_key, document tests in verify method
102
class TestVerify(TestCase):
103
5971.1.14 by Jonathan Riddell
add test for set_acceptable_keys, accept non-trusted keys if specified as acceptable, import dummy key in tests so it works outside my machine
104
    def import_keys(self):
105
        from StringIO import StringIO
106
        import gpgme
107
        context = gpgme.Context()
108
109
        key = StringIO("""-----BEGIN PGP PUBLIC KEY BLOCK-----
110
Version: GnuPG v1.4.11 (GNU/Linux)
111
112
mQENBE343IgBCADwzPW7kmKb2bjB+UU+1ER/ABMZspvtoZMPusUw7bk6coXHF/0W
113
u1K/hSYeX9xaGOfOQw41r/g13MoR9dsL6L84RLiisf38rRoBZt+d5bCbZA5Xo801
114
2PeoBoGo6u5oOYKAFLMvrUitPiiE0IT/oQTfC4YUrLN4A+9W0QZruPGIpIXwmZXr
115
L0zsqYfNqIN0ompeJenVpKpvm3loJ/zfK7R3EJ3hsv6nkUmWCFsP1Pw3UV1YuCmw
116
Mkdn1U7DaOql1WjXgj9ABQDJrun2TGsqrSRzBODtHKA/uOX0K3VfKBU8VZo3dXUm
117
1Q4ZeZC39L9qJGTH8TQYlwBLe1yAOp+vx7QJABEBAAG0JEJhemFhciBUZXN0IEtl
118
eSA8YmF6YWFyQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTfjciAIbAwYLCQgHAwIG
119
FQgCCQoLBBYCAwECHgECF4AACgkQh2gbHuMIDkWJUggAwj537fH6WW+GGLA5onys
120
2hZmXUq/tU+L92bjQoRY4fmsQpk/FUVPUf+NQ0v1gkxx4BTfyYewaj5G6L8cvqW2
121
jj7UiJd8z9gTRxWTnYwfR/w5PGmxfJsBfEUKWsccrPQdOXAhwu0fjYIVk4nqgswa
122
IOAZIwe5Vsfs36uSS7p8RQHAZXLXtTOn3KcXHaxu83w6nc4zkWRovGJ9isBN3haO
123
2qEa0mYiAfDpz40CGtb8N/TQHF3Xcw8rJcxpg6RF3jMtWQnzbVJFp13it00R3LqW
124
o/r3RII3Ii3z2yARlg6D+5hVOrFBV8jFLkff1R2ZnVu+7WOrnbpmt3OiMkSeZrtB
125
OrkBDQRN+NyIAQgArRZ2YGzUj5dXOVIWgZ1/QFpyfx/cG/293WjRE4Wt2e4SxMf2
126
V0dcVCqWwT0+a79Wbausv4bStD4SkwDmu0Jf3z5ERzrr7oZwP0PMsIlM5zT6XSsr
127
6UUneB3UXX7MrEqVogVhRM0ORIaK/oRwMXr7K6xVT+bCBP3/p66kHtY1ZpfEzTEX
128
imBsN3GqoewBHYIneJKBtHE7uzdzw3O5p5dXqoj5foxGi9R1J15vAmt5pI68HJeX
129
P6ktvXbX2Iu7VDNoCvRXM9+ntyJtsXCjNXg4pTGHS/XO4nm2db4FUZOBcVMb1vCc
130
VtFjLTcbCqJqpoJWUtsLcNqDqMHOQDpe6KTNTQARAQABiQEfBBgBAgAJBQJN+NyI
131
AhsMAAoJEIdoGx7jCA5FrR8IANnOF3PUj1TbRcwV6RoWmHsFQHrPmM8ogXia1Lsv
132
jE1iEWoC+muvKh6Oydf90k6ZslS7rdDnp2qzYY8W/TiDkxP+fvsZ4mMi1Y0F+3ty
133
1jzWhcsnB2VrJSiavxEXk0tKPrNv4EUGWG6wHsC9TBj37If+nrMyim94VHvI0eHm
134
X8yMlN4O3HfmgD9CbJdUxueP3e31OIYuwh/6F7GII8TNEVHU/8vh/mQcCxppNbc+
135
boff+kIsoa/TAMLwtJoSrX1nXm0K3vZePRLnIgmwVzdkOIkaRJUG2tSQFvkfhvtE
136
LhnkL5l4MO0wrUds0UWRwa3d7j/P2ExrqXdlLmEzrifWyEQ=
137
=hUJn
138
-----END PGP PUBLIC KEY BLOCK-----
139
""")
140
141
        secret_key = StringIO("""-----BEGIN PGP PRIVATE KEY BLOCK-----
142
Version: GnuPG v1.4.11 (GNU/Linux)
143
144
lQOYBE343IgBCADwzPW7kmKb2bjB+UU+1ER/ABMZspvtoZMPusUw7bk6coXHF/0W
145
u1K/hSYeX9xaGOfOQw41r/g13MoR9dsL6L84RLiisf38rRoBZt+d5bCbZA5Xo801
146
2PeoBoGo6u5oOYKAFLMvrUitPiiE0IT/oQTfC4YUrLN4A+9W0QZruPGIpIXwmZXr
147
L0zsqYfNqIN0ompeJenVpKpvm3loJ/zfK7R3EJ3hsv6nkUmWCFsP1Pw3UV1YuCmw
148
Mkdn1U7DaOql1WjXgj9ABQDJrun2TGsqrSRzBODtHKA/uOX0K3VfKBU8VZo3dXUm
149
1Q4ZeZC39L9qJGTH8TQYlwBLe1yAOp+vx7QJABEBAAEAB/0RJTbV991SOtVfPQVu
150
LM+tD0SiOXJwIBIINlngsFHWVIiBSDb6uF8dneMR70IRnuEFHFyAUXA7PZDxvcSu
151
phAqIdKCWxQPkAULAS0o4U2K3ZFGh4uOqvfZ8eSnh1rETFv7Yf3u23K89cZiy99n
152
EtWgSqzC/2z5PaZ7/alsYCBqhHuyd4Phaud7qv7FTz8mFrCf+CCY+D08wbnZBu4g
153
N9tBwoxT/UKRfv3nghIh9v+3qWfBEFGhrYbt92XKFbHOQeATZz8AGIv1eqN/+ZQY
154
oYmvVfO3GkrWaRoPeJNLqSDEn/45O1Uh9MJ4mQclXqB0QzMShle8uusHxIeJSQsR
155
z//VBAD11WS7qSgCeiHR+4jDzrrlb2snnA2bfDToEomDxd/n8xm7nJWdkNfJ2BCw
156
KvnxYVxjFNAwkKJGRajzALBLzRVO+K9NtSLiddv5zv+UNdgsKuE8tD7Jqxd/IbWw
157
AimCtL8osnJ+r9dvL+NyjkAT6l/NdEbLXGrBaMeTfSgl2cBOOwQA+sJIh1R5PiCK
158
nLIs9pm3PSy3w92Peelq/x/+0aebTZaJUk2ou3oCvB3druDqrUeaopuuCc0drV7C
159
Ldoey8x/T2ZGzmT2af9qNaD6ScTimDodXcJdwlpobhZTKpsE4EyywpLXtlWte1x0
160
1Mq3llQsIdRdf3GLS+L207hWgKDiDosD/0SyOBO/IBDteeEzeN2hNE3A8oeVbvRS
161
XrS/3uj6oKmlWUBORYP8ptUrXPoVPmNz2y4GO+OysFtfct3Yqb+Sb/52SXMOHTox
162
2oLW08tkzfkDArU5aauMEPmyutGyJ+hGo7fsuLXzXR8OPw4yZJdzG1tRlP2TTKmq
163
Fx8G/Ik6bN4zTYK0JEJhemFhciBUZXN0IEtleSA8YmF6YWFyQGV4YW1wbGUuY29t
164
PokBOAQTAQIAIgUCTfjciAIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ
165
h2gbHuMIDkWJUggAwj537fH6WW+GGLA5onys2hZmXUq/tU+L92bjQoRY4fmsQpk/
166
FUVPUf+NQ0v1gkxx4BTfyYewaj5G6L8cvqW2jj7UiJd8z9gTRxWTnYwfR/w5PGmx
167
fJsBfEUKWsccrPQdOXAhwu0fjYIVk4nqgswaIOAZIwe5Vsfs36uSS7p8RQHAZXLX
168
tTOn3KcXHaxu83w6nc4zkWRovGJ9isBN3haO2qEa0mYiAfDpz40CGtb8N/TQHF3X
169
cw8rJcxpg6RF3jMtWQnzbVJFp13it00R3LqWo/r3RII3Ii3z2yARlg6D+5hVOrFB
170
V8jFLkff1R2ZnVu+7WOrnbpmt3OiMkSeZrtBOp0DlwRN+NyIAQgArRZ2YGzUj5dX
171
OVIWgZ1/QFpyfx/cG/293WjRE4Wt2e4SxMf2V0dcVCqWwT0+a79Wbausv4bStD4S
172
kwDmu0Jf3z5ERzrr7oZwP0PMsIlM5zT6XSsr6UUneB3UXX7MrEqVogVhRM0ORIaK
173
/oRwMXr7K6xVT+bCBP3/p66kHtY1ZpfEzTEXimBsN3GqoewBHYIneJKBtHE7uzdz
174
w3O5p5dXqoj5foxGi9R1J15vAmt5pI68HJeXP6ktvXbX2Iu7VDNoCvRXM9+ntyJt
175
sXCjNXg4pTGHS/XO4nm2db4FUZOBcVMb1vCcVtFjLTcbCqJqpoJWUtsLcNqDqMHO
176
QDpe6KTNTQARAQABAAf1EfceUlGLvoA/+yDTNTMjuPfzfKwbB/FOVfX44g3Za1eT
177
v7RvSuj4rFYIdE9UvZEei/pqPOSc+hhSsKZCulGXD5TUpf3AyG7ipWU/kID46Csp
178
0V08DPpFHnuw/N6+qNo5iSnhN9U1XMLjYT5d1HvKur26r2vWbmUTSJ1qIluHL2fT
179
R1pKYYLuoff4MIjZ01Hawq72jjor+dLBmMWveHpq4XNp+vQ4x8aFnY9ozufon0nM
180
uRSJRlQjDNB274tvUbmDFP+nzNbqF1nBTZ6FTdH/iKVNbytiYF7Hbat8GWVZqY1u
181
CZr7BklpIVWlk62ll0psMIPVyANi7YT332LLqYmBBADJKTx2dariG/kWU2W/9VEO
182
2VZpqsqazAxOoFEIOpcOlByhhyw5g0IKu0UyzHkhoCje0cWxpdSBFG432b8zL0AT
183
Z0RycfUG7Sgp9CpY1h8Cc/HbBa8xo1fSM7zplPQrHBqUzlVVBq6HOkUq+7qsPFWc
184
RRie95VsDmIMKQKPJHeYHQQA3EYGit+QHV0dccAInghEsf/mq8Gfnvo6HPYhWcDC
185
DTM39NhNlnl1WkTFCd2TWc+TWQ4KlRsh6bMjUpNa2qjrUl90fLekbogcxxMhcwa6
186
xgzEANZfwqdY0u3aB/CyZ6odfThwcAoeqoMpw34CfeKEroubpi2n8wKByrN2MQXJ
187
4vEEAJbXZOqgAcFAFBUVb5mVT0s2lJMagZFPdhRJz2bttz01s/B8aca6CrDpFRjT
188
03zRFUZjwDYqZDWBC181dCE9yla4OkWd5QyRKSS2EE02KEYqRzT0RngQn7s4AW2r
189
326up3Jhleln3hgD4Kk3V3KHmyK8zqZA0qWzry4Vl2jjkbnAPB2JAR8EGAECAAkF
190
Ak343IgCGwwACgkQh2gbHuMIDkWtHwgA2c4Xc9SPVNtFzBXpGhaYewVAes+YzyiB
191
eJrUuy+MTWIRagL6a68qHo7J1/3STpmyVLut0OenarNhjxb9OIOTE/5++xniYyLV
192
jQX7e3LWPNaFyycHZWslKJq/EReTS0o+s2/gRQZYbrAewL1MGPfsh/6eszKKb3hU
193
e8jR4eZfzIyU3g7cd+aAP0Jsl1TG54/d7fU4hi7CH/oXsYgjxM0RUdT/y+H+ZBwL
194
Gmk1tz5uh9/6Qiyhr9MAwvC0mhKtfWdebQre9l49EuciCbBXN2Q4iRpElQba1JAW
195
+R+G+0QuGeQvmXgw7TCtR2zRRZHBrd3uP8/YTGupd2UuYTOuJ9bIRA==
196
=LXn0
197
-----END PGP PRIVATE KEY BLOCK-----
198
""")
199
6043.2.5 by Jonathan Riddell
catch a revoked key and add test for it
200
        revoked_key = StringIO("""-----BEGIN PGP PUBLIC KEY BLOCK-----
201
Version: GnuPG v1.4.11 (GNU/Linux)
202
203
mI0ETjlW5gEEAOb/6P+TVM59E897wRtatxys2BhsHCXM4T7xjIiANfDwejDdifqh
204
tluTfSJLLxPembtrrEjux1C0AJgc+f0MIfsc3Pr3eFJzKB2ot/1IVG1/1KnA0zt3
205
W2xPT3lRib27WJ9Fag+dMtQaIzgJ7/n2DFxsFZ33FD2kxrEXB2exGg6FABEBAAGI
206
pgQgAQIAEAUCTjlXkAkdAHJldm9rZWQACgkQjs6dvEpb0cQPHAP/Wi9rbx0e+1Sf
207
ziGgyVdr3m3A6uvze5oXKVgFRbGRUYSH4/I8GW0W9x4TcRg9h+YaQ8NUdADr9kNE
208
tKAljLqYA5qdqSfYuaij1M++Xj+KUZ359R74sHuQqwnRy1XXQNfRs/QpXA7vLdds
209
rjg+pbWuXO92TZJUdnqtWW+VEyZBsPy0G3Rlc3Qga2V5IDx0ZXN0QGV4YW1wbGUu
210
Y29tPoi4BBMBAgAiBQJOOVbmAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK
211
CRCOzp28SlvRxNWzA/42WVmI0b+6mF/imEOlY1TiyvrcpK250rkSDsCtL4lOwy7G
212
antZhpgNfnXRd/ySfsS3EB6dpOWgOSxGRvWQhA+vxBT9BYNk49qd3JIrSaSWpR12
213
rET8qO1rEQQFWsw03CxTGujxGlmEO+a1yguRXp2UWaY7FngcQmD+8q7BUIVm7riN
214
BE45VuYBBADTEH2jHTjNCc5CMOhea6EJTrkx3upcEqB2oyhWeSWJiBGOxlcddsjo
215
3J3/EmBB8kK1hM9TidD3SG64x1N287lg8ELJBlKv+pQVyxohGJ1u/THgpTDMMQcL
216
luG5rAHQGSfyzKTiOnaTyBYg3M/nzgUOU9dKEFB0EA3tjUXFOT+r3wARAQABiJ8E
217
GAECAAkFAk45VuYCGwwACgkQjs6dvEpb0cRSLQP/fzCWX2lXwlwWiVF8BOPF7o9z
218
icHErc7/X17RGb4qj1kVf+UkRdUWJrbEVh4h6MncBIuA70WsYogiw+Kz/0LCtQAR
219
YUJsPy/EL++OKPH1aFasOdTxwkTka85+RdYqhP1+z/aYLFMWq6mRFI+o6x2k5mGi
220
7dMv2kKTJPoXUpiXJbg=
221
=hLYO
222
-----END PGP PUBLIC KEY BLOCK-----
223
""")
224
6043.2.8 by Jonathan Riddell
add test for unknown key
225
        expired_key = StringIO("""-----BEGIN PGP PUBLIC KEY BLOCK-----
226
Version: GnuPG v1.4.11 (GNU/Linux)
227
228
mI0ETjZ6PAEEALkR4GcFQidCCxV7pgQwQd5MZua0YO2l92fVqHX+PhnZ6egCLKdD
229
2bWlMUd6MLPF3FlRL7BBAxvW/DazkBOp7ljsnpMpptEzY49Uem1irYLYiVb9zK96
230
0sQZzFxFkfEYetQEXC68mIck8tbySOX5NAOw++3jFm3J7dsU1R3XtYzRABEBAAG0
231
G3Rlc3Qga2V5IDx0ZXN0QGV4YW1wbGUuY29tPoi+BBMBAgAoBQJONno8AhsDBQkA
232
AVGABgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRAc4m97T40VEz+DA/9PBphG
233
Yp9cHVaHSfTUKGTGgIbvRe60sFNpDCYZeAGDrygOMuI8MNzbVpwefRBFHVPx7jWd
234
rrYMsLkcsNUS9D0baU+0D/qp7JVg7ZSQtG0O6IG4eTZhibteY1fu0+unlXmg9NHx
235
5VvhwzBiJDYji00M2p/CZEMiYFUuy76CsxUpN7iNBE42ejwBBACkv2/mX7IPQg0C
236
A3KSrJsJv+sdvKm4b4xuI4OwagwTIVz4KlTqV4IBrVjSBfwyMXucXz0bTW85qjgA
237
+n67td8vyjYYZUEz1uY9lSquQQDnAN0txL3cLHZXWiWOkmzZVddQtlflK2a/J9o0
238
QkHPVUm+hc4l64dIzStrNl2S66fAvQARAQABiKUEGAECAA8FAk42ejwCGwwFCQAB
239
UYAACgkQHOJve0+NFROEYQP/epg+o8iBs31hkSERyZjrRR66LpywezWj30Rn/3mX
240
Fzi9HkF4xLemWOzdNt9C5PYrOep85PQg8haEjknxVjZFS0ikT1h3OWk/TF1ZrLVm
241
WzyX8DaHQEjKpLJJjXcAbTiZBNMk0QaVC9RvIeHpCf3n3DC49DdjsPJRMKOn8KDi
242
kRk=
243
=p0gt
244
-----END PGP PUBLIC KEY BLOCK-----
245
""")
5971.1.14 by Jonathan Riddell
add test for set_acceptable_keys, accept non-trusted keys if specified as acceptable, import dummy key in tests so it works outside my machine
246
        context.import_(key)
247
        context.import_(secret_key)
6043.2.5 by Jonathan Riddell
catch a revoked key and add test for it
248
        context.import_(revoked_key)
6043.2.8 by Jonathan Riddell
add test for unknown key
249
        context.import_(expired_key)
5971.1.14 by Jonathan Riddell
add test for set_acceptable_keys, accept non-trusted keys if specified as acceptable, import dummy key in tests so it works outside my machine
250
6043.2.7 by Jonathan Riddell
some reordering of verification, improve names of tests
251
    def test_verify_untrusted_but_accepted(self):
252
        #untrusted by gpg but listed as acceptable_keys by user
5971.1.35 by Jonathan Riddell
set gpgme in tests.features
253
        self.requireFeature(features.gpgme)
254
        self.import_keys()
5971.1.14 by Jonathan Riddell
add test for set_acceptable_keys, accept non-trusted keys if specified as acceptable, import dummy key in tests so it works outside my machine
255
            
5971.1.9 by Jonathan Riddell
add some tests
256
        content = """-----BEGIN PGP SIGNED MESSAGE-----
257
Hash: SHA1
258
259
bazaar-ng testament short form 1
260
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
261
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
262
-----BEGIN PGP SIGNATURE-----
263
Version: GnuPG v1.4.11 (GNU/Linux)
264
5971.1.14 by Jonathan Riddell
add test for set_acceptable_keys, accept non-trusted keys if specified as acceptable, import dummy key in tests so it works outside my machine
265
iQEcBAEBAgAGBQJN+ekFAAoJEIdoGx7jCA5FGtEH/i+XxJRvqU6wdBtLVrGBMAGk
266
FZ5VP+KyXYtymSbgSstj/vM12NeMIeFs3xGnNnYuX1MIcY6We5TKtCH0epY6ym5+
267
6g2Q2QpQ5/sT2d0mWzR0K4uVngmxVQaXTdk5PdZ40O7ULeDLW6CxzxMHyUL1rsIx
268
7UBUTBh1O/1n3ZfD99hUkm3hVcnsN90uTKH59zV9NWwArU0cug60+5eDKJhSJDbG
269
rIwlqbFAjDZ7L/48e+IaYIJwBZFzMBpJKdCxzALLtauMf+KK8hGiL2hrRbWm7ty6
270
NgxfkMYOB4rDPdSstT35N+5uBG3n/UzjxHssi0svMfVETYYX40y57dm2eZQXFp8=
271
=iwsn
5971.1.9 by Jonathan Riddell
add some tests
272
-----END PGP SIGNATURE-----
273
"""
5971.1.31 by Jonathan Riddell
and update tests
274
        plain = """bazaar-ng testament short form 1
275
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
276
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
277
"""
5971.1.9 by Jonathan Riddell
add some tests
278
        my_gpg = gpg.GPGStrategy(FakeConfig())
5971.1.14 by Jonathan Riddell
add test for set_acceptable_keys, accept non-trusted keys if specified as acceptable, import dummy key in tests so it works outside my machine
279
        my_gpg.set_acceptable_keys("bazaar@example.com")
5971.1.31 by Jonathan Riddell
and update tests
280
        self.assertEqual((gpg.SIGNATURE_VALID, None), my_gpg.verify(content,
281
                            plain))
5971.1.9 by Jonathan Riddell
add some tests
282
6043.2.7 by Jonathan Riddell
some reordering of verification, improve names of tests
283
    def test_verify_unacceptable_key(self):
6043.2.4 by Jonathan Riddell
add test for valid_but_unacceptable_key, document tests in verify method
284
        self.requireFeature(features.gpgme)
285
        self.import_keys()
286
            
287
        content = """-----BEGIN PGP SIGNED MESSAGE-----
288
Hash: SHA1
289
290
bazaar-ng testament short form 1
291
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
292
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
293
-----BEGIN PGP SIGNATURE-----
294
Version: GnuPG v1.4.11 (GNU/Linux)
295
296
iQEcBAEBAgAGBQJN+ekFAAoJEIdoGx7jCA5FGtEH/i+XxJRvqU6wdBtLVrGBMAGk
297
FZ5VP+KyXYtymSbgSstj/vM12NeMIeFs3xGnNnYuX1MIcY6We5TKtCH0epY6ym5+
298
6g2Q2QpQ5/sT2d0mWzR0K4uVngmxVQaXTdk5PdZ40O7ULeDLW6CxzxMHyUL1rsIx
299
7UBUTBh1O/1n3ZfD99hUkm3hVcnsN90uTKH59zV9NWwArU0cug60+5eDKJhSJDbG
300
rIwlqbFAjDZ7L/48e+IaYIJwBZFzMBpJKdCxzALLtauMf+KK8hGiL2hrRbWm7ty6
301
NgxfkMYOB4rDPdSstT35N+5uBG3n/UzjxHssi0svMfVETYYX40y57dm2eZQXFp8=
302
=iwsn
303
-----END PGP SIGNATURE-----
304
"""
305
        plain = """bazaar-ng testament short form 1
306
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
307
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
308
"""
309
        my_gpg = gpg.GPGStrategy(FakeConfig())
310
        my_gpg.set_acceptable_keys("foo@example.com")
311
        self.assertEqual((gpg.SIGNATURE_KEY_MISSING, u'E3080E45'),
312
                         my_gpg.verify(content, plain))
313
6043.2.6 by Jonathan Riddell
catch untrusted keys and add test
314
    def test_verify_valid_but_untrusted(self):
315
        self.requireFeature(features.gpgme)
316
        self.import_keys()
317
            
318
        content = """-----BEGIN PGP SIGNED MESSAGE-----
319
Hash: SHA1
320
321
bazaar-ng testament short form 1
322
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
323
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
324
-----BEGIN PGP SIGNATURE-----
325
Version: GnuPG v1.4.11 (GNU/Linux)
326
327
iQEcBAEBAgAGBQJN+ekFAAoJEIdoGx7jCA5FGtEH/i+XxJRvqU6wdBtLVrGBMAGk
328
FZ5VP+KyXYtymSbgSstj/vM12NeMIeFs3xGnNnYuX1MIcY6We5TKtCH0epY6ym5+
329
6g2Q2QpQ5/sT2d0mWzR0K4uVngmxVQaXTdk5PdZ40O7ULeDLW6CxzxMHyUL1rsIx
330
7UBUTBh1O/1n3ZfD99hUkm3hVcnsN90uTKH59zV9NWwArU0cug60+5eDKJhSJDbG
331
rIwlqbFAjDZ7L/48e+IaYIJwBZFzMBpJKdCxzALLtauMf+KK8hGiL2hrRbWm7ty6
332
NgxfkMYOB4rDPdSstT35N+5uBG3n/UzjxHssi0svMfVETYYX40y57dm2eZQXFp8=
333
=iwsn
334
-----END PGP SIGNATURE-----
335
"""
336
        plain = """bazaar-ng testament short form 1
337
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
338
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
339
"""
340
        my_gpg = gpg.GPGStrategy(FakeConfig())
341
        self.assertEqual((gpg.SIGNATURE_NOT_VALID, None), my_gpg.verify(content,
342
                            plain))
343
5971.1.32 by Jonathan Riddell
test for signing incorrect commit content
344
    def test_verify_bad_testament(self):
5971.1.35 by Jonathan Riddell
set gpgme in tests.features
345
        self.requireFeature(features.gpgme)
346
        self.import_keys()
5971.1.32 by Jonathan Riddell
test for signing incorrect commit content
347
            
348
        content = """-----BEGIN PGP SIGNED MESSAGE-----
349
Hash: SHA1
350
351
bazaar-ng testament short form 1
352
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
353
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
354
-----BEGIN PGP SIGNATURE-----
355
Version: GnuPG v1.4.11 (GNU/Linux)
356
357
iQEcBAEBAgAGBQJN+ekFAAoJEIdoGx7jCA5FGtEH/i+XxJRvqU6wdBtLVrGBMAGk
358
FZ5VP+KyXYtymSbgSstj/vM12NeMIeFs3xGnNnYuX1MIcY6We5TKtCH0epY6ym5+
359
6g2Q2QpQ5/sT2d0mWzR0K4uVngmxVQaXTdk5PdZ40O7ULeDLW6CxzxMHyUL1rsIx
360
7UBUTBh1O/1n3ZfD99hUkm3hVcnsN90uTKH59zV9NWwArU0cug60+5eDKJhSJDbG
361
rIwlqbFAjDZ7L/48e+IaYIJwBZFzMBpJKdCxzALLtauMf+KK8hGiL2hrRbWm7ty6
362
NgxfkMYOB4rDPdSstT35N+5uBG3n/UzjxHssi0svMfVETYYX40y57dm2eZQXFp8=
363
=iwsn
364
-----END PGP SIGNATURE-----
365
"""
366
        plain = """bazaar-ng testament short form 1
367
revision-id: doctor@example.com-20110527185938-hluafawphszb8dl1
368
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
369
"""
370
        my_gpg = gpg.GPGStrategy(FakeConfig())
371
        my_gpg.set_acceptable_keys("bazaar@example.com")
372
        self.assertEqual((gpg.SIGNATURE_NOT_VALID, None), my_gpg.verify(content,
373
                            plain))
374
6043.2.5 by Jonathan Riddell
catch a revoked key and add test for it
375
376
    def test_verify_revoked_signature(self):
377
        self.requireFeature(features.gpgme)
378
        self.import_keys()
379
            
380
        content = """-----BEGIN PGP SIGNED MESSAGE-----
381
Hash: SHA1
382
383
asdf
384
-----BEGIN PGP SIGNATURE-----
385
Version: GnuPG v1.4.11 (GNU/Linux)
386
387
iJwEAQECAAYFAk45V18ACgkQjs6dvEpb0cSIZQP/eOGTXGPlrNwvDkcX2d8O///I
388
ecB4sUIUEpv1XAk1MkNu58lsjjK72lRaLusEGqd7HwrFmpxVeVs0oWLg23PNPCFs
389
yJBID9ma+VxFVPtkEFnrc1R72sBJLfBcTxMkwVTC8eeznjdtn+cg+aLkxbPdrGnr
390
JFA6kUIJU2w9LU/b88Y=
391
=UuRX
392
-----END PGP SIGNATURE-----
393
"""
394
        plain = """asdf\n"""
395
        my_gpg = gpg.GPGStrategy(FakeConfig())
396
        my_gpg.set_acceptable_keys("test@example.com")
397
        self.assertEqual((gpg.SIGNATURE_NOT_VALID, None), my_gpg.verify(content,
398
                            plain))
399
5971.1.9 by Jonathan Riddell
add some tests
400
    def test_verify_invalid(self):
5971.1.80 by Jonathan Riddell
add missing self.requireFeature() checks to gpg tests
401
        self.requireFeature(features.gpgme)
6123.6.1 by Jonathan Riddell
ensure all tests using gpg keys run self.import_keys() first
402
        self.import_keys()
5971.1.9 by Jonathan Riddell
add some tests
403
        content = """-----BEGIN PGP SIGNED MESSAGE-----
404
Hash: SHA1
405
406
bazaar-ng testament short form 1
407
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
408
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
409
-----BEGIN PGP SIGNATURE-----
410
Version: GnuPG v1.4.11 (GNU/Linux)
411
412
iEYEARECAAYFAk33gYsACgkQpQbm1N1NUIhiDACglOuQDlnSF4NxfHSkN/zrmFy8
413
nswAoNGXAVuR9ONasAKIGBNUE0b+lols
414
=SOuC
415
-----END PGP SIGNATURE-----
416
"""
5971.1.31 by Jonathan Riddell
and update tests
417
        plain = """bazaar-ng testament short form 1
418
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
419
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
420
"""
5971.1.9 by Jonathan Riddell
add some tests
421
        my_gpg = gpg.GPGStrategy(FakeConfig())
5971.1.22 by Jonathan Riddell
fix tests
422
        self.assertEqual((gpg.SIGNATURE_NOT_VALID, None),
5971.1.31 by Jonathan Riddell
and update tests
423
                            my_gpg.verify(content, plain))
5971.1.9 by Jonathan Riddell
add some tests
424
6043.2.8 by Jonathan Riddell
add test for unknown key
425
    def test_verify_expired_but_valid(self):
426
        self.requireFeature(features.gpgme)
6123.6.1 by Jonathan Riddell
ensure all tests using gpg keys run self.import_keys() first
427
        self.import_keys()
6043.2.8 by Jonathan Riddell
add test for unknown key
428
        content = """-----BEGIN PGP SIGNED MESSAGE-----
429
Hash: SHA1
430
 
431
bazaar-ng testament short form 1
432
revision-id: test@example.com-20110801100657-f1dr1nompeex723z
433
sha1: 59ab434be4c2d5d646dee84f514aa09e1b72feeb
434
-----BEGIN PGP SIGNATURE-----
435
Version: GnuPG v1.4.10 (GNU/Linux)
436
 
437
iJwEAQECAAYFAk42esUACgkQHOJve0+NFRPc5wP7BoZkzBU8JaHMLv/LmqLr0sUz
438
zuE51ofZZ19L7KVtQWsOi4jFy0fi4A5TFwO8u9SOfoREGvkw292Uty9subSouK5/
439
mFmDOYPQ+O83zWgYZsBmMJWYDZ+X9I6XXZSbPtV/7XyTjaxtl5uRnDVJjg+AzKvD
440
dTp8VatVVrwuvzOPDVc=
441
=uHen
442
-----END PGP SIGNATURE-----
443
"""
444
        plain = """bazaar-ng testament short form 1
445
revision-id: test@example.com-20110801100657-f1dr1nompeex723z
446
sha1: 59ab434be4c2d5d646dee84f514aa09e1b72feeb
447
"""
448
        my_gpg = gpg.GPGStrategy(FakeConfig())
6043.3.2 by Jonathan Riddell
update test
449
        self.assertEqual((gpg.SIGNATURE_EXPIRED, u'4F8D1513'),
6043.2.8 by Jonathan Riddell
add test for unknown key
450
                            my_gpg.verify(content, plain))
451
452
    def test_verify_unknown_key(self):
453
        self.requireFeature(features.gpgme)
6123.6.1 by Jonathan Riddell
ensure all tests using gpg keys run self.import_keys() first
454
        self.import_keys()
6043.2.8 by Jonathan Riddell
add test for unknown key
455
        content = """-----BEGIN PGP SIGNED MESSAGE-----
456
Hash: SHA1
457
458
asdf
459
-----BEGIN PGP SIGNATURE-----
460
Version: GnuPG v1.4.11 (GNU/Linux)
461
462
iQEcBAEBAgAGBQJOORKwAAoJENf6AkFdUeVvJDYH/1Cz+AJn1Jvy5n64o+0fZ5Ow
463
Y7UQb4QQTIOV7jI7n4hv/yBzuHrtImFzYvQl/o2Ezzi8B8L5gZtQy+xCUF+Q8iWs
464
gytZ5JUtSze7hDZo1NUl4etjoRGYqRfrUcvE2LkVH2dFbDGyyQfVmoeSHa5akuuP
465
QZmyg2F983rACVIpGvsqTH6RcBdvE9vx68lugeKQA8ArDn39/74FBFipFzrXSPij
466
eKFpl+yZmIb3g6HkPIC8o4j/tMvc37xF1OG5sBu8FT0+FC+VgY7vAblneDftAbyP
467
sIODx4WcfJtjLG/qkRYqJ4gDHo0eMpTJSk2CWebajdm4b+JBrM1F9mgKuZFLruE=
468
=RNR5
469
-----END PGP SIGNATURE-----
470
"""
471
        plain = "asdf\n"
472
        my_gpg = gpg.GPGStrategy(FakeConfig())
473
        self.assertEqual((gpg.SIGNATURE_KEY_MISSING, u'5D51E56F'),
474
                            my_gpg.verify(content, plain))
475
5971.1.11 by Jonathan Riddell
add set_acceptable_keys() so user can specify which gpg keys can be used for verification
476
    def test_set_acceptable_keys(self):
5971.1.35 by Jonathan Riddell
set gpgme in tests.features
477
        self.requireFeature(features.gpgme)
478
        self.import_keys()
5971.1.11 by Jonathan Riddell
add set_acceptable_keys() so user can specify which gpg keys can be used for verification
479
        my_gpg = gpg.GPGStrategy(FakeConfig())
5971.1.14 by Jonathan Riddell
add test for set_acceptable_keys, accept non-trusted keys if specified as acceptable, import dummy key in tests so it works outside my machine
480
        my_gpg.set_acceptable_keys("bazaar@example.com")
5971.1.11 by Jonathan Riddell
add set_acceptable_keys() so user can specify which gpg keys can be used for verification
481
        self.assertEqual(my_gpg.acceptable_keys,
5971.1.14 by Jonathan Riddell
add test for set_acceptable_keys, accept non-trusted keys if specified as acceptable, import dummy key in tests so it works outside my machine
482
                         [u'B5DEED5FCB15DAE6ECEF919587681B1EE3080E45'])
5971.1.11 by Jonathan Riddell
add set_acceptable_keys() so user can specify which gpg keys can be used for verification
483
484
    def test_set_acceptable_keys_unknown(self):
5971.1.80 by Jonathan Riddell
add missing self.requireFeature() checks to gpg tests
485
        self.requireFeature(features.gpgme)
5971.1.11 by Jonathan Riddell
add set_acceptable_keys() so user can specify which gpg keys can be used for verification
486
        my_gpg = gpg.GPGStrategy(FakeConfig())
6123.1.16 by Jelmer Vernooij
Add test.
487
        self.notes = []
488
        def note(*args):
489
            self.notes.append(args[0] % args[1:])
490
        self.overrideAttr(trace, 'note', note)
5971.1.11 by Jonathan Riddell
add set_acceptable_keys() so user can specify which gpg keys can be used for verification
491
        my_gpg.set_acceptable_keys("unknown")
492
        self.assertEqual(my_gpg.acceptable_keys, [])
6123.1.16 by Jelmer Vernooij
Add test.
493
        self.assertEqual(self.notes,
494
            ['No GnuPG key results for pattern: unknown'])
5971.1.35 by Jonathan Riddell
set gpgme in tests.features
495
5971.1.11 by Jonathan Riddell
add set_acceptable_keys() so user can specify which gpg keys can be used for verification
496
1442.1.62 by Robert Collins
Allow creation of testaments from uncommitted data, and use that to get signatures before committing revisions.
497
class TestDisabled(TestCase):
498
499
    def test_sign(self):
500
        self.assertRaises(errors.SigningFailed,
501
                          gpg.DisabledGPGStrategy(None).sign, 'content')
5971.1.8 by Jonathan Riddell
start adding test cases
502
503
    def test_verify(self):
5971.1.33 by Jonathan Riddell
rename errors.VerifyFailed to errors.SignatureVerificationFailed
504
        self.assertRaises(errors.SignatureVerificationFailed,
5971.1.31 by Jonathan Riddell
and update tests
505
                          gpg.DisabledGPGStrategy(None).verify, 'content',
506
                          'testament')