1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
6 Exception classes raised by AdbWrapper and DeviceUtils.
9 from pylib
import cmd_helper
10 from pylib
.utils
import base_error
13 class CommandFailedError(base_error
.BaseError
):
14 """Exception for command failures."""
16 def __init__(self
, message
, device_serial
=None):
17 if device_serial
is not None:
18 message
= '(device: %s) %s' % (device_serial
, message
)
19 self
.device_serial
= device_serial
20 super(CommandFailedError
, self
).__init
__(message
)
23 class AdbCommandFailedError(CommandFailedError
):
24 """Exception for adb command failures."""
26 def __init__(self
, args
, output
, status
=None, device_serial
=None,
32 adb_cmd
= ' '.join(cmd_helper
.SingleQuote(arg
) for arg
in self
.args
)
33 message
= ['adb %s: failed ' % adb_cmd
]
35 message
.append('with exit status %s ' % self
.status
)
37 message
.append('and output:\n')
38 message
.extend('- %s\n' % line
for line
in output
.splitlines())
40 message
.append('and no output.')
41 message
= ''.join(message
)
42 super(AdbCommandFailedError
, self
).__init
__(message
, device_serial
)
45 class DeviceVersionError(CommandFailedError
):
46 """Exception for device version failures."""
48 def __init__(self
, message
, device_serial
=None):
49 super(DeviceVersionError
, self
).__init
__(message
, device_serial
)
52 class AdbShellCommandFailedError(AdbCommandFailedError
):
53 """Exception for shell command failures run via adb."""
55 def __init__(self
, command
, output
, status
, device_serial
=None):
56 self
.command
= command
57 message
= ['shell command run via adb failed on the device:\n',
58 ' command: %s\n' % command
]
59 message
.append(' exit status: %s\n' % status
)
61 message
.append(' output:\n')
62 if isinstance(output
, basestring
):
63 output_lines
= output
.splitlines()
66 message
.extend(' - %s\n' % line
for line
in output_lines
)
68 message
.append(" output: ''\n")
69 message
= ''.join(message
)
70 super(AdbShellCommandFailedError
, self
).__init
__(
71 ['shell', command
], output
, status
, device_serial
, message
)
74 class CommandTimeoutError(base_error
.BaseError
):
75 """Exception for command timeouts."""
79 class DeviceUnreachableError(base_error
.BaseError
):
80 """Exception for device unreachable failures."""
84 class NoDevicesError(base_error
.BaseError
):
85 """Exception for having no devices attached."""
88 super(NoDevicesError
, self
).__init
__(
89 'No devices attached.', is_infra_error
=True)