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 |