def test_create_interrupt_this_thread_callback(): class MyThread(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.finished = False self.daemon = True self.interrupt_thread = None self.interrupted = False def run(self): try: self.interrupt_thread = create_interrupt_this_thread_callback() while True: time.sleep(.2) except KeyboardInterrupt: self.interrupted = True finally: self.finished = True t = MyThread() t.start() wait_for_condition(lambda: t.interrupt_thread is not None) t.interrupt_thread() wait_for_condition(lambda: t.finished) assert t.interrupted
def test_console_debugger_connected(console_setup): class _DebuggerWriterThread(AbstractWriterThread): FORCE_KILL_PROCESS_WHEN_FINISHED_OK = True def __init__(self): AbstractWriterThread.__init__(self) socket_name = get_socket_name(close=True) server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_socket.bind(socket_name) server_socket.listen(1) self.port = socket_name[1] self.__server_socket = server_socket def run(self): print('waiting for second process') self.sock, addr = self.__server_socket.accept() print('accepted second process') from tests_python.debugger_unittest import ReaderThread self.reader_thread = ReaderThread(self.sock) self.reader_thread.start() self._sequence = -1 # initial command is always the version self.write_version() self.log.append('start_socket') self.write_make_initial_run() time.sleep(1) seq = self.write_list_threads() msg = self.wait_for_list_threads(seq) assert msg.thread['name'] == 'MainThread' assert msg.thread['id'] == 'console_main' self.write_get_frame('console_main', '1') self.wait_for_vars([ [ '<var name="a" type="int" qualifier="%s" value="int: 10"' % (builtin_qualifier, ), '<var name="a" type="int" value="int', # jython ], ]) self.finished_ok = True with console_setup.check_console() as writer: writer.execute_line('a = 10') debugger_writer_thread = _DebuggerWriterThread() debugger_writer_thread.start() writer.connect_to_debugger(debugger_writer_thread.port) wait_for_condition(lambda: debugger_writer_thread.finished_ok) writer.execute_line('print("TEST SUCEEDED")') writer.close() writer.finished_ok = True
def _check_tracing_other_threads(): import pydevd_tracing import time from tests_python.debugger_unittest import wait_for_condition try: import _thread except ImportError: import thread as _thread # This method is called in a subprocess, so, make sure we exit properly even if we somehow # deadlock somewhere else. def dump_threads_and_kill_on_timeout(): time.sleep(10) from _pydevd_bundle import pydevd_utils pydevd_utils.dump_threads() time.sleep(1) import os os._exit(77) _thread.start_new_thread(dump_threads_and_kill_on_timeout, ()) def method(): while True: trace_func = sys.gettrace() if trace_func: threading.current_thread().trace_func = trace_func break time.sleep(.01) def dummy_thread_method(): threads.append(threading.current_thread()) method() threads = [] threads.append(threading.Thread(target=method)) threads[-1].daemon = True threads[-1].start() _thread.start_new_thread(dummy_thread_method, ()) wait_for_condition(lambda: len(threads) == 2, msg=lambda: 'Found threads: %s' % (threads, )) def tracing_func(frame, event, args): return tracing_func assert pydevd_tracing.set_trace_to_threads(tracing_func) == 0 def check_threads_tracing_func(): for t in threads: if getattr(t, 'trace_func', None) != tracing_func: return False return True wait_for_condition(check_threads_tracing_func) assert tracing_func == sys.gettrace()
def update_command_line_args(writer, args): ret = debugger_unittest.AbstractWriterThread.update_command_line_args( writer, args) wait_for_condition(lambda: hasattr(writer, 'port')) ret.append(str(writer.port)) if access_token is not None: ret.append('--access-token') ret.append(access_token) if ide_access_token is not None: ret.append('--ide-access-token') ret.append(ide_access_token) return ret
def hello(self): def _hello(): try: msg = runner.proxy.hello('ignored') if msg is not None: if isinstance(msg, (list, tuple)): msg = next(iter(msg)) if msg.lower().startswith('hello'): return True except: # That's ok, communication still not ready. pass return False wait_for_condition(_hello)
def _check_tracing_other_threads(): import pydevd_tracing import time from tests_python.debugger_unittest import wait_for_condition try: import _thread except ImportError: import thread as _thread def method(): while True: trace_func = sys.gettrace() if trace_func: threading.current_thread().trace_func = trace_func break time.sleep(.01) def dummy_thread_method(): threads.append(threading.current_thread()) method() threads = [] threads.append(threading.Thread(target=method)) threads[-1].start() _thread.start_new_thread(dummy_thread_method, ()) wait_for_condition(lambda: len(threads) == 2, msg=lambda: 'Found threads: %s' % (threads, )) def tracing_func(frame, event, args): return tracing_func assert pydevd_tracing.set_trace_to_threads(tracing_func) == 0 def check_threads_tracing_func(): for t in threads: if getattr(t, 'trace_func', None) != tracing_func: return False return True wait_for_condition(check_threads_tracing_func) assert tracing_func == sys.gettrace()
def update_command_line_args(writer, args): ret = debugger_unittest.AbstractWriterThread.update_command_line_args( writer, args) wait_for_condition(lambda: hasattr(writer, 'port')) ret.append(str(writer.port)) return ret