diff --git a/AUTHORS.rst b/AUTHORS.rst index 9f0f86d667b..6aa0490c549 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -44,6 +44,7 @@ The following wonderful people contributed directly or indirectly to this projec - `Li-aung Yip `_ - `macrojames `_ - `Michael Elovskikh `_ +- `Mischa Krüger `_ - `naveenvhegde `_ - `neurrone `_ - `njittam `_ diff --git a/requirements-dev.txt b/requirements-dev.txt index d729abf8a15..2835df57fed 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -6,4 +6,5 @@ yapf pre-commit beautifulsoup4 pytest +pytest-catchlog pytest-timeout diff --git a/telegram/ext/updater.py b/telegram/ext/updater.py index e1828441598..f2a428a2269 100644 --- a/telegram/ext/updater.py +++ b/telegram/ext/updater.py @@ -31,6 +31,7 @@ from telegram import Bot, TelegramError from telegram.ext import Dispatcher, JobQueue from telegram.error import Unauthorized, InvalidToken, RetryAfter +from telegram.utils.helpers import get_signal_name from telegram.utils.request import Request from telegram.utils.webhookhandler import (WebhookServer, WebhookHandler) @@ -449,6 +450,8 @@ def _join_threads(self): def signal_handler(self, signum, frame): self.is_idle = False if self.running: + self.logger.info('Received signal {} ({}), stopping...'.format( + signum, get_signal_name(signum))) self.stop() if self.user_sig_handler: self.user_sig_handler(signum, frame) diff --git a/telegram/utils/helpers.py b/telegram/utils/helpers.py index 9da126e0531..90aa07333cf 100644 --- a/telegram/utils/helpers.py +++ b/telegram/utils/helpers.py @@ -19,6 +19,7 @@ """This module contains helper functions.""" import re +import signal from datetime import datetime try: @@ -26,6 +27,18 @@ except ImportError: from cgi import escape as escape_html # noqa: F401 + +# From https://stackoverflow.com/questions/2549939/get-signal-names-from-numbers-in-python +_signames = {v: k + for k, v in reversed(sorted(vars(signal).items())) + if k.startswith('SIG') and not k.startswith('SIG_')} + + +def get_signal_name(signum): + """Returns the signal name of the given signal number.""" + return _signames[signum] + + # Not using future.backports.datetime here as datetime value might be an input from the user, # making every isinstace() call more delicate. So we just use our own compat layer. if hasattr(datetime, 'timestamp'): diff --git a/tests/test_updater.py b/tests/test_updater.py index be89ffe8386..09678ec063b 100644 --- a/tests/test_updater.py +++ b/tests/test_updater.py @@ -16,9 +16,11 @@ # # You should have received a copy of the GNU Lesser Public License # along with this program. If not, see [http://www.gnu.org/licenses/]. +import logging import os import signal import sys +from functools import partial from queue import Queue from random import randrange from threading import Thread @@ -238,15 +240,25 @@ def _send_webhook_msg(self, return urlopen(req) - def signal_sender(self): + def signal_sender(self, updater): sleep(0.2) + while not updater.running: + sleep(0.2) + os.kill(os.getpid(), signal.SIGTERM) @signalskip - def test_idle(self, updater): + def test_idle(self, updater, caplog): updater.start_polling(0.01) - Thread(target=self.signal_sender).start() - updater.idle() + Thread(target=partial(self.signal_sender, updater=updater)).start() + + with caplog.at_level(logging.INFO): + updater.idle() + + rec = caplog.records[-1] + assert rec.msg.startswith('Received signal {}'.format(signal.SIGTERM)) + assert rec.levelname == 'INFO' + # If we get this far, idle() ran through sleep(.5) assert updater.running is False @@ -260,7 +272,7 @@ def user_signal_inc(signum, frame): updater.user_sig_handler = user_signal_inc updater.start_polling(0.01) - Thread(target=self.signal_sender).start() + Thread(target=partial(self.signal_sender, updater=updater)).start() updater.idle() # If we get this far, idle() ran through sleep(.5) pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy