76 PLATFORM = platform.python_implementation()
79 import socketserver
as SocketServer
80 except ImportError
as e:
85 sys.path.append(os.path.join(os.path.dirname(__file__),
'../../lib'))
86 from robot.errors
import ExecutionFailed
87 from robot.running
import EXECUTION_CONTEXTS
88 from robot.running.signalhandler
import STOP_SIGNAL_MONITOR
89 from robot.utils
import encoding
90 from robot.utils.encoding
import SYSTEM_ENCODING
108 from StringIO
import StringIO
110 from io
import StringIO
124 current = EXECUTION_CONTEXTS.current
130 return out._xmllogger._log_message_is_logged(level)
139 ROBOT_LISTENER_API_VERSION = 2
149 self.
_create_debugger_create_debugger((len(args) >= 2)
and (args[1] ==
'True'))
151 print(
"TestRunnerAgent: Running under %s %s\n" %
152 (PLATFORM, sys.version.split()[0]))
160 target=self.
_killer_killer.serve_forever)
173 self.
_send_socket_send_socket(
"start_test", name, attrs)
179 attrs_copy = copy.copy(attrs)
180 del attrs_copy[
'doc']
181 attrs_copy[
'is_dir'] = os.path.isdir(attrs[
'source'])
182 self.
_send_socket_send_socket(
"start_suite", name, attrs_copy)
185 attrs_copy = copy.copy(attrs)
186 del attrs_copy[
'doc']
187 attrs_copy[
'is_dir'] = os.path.isdir(attrs[
'source'])
188 self.
_send_socket_send_socket(
"end_suite", name, attrs_copy)
195 attrs_copy = copy.copy(attrs)
196 del attrs_copy[
'args']
197 del attrs_copy[
'doc']
198 del attrs_copy[
'assign']
200 self.
_send_socket_send_socket(
"start_keyword", name, attrs_copy)
201 if self.
_debugger_debugger.is_breakpoint(name, attrs):
203 paused = self.
_debugger_debugger.is_paused()
212 attrs_copy = copy.copy(attrs)
213 del attrs_copy[
'args']
214 del attrs_copy[
'doc']
215 del attrs_copy[
'assign']
217 self.
_send_socket_send_socket(
"end_keyword", name, attrs_copy)
225 self._send_socket(
"log_message", message)
234 self._send_socket(
"report_file", path)
243 self._send_socket(
"close")
245 self.filehandler.
close()
253 self.
socksock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
258 except socket.error
as e:
259 print(
'unable to open socket to "%s:%s" error: %s'
260 % (self.
hosthost, self.
portport, str(e)))
267 packet = (name, args)
272 traceback.print_exc(file=sys.stdout)
288 if len(attrs[
'args']) > 0:
289 return name ==
'BuiltIn.Comment' and \
290 str(attrs[
'args'][0]).upper().startswith(
u"PAUSE")
294 self.
_state_state =
'pause'
300 self.
_state_state =
'running'
305 self.
_state_state =
'step_next'
309 self.
_state_state =
'step_over'
313 while self.
_state_state ==
'pause':
316 if self.
_state_state ==
'step_next':
317 self.
_state_state =
'pause'
318 elif self.
_state_state ==
'step_over':
320 self.
_state_state =
'resume'
327 self.
_state_state =
'pause'
330 return self.
_state_state ==
'pause'
334 allow_reuse_address =
True
337 SocketServer.TCPServer.__init__(self, (
"", 0), RobotKillerHandler)
343 data = self.request.makefile(
'r').read().strip()
346 elif data ==
'pause':
347 self.server.debugger.pause()
348 elif data ==
'resume':
349 self.server.debugger.resume()
350 elif data ==
'step_next':
351 self.server.debugger.step_next()
352 elif data ==
'step_over':
353 self.server.debugger.step_over()
354 elif data ==
'pause_on_failure':
355 self.server.debugger.pause_on_failure(
True)
356 elif data ==
'do_not_pause_on_failure':
357 self.server.debugger.pause_on_failure(
False)
363 except ExecutionFailed:
380 class EncodeError(StreamError):
381 wrapped_exceptions = (pickle.PicklingError, )
393 wrapped_exceptions = (pickle.UnpicklingError,)
395 if hasattr(json,
'JSONDecodeError'):
396 wrapped_exceptions = (pickle.UnpicklingError, json.JSONDecodeError)
458 loads = staticmethod(loads)
459 dumps = staticmethod(dumps)
474 sort_keys=
True).encode
477 def json_not_impl(dummy):
478 raise NotImplementedError(
479 'Python should include json. Please check your Python installation.')
480 self.
_json_decoder_json_decoder = staticmethod(json_not_impl)
481 self.
_json_encoder_json_encoder = staticmethod(json_not_impl)
500 write_list.append(
'J')
501 write_list.extend([str(len(s)),
'|', s])
506 s = pickle.dumps(obj, pickle.HIGHEST_PROTOCOL)
507 write_list.append(
'P')
508 write_list.extend([str(len(s)),
'|', s])
509 self.
fpfp.
write(bytes(
''.join(write_list),
"UTF-8"))
525 if not msglen.isdigit():
526 raise DecodeError(
'Message header not valid: %r' % header)
530 buff.write(self.
fpfp.read(msglen))
535 return pickle.loads(buff.getvalue())
537 raise DecodeError(
"Message type %r not supported" % msgtype)
538 except DecodeError.wrapped_exceptions
as e:
548 while len(buff.getvalue()) == 0
or buff.getvalue()[-1] !=
'|':
549 recv_char = self.
fpfp.read(1)
551 raise EOFError(
'File/Socket closed while reading load header')
552 buff.write(recv_char)
553 return buff.getvalue()[:-1]
This exception is raised when there is a problem decoding an object, such as a security violation.
def __init__(self, pause_on_failure=False)
def is_breakpoint(name, attrs)
def end_keyword(self, passed=True)
def pause_on_failure(self, pause)
def __init__(self, debugger)
Base class for EncodeError and DecodeError.
This class provides a common streaming approach for the purpose of reliably sending data over a socke...
def load(self)
Reads in json message prepended with message length header from a file (or socket,...
def dump(self, obj)
Similar method to json dump, prepending data with message length header.
def __init__(self, fp)
Stream handler that encodes objects as either JSON (if available) with message length header prepende...
Pass all listener events to a remote listener.
def _create_debugger(self, pause_on_failure)
def end_suite(self, name, attrs)
def message(self, message)
def debug_file(self, path)
def _send_socket(self, name, *args)
def start_keyword(self, name, attrs)
def end_test(self, name, attrs)
def _send_server_port(self, port)
def _create_kill_server(self)
def end_keyword(self, name, attrs)
def start_suite(self, name, attrs)
def log_message(self, message)
def report_file(self, path)
def _connect(self)
Establish a connection for sending data.
def summary_file(self, path)
def __init__(self, *args)
def start_test(self, name, attrs)
def output_file(self, path)
def loads(s)
Reads in json message or pickle message prepended with message length header from a string.
def dumps(obj)
Similar method to json dumps, prepending data with message length header.
def write(msg, level='INFO', html=False)
Writes the message to the log file using the given level.