~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/selftest/blackbox.py

  • Committer: Martin Pool
  • Date: 2005-06-24 11:04:55 UTC
  • Revision ID: mbp@sourcefrog.net-20050624110455-b0e54cd5f96691e5
- better quotefn for windows: use doublequotes for strings with 
  strange characters, not backslashes
- new backup_file() routine

Show diffs side-by-side

added added

removed removed

Lines of Context:
31
31
from unittest import TestCase
32
32
from bzrlib.selftest import TestBase, InTempDir
33
33
 
34
 
 
35
 
 
36
 
class ExternalBase(InTempDir):
37
 
    def runbzr(self, args, retcode=0):
38
 
        try:
39
 
            import shutil
40
 
            from subprocess import call
41
 
        except ImportError, e:
42
 
            _need_subprocess()
43
 
            raise
44
 
 
45
 
        if isinstance(args, basestring):
46
 
            args = args.split()
47
 
            
48
 
        return self.runcmd(['python', self.BZRPATH,] + args,
49
 
                           retcode=retcode)
50
 
 
51
 
 
52
 
 
53
 
class TestVersion(ExternalBase):
 
34
class TestVersion(TestBase):
54
35
    def runTest(self):
55
36
        # output is intentionally passed through to stdout so that we
56
37
        # can see the version being tested
57
 
        self.runbzr(['version'])
58
 
 
59
 
 
60
 
 
61
 
class HelpCommands(ExternalBase):
 
38
        self.runcmd(['bzr', 'version'])
 
39
 
 
40
 
 
41
 
 
42
class HelpCommands(TestBase):
62
43
    def runTest(self):
63
 
        self.runbzr('--help')
64
 
        self.runbzr('help')
65
 
        self.runbzr('help commands')
66
 
        self.runbzr('help help')
67
 
        self.runbzr('commit -h')
68
 
 
69
 
 
70
 
class InitBranch(ExternalBase):
 
44
        self.runcmd('bzr --help')
 
45
        self.runcmd('bzr help')
 
46
        self.runcmd('bzr help commands')
 
47
        self.runcmd('bzr help help')
 
48
        self.runcmd('bzr commit -h')
 
49
 
 
50
 
 
51
class InitBranch(InTempDir):
71
52
    def runTest(self):
72
53
        import os
73
 
        self.runbzr(['init'])
74
 
 
75
 
 
76
 
 
77
 
class UserIdentity(ExternalBase):
 
54
        self.runcmd(['bzr', 'init'])
 
55
 
 
56
 
 
57
 
 
58
class UserIdentity(InTempDir):
78
59
    def runTest(self):
79
60
        # this should always identify something, if only "john@localhost"
80
 
        self.runbzr("whoami")
81
 
        self.runbzr("whoami --email")
 
61
        self.runcmd("bzr whoami")
 
62
        self.runcmd("bzr whoami --email")
82
63
        self.assertEquals(self.backtick("bzr whoami --email").count('@'),
83
64
                          1)
84
65
 
85
66
 
86
 
class InvalidCommands(ExternalBase):
87
 
    def runTest(self):
88
 
        self.runbzr("pants", retcode=1)
89
 
        self.runbzr("--pants off", retcode=1)
90
 
        self.runbzr("diff --message foo", retcode=1)
91
 
 
92
 
 
93
 
 
94
 
class EmptyCommit(ExternalBase):
95
 
    def runTest(self):
96
 
        self.runbzr("init")
97
 
        self.build_tree(['hello.txt'])
98
 
        self.runbzr("commit -m empty", retcode=1)
99
 
        self.runbzr("add hello.txt")
100
 
        self.runbzr("commit -m added")
101
 
 
102
 
 
103
 
 
104
 
class IgnorePatterns(ExternalBase):
105
 
    def runTest(self):
106
 
        from bzrlib.branch import Branch
107
 
        
108
 
        b = Branch('.', init=True)
109
 
        self.assertEquals(list(b.unknowns()), [])
110
 
 
111
 
        file('foo.tmp', 'wt').write('tmp files are ignored')
112
 
        self.assertEquals(list(b.unknowns()), [])
113
 
        assert self.backtick('bzr unknowns') == ''
114
 
 
115
 
        file('foo.c', 'wt').write('int main() {}')
116
 
        self.assertEquals(list(b.unknowns()), ['foo.c'])
117
 
        assert self.backtick('bzr unknowns') == 'foo.c\n'
118
 
 
119
 
        self.runbzr(['add', 'foo.c'])
120
 
        assert self.backtick('bzr unknowns') == ''
121
 
 
122
 
        # 'ignore' works when creating the .bzignore file
123
 
        file('foo.blah', 'wt').write('blah')
124
 
        self.assertEquals(list(b.unknowns()), ['foo.blah'])
125
 
        self.runbzr('ignore *.blah')
126
 
        self.assertEquals(list(b.unknowns()), [])
127
 
        assert file('.bzrignore', 'rb').read() == '*.blah\n'
128
 
 
129
 
        # 'ignore' works when then .bzrignore file already exists
130
 
        file('garh', 'wt').write('garh')
131
 
        self.assertEquals(list(b.unknowns()), ['garh'])
132
 
        assert self.backtick('bzr unknowns') == 'garh\n'
133
 
        self.runbzr('ignore garh')
134
 
        self.assertEquals(list(b.unknowns()), [])
135
 
        assert file('.bzrignore', 'rb').read() == '*.blah\ngarh\n'
136
 
        
137
 
 
138
 
 
139
 
 
140
 
class OldTests(ExternalBase):
 
67
class InvalidCommands(InTempDir):
 
68
    def runTest(self):
 
69
        self.runcmd("bzr pants", retcode=1)
 
70
        self.runcmd("bzr --pants off", retcode=1)
 
71
        self.runcmd("bzr diff --message foo", retcode=1)
 
72
 
 
73
 
 
74
 
 
75
class OldTests(InTempDir):
141
76
    # old tests moved from ./testbzr
142
77
    def runTest(self):
143
78
        from os import chdir, mkdir
144
79
        from os.path import exists
145
80
        import os
146
81
 
147
 
        runbzr = self.runbzr
 
82
        runcmd = self.runcmd
148
83
        backtick = self.backtick
149
84
        progress = self.log
150
85
 
151
86
        progress("basic branch creation")
152
 
        mkdir('branch1')
 
87
        runcmd(['mkdir', 'branch1'])
153
88
        chdir('branch1')
154
 
        runbzr('init')
 
89
        runcmd('bzr init')
155
90
 
156
91
        self.assertEquals(backtick('bzr root').rstrip(),
157
92
                          os.path.join(self.test_dir, 'branch1'))
163
98
        f.close()
164
99
 
165
100
        out = backtick("bzr unknowns")
166
 
        self.assertEquals(out, 'test.txt\n')
 
101
        assert out == 'test.txt\n'
167
102
 
168
103
        out = backtick("bzr status")
169
104
        assert out == 'unknown:\n  test.txt\n'
198
133
                       "  test.txt\n")
199
134
 
200
135
        progress("command help")
201
 
        runbzr("help st")
202
 
        runbzr("help")
203
 
        runbzr("help commands")
204
 
        runbzr("help slartibartfast", 1)
 
136
        runcmd("bzr help st")
 
137
        runcmd("bzr help")
 
138
        runcmd("bzr help commands")
 
139
        runcmd("bzr help slartibartfast", 1)
205
140
 
206
141
        out = backtick("bzr help ci")
207
142
        out.index('aliases: ')
208
143
 
209
144
        progress("can't rename unversioned file")
210
 
        runbzr("rename test.txt new-test.txt", 1)
 
145
        runcmd("bzr rename test.txt new-test.txt", 1)
211
146
 
212
147
        progress("adding a file")
213
148
 
214
 
        runbzr("add test.txt")
 
149
        runcmd("bzr add test.txt")
215
150
        assert backtick("bzr unknowns") == ''
216
151
        assert backtick("bzr status --all") == ("added:\n"
217
152
                                                "  test.txt\n")
218
153
 
219
154
        progress("rename newly-added file")
220
 
        runbzr("rename test.txt hello.txt")
 
155
        runcmd("bzr rename test.txt hello.txt")
221
156
        assert os.path.exists("hello.txt")
222
157
        assert not os.path.exists("test.txt")
223
158
 
224
159
        assert backtick("bzr revno") == '0\n'
225
160
 
226
161
        progress("add first revision")
227
 
        runbzr(['commit', '-m', 'add first revision'])
 
162
        runcmd(["bzr", "commit", "-m", 'add first revision'])
228
163
 
229
164
        progress("more complex renames")
230
165
        os.mkdir("sub1")
231
 
        runbzr("rename hello.txt sub1", 1)
232
 
        runbzr("rename hello.txt sub1/hello.txt", 1)
233
 
        runbzr("move hello.txt sub1", 1)
 
166
        runcmd("bzr rename hello.txt sub1", 1)
 
167
        runcmd("bzr rename hello.txt sub1/hello.txt", 1)
 
168
        runcmd("bzr move hello.txt sub1", 1)
234
169
 
235
 
        runbzr("add sub1")
236
 
        runbzr("rename sub1 sub2")
237
 
        runbzr("move hello.txt sub2")
 
170
        runcmd("bzr add sub1")
 
171
        runcmd("bzr rename sub1 sub2")
 
172
        runcmd("bzr move hello.txt sub2")
238
173
        assert backtick("bzr relpath sub2/hello.txt") == os.path.join("sub2", "hello.txt\n")
239
174
 
240
175
        assert exists("sub2")
242
177
        assert not exists("sub1")
243
178
        assert not exists("hello.txt")
244
179
 
245
 
        runbzr(['commit', '-m', 'commit with some things moved to subdirs'])
 
180
        runcmd(['bzr', 'commit', '-m', 'commit with some things moved to subdirs'])
246
181
 
247
182
        mkdir("sub1")
248
 
        runbzr('add sub1')
249
 
        runbzr('move sub2/hello.txt sub1')
 
183
        runcmd('bzr add sub1')
 
184
        runcmd('bzr move sub2/hello.txt sub1')
250
185
        assert not exists('sub2/hello.txt')
251
186
        assert exists('sub1/hello.txt')
252
 
        runbzr('move sub2 sub1')
 
187
        runcmd('bzr move sub2 sub1')
253
188
        assert not exists('sub2')
254
189
        assert exists('sub1/sub2')
255
190
 
256
 
        runbzr(['commit', '-m', 'rename nested subdirectories'])
 
191
        runcmd(['bzr', 'commit', '-m', 'rename nested subdirectories'])
257
192
 
258
193
        chdir('sub1/sub2')
259
194
        self.assertEquals(backtick('bzr root')[:-1],
260
195
                          os.path.join(self.test_dir, 'branch1'))
261
 
        runbzr('move ../hello.txt .')
 
196
        runcmd('bzr move ../hello.txt .')
262
197
        assert exists('./hello.txt')
263
198
        assert backtick('bzr relpath hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
264
199
        assert backtick('bzr relpath ../../sub1/sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
265
 
        runbzr(['commit', '-m', 'move to parent directory'])
 
200
        runcmd(['bzr', 'commit', '-m', 'move to parent directory'])
266
201
        chdir('..')
267
202
        assert backtick('bzr relpath sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
268
203
 
269
 
        runbzr('move sub2/hello.txt .')
 
204
        runcmd('bzr move sub2/hello.txt .')
270
205
        assert exists('hello.txt')
271
206
 
272
207
        f = file('hello.txt', 'wt')
277
212
        f.write('this is my new commit\n')
278
213
        f.close()
279
214
 
280
 
        runbzr('commit -F msg.tmp')
 
215
        runcmd('bzr commit -F msg.tmp')
281
216
 
282
217
        assert backtick('bzr revno') == '5\n'
283
 
        runbzr('export -r 5 export-5.tmp')
284
 
        runbzr('export export.tmp')
285
 
 
286
 
        runbzr('log')
287
 
        runbzr('log -v')
288
 
        runbzr('log -v --forward')
289
 
        runbzr('log -m', retcode=1)
290
 
        log_out = backtick('bzr log -m commit')
291
 
        assert "this is my new commit" in log_out
292
 
        assert "rename nested" not in log_out
293
 
        assert 'revision-id' not in log_out
294
 
        assert 'revision-id' in backtick('bzr log --show-ids -m commit')
 
218
        runcmd('bzr export -r 5 export-5.tmp')
 
219
        runcmd('bzr export export.tmp')
 
220
 
 
221
        runcmd('bzr log')
 
222
        runcmd('bzr log -v')
 
223
 
295
224
 
296
225
 
297
226
        progress("file with spaces in name")
298
227
        mkdir('sub directory')
299
228
        file('sub directory/file with spaces ', 'wt').write('see how this works\n')
300
 
        runbzr('add .')
301
 
        runbzr('diff')
302
 
        runbzr('commit -m add-spaces')
303
 
        runbzr('check')
304
 
 
305
 
        runbzr('log')
306
 
        runbzr('log --forward')
307
 
 
308
 
        runbzr('info')
 
229
        runcmd('bzr add .')
 
230
        runcmd('bzr diff')
 
231
        runcmd('bzr commit -m add-spaces')
 
232
        runcmd('bzr check')
 
233
 
 
234
        runcmd('bzr log')
 
235
        runcmd('bzr log --forward')
 
236
 
 
237
        runcmd('bzr info')
309
238
 
310
239
 
311
240
 
315
244
        chdir('..')
316
245
        chdir('..')
317
246
        progress('branch')
318
 
        assert os.path.exists('branch1')
319
 
        assert not os.path.exists('branch2')
320
247
        # Can't create a branch if it already exists
321
 
        runbzr('branch branch1', retcode=1)
 
248
        runcmd('bzr branch branch1', retcode=1)
322
249
        # Can't create a branch if its parent doesn't exist
323
 
        runbzr('branch /unlikely/to/exist', retcode=1)
324
 
        runbzr('branch branch1 branch2')
325
 
        assert exists('branch2')
326
 
        assert exists('branch2/sub1')
327
 
        assert exists('branch2/sub1/hello.txt')
328
 
        
329
 
        runbzr('branch --revision 0 branch1 branch3')
330
 
        assert not exists('branch3/sub1/hello.txt')
331
 
        runbzr('branch --revision 0..3 branch1 branch4', retcode=1)
 
250
        runcmd('bzr branch /unlikely/to/exist', retcode=1)
 
251
        runcmd('bzr branch branch1 branch2')
332
252
 
333
253
        progress("pull")
334
254
        chdir('branch1')
335
 
        runbzr('pull', retcode=1)
336
 
        runbzr('pull ../branch2')
 
255
        runcmd('bzr pull', retcode=1)
 
256
        runcmd('bzr pull ../branch2')
337
257
        chdir('.bzr')
338
 
        runbzr('pull')
339
 
        runbzr('commit --unchanged -m empty')
340
 
        runbzr('pull')
 
258
        runcmd('bzr pull')
 
259
        runcmd('bzr commit -m empty')
 
260
        runcmd('bzr pull')
341
261
        chdir('../../branch2')
342
 
        runbzr('pull')
343
 
        runbzr('commit --unchanged -m empty')
 
262
        runcmd('bzr pull')
 
263
        runcmd('bzr commit -m empty')
344
264
        chdir('../branch1')
345
 
        runbzr('commit --unchanged -m empty')
346
 
        runbzr('pull', retcode=1)
 
265
        runcmd('bzr commit -m empty')
 
266
        runcmd('bzr pull', retcode=1)
347
267
        chdir ('..')
348
268
 
349
269
        progress('status after remove')
359
279
        #     at /vrac/python/bazaar-ng/bzrlib/diff.py:286 in compare_trees()
360
280
        #     see ~/.bzr.log for debug information
361
281
        chdir('status-after-remove')
362
 
        runbzr('init')
 
282
        runcmd('bzr init')
363
283
        file('a', 'w').write('foo')
364
 
        runbzr('add a')
365
 
        runbzr(['commit', '-m', 'add a'])
366
 
        runbzr('remove a')
367
 
        runbzr('status')
368
 
 
369
 
        chdir('..')
 
284
        runcmd('bzr add a')
 
285
        runcmd(['bzr', 'commit', '-m', 'add a'])
 
286
        runcmd('bzr remove a')
 
287
        runcmd('bzr status')
 
288
 
 
289
        chdir('..')
 
290
 
 
291
        progress('ignore patterns')
 
292
        mkdir('ignorebranch')
 
293
        chdir('ignorebranch')
 
294
        runcmd('bzr init')
 
295
        assert backtick('bzr unknowns') == ''
 
296
 
 
297
        file('foo.tmp', 'wt').write('tmp files are ignored')
 
298
        assert backtick('bzr unknowns') == ''
 
299
 
 
300
        file('foo.c', 'wt').write('int main() {}')
 
301
        assert backtick('bzr unknowns') == 'foo.c\n'
 
302
        runcmd('bzr add foo.c')
 
303
        assert backtick('bzr unknowns') == ''
 
304
 
 
305
        # 'ignore' works when creating the .bzignore file
 
306
        file('foo.blah', 'wt').write('blah')
 
307
        assert backtick('bzr unknowns') == 'foo.blah\n'
 
308
        runcmd('bzr ignore *.blah')
 
309
        assert backtick('bzr unknowns') == ''
 
310
        assert file('.bzrignore', 'rb').read() == '*.blah\n'
 
311
 
 
312
        # 'ignore' works when then .bzrignore file already exists
 
313
        file('garh', 'wt').write('garh')
 
314
        assert backtick('bzr unknowns') == 'garh\n'
 
315
        runcmd('bzr ignore garh')
 
316
        assert backtick('bzr unknowns') == ''
 
317
        assert file('.bzrignore', 'rb').read() == '*.blah\ngarh\n'
 
318
 
 
319
        chdir('..')
 
320
 
370
321
 
371
322
 
372
323
 
373
324
        progress("recursive and non-recursive add")
374
325
        mkdir('no-recurse')
375
326
        chdir('no-recurse')
376
 
        runbzr('init')
 
327
        runcmd('bzr init')
377
328
        mkdir('foo')
378
329
        fp = os.path.join('foo', 'test.txt')
379
330
        f = file(fp, 'w')
380
331
        f.write('hello!\n')
381
332
        f.close()
382
 
        runbzr('add --no-recurse foo')
383
 
        runbzr('file-id foo')
384
 
        runbzr('file-id ' + fp, 1)      # not versioned yet
385
 
        runbzr('commit -m add-dir-only')
386
 
 
387
 
        self.runbzr('file-id ' + fp, 1)      # still not versioned 
388
 
 
389
 
        self.runbzr('add foo')
390
 
        self.runbzr('file-id ' + fp)
391
 
        self.runbzr('commit -m add-sub-file')
 
333
        runcmd('bzr add --no-recurse foo')
 
334
        runcmd('bzr file-id foo')
 
335
        runcmd('bzr file-id ' + fp, 1)      # not versioned yet
 
336
        runcmd('bzr commit -m add-dir-only')
 
337
 
 
338
        runcmd('bzr file-id ' + fp, 1)      # still not versioned 
 
339
 
 
340
        runcmd('bzr add foo')
 
341
        runcmd('bzr file-id ' + fp)
 
342
        runcmd('bzr commit -m add-sub-file')
392
343
 
393
344
        chdir('..')
394
345
 
395
346
 
396
347
 
397
 
class RevertCommand(ExternalBase):
398
 
    def runTest(self):
399
 
        self.runbzr('init')
400
 
 
401
 
        file('hello', 'wt').write('foo')
402
 
        self.runbzr('add hello')
403
 
        self.runbzr('commit -m setup hello')
 
348
    
404
349
        
405
 
        file('hello', 'wt').write('bar')
406
 
        self.runbzr('revert hello')
407
 
        self.check_file_contents('hello', 'foo')
408
 
 
 
350
 
 
351
 
 
352
# lists all tests from this module in the best order to run them.  we
 
353
# do it this way rather than just discovering them all because it
 
354
# allows us to test more basic functions first where failures will be
 
355
# easiest to understand.
 
356
 
 
357
def suite():
 
358
    from unittest import TestSuite
 
359
    s = TestSuite()
 
360
    s.addTests([TestVersion(),
 
361
                InitBranch(),
 
362
                HelpCommands(),
 
363
                UserIdentity(),
 
364
                InvalidCommands(),
 
365
                OldTests()])
 
366
    return s