RIDE icon indicating copy to clipboard operation
RIDE copied to clipboard

When a variable is a bytes and contains non-charater ascii, the log info doesnot output anymore

Open zhuyu4839 opened this issue 2 years ago • 4 comments

20220421-181435 20220421-181616

zhuyu4839 avatar Apr 21 '22 10:04 zhuyu4839

robotframework-ride 2.0b1

zhuyu4839 avatar Apr 21 '22 10:04 zhuyu4839

@zhuyu4839 Please attach a sample test case file, so we can reproduce on our side. Thanks.

HelioGuilherme66 avatar Apr 25 '22 18:04 HelioGuilherme66

  • [ ] 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]

`

zhuyu4839 avatar May 03 '22 01:05 zhuyu4839

@HelioGuilherme66 The test case and the keywords file are here.

zhuyu4839 avatar May 03 '22 01:05 zhuyu4839

I believe this was also solved by #2494 @zhuyu4839 Can you please confirm by installing from master ?

HelioGuilherme66 avatar Nov 08 '22 23:11 HelioGuilherme66