cubicweb/devtools/httptest.py
changeset 12530 9d88e1177c35
parent 11767 432f87a63057
child 12531 2b9e815d20dc
equal deleted inserted replaced
12529:7276f1c89ddd 12530:9d88e1177c35
    24 
    24 
    25 import random
    25 import random
    26 import threading
    26 import threading
    27 import socket
    27 import socket
    28 
    28 
    29 from six import PY3
       
    30 from six.moves import range, http_client
    29 from six.moves import range, http_client
    31 from six.moves.urllib.parse import urlparse
    30 from six.moves.urllib.parse import urlparse
    32 
    31 
    33 
    32 
    34 from cubicweb.devtools.testlib import CubicWebTC
    33 from cubicweb.devtools.testlib import CubicWebTC
    62             s.close()
    61             s.close()
    63     raise RuntimeError('get_available_port([ports_range]) cannot find an available port')
    62     raise RuntimeError('get_available_port([ports_range]) cannot find an available port')
    64 
    63 
    65 
    64 
    66 class _CubicWebServerTC(CubicWebTC):
    65 class _CubicWebServerTC(CubicWebTC):
    67     """Class for running a Twisted-based test web server.
    66     """Base class for running a test web server.
    68     """
    67     """
    69     ports_range = range(7000, 8000)
    68     ports_range = range(7000, 8000)
    70 
    69 
    71     def start_server(self):
    70     def start_server(self):
    72         raise NotImplementedError
    71         raise NotImplementedError
   131         super(_CubicWebServerTC, self).tearDown()
   130         super(_CubicWebServerTC, self).tearDown()
   132 
   131 
   133 
   132 
   134 class CubicWebServerTC(_CubicWebServerTC):
   133 class CubicWebServerTC(_CubicWebServerTC):
   135     def start_server(self):
   134     def start_server(self):
   136         if PY3:
       
   137             self.skipTest('not using twisted on python3')
       
   138         from twisted.internet import reactor
       
   139         from cubicweb.etwist.server import run
       
   140         # use a semaphore to avoid starting test while the http server isn't
       
   141         # fully initilialized
       
   142         semaphore = threading.Semaphore(0)
       
   143         def safe_run(*args, **kwargs):
       
   144             try:
       
   145                 run(*args, **kwargs)
       
   146             finally:
       
   147                 semaphore.release()
       
   148 
       
   149         reactor.addSystemEventTrigger('after', 'startup', semaphore.release)
       
   150         t = threading.Thread(target=safe_run, name='cubicweb_test_web_server',
       
   151                 args=(self.config, True), kwargs={'repo': self.repo})
       
   152         self.web_thread = t
       
   153         t.start()
       
   154         semaphore.acquire()
       
   155         if not self.web_thread.isAlive():
       
   156             # XXX race condition with actual thread death
       
   157             raise RuntimeError('Could not start the web server')
       
   158         #pre init utils connection
       
   159         parseurl = urlparse(self.config['base-url'])
       
   160         assert parseurl.port == self.config['port'], (self.config['base-url'], self.config['port'])
       
   161         self._web_test_cnx = http_client.HTTPConnection(parseurl.hostname,
       
   162                                                         parseurl.port)
       
   163         self._ident_cookie = None
       
   164 
       
   165     def stop_server(self, timeout=15):
       
   166         """Stop the webserver, waiting for the thread to return"""
       
   167         from twisted.internet import reactor
       
   168         if self._web_test_cnx is None:
       
   169             self.web_logout()
       
   170             self._web_test_cnx.close()
       
   171         try:
       
   172             reactor.stop()
       
   173             self.web_thread.join(timeout)
       
   174             assert not self.web_thread.isAlive()
       
   175 
       
   176         finally:
       
   177             reactor.__init__()
       
   178 
       
   179 
       
   180 class CubicWebWsgiTC(CubicWebServerTC):
       
   181     def start_server(self):
       
   182         from cubicweb.wsgi.handler import CubicWebWSGIApplication
   135         from cubicweb.wsgi.handler import CubicWebWSGIApplication
   183         from wsgiref import simple_server
   136         from wsgiref import simple_server
   184         from six.moves import queue
   137         from six.moves import queue
   185 
   138 
   186         config = self.config
   139         config = self.config