From 41fcd9673e4bea0e69f8e1c446af60760bf03c14 Mon Sep 17 00:00:00 2001 From: Chad Whitacre Date: Wed, 30 Sep 2020 23:26:31 -0400 Subject: [PATCH] Move SignalMixin and TimeMixin back to common_util This concludes our service. --- src/allmydata/test/common_py3.py | 67 -------------------------- src/allmydata/test/common_util.py | 50 ++++++++++++++++++- src/allmydata/test/test_iputil.py | 2 +- src/allmydata/test/test_time_format.py | 2 +- src/allmydata/test/web/test_web.py | 2 +- src/allmydata/util/_python3.py | 1 - 6 files changed, 52 insertions(+), 72 deletions(-) delete mode 100644 src/allmydata/test/common_py3.py diff --git a/src/allmydata/test/common_py3.py b/src/allmydata/test/common_py3.py deleted file mode 100644 index 0dae05aa6..000000000 --- a/src/allmydata/test/common_py3.py +++ /dev/null @@ -1,67 +0,0 @@ -""" -Common utilities that have been ported to Python 3. - -Ported to Python 3. -""" - -from __future__ import unicode_literals -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -from future.utils import PY2 -if PY2: - from builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, dict, list, object, range, str, max, min # noqa: F401 - -import os -import time -import signal - -from twisted.internet import reactor - - -class TimezoneMixin(object): - - def setTimezone(self, timezone): - def tzset_if_possible(): - # Windows doesn't have time.tzset(). - if hasattr(time, 'tzset'): - time.tzset() - - unset = object() - originalTimezone = os.environ.get('TZ', unset) - def restoreTimezone(): - if originalTimezone is unset: - del os.environ['TZ'] - else: - os.environ['TZ'] = originalTimezone - tzset_if_possible() - - os.environ['TZ'] = timezone - self.addCleanup(restoreTimezone) - tzset_if_possible() - - def have_working_tzset(self): - return hasattr(time, 'tzset') - - -class SignalMixin(object): - # This class is necessary for any code which wants to use Processes - # outside the usual reactor.run() environment. It is copied from - # Twisted's twisted.test.test_process . Note that Twisted-8.2.0 uses - # something rather different. - sigchldHandler = None - - def setUp(self): - # make sure SIGCHLD handler is installed, as it should be on - # reactor.run(). problem is reactor may not have been run when this - # test runs. - if hasattr(reactor, "_handleSigchld") and hasattr(signal, "SIGCHLD"): - self.sigchldHandler = signal.signal(signal.SIGCHLD, - reactor._handleSigchld) - return super(SignalMixin, self).setUp() - - def tearDown(self): - if self.sigchldHandler: - signal.signal(signal.SIGCHLD, self.sigchldHandler) - return super(SignalMixin, self).tearDown() diff --git a/src/allmydata/test/common_util.py b/src/allmydata/test/common_util.py index ce6271399..8673e2ece 100644 --- a/src/allmydata/test/common_util.py +++ b/src/allmydata/test/common_util.py @@ -1,6 +1,8 @@ from __future__ import print_function import os +import time +import signal from random import randrange from six.moves import StringIO @@ -14,7 +16,6 @@ from allmydata.util.encodingutil import unicode_platform, get_filesystem_encodin # Imported for backwards compatibility: from future.utils import bord, bchr, binary_type from past.builtins import unicode -from .common_py3 import SignalMixin def skip_if_cannot_represent_filename(u): @@ -94,6 +95,28 @@ class ReallyEqualMixin(object): self.assertEqual(type(a), type(b), "a :: %r (%s), b :: %r (%s), %r" % (a, type(a), b, type(b), msg)) +class SignalMixin(object): + # This class is necessary for any code which wants to use Processes + # outside the usual reactor.run() environment. It is copied from + # Twisted's twisted.test.test_process . Note that Twisted-8.2.0 uses + # something rather different. + sigchldHandler = None + + def setUp(self): + # make sure SIGCHLD handler is installed, as it should be on + # reactor.run(). problem is reactor may not have been run when this + # test runs. + if hasattr(reactor, "_handleSigchld") and hasattr(signal, "SIGCHLD"): + self.sigchldHandler = signal.signal(signal.SIGCHLD, + reactor._handleSigchld) + return super(SignalMixin, self).setUp() + + def tearDown(self): + if self.sigchldHandler: + signal.signal(signal.SIGCHLD, self.sigchldHandler) + return super(SignalMixin, self).tearDown() + + class StallMixin(object): def stall(self, res=None, delay=1): d = defer.Deferred() @@ -221,6 +244,31 @@ class TestMixin(SignalMixin): self.fail("Reactor was still active when it was required to be quiescent.") +class TimezoneMixin(object): + + def setTimezone(self, timezone): + def tzset_if_possible(): + # Windows doesn't have time.tzset(). + if hasattr(time, 'tzset'): + time.tzset() + + unset = object() + originalTimezone = os.environ.get('TZ', unset) + def restoreTimezone(): + if originalTimezone is unset: + del os.environ['TZ'] + else: + os.environ['TZ'] = originalTimezone + tzset_if_possible() + + os.environ['TZ'] = timezone + self.addCleanup(restoreTimezone) + tzset_if_possible() + + def have_working_tzset(self): + return hasattr(time, 'tzset') + + try: import win32file import win32con diff --git a/src/allmydata/test/test_iputil.py b/src/allmydata/test/test_iputil.py index 71374fec7..f403de35b 100644 --- a/src/allmydata/test/test_iputil.py +++ b/src/allmydata/test/test_iputil.py @@ -23,7 +23,7 @@ from tenacity import retry, stop_after_attempt from foolscap.api import Tub from allmydata.util import iputil, gcutil -import allmydata.test.common_py3 as testutil +import allmydata.test.common_util as testutil from allmydata.util.namespace import Namespace diff --git a/src/allmydata/test/test_time_format.py b/src/allmydata/test/test_time_format.py index dc9c03b91..f83a6a53c 100644 --- a/src/allmydata/test/test_time_format.py +++ b/src/allmydata/test/test_time_format.py @@ -16,7 +16,7 @@ import time from twisted.trial import unittest -from allmydata.test.common_py3 import TimezoneMixin +from allmydata.test.common_util import TimezoneMixin from allmydata.util import time_format diff --git a/src/allmydata/test/web/test_web.py b/src/allmydata/test/web/test_web.py index 1773c32a4..508fc82d4 100644 --- a/src/allmydata/test/web/test_web.py +++ b/src/allmydata/test/web/test_web.py @@ -52,7 +52,7 @@ from allmydata.interfaces import ( ) from allmydata.mutable import servermap, publish, retrieve from .. import common_util as testutil -from ..common_py3 import TimezoneMixin +from ..common_util import TimezoneMixin from ..common_web import ( do_http, Error, diff --git a/src/allmydata/util/_python3.py b/src/allmydata/util/_python3.py index 31ac4f4ae..93e0ad7e8 100644 --- a/src/allmydata/util/_python3.py +++ b/src/allmydata/util/_python3.py @@ -52,7 +52,6 @@ PORTED_MODULES = [ "allmydata.storage.mutable", "allmydata.storage.server", "allmydata.storage.shares", - "allmydata.test.common_py3", "allmydata.test.no_network", "allmydata.uri", "allmydata.util._python3",