def run_tribler_core(api_port, api_key, state_dir, gui_test_mode=False): """ This method will start a new Tribler session. Note that there is no direct communication between the GUI process and the core: all communication is performed through the HTTP API. """ logger.info(f'Start tribler core. API port: "{api_port}". ' f'API key: "{api_key}". State dir: "{state_dir}". ' f'Core test mode: "{gui_test_mode}"') config = TriblerConfig.load( file=state_dir / CONFIG_FILE_NAME, state_dir=state_dir, reset_config_on_error=True) config.gui_test_mode = gui_test_mode if SentryReporter.is_in_test_mode(): default_core_exception_handler.sentry_reporter.global_strategy = SentryStrategy.SEND_ALLOWED config.api.http_port = int(api_port) # If the API key is set to an empty string, it will remain disabled if config.api.key not in ('', api_key): config.api.key = api_key config.write() # Immediately write the API key so other applications can use it config.api.http_enabled = True priority_order = config.resource_monitor.cpu_priority set_process_priority(pid=os.getpid(), priority_order=priority_order) # Enable tracer if --trace-debug or --trace-exceptions flag is present in sys.argv log_dir = config.general.get_path_as_absolute('log_dir', config.state_dir) trace_logger = check_and_enable_code_tracing('core', log_dir) logging.getLogger('asyncio').setLevel(logging.WARNING) if sys.platform.startswith('win'): # TODO for the moment being, we use the SelectorEventLoop on Windows, since with the ProactorEventLoop, ipv8 # peer discovery becomes unstable. Also see issue #5485. asyncio.set_event_loop(asyncio.SelectorEventLoop()) loop = asyncio.get_event_loop() exception_handler = default_core_exception_handler loop.set_exception_handler(exception_handler.unhandled_error_observer) try: loop.run_until_complete(core_session(config, components=list(components_gen(config)))) finally: if trace_logger: trace_logger.close() # Flush the logs to the file before exiting for handler in logging.getLogger().handlers: handler.flush()
def test_is_in_test_mode(): assert SentryReporter.get_test_sentry_url() == 'url' assert SentryReporter.is_in_test_mode()
def __init__( # pylint: disable=too-many-arguments, too-many-locals self, parent, sentry_reporter: SentryReporter, reported_error: ReportedError, tribler_version, start_time, stop_application_on_close=True, additional_tags=None, retrieve_error_message_from_stacktrace=False, ): QDialog.__init__(self, parent) uic.loadUi(get_ui_file_path('feedback_dialog.ui'), self) self.setWindowTitle(tr("Unexpected error")) self.selected_item_index = 0 self.tribler_version = tribler_version self.reported_error = reported_error self.scrubber = SentryScrubber() self.sentry_reporter = sentry_reporter self.stop_application_on_close = stop_application_on_close self.additional_tags = additional_tags self.retrieve_error_message_from_stacktrace = retrieve_error_message_from_stacktrace # Qt 5.2 does not have the setPlaceholderText property if hasattr(self.comments_text_edit, "setPlaceholderText"): placeholder = tr( "What were you doing before this crash happened? " "This information will help Tribler developers to figure out and fix the issue quickly." ) self.comments_text_edit.setPlaceholderText(placeholder) def add_item_to_info_widget(key, value): item = QTreeWidgetItem(self.env_variables_list) item.setText(0, key) scrubbed_value = self.scrubber.scrub_text(value) item.setText(1, scrubbed_value) text_for_viewing = '\n'.join( ( reported_error.text, LONG_TEXT_DELIMITER, reported_error.long_text, CONTEXT_DELIMITER, reported_error.context, ) ) stacktrace = self.scrubber.scrub_text(text_for_viewing.rstrip()) self.error_text_edit.setPlainText(stacktrace) connect(self.cancel_button.clicked, self.on_cancel_clicked) connect(self.send_report_button.clicked, self.on_send_clicked) # Add machine information to the tree widget add_item_to_info_widget('os.getcwd', f'{os.getcwd()}') add_item_to_info_widget('sys.executable', f'{sys.executable}') add_item_to_info_widget('os', os.name) add_item_to_info_widget('platform', sys.platform) add_item_to_info_widget('platform.details', platform.platform()) add_item_to_info_widget('platform.machine', platform.machine()) add_item_to_info_widget('python.version', sys.version) add_item_to_info_widget('indebug', str(__debug__)) add_item_to_info_widget('tribler_uptime', f"{time.time() - start_time}") for argv in sys.argv: add_item_to_info_widget('sys.argv', f'{argv}') for path in sys.path: add_item_to_info_widget('sys.path', f'{path}') for key in os.environ.keys(): add_item_to_info_widget('os.environ', f'{key}: {os.environ[key]}') # Add recent requests to feedback dialog request_ind = 1 for request, status_code in sorted(tribler_performed_requests, key=lambda rq: rq[0].time)[-30:]: add_item_to_info_widget( 'request_%d' % request_ind, '%s %s %s (time: %s, code: %s)' % (request.url, request.method, request.raw_data, request.time, status_code), ) request_ind += 1 # Add recent events to feedback dialog events_ind = 1 for event, event_time in received_events[:30][::-1]: add_item_to_info_widget('event_%d' % events_ind, f'{json.dumps(event)} (time: {event_time})') events_ind += 1 # Users can remove specific lines in the report connect(self.env_variables_list.customContextMenuRequested, self.on_right_click_item) self.send_automatically = SentryReporter.is_in_test_mode() if self.send_automatically: self.stop_application_on_close = True self.on_send_clicked(True)
def test_is_not_in_test_mode(): assert SentryReporter.get_test_sentry_url() is None assert not SentryReporter.is_in_test_mode()