RIDE
RIDE copied to clipboard
When a variable is a bytes and contains non-charater ascii, the log info doesnot output anymore
robotframework-ride 2.0b1
@zhuyu4839 Please attach a sample test case file, so we can reproduce on our side. Thanks.
- [ ] test.robot
`*** Settings *** Library keywords.py
*** Variables *** ${HOST} ('192.168.8.104', 8081) ${TARGET} ('192.168.8.104', 8080)
*** Test Cases *** TEST [Documentation] Test ${ret} Udp Query ${HOST} target=${TARGET} data=[0x80, 0x00, 0x01, 0x00, 0x00] Log Test`
- [ ] keywords.py `import re import socket import time import logging
__logger = logging.getLogger(name)
def eval_(source: str, reg='[\w\W]*?', *, flag=0x07):
if isinstance(source, str):
if (flag & 0x08)
or ((flag & 0x01) and re.match(f'^\({reg}\)$', source))
or ((flag & 0x02) and re.match(f'^\[{reg}\]$', source))
or ((flag & 0x04) and re.match('^\{%s\}$' % reg, source)):
try:
return eval(source)
except (ValueError, SyntaxError, TypeError):
__logger.warning(f'[eval] invalid string: {source}')
return source
class _SocketClient:
def __init__(self, socket_type, host, target, timeout):
self._logger = logging.getLogger(self.__class__.__name__)
self._resource = None
self._target = eval_(target)
self._host = eval_(host)
self._socket_type = socket_type
self._timeout = timeout
def __enter__(self):
self.open()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
pass
def open(self):
if self._resource is None:
_socket = socket.socket(socket.AF_INET, self._socket_type)
self._resource = _socket
if self._host and isinstance(self._host, tuple):
self._resource.bind(self._host)
self._resource.settimeout(self._timeout)
if self._socket_type == socket.SOCK_STREAM:
self._resource.connect(self._target)
return self._resource
def write(self, data, target=None, auto_eval=True):
if not isinstance(data, (bytes, bytearray)):
if auto_eval:
data = eval_(data, reg='((0x)[0-9a-fA-F]+(,)?\\s*)+', flag=0x03)
if isinstance(data, str):
data = bytearray(data, encoding='utf-8')
else:
data = bytearray(data)
self._logger.debug('socket send len: %4d, data: {%s}'
% (len(data), ' '.join('%02X' % i for i in data)))
if self._socket_type == socket.SOCK_DGRAM:
target = eval_(target)
length = self._resource.sendto(data, target)
else:
length = self._resource.send(data)
# if length != len(data):
return length
def read(self, buf_size=1024):
buf_size = int(buf_size)
if self._socket_type == socket.SOCK_DGRAM:
data, info = self._resource.recvfrom(buf_size)
if data:
self._logger.debug('socket recv len: %4d, data: {%s} from: %s'
% (len(data), ' '.join('%02X' % i for i in data), str(info)))
return data, info
else:
data = self._resource.recv(buf_size)
if data:
self._logger.debug('socket recv len: %4d, data: {%s}'
% (len(data), ' '.join('%02X' % i for i in data)))
return data
class UdpClient(_SocketClient):
def __init__(self, host=None, timeout=10):
super().__init__(socket.SOCK_DGRAM, host, None, timeout)
def query(self, data, target, auto_eval=True, buf_size=1024, delay=0.2):
self.write(data, target, auto_eval)
time.sleep(float(delay))
return self.read(buf_size)
def udp_query(host=None, *, target, data, **kwargs): with UdpClient(host) as client: return client.query(data, target=target, **kwargs)[0]
`
@HelioGuilherme66 The test case and the keywords file are here.
I believe this was also solved by #2494
@zhuyu4839 Can you please confirm by installing from master
?