~ed.so/duplicity/reuse-passphrase-for-signing-fix

« back to all changes in this revision

Viewing changes to testing/GnuPGInterfacetest.py

  • Committer: bescoto
  • Date: 2002-10-29 01:49:46 UTC
  • Revision ID: vcs-imports@canonical.com-20021029014946-3m4rmm5plom7pl6q
Initial checkin

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
"""py-unit tests for GnuPG
 
2
 
 
3
COPYRIGHT:
 
4
 
 
5
Copyright (C) 2001  Frank J. Tobin, ftobin@neverending.org
 
6
 
 
7
LICENSE:
 
8
 
 
9
This library is free software; you can redistribute it and/or
 
10
modify it under the terms of the GNU Lesser General Public
 
11
License as published by the Free Software Foundation; either
 
12
version 2.1 of the License, or (at your option) any later version.
 
13
 
 
14
This library is distributed in the hope that it will be useful,
 
15
but WITHOUT ANY WARRANTY; without even the implied warranty of
 
16
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
17
Lesser General Public License for more details.
 
18
 
 
19
You should have received a copy of the GNU Lesser General Public
 
20
License along with this library; if not, write to the Free Software
 
21
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
22
or see http://www.gnu.org/copyleft/lesser.html
 
23
"""
 
24
 
 
25
import unittest
 
26
 
 
27
import os
 
28
import tempfile
 
29
import sys
 
30
 
 
31
sys.path.insert(0, "../src")
 
32
import GnuPGInterface
 
33
 
 
34
__author__   = "Frank J. Tobin, ftobin@neverending.org"
 
35
__version__  = "0.2.2"
 
36
__revision__ = "$Id: GnuPGInterfacetest.py,v 1.1 2002/10/29 01:49:47 bescoto Exp $"
 
37
 
 
38
class BasicTest(unittest.TestCase):
 
39
    """an initializer superclass"""
 
40
 
 
41
    def __init__(self, methodName=None):
 
42
        self.gnupg = GnuPGInterface.GnuPG()
 
43
        unittest.TestCase.__init__(self, methodName)
 
44
 
 
45
 
 
46
class GnuPGTests(BasicTest):
 
47
    """Tests for GnuPG class"""
 
48
 
 
49
    def __init__(self, methodName=None):
 
50
        BasicTest.__init__(self, methodName)
 
51
 
 
52
        self.gnupg.passphrase = "Three blind mice"
 
53
        self.gnupg.options.armor = 1
 
54
        self.gnupg.options.meta_interactive = 0
 
55
        self.gnupg.options.extra_args.append('--no-secmem-warning')
 
56
    
 
57
    def do_create_fh_operation(self, args, input,
 
58
                               passphrase=None):
 
59
        creations = ['stdin', 'stdout']
 
60
 
 
61
        # Make sure we're getting the passphrase to GnuPG
 
62
        # somehow!
 
63
        assert passphrase != None or self.gnupg.passphrase != None, \
 
64
               "No way to send the passphrase to GnuPG!"
 
65
 
 
66
        # We'll handle the passphrase manually
 
67
        if passphrase != None: creations.append('passphrase')
 
68
        
 
69
        proc = self.gnupg.run( args, create_fhs=creations )
 
70
 
 
71
        if passphrase != None:
 
72
            proc.handles['passphrase'].write(passphrase)
 
73
            proc.handles['passphrase'].close()
 
74
        
 
75
        proc.handles['stdin'].write(input)
 
76
        proc.handles['stdin'].close()
 
77
        
 
78
        ciphertext = proc.handles['stdout'].read()
 
79
        proc.handles['stdout'].close()
 
80
        
 
81
        # Checking to make sure GnuPG exited successfully
 
82
        proc.wait()
 
83
 
 
84
        return ciphertext
 
85
 
 
86
    
 
87
    def do_attach_fh_operation(self, args, stdin, stdout,
 
88
                               passphrase=None):
 
89
        
 
90
        # Make sure we're getting the passphrase to GnuPG
 
91
        # somehow!
 
92
        assert passphrase != None or self.gnupg.passphrase != None, \
 
93
               "No way to send the passphrase to GnuPG!"
 
94
 
 
95
        creations = []
 
96
        # We'll handle the passphrase manually
 
97
        if passphrase != None: handles.append('passphrase')
 
98
 
 
99
        attachments = { 'stdin': stdin, 'stdout': stdout }
 
100
        
 
101
        proc = self.gnupg.run( args, create_fhs=creations,
 
102
                               attach_fhs=attachments )
 
103
        
 
104
        if passphrase != None:
 
105
            proc.handles['passphrase'].write(passphrase)
 
106
            proc.handles['passphrase'].close()
 
107
            
 
108
        # Checking to make sure GnuPG exited successfully
 
109
        proc.wait()
 
110
        
 
111
    
 
112
    def test_create_fhs_solely(self):
 
113
        """Do GnuPG operations using solely the create_fhs feature"""
 
114
        plaintext = "Three blind mice"
 
115
 
 
116
        ciphertext = self.do_create_fh_operation( ['--symmetric'],
 
117
                                                  plaintext )
 
118
        
 
119
        decryption = self.do_create_fh_operation( ['--decrypt'],
 
120
                                                  ciphertext,
 
121
                                                  self.gnupg.passphrase )
 
122
        assert decryption == plaintext, \
 
123
               "GnuPG decrypted output does not match original input"
 
124
 
 
125
 
 
126
    def test_attach_fhs(self):
 
127
        """Do GnuPG operations using the attach_fhs feature"""
 
128
        plaintext_source = '/etc/motd'
 
129
        
 
130
        plainfile = open(plaintext_source)
 
131
        temp1 = tempfile.TemporaryFile()
 
132
        temp2 = tempfile.TemporaryFile()
 
133
 
 
134
        self.do_attach_fh_operation( ['--symmetric'],
 
135
                                     stdin=plainfile, stdout=temp1 )
 
136
 
 
137
        temp1.seek(0)
 
138
        
 
139
        self.do_attach_fh_operation( ['--decrypt'],
 
140
                                     stdin=temp1, stdout=temp2 )
 
141
        
 
142
        plainfile.seek(0)
 
143
        temp2.seek(0)
 
144
 
 
145
        assert fh_cmp(plainfile, temp2), \
 
146
               "GnuPG decrypted output does not match original input"
 
147
 
 
148
 
 
149
class OptionsTests(BasicTest):
 
150
    """Tests for Options class"""
 
151
    
 
152
    def __init__(self, methodName=None):
 
153
        BasicTest.__init__(self, methodName)
 
154
        self.reset_options()
 
155
 
 
156
    def reset_options(self):
 
157
        self.gnupg.options = GnuPGInterface.Options()
 
158
 
 
159
    def option_to_arg(self, option):
 
160
        return '--' + option.replace('_', '-')
 
161
        
 
162
    def test_boolean_args(self):
 
163
        """test Options boolean options that they generate
 
164
        proper arguments"""
 
165
        
 
166
        booleans = [ 'armor',      'no_greeting',  'no_verbose',
 
167
                     'batch',      'always_trust', 'rfc1991',
 
168
                     'quiet',      'openpgp',      'force_v3_sigs',
 
169
                     'no_options', 'textmode' ]
 
170
        
 
171
        for option in booleans:
 
172
            self.reset_options()
 
173
            setattr(self.gnupg.options, option, 1)
 
174
            arg = self.option_to_arg(option)
 
175
            
 
176
            should_be = [arg]
 
177
            result    = self.gnupg.options.get_args()
 
178
            
 
179
            assert should_be == result, \
 
180
                   "failure to set option '%s'; should be %s, but result is %s" \
 
181
                   % (option, should_be, result)
 
182
    
 
183
    def test_string_args(self):
 
184
        """test Options string-taking options that they generate
 
185
        proper arguments"""
 
186
 
 
187
        strings = [ 'homedir', 'default_key', 'comment', 'compress_algo',
 
188
                    'options' ]
 
189
 
 
190
        string_value = 'test-argument'
 
191
        
 
192
        for option in strings:
 
193
            self.reset_options()
 
194
            setattr(self.gnupg.options, option, string_value)
 
195
            arg = self.option_to_arg(option)
 
196
            
 
197
            should_be = [arg, string_value]
 
198
            result    = self.gnupg.options.get_args()
 
199
            
 
200
            assert should_be == result, \
 
201
                   "failure to set option '%s'; should be %s, but result is %s" \
 
202
                   % (option, should_be, result)
 
203
 
 
204
    def test_list_args(self):
 
205
        """test Options string-taking options that they generate
 
206
        proper arguments"""
 
207
 
 
208
        lists = [ 'recipients', 'encrypt_to' ]
 
209
        list_value = ['test1', 'test2']
 
210
 
 
211
        for option in lists:
 
212
            self.reset_options()
 
213
            setattr(self.gnupg.options, option, list_value)
 
214
 
 
215
            # special case for recipients, since their
 
216
            # respective argument is 'recipient', not 'recipients'
 
217
            if option == 'recipients': arg = '--recipient'
 
218
            else: arg = self.option_to_arg(option)
 
219
            
 
220
            should_be = []
 
221
            for v in list_value: should_be.extend([arg, v])
 
222
            
 
223
            result = self.gnupg.options.get_args()
 
224
            
 
225
            assert should_be == result, \
 
226
                   "failure to set option '%s'; should be %s, but result is %s" \
 
227
                   % (option, should_be, result)
 
228
 
 
229
 
 
230
class PipesTests(unittest.TestCase):
 
231
    """Tests for Pipes class"""
 
232
 
 
233
    def test_constructor(self):
 
234
        self.pipe = GnuPGInterface.Pipe(1, 2, 0)
 
235
        assert self.pipe.parent == 1
 
236
        assert self.pipe.child  == 2
 
237
        assert not self.pipe.direct
 
238
    
 
239
########################################################################
 
240
 
 
241
def fh_cmp(f1, f2, bufsize=8192):
 
242
    while 1:
 
243
        b1 = f1.read(bufsize)
 
244
        b2 = f2.read(bufsize)
 
245
        if b1 != b2: return 0
 
246
        if not b1:   return 1
 
247
 
 
248
########################################################################
 
249
 
 
250
if __name__ == "__main__":
 
251
    unittest.main()