From b5612c5632c9738f614cc2de4c9f82d6fc38130c Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Thu, 22 Jun 2023 16:33:53 +0800 Subject: [PATCH] refactor: raise adb error --- hrp/internal/code/code.go | 22 ++++++++++++---------- hrp/pkg/gadb/client.go | 9 +++++++++ hrp/pkg/gadb/device.go | 28 +++++++++++++--------------- hrp/pkg/gadb/transport.go | 31 ++++++++++++++++++++++--------- hrp/pkg/uixt/android_device.go | 13 ++++++------- 5 files changed, 62 insertions(+), 41 deletions(-) diff --git a/hrp/internal/code/code.go b/hrp/internal/code/code.go index 2cfc0832..e03420ac 100644 --- a/hrp/internal/code/code.go +++ b/hrp/internal/code/code.go @@ -61,11 +61,12 @@ var ( // android device related: [60, 70) var ( - AndroidDeviceConnectionError = errors.New("android device connection error") // 60 - AndroidDeviceUSBDriverError = errors.New("android device USB driver error") // 61 - AndroidShellExecError = errors.New("android adb shell exec error") // 62 - AndroidScreenShotError = errors.New("android screenshot error") // 65 - AndroidCaptureLogError = errors.New("android capture log error") // 66 + AndroidDeviceConnectionError = errors.New("android device general connection error") // 60 + AndroidDeviceConnectionRefusedError = errors.New("android device connection refused") // 61 + AndroidShellExecError = errors.New("android adb shell exec error") // 62 + AndroidDeviceOfflineError = errors.New("android device offline") // 63 + AndroidScreenShotError = errors.New("android screenshot error") // 65 + AndroidCaptureLogError = errors.New("android capture log error") // 66 ) // UI automation related: [70, 80) @@ -127,11 +128,12 @@ var errorsMap = map[error]int{ IOSCaptureLogError: 56, // android related - AndroidDeviceConnectionError: 60, - AndroidDeviceUSBDriverError: 61, - AndroidShellExecError: 62, - AndroidScreenShotError: 65, - AndroidCaptureLogError: 66, + AndroidDeviceConnectionError: 60, + AndroidDeviceConnectionRefusedError: 61, + AndroidShellExecError: 62, + AndroidDeviceOfflineError: 63, + AndroidScreenShotError: 65, + AndroidCaptureLogError: 66, // UI automation related MobileUIDriverError: 70, diff --git a/hrp/pkg/gadb/client.go b/hrp/pkg/gadb/client.go index bc0349ff..79e69d91 100644 --- a/hrp/pkg/gadb/client.go +++ b/hrp/pkg/gadb/client.go @@ -5,7 +5,10 @@ import ( "strconv" "strings" + "github.com/pkg/errors" "github.com/rs/zerolog/log" + + "github.com/httprunner/httprunner/v4/hrp/internal/code" ) const ( @@ -84,6 +87,12 @@ func (c Client) DeviceSerialList() (serials []string, err error) { } func (c Client) DeviceList() (devices []*Device, err error) { + defer func() { + if err != nil && errors.Cause(err) == nil { + err = errors.Wrap(code.AndroidDeviceConnectionError, err.Error()) + } + }() + var resp string if resp, err = c.executeCommand("host:devices-l"); err != nil { return diff --git a/hrp/pkg/gadb/device.go b/hrp/pkg/gadb/device.go index 8a953e0b..58175669 100644 --- a/hrp/pkg/gadb/device.go +++ b/hrp/pkg/gadb/device.go @@ -36,12 +36,18 @@ const ( StateOnline DeviceState = "online" StateOffline DeviceState = "offline" StateDisconnected DeviceState = "disconnected" + StateBootloader DeviceState = "bootloader" + StateRecovery DeviceState = "recovery" + StateUnauthorized DeviceState = "unauthorized" ) var deviceStateStrings = map[string]DeviceState{ - "": StateDisconnected, - "offline": StateOffline, - "device": StateOnline, + "": StateDisconnected, // no devices/emulators found + "offline": StateOffline, + "bootloader": StateBootloader, + "recovery": StateRecovery, + "unauthorized": StateUnauthorized, + "device": StateOnline, } func deviceStateConv(k string) (deviceState DeviceState) { @@ -245,13 +251,10 @@ func (d *Device) ReverseForwardKillAll() error { func (d *Device) RunShellCommand(cmd string, args ...string) (string, error) { raw, err := d.RunShellCommandWithBytes(cmd, args...) - if err != nil { - if errors.Is(err, code.AndroidDeviceConnectionError) { - return "", err - } - return "", errors.Wrap(code.AndroidShellExecError, err.Error()) + if err != nil && errors.Cause(err) == nil { + err = errors.Wrap(code.AndroidShellExecError, err.Error()) } - return string(raw), nil + return string(raw), err } func (d *Device) RunShellCommandWithBytes(cmd string, args ...string) ([]byte, error) { @@ -268,11 +271,6 @@ func (d *Device) RunShellCommandWithBytes(cmd string, args ...string) ([]byte, e return raw, err } -func (d *Device) RunShellCommandV2(cmd string, args ...string) (string, error) { - raw, err := d.RunShellCommandV2WithBytes(cmd, args...) - return string(raw), err -} - // RunShellCommandV2WithBytes shell v2, 支持后台运行而不会阻断 func (d *Device) RunShellCommandV2WithBytes(cmd string, args ...string) ([]byte, error) { if len(args) > 0 { @@ -594,7 +592,7 @@ func (d *Device) Uninstall(packageName string, keepData ...bool) (string, error) args = append(args, "-k") } args = append(args, packageName) - return d.RunShellCommandV2("pm", args...) + return d.RunShellCommand("pm", args...) } func (d *Device) ScreenCap() ([]byte, error) { diff --git a/hrp/pkg/gadb/transport.go b/hrp/pkg/gadb/transport.go index b59ed42e..d9891069 100644 --- a/hrp/pkg/gadb/transport.go +++ b/hrp/pkg/gadb/transport.go @@ -7,6 +7,7 @@ import ( "net" "regexp" "strconv" + "strings" "time" "github.com/pkg/errors" @@ -19,6 +20,8 @@ var ErrConnBroken = errors.New("socket connection broken") var DefaultAdbReadTimeout time.Duration = 60 +var regexDeviceOffline = regexp.MustCompile("device .* not found") + type transport struct { sock net.Conn readTimeout time.Duration @@ -29,9 +32,26 @@ func newTransport(address string, readTimeout ...time.Duration) (tp transport, e readTimeout = []time.Duration{DefaultAdbReadTimeout} } tp.readTimeout = readTimeout[0] - if tp.sock, err = net.Dial("tcp", address); err != nil { - err = fmt.Errorf("adb transport: %w", err) + tp.sock, err = net.Dial("tcp", address) + if err == nil { + // dial success + return tp, nil } + + // connection refused + if strings.Contains(err.Error(), "connect: connection refused") { + err = errors.Wrap(code.AndroidDeviceConnectionRefusedError, err.Error()) + return + } + + // device offline + if regexDeviceOffline.MatchString(err.Error()) { + err = errors.Wrap(code.AndroidDeviceOfflineError, err.Error()) + return + } + + // other connection errors + err = errors.Wrap(code.AndroidDeviceConnectionError, err.Error()) return } @@ -48,8 +68,6 @@ func (t transport) Conn() net.Conn { return t.sock } -var regexDeviceOffline = regexp.MustCompile("device .* not found") - func (t transport) VerifyResponse() (err error) { var status string if status, err = t.ReadStringN(4); err != nil { @@ -64,11 +82,6 @@ func (t transport) VerifyResponse() (err error) { return err } - if regexDeviceOffline.MatchString(sError) { - // device offline - return errors.Wrap(code.AndroidDeviceConnectionError, sError) - } - log.Warn().Str("status", status).Str("err", sError). Msg("verify adb response failed") return errors.New(sError) diff --git a/hrp/pkg/uixt/android_device.go b/hrp/pkg/uixt/android_device.go index b511659d..ef24c637 100644 --- a/hrp/pkg/uixt/android_device.go +++ b/hrp/pkg/uixt/android_device.go @@ -91,7 +91,7 @@ func NewAndroidDevice(options ...AndroidDeviceOption) (device *AndroidDevice, er deviceList, err := GetAndroidDevices(device.SerialNumber) if err != nil { - return nil, errors.Wrap(code.AndroidDeviceConnectionError, err.Error()) + return nil, err } dev := deviceList[0] @@ -106,12 +106,11 @@ func NewAndroidDevice(options ...AndroidDeviceOption) (device *AndroidDevice, er func GetAndroidDevices(serial ...string) (devices []*gadb.Device, err error) { var adbClient gadb.Client if adbClient, err = gadb.NewClientWith(AdbServerHost, AdbServerPort); err != nil { - return nil, errors.Wrap(code.AndroidDeviceConnectionError, err.Error()) + return nil, err } if devices, err = adbClient.DeviceList(); err != nil { - return nil, errors.Wrap(code.AndroidDeviceConnectionError, - fmt.Sprintf("list android devices failed: %v", err)) + return nil, err } var deviceList []*gadb.Device @@ -190,11 +189,11 @@ func (dev *AndroidDevice) NewDriver(capabilities Capabilities) (driverExt *Drive func (dev *AndroidDevice) NewUSBDriver(capabilities Capabilities) (driver WebDriver, err error) { var localPort int if localPort, err = getFreePort(); err != nil { - return nil, errors.Wrap(code.AndroidDeviceUSBDriverError, + return nil, errors.Wrap(code.AndroidDeviceConnectionError, fmt.Sprintf("get free port failed: %v", err)) } if err = dev.d.Forward(localPort, UIA2ServerPort); err != nil { - return nil, errors.Wrap(code.AndroidDeviceUSBDriverError, + return nil, errors.Wrap(code.AndroidDeviceConnectionError, fmt.Sprintf("forward port %d->%d failed: %v", localPort, UIA2ServerPort, err)) } @@ -204,7 +203,7 @@ func (dev *AndroidDevice) NewUSBDriver(capabilities Capabilities) (driver WebDri uiaDriver, err := NewUIADriver(capabilities, rawURL) if err != nil { _ = dev.d.ForwardKill(localPort) - return nil, errors.Wrap(code.AndroidDeviceUSBDriverError, err.Error()) + return nil, errors.Wrap(code.AndroidDeviceConnectionError, err.Error()) } uiaDriver.adbClient = dev.d uiaDriver.logcat = dev.logcat