15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22
from bzrlib.tests import script
25
from breezy.tests import script
25
28
class TestSyntax(tests.TestCase):
27
30
def test_comment_is_ignored(self):
28
self.assertEquals([], script._script_to_commands('#comment\n'))
30
def test_empty_line_is_ignored(self):
31
self.assertEquals([], script._script_to_commands('\n'))
31
self.assertEqual([], script._script_to_commands('#comment\n'))
33
def test_comment_multiple_lines(self):
35
(['bar'], None, None, None),
37
script._script_to_commands("""
38
# this comment is ignored
44
def test_trim_blank_lines(self):
45
"""Blank lines are respected, but trimmed at the start and end.
47
Python triple-quoted syntax is going to give stubby/empty blank lines
48
right at the start and the end. These are cut off so that callers don't
49
need special syntax to avoid them.
51
However we do want to be able to match commands that emit blank lines.
54
(['bar'], None, '\n', None),
56
script._script_to_commands("""
33
61
def test_simple_command(self):
34
self.assertEquals([(['cd', 'trunk'], None, None, None)],
35
script._script_to_commands('$ cd trunk'))
62
self.assertEqual([(['cd', 'trunk'], None, None, None)],
63
script._script_to_commands('$ cd trunk'))
37
65
def test_command_with_single_quoted_param(self):
38
story = """$ bzr commit -m 'two words'"""
39
self.assertEquals([(['bzr', 'commit', '-m', "'two words'"],
41
script._script_to_commands(story))
66
story = """$ brz commit -m 'two words'"""
67
self.assertEqual([(['brz', 'commit', '-m', "'two words'"],
69
script._script_to_commands(story))
43
71
def test_command_with_double_quoted_param(self):
44
story = """$ bzr commit -m "two words" """
45
self.assertEquals([(['bzr', 'commit', '-m', '"two words"'],
47
script._script_to_commands(story))
72
story = """$ brz commit -m "two words" """
73
self.assertEqual([(['brz', 'commit', '-m', '"two words"'],
75
script._script_to_commands(story))
49
77
def test_command_with_input(self):
51
79
[(['cat', '>file'], 'content\n', None, None)],
52
80
script._script_to_commands('$ cat >file\n<content\n'))
82
def test_indented(self):
83
# scripts are commonly given indented within the test source code, and
84
# common indentation is stripped off
90
self.assertEqual([(['brz', 'add'], None,
91
'adding file\nadding file2\n', None)],
92
script._script_to_commands(story))
54
94
def test_command_with_output(self):
60
self.assertEquals([(['bzr', 'add'], None,
61
'adding file\nadding file2\n', None)],
62
script._script_to_commands(story))
100
self.assertEqual([(['brz', 'add'], None,
101
'adding file\nadding file2\n', None)],
102
script._script_to_commands(story))
64
104
def test_command_with_error(self):
67
2>bzr: ERROR: Not a branch: "foo"
107
2>brz: ERROR: Not a branch: "foo"
69
self.assertEquals([(['bzr', 'branch', 'foo'],
70
None, None, 'bzr: ERROR: Not a branch: "foo"\n')],
71
script._script_to_commands(story))
109
self.assertEqual([(['brz', 'branch', 'foo'],
110
None, None, 'brz: ERROR: Not a branch: "foo"\n')],
111
script._script_to_commands(story))
73
113
def test_input_without_command(self):
74
114
self.assertRaises(SyntaxError, script._script_to_commands, '<input')
103
143
self._check('foo', None, None, ['bar', 'baz'], ['bar', '<foo', 'baz'])
105
145
def test_output_redirection(self):
106
self._check(None, 'foo', 'wb+', [], ['>foo'])
107
self._check(None, 'foo', 'wb+', ['bar'], ['bar', '>foo'])
108
self._check(None, 'foo', 'wb+', ['bar'], ['bar', '>', 'foo'])
109
self._check(None, 'foo', 'ab+', [], ['>>foo'])
110
self._check(None, 'foo', 'ab+', ['bar'], ['bar', '>>foo'])
111
self._check(None, 'foo', 'ab+', ['bar'], ['bar', '>>', 'foo'])
146
self._check(None, 'foo', 'w+', [], ['>foo'])
147
self._check(None, 'foo', 'w+', ['bar'], ['bar', '>foo'])
148
self._check(None, 'foo', 'w+', ['bar'], ['bar', '>', 'foo'])
149
self._check(None, 'foo', 'a+', [], ['>>foo'])
150
self._check(None, 'foo', 'a+', ['bar'], ['bar', '>>foo'])
151
self._check(None, 'foo', 'a+', ['bar'], ['bar', '>>', 'foo'])
113
153
def test_redirection_syntax_errors(self):
114
154
self._check('', None, None, [], ['<'])
115
self._check(None, '', 'wb+', [], ['>'])
116
self._check(None, '', 'ab+', [], ['>>'])
117
self._check('>', '', 'ab+', [], ['<', '>', '>>'])
155
self._check(None, '', 'w+', [], ['>'])
156
self._check(None, '', 'a+', [], ['>>'])
157
self._check('>', '', 'a+', [], ['<', '>', '>>'])
121
160
class TestExecution(script.TestCaseWithTransportAndScript):
123
162
def test_unknown_command(self):
124
self.assertRaises(SyntaxError, self.run_script, 'foo')
163
"""A clear error is reported for commands that aren't recognised
165
Testing the attributes of the SyntaxError instance is equivalent to
166
using traceback.format_exception_only and comparing with:
167
File "<string>", line 1
170
SyntaxError: Command not found "foo"
172
e = self.assertRaises(SyntaxError, self.run_script, "$ foo --frob")
173
self.assertContainsRe(e.msg, "not found.*foo")
174
self.assertEqual(e.text, "foo --frob")
176
def test_blank_output_mismatches_output(self):
177
"""If you give output, the output must actually be blank.
179
See <https://bugs.launchpad.net/bzr/+bug/637830>: previously blank
180
output was a wildcard. Now you must say ... if you want that.
182
self.assertRaises(AssertionError,
188
def test_null_output_matches_option(self):
189
"""If you want null output to be a wild card, you can pass
190
null_output_matches_anything to run_script"""
194
""", null_output_matches_anything=True)
196
def test_ellipsis_everything(self):
197
"""A simple ellipsis matches everything."""
203
def test_ellipsis_matches_empty(self):
126
209
def test_stops_on_unexpected_output(self):
215
309
def test_cat_input_to_output(self):
216
310
retcode, out, err = self.run_command(['cat'],
217
311
'content\n', 'content\n', None)
218
self.assertEquals('content\n', out)
219
self.assertEquals(None, err)
312
self.assertEqual('content\n', out)
313
self.assertEqual(None, err)
221
315
def test_cat_file_to_output(self):
222
self.build_tree_contents([('file', 'content\n')])
316
self.build_tree_contents([('file', b'content\n')])
223
317
retcode, out, err = self.run_command(['cat', 'file'],
224
318
None, 'content\n', None)
225
self.assertEquals('content\n', out)
226
self.assertEquals(None, err)
319
self.assertEqual('content\n', out)
320
self.assertEqual(None, err)
228
322
def test_cat_input_to_file(self):
229
323
retcode, out, err = self.run_command(['cat', '>file'],
230
324
'content\n', None, None)
231
325
self.assertFileEqual('content\n', 'file')
232
self.assertEquals(None, out)
233
self.assertEquals(None, err)
326
self.assertEqual(None, out)
327
self.assertEqual(None, err)
234
328
retcode, out, err = self.run_command(['cat', '>>file'],
235
329
'more\n', None, None)
236
330
self.assertFileEqual('content\nmore\n', 'file')
237
self.assertEquals(None, out)
238
self.assertEquals(None, err)
331
self.assertEqual(None, out)
332
self.assertEqual(None, err)
240
334
def test_cat_file_to_file(self):
241
self.build_tree_contents([('file', 'content\n')])
335
self.build_tree_contents([('file', b'content\n')])
242
336
retcode, out, err = self.run_command(['cat', 'file', '>file2'],
243
337
None, None, None)
244
self.assertFileEqual('content\n', 'file2')
338
self.assertFileEqual(b'content\n', 'file2')
246
340
def test_cat_files_to_file(self):
247
self.build_tree_contents([('cat', 'cat\n')])
248
self.build_tree_contents([('dog', 'dog\n')])
341
self.build_tree_contents([('cat', b'cat\n')])
342
self.build_tree_contents([('dog', b'dog\n')])
249
343
retcode, out, err = self.run_command(['cat', 'cat', 'dog', '>file'],
250
344
None, None, None)
251
self.assertFileEqual('cat\ndog\n', 'file')
345
self.assertFileEqual(b'cat\ndog\n', 'file')
253
347
def test_cat_bogus_input_file(self):
254
348
self.run_script("""
302
397
self.assertRaises(ValueError, self.run_script, '$ cd ..')
304
399
def test_cd_dir_and_back_home(self):
305
self.assertEquals(self.test_dir, osutils.getcwd())
400
self.assertEqual(self.test_dir, osutils.getcwd())
306
401
self.run_script("""
310
self.assertEquals(osutils.pathjoin(self.test_dir, 'dir'),
405
self.assertEqual(osutils.pathjoin(self.test_dir, 'dir'),
313
408
self.run_script('$ cd')
314
self.assertEquals(self.test_dir, osutils.getcwd())
317
class TestBzr(script.TestCaseWithTransportAndScript):
319
def test_bzr_smoke(self):
320
self.run_script('$ bzr init branch')
321
self.failUnlessExists('branch')
409
self.assertEqual(self.test_dir, osutils.getcwd())
412
class TestBrz(script.TestCaseWithTransportAndScript):
414
def test_brz_smoke(self):
417
Created a standalone tree (format: ...)
419
self.assertPathExists('branch')
324
422
class TestEcho(script.TestCaseWithMemoryTransportAndScript):
338
436
def test_echo_to_output(self):
339
437
retcode, out, err = self.run_command(['echo'], None, '\n', None)
340
self.assertEquals('\n', out)
341
self.assertEquals(None, err)
438
self.assertEqual('\n', out)
439
self.assertEqual(None, err)
343
441
def test_echo_some_to_output(self):
344
442
retcode, out, err = self.run_command(['echo', 'hello'],
345
443
None, 'hello\n', None)
346
self.assertEquals('hello\n', out)
347
self.assertEquals(None, err)
444
self.assertEqual('hello\n', out)
445
self.assertEqual(None, err)
349
447
def test_echo_more_output(self):
350
448
retcode, out, err = self.run_command(
351
449
['echo', 'hello', 'happy', 'world'],
352
450
None, 'hello happy world\n', None)
353
self.assertEquals('hello happy world\n', out)
354
self.assertEquals(None, err)
451
self.assertEqual('hello happy world\n', out)
452
self.assertEqual(None, err)
356
454
def test_echo_appended(self):
357
455
retcode, out, err = self.run_command(['echo', 'hello', '>file'],
358
456
None, None, None)
359
self.assertEquals(None, out)
360
self.assertEquals(None, err)
361
self.assertFileEqual('hello\n', 'file')
457
self.assertEqual(None, out)
458
self.assertEqual(None, err)
459
self.assertFileEqual(b'hello\n', 'file')
362
460
retcode, out, err = self.run_command(['echo', 'happy', '>>file'],
363
461
None, None, None)
364
self.assertEquals(None, out)
365
self.assertEquals(None, err)
366
self.assertFileEqual('hello\nhappy\n', 'file')
462
self.assertEqual(None, out)
463
self.assertEqual(None, err)
464
self.assertFileEqual(b'hello\nhappy\n', 'file')
466
def test_empty_line_in_output_is_respected(self):
369
475
class TestRm(script.TestCaseWithTransportAndScript):
375
481
def test_rm_file(self):
376
482
self.run_script('$ echo content >file')
377
self.failUnlessExists('file')
483
self.assertPathExists('file')
378
484
self.run_script('$ rm file')
379
self.failIfExists('file')
485
self.assertPathDoesNotExist('file')
381
487
def test_rm_file_force(self):
382
self.failIfExists('file')
488
self.assertPathDoesNotExist('file')
383
489
self.run_script('$ rm -f file')
384
self.failIfExists('file')
490
self.assertPathDoesNotExist('file')
386
492
def test_rm_files(self):
387
493
self.run_script("""
388
494
$ echo content >file
389
495
$ echo content >file2
391
self.failUnlessExists('file2')
497
self.assertPathExists('file2')
392
498
self.run_script('$ rm file file2')
393
self.failIfExists('file2')
499
self.assertPathDoesNotExist('file2')
395
501
def test_rm_dir(self):
396
502
self.run_script('$ mkdir dir')
397
self.failUnlessExists('dir')
503
self.assertPathExists('dir')
398
504
self.run_script("""
400
506
2>rm: cannot remove 'dir': Is a directory
402
self.failUnlessExists('dir')
508
self.assertPathExists('dir')
404
510
def test_rm_dir_recursive(self):
405
511
self.run_script("""
409
self.failIfExists('dir')
515
self.assertPathDoesNotExist('dir')
412
518
class TestMv(script.TestCaseWithTransportAndScript):
443
549
$ echo content > file
445
551
self.run_script('$ mv file dir')
446
self.failUnlessExists('dir')
447
self.failIfExists('file')
448
self.failUnlessExists('dir/file')
552
self.assertPathExists('dir')
553
self.assertPathDoesNotExist('file')
554
self.assertPathExists('dir/file')
557
class cmd_test_confirm(commands.Command):
560
if ui.ui_factory.get_boolean(
562
# 'breezy.tests.test_script.confirm',
565
self.outf.write('Do it!\n')
570
class TestUserInteraction(script.TestCaseWithMemoryTransportAndScript):
572
def test_confirm_action(self):
573
"""You can write tests that demonstrate user confirmation.
575
Specifically, ScriptRunner does't care if the output line for the
576
prompt isn't terminated by a newline from the program; it's implicitly
577
terminated by the input.
579
commands.builtin_command_registry.register(cmd_test_confirm)
581
commands.builtin_command_registry.remove, 'test-confirm')
584
2>Really do it? ([y]es, [n]o): yes
588
2>Really do it? ([y]es, [n]o): no
594
class TestShelve(script.TestCaseWithTransportAndScript):
597
super(TestShelve, self).setUp()
600
Created a standalone tree (format: 2a)
605
$ brz commit -m 'file added'
606
2>Committing to:...test/
608
2>Committed revision 1.
612
def test_shelve(self):
614
$ brz shelve -m 'shelve bar'
615
2>Shelve? ([y]es, [N]o, [f]inish, [q]uit): yes
619
2>Shelve 1 change(s)? ([y]es, [N]o, [f]inish, [q]uit): yes
621
2>Changes shelved with id "1".
623
null_output_matches_anything=True)
629
def test_dont_shelve(self):
630
# We intentionally provide no input here to test EOF
632
"$ brz shelve -m 'shelve bar'\n"
633
"2>Shelve? ([y]es, [N]o, [f]inish, [q]uit): \n"
634
"2>No changes to shelve.\n"
635
), null_output_matches_anything=True)