~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/script.py

Rework test_script a little bit.


Don't allow someone to request a stdin request to echo.
Echo never reads from stdin, it just echos its arguments.
You use 'cat' if you want to read from stdin.

A few other fixes because the tests were using filenames
that are actually illegal on Windows, rather than just
nonexistant.


Change the exception handling for commands so that
unknown errors don't get silently squashed and then
turn into hard-to-debug errors later.

test_script now passes on Windows.

Show diffs side-by-side

added added

removed removed

Lines of Context:
217
217
            # Specifying None means: any output is accepted
218
218
            return
219
219
        if actual is None:
220
 
            test_case.fail('Unexpected: %s' % actual)
 
220
            test_case.fail('We expected output: %r, but found None'
 
221
                           % (expected,))
221
222
        matching = self.output_checker.check_output(
222
223
            expected, actual, self.check_options)
223
224
        if not matching:
289
290
            try:
290
291
                inputs.append(self._read_input(None, in_name))
291
292
            except IOError, e:
292
 
                if e.errno == errno.ENOENT:
 
293
                # Some filenames are illegal on Windows and generate EINVAL
 
294
                # rather than just saying the filename doesn't exist
 
295
                if e.errno in (errno.ENOENT, errno.EINVAL):
293
296
                    return (1, None,
294
297
                            '%s: No such file or directory\n' % (in_name,))
 
298
                raise
295
299
        # Basically cat copy input to output
296
300
        output = ''.join(inputs)
297
301
        # Handle output redirections
298
302
        try:
299
303
            output = self._write_output(output, out_name, out_mode)
300
304
        except IOError, e:
301
 
            if e.errno == errno.ENOENT:
 
305
            # If out_name cannot be created, we may get 'ENOENT', however if
 
306
            # out_name is something like '', we can get EINVAL
 
307
            if e.errno in (errno.ENOENT, errno.EINVAL):
302
308
                return 1, None, '%s: No such file or directory\n' % (out_name,)
 
309
            raise
303
310
        return 0, output, None
304
311
 
305
312
    def do_echo(self, test_case, input, args):
306
313
        (in_name, out_name, out_mode, args) = _scan_redirection_options(args)
307
 
        if input and args:
308
 
                raise SyntaxError('Specify parameters OR use redirection')
 
314
        if input or in_name:
 
315
            raise SyntaxError('echo doesn\'t read from stdin')
309
316
        if args:
310
317
            input = ' '.join(args)
311
 
        try:
312
 
            input = self._read_input(input, in_name)
313
 
        except IOError, e:
314
 
            if e.errno == errno.ENOENT:
315
 
                return 1, None, '%s: No such file or directory\n' % (in_name,)
316
318
        # Always append a \n'
317
319
        input += '\n'
318
320
        # Process output
321
323
        try:
322
324
            output = self._write_output(output, out_name, out_mode)
323
325
        except IOError, e:
324
 
            if e.errno == errno.ENOENT:
 
326
            if e.errno in (errno.ENOENT, errno.EINVAL):
325
327
                return 1, None, '%s: No such file or directory\n' % (out_name,)
 
328
            raise
326
329
        return 0, output, None
327
330
 
328
331
    def _get_jail_root(self, test_case):