r47093 - Merge reactor-import-8246: Remove module-level reactor import in t.w.http

hawkowl-TA+aISz0psMTMxyoc4vAAJOcrHinNvQL0E9HWUfgJXw@public.gmane.org Sun, 27 Mar 2016 08:25:14 -0600 (MDT)
Newsgroups gmane.comp.python.twisted.commits
Message-ID <[email protected]>
Author: hawkowl
Date: Sun Mar 27 08:25:04 2016
New Revision: 47093

Added:
   trunk/twisted/web/topfiles/8246.feature
Modified:
   trunk/twisted/web/http.py
   trunk/twisted/web/test/test_web.py

Log:
Merge reactor-import-8246: Remove module-level reactor import in t.w.http

Author: hawkowl
Reviewer: adiroiban
Fixes: #8246

Modified: trunk/twisted/web/http.py
==============================================================================
--- trunk/twisted/web/http.py	(original)
+++ trunk/twisted/web/http.py	Sun Mar 27 08:25:04 2016
@@ -95,7 +95,7 @@
 from twisted.python import log
 from twisted.python.versions import Version
 from twisted.python.components import proxyForInterface
-from twisted.internet import interfaces, reactor, protocol, address
+from twisted.internet import interfaces, protocol, address
 from twisted.internet.defer import Deferred
 from twisted.internet.interfaces import IProtocol
 from twisted.protocols import policies, basic
@@ -2096,14 +2096,20 @@
 
     timeOut = 60 * 60 * 12
 
-    _reactor = reactor
-
-    def __init__(self, logPath=None, timeout=60*60*12, logFormatter=None):
+    def __init__(self, logPath=None, timeout=60*60*12, logFormatter=None,
+                 reactor=None):
         """
         @param logFormatter: An object to format requests into log lines for
             the access log.
         @type logFormatter: L{IAccessLogFormatter} provider
+
+        @param reactor: A L{IReactorTime} provider used to compute logging
+            timestamps.
         """
+        if not reactor:
+            from twisted.internet import reactor
+        self._reactor = reactor
+
         if logPath is not None:
             logPath = os.path.abspath(logPath)
         self.logPath = logPath

Modified: trunk/twisted/web/test/test_web.py
==============================================================================
--- trunk/twisted/web/test/test_web.py	(original)
+++ trunk/twisted/web/test/test_web.py	Sun Mar 27 08:25:04 2016
@@ -1045,8 +1045,7 @@
         reactor.advance(1234567890)
 
         logPath = self.mktemp()
-        factory = self.factory(logPath=logPath)
-        factory._reactor = reactor
+        factory = self.factory(logPath=logPath, reactor=reactor)
         factory.startFactory()
 
         try:
@@ -1147,7 +1146,7 @@
         reactor.advance(1234567890)
 
         timestamp = http.datetimeToLogString(reactor.seconds())
-        request = DummyRequestForLogTest(http.HTTPFactory())
+        request = DummyRequestForLogTest(http.HTTPFactory(reactor=reactor))
         request.client = IPv4Address("TCP", b"evil x-forwarded-for \x80", 12345)
         request.method = b"POS\x81"
         request.protocol = b"HTTP/1.\x82"
@@ -1188,7 +1187,7 @@
         reactor.advance(1234567890)
 
         timestamp = http.datetimeToLogString(reactor.seconds())
-        request = DummyRequestForLogTest(http.HTTPFactory())
+        request = DummyRequestForLogTest(http.HTTPFactory(reactor=reactor))
         expected = http.combinedLogFormatter(timestamp, request).replace(
             u"1.2.3.4", u"172.16.1.2")
         request.requestHeaders.setRawHeaders(b"x-forwarded-for", [header])
@@ -1357,3 +1356,29 @@
             warnings[0]['message'],
             ("twisted.web.server.string_date_time was deprecated in Twisted "
              "12.1.0: Please use twisted.web.http.stringToDatetime instead"))
+
+
+
+class ExplicitHTTPFactoryReactor(unittest.TestCase):
+    """
+    L{http.HTTPFactory} accepts explicit reactor selection.
+    """
+
+    def test_explicitReactor(self):
+        """
+        L{http.HTTPFactory.__init__} accepts a reactor argument which is set on
+        L{http.HTTPFactory._reactor}.
+        """
+        reactor = "I am a reactor!"
+        factory = http.HTTPFactory(reactor=reactor)
+        self.assertIs(factory._reactor, reactor)
+
+
+    def test_defaultReactor(self):
+        """
+        Giving no reactor argument to L{http.HTTPFactory.__init__} means it
+        will select the global reactor.
+        """
+        from twisted.internet import reactor
+        factory = http.HTTPFactory()
+        self.assertIs(factory._reactor, reactor)