def testPostMethodDeCompressesDeflatedBody_deflate(self): self.requestData = None def handler(**kwargs): self.requestData = kwargs reactor = Reactor() server = HttpServer(reactor, self.port, handler, timeout=0.01) server.listen() sok = socket() sok.connect(('localhost', self.port)) bodyData = 'bodydatabodydata' bodyDataCompressed = compress(bodyData) contentLengthCompressed = len(bodyDataCompressed) sok.send(( 'POST / HTTP/1.0\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: %d\r\nContent-Encoding: deflate\r\n\r\n' % contentLengthCompressed) + bodyDataCompressed) while not self.requestData: reactor.step() self.assertEquals(dict, type(self.requestData)) self.assertTrue('Headers' in self.requestData) headers = self.requestData['Headers'] self.assertEquals('POST', self.requestData['Method']) self.assertEquals('application/x-www-form-urlencoded', headers['Content-Type']) self.assertEquals(contentLengthCompressed, int(headers['Content-Length']) ) # TS: is this correct?, maybe decompressed length? self.assertTrue('Body' in self.requestData) self.assertEquals('bodydatabodydata', self.requestData['Body'])
def testInvalidTime(self): reactor = Reactor() try: reactor.addTimer(-1, None) self.fail('should raise exeption') except Exception, e: self.assertEquals('Timeout must be >= 0. It was -1.', str(e))
def testPostMethodDeCompressesDeflatedBody_unrecognizedEncoding(self): self.requestData = None def handler(**kwargs): self.requestData = kwargs return yield reactor = Reactor() server = HttpServer(reactor, self.port, handler, timeout=0.01) server.listen() sok = socket() sok.connect(('localhost', self.port)) bodyData = 'bodydatabodydata' bodyDataCompressed = compress(bodyData) contentLengthCompressed = len(bodyDataCompressed) sok.send(( 'POST / HTTP/1.0\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: %d\r\nContent-Encoding: unknown\r\n\r\n' % contentLengthCompressed) + bodyDataCompressed) while select([sok], [], [], 0) != ([sok], [], []): reactor.step() self.assertTrue(sok.recv(4096).startswith('HTTP/1.0 400 Bad Request')) self.assertEquals(None, self.requestData)
def testPost(self): port = randint(2048, 4096) reactor = Reactor() request = "POST / HTTP/1.1\r\nHost: localhost\r\nTransfer-Encoding: chunked\r\nSOAPAction: blah\r\nUser-Agent: Weightless/v%s\r\n\r\n1\r\nA\r\n1\r\nB\r\n1\r\nC\r\n0\r\n\r\n" % WlVersion serverThread = server(port, "HTTP/1.1 200 OK\r\n\r\nresponse", request, loop=9) sentData = [] done = [] def send(data): sentData.append(data) def throw(exception): if isinstance(exception, StopIteration): done.append(True) def next(): yield "A" yield "B" yield "C" yield None reader = HttpReaderFacade(reactor, "http://localhost:%s" % port, send, errorHandler=throw, timeout=0.5, headers={'SOAPAction': 'blah'}, bodyHandler=next) reactor.addTimer(3.0, lambda: self.fail("Test Stuck")) while not done: reactor.step() self.assertEquals(['response'], sentData[1:]) self.assertEquals('200', sentData[0]['StatusCode']) expected = 'POST / HTTP/1.1\r\nHost: localhost\r\nTransfer-Encoding: chunked\r\nSOAPAction: blah\r\nUser-Agent: Weightless/v%s\r\n\r\n' % WlVersion + '1\r\nA\r\n' + '1\r\nB\r\n' + '1\r\nC\r\n' + '0\r\n\r\n' self.assertEquals(expected, "".join(request))
def setUp(self): self.tempdir = mkdtemp() fd, self.tempfile = mkstemp() os.close(fd) self.reactor = Reactor() self.mockreactor = Reactor(lambda r, w, o, t: (r, w, o)) self.port = randint(2**15, 2**16)
def startServer(port, stateDir, luceneserverPort, gatewayPort, quickCommit=False, **ignored): setSignalHandlers() print 'Firing up Index Server.' statePath = abspath(stateDir) writerReactor = Reactor() writer = writerMain( writerReactor=writerReactor, statePath=statePath, luceneserverPort=luceneserverPort, gatewayPort=gatewayPort, quickCommit=quickCommit, ) writerServer = be(writer) # Start writer in main (this) thread: consume(writerServer.once.observer_init()) registerShutdownHandler(statePath=statePath, server=writerServer, reactor=writerReactor, shutdownMustSucceed=False) print "Ready to rumble at port %s" % port stdout.flush() writerReactor.loop()
def testPostMethodDeCompressesDeflatedBody_deflate(self): self.requestData = None def handler(**kwargs): self.requestData = kwargs reactor = Reactor() server = HttpServer(reactor, self.port, handler, timeout=0.01) server.listen() sok = socket() sok.connect(('localhost', self.port)) bodyData = 'bodydatabodydata' bodyDataCompressed = compress(bodyData) contentLengthCompressed = len(bodyDataCompressed) sok.send(('POST / HTTP/1.0\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: %d\r\nContent-Encoding: deflate\r\n\r\n' % contentLengthCompressed) + bodyDataCompressed) while not self.requestData: reactor.step() self.assertEquals(dict, type(self.requestData)) self.assertTrue('Headers' in self.requestData) headers = self.requestData['Headers'] self.assertEquals('POST', self.requestData['Method']) self.assertEquals('application/x-www-form-urlencoded', headers['Content-Type']) self.assertEquals(contentLengthCompressed, int(headers['Content-Length'])) # TS: is this correct?, maybe decompressed length? self.assertTrue('Body' in self.requestData) self.assertEquals('bodydatabodydata', self.requestData['Body'])
def testPostMethodReadsBody(self): self.requestData = None def handler(**kwargs): self.requestData = kwargs reactor = Reactor() server = HttpServer(reactor, self.port, handler, timeout=0.01) server.listen() sok = socket() sok.connect(('localhost', self.port)) sok.send( 'POST / HTTP/1.0\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 8\r\n\r\nbodydata' ) while not self.requestData: reactor.step() self.assertEquals(dict, type(self.requestData)) self.assertTrue('Headers' in self.requestData) headers = self.requestData['Headers'] self.assertEquals('POST', self.requestData['Method']) self.assertEquals('application/x-www-form-urlencoded', headers['Content-Type']) self.assertEquals(8, int(headers['Content-Length'])) self.assertTrue('Body' in self.requestData) self.assertEquals('bodydata', self.requestData['Body'])
def startServer(port, stateDir, lucenePort, gatewayPort, quickCommit=False, **kwargs): setSignalHandlers() print 'Firing up API Server.' reactor = Reactor() statePath = abspath(stateDir) dna = main(reactor=reactor, port=port, statePath=statePath, lucenePort=lucenePort, gatewayPort=gatewayPort, quickCommit=quickCommit, **kwargs) server = be(dna) consume(server.once.observer_init()) registerShutdownHandler(statePath=statePath, server=server, reactor=reactor, shutdownMustSucceed=False) print "Ready to rumble at %s" % port sys.stdout.flush() reactor.loop()
def testPostMethodDeCompressesDeflatedBody_gzip(self): self.requestData = None def handler(**kwargs): self.requestData = kwargs reactor = Reactor() server = HttpServer(reactor, self.port, handler, timeout=0.01) server.listen() sok = socket() sok.connect(('localhost', self.port)) bodyData = 'bodydatabodydata' _sio = StringIO() _gzFileObj = GzipFile(filename=None, mode='wb', compresslevel=6, fileobj=_sio) _gzFileObj.write(bodyData); _gzFileObj.close() compressedBodyData = _sio.getvalue() bodyDataCompressed = compress(bodyData) contentLengthCompressed = len(bodyDataCompressed) sok.send(('POST / HTTP/1.0\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: %d\r\nContent-Encoding: gzip\r\n\r\n' % contentLengthCompressed) + bodyDataCompressed) while not self.requestData: reactor.step() self.assertEquals(dict, type(self.requestData)) self.assertTrue('Headers' in self.requestData) headers = self.requestData['Headers'] self.assertEquals('POST', self.requestData['Method']) self.assertEquals('application/x-www-form-urlencoded', headers['Content-Type']) self.assertEquals(contentLengthCompressed, int(headers['Content-Length'])) self.assertTrue('Body' in self.requestData) self.assertEquals('bodydatabodydata', self.requestData['Body'])
def setUp(self): TestCase.setUp(self) self.tempdir = mkdtemp() fd, self.tempfile = mkstemp() os.close(fd) self.reactor = Reactor() self.port = PortNumberGenerator.next()
def testClearTimer(self): port = randint(2**10, 2**16) reactor = Reactor() expectedrequest = "GET / HTTP/1.1\r\nHost: localhost\r\nUser-Agent: Weightless/v%s\r\n\r\n" % WlVersion serverThread = server(port, "HTTP/1.1 200 OK\r\n\r\nresponse", expectedrequest) self.exception = None sentData = [] def send(data): sentData.append(data) def throw(exception): self.exception = exception reader = HttpReaderFacade(reactor, "http://localhost:%s" % port, send, throw, timeout=0.01, recvSize=3) while not self.exception: reactor.step() sleep(0.02) # 2 * timeout, just to be sure self.assertTrue(isinstance(self.exception, StopIteration))
def testRemoveTimer(self): def itsTime(): pass reactor = Reactor() token1 = reactor.addTimer(0.05, itsTime) token2 = reactor.addTimer(0.051, itsTime) reactor.removeTimer(token1) self.assertEquals(1, len(reactor._timers))
def testSendHeader(self): self.kwargs = None def response(**kwargs): self.kwargs = kwargs yield 'nosense' reactor = Reactor() server = HttpServer(reactor, self.port, response) server.listen() sok = socket() sok.connect(('localhost', self.port)) sok.send( 'GET /path/here HTTP/1.0\r\nConnection: close\r\nApe-Nut: Mies\r\n\r\n' ) while not self.kwargs: reactor.step() self.assertEquals( { 'Body': '', 'RequestURI': '/path/here', 'HTTPVersion': '1.0', 'Method': 'GET', 'Headers': { 'Connection': 'close', 'Ape-Nut': 'Mies' }, 'Client': ('127.0.0.1', MATCHALL) }, self.kwargs)
def testDealWithChunkedResponse(self): port = randint(2048, 4096) reactor = Reactor() sentData = [] done = [] expectedrequest = "GET / HTTP/1.1\r\nHost: localhost\r\nUser-Agent: Weightless/v%s\r\n\r\n" % WlVersion serverThread = server(port, "\r\n".join("""HTTP/1.1 302 Found Date: Fri, 26 Oct 2007 07:23:26 GMT Server: Apache/2.2.3 (Debian) mod_python/3.2.10 Python/2.4.4 mod_ssl/2.2.3 OpenSSL/0.9.8c Location: /page/softwarestudio.page/show Transfer-Encoding: chunked Content-Type: text/html; charset=utf-8 4F <p>The document has moved <a href="/page/softwarestudio.page/show">here</a></p> 0 """.split("\n")), expectedrequest) class Handler: def send(self, data): sentData.append(data) def throw(self, exception): if isinstance(exception, StopIteration): done.append(True) reader = HttpReader(reactor, Connector(reactor, 'localhost', int(port)), Handler(), 'GET', 'localhost', '/', recvSize=5) reactor.addTimer(0.2, lambda: self.fail("Test Stuck")) while not done: reactor.step() self.assertEquals("""<p>The document has moved <a href="/page/softwarestudio.page/show">here</a></p>""", "".join(sentData[1:]))
def testInvalidPOSTRequestStartsOnlyOneTimer(self): # problem in found in OAS, timers not removed properly when whole body hasnt been read yet _httpserver.RECVSIZE = 1 reactor = Reactor() timers = [] orgAddTimer = reactor.addTimer def addTimerInterceptor(*timer): timers.append(timer) return orgAddTimer(*timer) reactor.addTimer = addTimerInterceptor server = HttpServer(reactor, self.port, lambda **kwargs: (x for x in []), timeout=0.01) server.listen() sok = socket() sok.connect(('localhost', self.port)) sok.send('POST / HTTP/1.0\r\nContent-Length: 10\r\n\r\n') reactor.step() sok.send(".") sleep(0.1) reactor.step() sok.send(".") reactor.step() sleep(0.1) while select([sok],[], [], 0) != ([sok], [], []): reactor.step() self.assertEquals(2, len(timers))
def testGlobalReactor(self): from weightless.io import reactor thereactor = Reactor() def handler(): self.assertEquals(thereactor, reactor()) thereactor.addTimer(0, handler) thereactor.step()
def startServer(**kwargs): reactor = Reactor() server = be(dna(reactor=reactor, **kwargs)) list(compose(server.once.observer_init())) print "Ready to rumble at", kwargs['port'] reactor.loop()
def testTimerDoesNotMaskAssertionErrors(self): reactor = Reactor() reactor.addTimer(0, lambda: self.fail("Assertion Error")) try: reactor.step() raise Exception('step() must raise AssertionError') except AssertionError: self.assertEquals([], reactor._timers)
def startServer(port, **kwargs): reactor = Reactor() server = be(dna(reactor, port, **kwargs)) list(compose(server.once.observer_init())) print("Ready to rumble at", port) stdout.flush() reactor.loop()
def testDoNotMaskOtherErrors(self): def raiser(*args): raise Exception('oops') reactor = Reactor(raiser) try: reactor.step() self.fail('must raise oops') except Exception, e: self.assertEquals('oops', str(e))
def startServer(port, **kwargs): reactor = Reactor() server = be(dna(reactor, port, **kwargs)) list(compose(server.once.observer_init())) print "Ready to rumble at", port stdout.flush() reactor.loop()
def testAddSocketRaisesException(self): class Sok: # raise exception when put into set def __hash__(self): raise Exception('aap') reactor = Reactor() try: reactor.addReader(Sok(), None) self.fail() except Exception, e: self.assertEquals('aap', str(e))
class AsyncReaderTest(WeightlessTestCase): def dispatch(self, *args, **kwargs): return compose(self.handler(*args, **kwargs)) def setUp(self): WeightlessTestCase.setUp(self) self.reactor = Reactor() self.port = randint(2**10, 2**16) self.httpserver = HttpServer(self.reactor, self.port, self.dispatch) self.httpserver.listen() def tearDown(self): self.httpserver.shutdown() self.reactor.shutdown() WeightlessTestCase.tearDown(self) def testHttpRequest(self): self.assertEquals('GET / HTTP/1.0\r\n', _httpRequest('GET', '/')) self.assertEquals('POST / HTTP/1.0\r\n', _httpRequest('POST', '/')) def testPassRequestThruToBackOfficeServer(self): done = [False] backofficeport = self.port + 1 def passthruhandler(*args, **kwargs): request = kwargs['RequestURI'] response = yield httpget('localhost', backofficeport, request) yield response done[0] = True self.handler = passthruhandler expectedrequest = "GET /depot?arg=1&arg=2 HTTP/1.0\r\n\r\n" responses = (i for i in ['hel', 'lo!']) backofficeserver = testserver(backofficeport, responses, expectedrequest) client = clientget('localhost', self.port, '/depot?arg=1&arg=2') while not done[0]: self.reactor.step() response = client.recv(99) self.assertEquals('hello!', response) def testConnectFails(self): exceptions = [] def failingserver(*args, **kwarg): try: response = yield httpget(*target) except Exception, e: exceptions.append(exc_info()) self.handler = failingserver clientget('localhost', self.port, '/') target = ('localhost', 'port', '/') # non-numeric port try: with self.stderr_replaced(): with self.loopingReactor(): while not exceptions: pass except Exception, e: pass
def testEmptyPath(self): port = randint(2**10, 2**16) reactor = Reactor() request = "GET / HTTP/1.1\r\nHost: localhost\r\nUser-Agent: Weightless/v%s\r\n\r\n" % WlVersion serverThread = server(port, "HTTP/1.1 200 OK\r\n\r\n", request) reader = HttpReaderFacade(reactor, "http://localhost:%s" % port, lambda data: 'a') reactor.step() reactor.step() serverThread.join()
def main(): parser = ParseArguments() parser.addOption('', '--port', type='int', mandatory=True) parser.addOption('', '--solrPort', type='int', mandatory=True) options, arguments = parser.parse() reactor = Reactor() server = createServer(reactor, **vars(options)) list(compose(server.once.observer_init())) reactor.loop()
def testAddSocketWriting(self): class Sok: def __hash__(self): return 1 reactor = Reactor() mockSok = Sok() self.assertTrue(mockSok not in reactor._writers) reactor.addWriter(mockSok, None) self.assertTrue(mockSok in reactor._writers) reactor.removeWriter(mockSok) self.assertFalse(mockSok in reactor._writers)
def testTimerDoesNotMaskKeyboardInterrupt(self): reactor = Reactor() def raiser(): raise KeyboardInterrupt('Ctrl-C') reactor.addTimer(0, raiser) try: reactor.step() self.fail('step() must raise KeyboardInterrupt') except KeyboardInterrupt: self.assertEquals([], reactor._timers)
def testAddSocketReading(self): class Sok: def __hash__(self): return 1 reactor = Reactor() mockSok = Sok() self.assertTrue(mockSok not in reactor._readers) reactor.addReader(mockSok, lambda: None) self.assertTrue(mockSok in reactor._readers) reactor.removeReader(mockSok) self.assertFalse(mockSok in reactor._readers)
def testTimerDoesNotMaskSystemExit(self): reactor = Reactor() def raiser(): raise SystemExit('shutdown...') reactor.addTimer(0, raiser) try: reactor.step() self.fail('step() must raise SystemExit') except SystemExit: self.assertEquals([], reactor._timers)
def testDoNotDieButLogOnProgrammingErrors(self): reactor = Reactor() reactor.addReader('not a sok', lambda: None) try: sys.stderr = StringIO() reactor.step() sys.stderr.seek(0) self.assertTrue('TypeError: argument must be an int' in sys.stderr.getvalue()) sys.stderr = sys.__stderr__ except TypeError: self.fail('must not fail')
def testRemoveTimerById(self): def itsTime(): pass reactor = Reactor() token1 = reactor.addTimer(0.051, itsTime) token2 = reactor.addTimer(0.051, itsTime) token3 = reactor.addTimer(0.051, itsTime) token3.time = token2.time = token1.time # whiteboxing, can happen in real code, not easy to reproduce in a test situation. self.assertEquals(token1.callback, token2.callback) self.assertEquals(token2.callback, token3.callback) reactor.removeTimer(token2) self.assertEquals([token1, token3], reactor._timers)
def _asProcess(g): if not is_generator(g): raise TypeError("asProcess() expects a generator, got %s" % repr(g)) reactor = Reactor() # Between creating and reactor.loop() there should be no statements that can raise exceptions (otherwise (epoll) fd-leaking occurs). wrapper(g, reactor) try: reactor.loop() except StopIteration, e: if e.args: return e.args[0]
def setUp(self): SeecrTestCase.setUp(self) self.reactor = Reactor() self.observer = CallTrace('Observer') self.inboxDirectory = join(self.tempdir, 'inbox') self.doneDirectory = join(self.tempdir, 'done') makedirs(self.inboxDirectory) makedirs(self.doneDirectory) self.inbox = Inbox(self.reactor, inboxDirectory=self.inboxDirectory, doneDirectory=self.doneDirectory) self.inbox.addObserver(self.observer)
def testExceptionInTimeoutCallback(self): sys.stderr = StringIO() try: def itsTime(): raise Exception('here is the exception') reactor = Reactor() token1 = reactor.addTimer(0.001, itsTime) try: reactor.step() except: self.fail('must not raise exception') finally: sys.stderr = sys.__stderr__
def testValidRequestResetsTimer(self): reactor = Reactor() server = HttpServer(reactor, self.port, lambda **kwargs: ('a' for a in range(3)), timeout=0.01, recvSize=3) server.listen() sok = socket() sok.connect(('localhost', self.port)) sok.send('GET / HTTP/1.0\r\n\r\n') sleep(0.02) for i in range(11): reactor.step() response = sok.recv(4096) self.assertEquals('aaa', response)
def testAssertionErrorInWRITECallback(self): sys.stderr = StringIO() try: def callback(): raise AssertionError('here is the assertion') reactor = Reactor(lambda r, w, o, t: (r,w,o)) reactor.addWriter(9, callback) try: reactor.step() self.fail('must raise exception') except AssertionError, e: self.assertEquals('here is the assertion', str(e)) finally: sys.stderr = sys.__stderr__
def testTimeoutOnInvalidRequest(self): port = randint(2**10, 2**16) reactor = Reactor() expectedrequest = "GET / HTTP/1.1\r\nHost: localhost\r\nUser-Agent: Weightless/v%s\r\n\r\n" % WlVersion serverThread = server(port, "HTTP/1.1 *invalid reponse* 200 OK\r\n\r\n", expectedrequest) errorArgs = [] def error(exception): errorArgs.append(exception) reader = HttpReaderFacade(reactor, "http://localhost:%s" % port, None, error, timeout=0.01) while not errorArgs: reactor.step() serverThread.join() self.assertEquals('timeout while receiving data', str(errorArgs[0]))
def testConnect(self): self.req = False serverResponse = 'Hello World' def onRequest(**kwargs): yield 'HTTP/1.0 200 OK\r\n\r\n' + serverResponse self.req = True port = randint(15000, 16000) reactor = Reactor() try: server = HttpsServer(reactor, port, onRequest, keyfile='ssl/server.pkey', certfile='ssl/server.cert') server.listen() p = Popen('wget -O - --no-check-certificate --quiet https://localhost:%s' % port, shell=True, stdout=PIPE) popenStdout = [] def readPopenStdout(): popenStdout.append(p.stdout.read()) reactor.addReader(p.stdout, readPopenStdout) while not self.req: reactor.step() reactor.step() self.assertEquals(1, len(popenStdout)) self.assertEquals(serverResponse, popenStdout[0]) finally: server.shutdown()
def testSendHeader(self): self.kwargs = None def response(**kwargs): self.kwargs = kwargs yield 'nosense' reactor = Reactor() server = HttpServer(reactor, self.port, response) server.listen() sok = socket() sok.connect(('localhost', self.port)) sok.send('GET /path/here HTTP/1.0\r\nConnection: close\r\nApe-Nut: Mies\r\n\r\n') while not self.kwargs: reactor.step() self.assertEquals({'Body': '', 'RequestURI': '/path/here', 'HTTPVersion': '1.0', 'Method': 'GET', 'Headers': {'Connection': 'close', 'Ape-Nut': 'Mies'}, 'Client': ('127.0.0.1', MATCHALL)}, self.kwargs)
def startServer(configFile, stateDir): setSignalHandlers() statePath = abspath(stateDir) config = readConfig(configFile) reactor = Reactor() server = be(dna(reactor=reactor, config=config, statePath=statePath)) consume(server.once.observer_init()) registerShutdownHandler(statePath=statePath, server=server, reactor=reactor) print "Server listening on port", config['erfgeoEnrich.portNumber'] print " - local state:", statePath stdout.flush() reactor.loop()
class HttpsServerTest(TestCase): def setUp(self): TestCase.setUp(self) self.reactor = Reactor() def tearDown(self): self.reactor.shutdown() self.reactor = None TestCase.tearDown(self) def testConnect(self): self.req = False serverResponse = 'Hello World' def onRequest(**kwargs): yield 'HTTP/1.0 200 OK\r\n\r\n' + serverResponse self.req = True port = PortNumberGenerator.next() with Reactor() as reactor: try: server = HttpsServer(reactor, port, onRequest, keyfile='ssl/server.pkey', certfile='ssl/server.cert') server.listen() p = Popen('wget -O - --no-check-certificate --quiet https://localhost:%s' % port, shell=True, stdout=PIPE) popenStdout = [] def readPopenStdout(): popenStdout.append(p.stdout.read()) reactor.addReader(p.stdout, readPopenStdout) while not self.req: reactor.step() reactor.step() self.assertEquals(1, len(popenStdout)) self.assertEquals(serverResponse, popenStdout[0]) finally: server.shutdown() # cleanup reactor.removeReader(p.stdout) def testConnectBindAddress(self): reactor = CallTrace() port = PortNumberGenerator.next() server = HttpsServer(reactor, port, lambda **kwargs: None, bindAddress='127.0.0.1', keyfile='ssl/server.pkey', certfile='ssl/server.cert') server.listen() self.assertEquals(('127.0.0.1', port), server._sok.getsockname())
def testInvalidRequestWithHalfHeader(self): reactor = Reactor() server = HttpServer(reactor, self.port, None, timeout=0.1) server.listen() sok = socket() sok.connect(('localhost', self.port)) sok.send('POST / HTTP/1.0\r\n') sok.send('Expect: something\r\n') sok.send('Content-Length: 5\r\n') sok.send('\r\n1234') sok.close() with self.stderr_replaced() as s: for i in range(4): reactor.step() self.assertEquals(1, len(reactor._readers))
def testDuplicateTimerDoesNotCauseZeroTimeout(self): itstime = [] def itsTime(): itstime.append(True) reactor = Reactor() reactor.addTimer(0.05, itsTime) reactor.addTimer(0.05, itsTime) reactor.addTimer(0.05, itsTime) reactor.addTimer(0.05, itsTime) reactor.addTimer(0.05, itsTime) while itstime != [True, True, True, True, True]: reactor.step() self.assertEquals([True, True, True, True, True], itstime)
def testImportForeignModules(self): reactor = Reactor() open(self.tempdir + '/file1.sf', 'w').write(""" import sys def main(headers={}, *args, **kwargs): yield str(sys) """) d = DynamicHtml([self.tempdir], reactor=reactor, allowedModules=['sys']) result = d.handleRequest(scheme='http', netloc='host.nl', path='/file1', query='?query=something', fragments='#fragments', arguments={'query': 'something'}) resultText = ''.join(result) self.assertTrue("<module 'sys' (built-in)>" in resultText, resultText) open(self.tempdir + '/file1.sf', 'w').write(""" import sys def main(headers={}, *args, **kwargs): yield sys.__doc__ """) reactor.step() result = ''.join(d.handleRequest(scheme='http', netloc='host.nl', path='/file1', query='?query=something', fragments='#fragments', arguments={'query': 'something'})) self.assertTrue('This module provides access to some objects' in result, result)
def testReloadImportedModules(self): reactor = Reactor() open(self.tempdir + '/file1.sf', 'w').write(""" def main(value, *args, **kwargs): return "original template %s" % value """) open(self.tempdir + '/file2.sf', 'w').write(""" import file1 def main(*args, **kwargs): yield file1.main(value='word!', *args, **kwargs) """) d = DynamicHtml([self.tempdir], reactor=reactor) result = ''.join(d.handleRequest(scheme='http', netloc='host.nl', path='/file2')) self.assertTrue('original template word!' in result, result) open(self.tempdir + '/file1.sf', 'w').write(""" def main(value, *args, **kwargs): return "changed template %s" % value """) reactor.step() result = ''.join(d.handleRequest(scheme='http', netloc='host.nl', path='/file2')) self.assertTrue('changed template word!' in result, result)
def testSuspendProtocolWithThrow(self): with Reactor() as reactor: suspend = Suspend() def handler(**httpvars): yield 'before suspend' yield suspend try: suspend.getResult() self.fail() except ValueError, e: tbstring = format_exc() yield "result = %s" % tbstring yield 'after suspend' listener = MyMockSocket() port = PortNumberGenerator.next() httpserver = HttpServer(reactor, port, handler, sok=listener) httpserver.listen() reactor.removeReader(listener) # avoid new connections httpserver._acceptor._accept() reactor.step() reactor.step() reactor.step() self.assertEquals(reactor, suspend._reactor) self.assertEquals(0, len(reactor._fds)) def raiser(): raise ValueError("BAD VALUE") try: raiser() except ValueError, e: exc_type, exc_value, exc_traceback = exc_info() suspend.throw(exc_type, exc_value, exc_traceback)
def testWrongUseAfterSuspending(self): with stdout_replaced(): with Reactor() as reactor: handle = ['initial value'] def callback(): handle[0] = reactor.suspend() sok = MockSocket() reactor.addWriter(sok, callback) reactor.step() self.assertEquals(sok.fileno(), handle[0]) try: reactor.addWriter(sok, callback) self.fail("Exception not raised") except ValueError, e: self.assertEquals('Socket is suspended', str(e)) try: reactor.addReader(sok, callback) self.fail("Exception not raised") except ValueError, e: self.assertEquals('Socket is suspended', str(e)) # cleanup fd's sok.close()
def testReactorSuspend(self): handle = ['initial value'] with stdout_replaced() as out: with Reactor() as reactor: def callback(): handle[0] = reactor.suspend() sok1 = MockSocket() reactor.addReader(sok1, callback) self.assertTrue(sok1.fileno() in reactor._fds) reactor.step() self.assertTrue(sok1.fileno() not in reactor._fds) sok2 = MockSocket() reactor.addWriter(sok2, callback) self.assertTrue(sok2.fileno() in reactor._fds) reactor.step() self.assertTrue(sok2.fileno() not in reactor._fds) self.assertTrue(handle[0] != None) self.assertTrue(handle[0] != 'initial value') # cleanup fd's sok1.close() sok2.close() self.assertEquals(2, out.getvalue().count('closing'), out.getvalue())