Skip to content

Commit 48b6d19

Browse files
authored
Get the hostname in 'connect()', not '__init__()' (#115)
* Get the hostname in 'connect()', not '__init__()' * Add missing functions to tables of contents
1 parent 6bf4541 commit 48b6d19

File tree

5 files changed

+39
-23
lines changed

5 files changed

+39
-23
lines changed

adb_shell/adb_device.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
* :meth:`AdbDevice.close`
4848
* :meth:`AdbDevice.connect`
4949
* :meth:`AdbDevice.list`
50+
* :attr:`AdbDevice.max_chunk_size`
5051
* :meth:`AdbDevice.pull`
5152
* :meth:`AdbDevice.push`
5253
* :meth:`AdbDevice.root`
@@ -62,7 +63,6 @@
6263

6364
import logging
6465
import os
65-
import socket
6666
import struct
6767
import time
6868

@@ -71,7 +71,7 @@
7171
from .adb_message import AdbMessage, checksum, unpack
7272
from .transport.base_transport import BaseTransport
7373
from .transport.tcp_transport import TcpTransport
74-
from .hidden_helpers import DeviceFile, _AdbTransactionInfo, _FileSyncTransactionInfo, get_files_to_push
74+
from .hidden_helpers import DeviceFile, _AdbTransactionInfo, _FileSyncTransactionInfo, get_banner, get_files_to_push
7575

7676
try:
7777
from .transport.usb_transport import UsbTransport
@@ -112,16 +112,10 @@ class AdbDevice(object):
112112
"""
113113

114114
def __init__(self, transport, banner=None):
115-
if banner:
116-
if not isinstance(banner, (bytes, bytearray)):
117-
self._banner = bytearray(banner, 'utf-8')
118-
else:
119-
self._banner = banner
115+
if banner and not isinstance(banner, (bytes, bytearray)):
116+
self._banner = bytearray(banner, 'utf-8')
120117
else:
121-
try:
122-
self._banner = bytearray(socket.gethostname(), 'utf-8')
123-
except: # noqa pylint: disable=bare-except
124-
self._banner = bytearray('unknown', 'utf-8')
118+
self._banner = banner
125119

126120
if not isinstance(transport, BaseTransport):
127121
raise exceptions.InvalidTransportError("`transport` must be an instance of a subclass of `BaseTransport`")
@@ -208,6 +202,10 @@ def connect(self, rsa_keys=None, transport_timeout_s=None, auth_timeout_s=consta
208202
Invalid auth response from the device
209203
210204
"""
205+
# 0. Get `self._banner` if it was not provided in the constructor
206+
if not self._banner:
207+
self._banner = get_banner()
208+
211209
# 1. Use the transport to establish a connection
212210
self._transport.close()
213211
self._transport.connect(transport_timeout_s)

adb_shell/adb_device_async.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
* :meth:`AdbDeviceAsync.close`
4646
* :meth:`AdbDeviceAsync.connect`
4747
* :meth:`AdbDeviceAsync.list`
48+
* :attr:`AdbDeviceAsync.max_chunk_size`
4849
* :meth:`AdbDeviceAsync.pull`
4950
* :meth:`AdbDeviceAsync.push`
5051
* :meth:`AdbDeviceAsync.root`
@@ -60,7 +61,6 @@
6061
from asyncio import get_running_loop
6162
import logging
6263
import os
63-
import socket
6464
import struct
6565
import time
6666

@@ -71,7 +71,7 @@
7171
from .adb_message import AdbMessage, checksum, unpack
7272
from .transport.base_transport_async import BaseTransportAsync
7373
from .transport.tcp_transport_async import TcpTransportAsync
74-
from .hidden_helpers import DeviceFile, _AdbTransactionInfo, _FileSyncTransactionInfo, get_files_to_push
74+
from .hidden_helpers import DeviceFile, _AdbTransactionInfo, _FileSyncTransactionInfo, get_banner, get_files_to_push
7575

7676

7777
_LOGGER = logging.getLogger(__name__)
@@ -107,17 +107,10 @@ class AdbDeviceAsync(object):
107107
"""
108108

109109
def __init__(self, transport, banner=None):
110-
if banner:
111-
if not isinstance(banner, (bytes, bytearray)):
112-
self._banner = bytearray(banner, 'utf-8')
113-
else:
114-
self._banner = banner
110+
if banner and not isinstance(banner, (bytes, bytearray)):
111+
self._banner = bytearray(banner, 'utf-8')
115112
else:
116-
try:
117-
# TODO: make this async / don't do I/O
118-
self._banner = bytearray(socket.gethostname(), 'utf-8')
119-
except: # noqa pylint: disable=bare-except
120-
self._banner = bytearray('unknown', 'utf-8')
113+
self._banner = banner
121114

122115
if not isinstance(transport, BaseTransportAsync):
123116
raise exceptions.InvalidTransportError("`transport` must be an instance of a subclass of `BaseTransportAsync`")
@@ -204,6 +197,10 @@ async def connect(self, rsa_keys=None, transport_timeout_s=None, auth_timeout_s=
204197
Invalid auth response from the device
205198
206199
"""
200+
# 0. Get `self._banner` if it was not provided in the constructor
201+
if not self._banner:
202+
self._banner = await get_running_loop().run_in_executor(None, get_banner)
203+
207204
# 1. Use the transport to establish a connection
208205
await self._transport.close()
209206
await self._transport.connect(transport_timeout_s)

adb_shell/hidden_helpers.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,15 @@
2727
2828
* :meth:`_FileSyncTransactionInfo.can_add_to_send_buffer`
2929
30+
* :func:`get_banner`
3031
* :func:`get_files_to_push`
3132
3233
"""
3334

3435

3536
from collections import namedtuple
3637
import os
38+
import socket
3739
import struct
3840

3941
from . import constants
@@ -69,6 +71,21 @@ def get_files_to_push(local_path, device_path):
6971
return local_path_is_dir, local_paths, device_paths
7072

7173

74+
def get_banner():
75+
"""Get the ``banner`` that will be signed in :meth:`adb_shell.adb_device.AdbDevice.connect` / :meth:`adb_shell.adb_device_async.AdbDeviceAsync.connect`.
76+
77+
Returns
78+
-------
79+
bytearray
80+
The hostname, or "unknown" if it could not be determined
81+
82+
"""
83+
try:
84+
return bytearray(socket.gethostname(), 'utf-8')
85+
except: # noqa pylint: disable=bare-except
86+
return bytearray('unknown', 'utf-8')
87+
88+
7289
class _AdbTransactionInfo(object): # pylint: disable=too-few-public-methods
7390
"""A class for storing info and settings used during a single ADB "transaction."
7491

tests/test_adb_device.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ def test_init_banner(self):
9696

9797
with patch('socket.gethostname', side_effect=Exception):
9898
device_banner_unknown = AdbDevice(transport=patchers.FakeTcpTransport('host', 5555))
99+
device_banner_unknown._transport._bulk_read = self.device._transport._bulk_read
100+
self.assertTrue(device_banner_unknown.connect())
99101
self.assertEqual(device_banner_unknown._banner, b'unknown')
100102

101103
# Clear the `_bulk_read` buffer so that `self.tearDown()` passes

tests/test_adb_device_async.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ async def test_init_banner(self):
102102

103103
with patch('socket.gethostname', side_effect=Exception):
104104
device_banner_unknown = AdbDeviceAsync(transport=FakeTcpTransportAsync('host', 5555))
105+
device_banner_unknown._transport._bulk_read = self.device._transport._bulk_read
106+
self.assertTrue(await device_banner_unknown.connect())
105107
self.assertEqual(device_banner_unknown._banner, b'unknown')
106108

107109
# Clear the `_bulk_read` buffer so that `self.tearDown()` passes

0 commit comments

Comments
 (0)