| # |
| # Copyright (C) 2017 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| |
| import subprocess |
| |
| class AdbHandler(object): |
| """Adb wrapper to execute shell and adb command to the device.""" |
| |
| def __init__(self, serial=None): |
| self.serial = serial |
| self.adb_cmd = 'adb -s {}'.format(serial) |
| |
| def exec_adb_command(self, cmd): |
| """Method to execute an adb command against the device.""" |
| cmd = "{} {}".format(self.adb_cmd, cmd) |
| proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) |
| (out, err) = proc.communicate() |
| ret = proc.returncode |
| if ret == 0: |
| return out |
| raise AdbError(cmd=cmd, stdout=out, stderr=err, ret_code=ret) |
| |
| def exec_shell_command(self, cmd): |
| """Method to execute a shell command against the device.""" |
| cmd = '{} shell {}'.format(self.adb_cmd, cmd) |
| proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) |
| (out, err) = proc.communicate() |
| ret = proc.returncode |
| if ret == 0: |
| return out |
| raise AdbError(cmd=cmd, stdout=out, stderr=err, ret_code=ret) |
| |
| class AdbError(Exception): |
| """Raised when there is an error in adb operations.""" |
| |
| def __init__(self, cmd, stdout, stderr, ret_code): |
| self.cmd = cmd |
| self.stdout = stdout |
| self.stderr = stderr |
| self.ret_code = ret_code |
| |
| def __str__(self): |
| return ('Error executing adb cmd "%s". ret: %d, stdout: %s, stderr: %s' |
| ) % (self.cmd, self.ret_code, self.stdout, self.stderr) |