def testGlobalReactor(self): from weightless.io import reactor thereactor = Reactor() def handler(): self.assertEquals(thereactor, reactor()) thereactor.addTimer(0, handler) thereactor.step()
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 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 testTimeoutOnServerGoingSilentAfterHeaders(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\n", expectedrequest, delay=1) errorArgs = [] class Handler: def send(self, data): pass def throw(self, exception): errorArgs.append(exception) def error(exception): errorArgs.append(exception) reader = HttpReader(reactor, Connector(reactor, 'localhost', port), Handler(), "GET", "localhost", "/", timeout=0.01) reactor.addTimer(0.2, lambda: self.fail("Test Stuck")) while not errorArgs: reactor.step() serverThread.join() self.assertEquals('timeout while receiving data', str(errorArgs[0]))
def testPostMethodTimesOutOnBadBody(self): self.requestData = None def handler(**kwargs): self.requestData = kwargs done = [] def onDone(): fromServer = sok.recv(1024) self.assertTrue('HTTP/1.0 400 Bad Request' in fromServer) done.append(True) reactor = Reactor() server = HttpServer(reactor, self.port, handler, timeout=0.01) server.listen() reactor.addTimer(0.02, onDone) 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\n' ) while not done: reactor.step()
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 testGetRidOfBadFileDescriptors(self): reactor = Reactor() class BadSocket(object): def fileno(self): return 88 def close(self): raise Exception('hell breaks loose') self.timeout = False def timeout(): self.timeout = True reactor.addReader(99, lambda: None) # broken reactor.addWriter(99, lambda: None) # broken reactor.addReader(BadSocket(), lambda: None) # even more broken reactor.addTimer(0.01, timeout) with self.stderr_replaced() as s: for i in range(10): if self.timeout: break reactor.step() self.assertTrue("Bad file descriptor" in s.getvalue(), s.getvalue()) self.assertTrue(self.timeout) self.assertEquals({}, reactor._readers) self.assertEquals({}, reactor._writers) self.assertEquals([], reactor._timers)
def testReadChunkedAndCompressedPost(self): postData = 'AhjBeehCeehAhjBeehCeehAhjBeehCeehAhjBeehCeeh' postDataCompressed = compress(postData) self.assertEquals(20, len(postDataCompressed)) self.assertEquals(15, len(postDataCompressed[:15])) self.assertEquals(5, len(postDataCompressed[15:])) self.requestData = {} def handler(**kwargs): self.requestData = kwargs reactor = Reactor() server = HttpServer(reactor, self.port, handler, timeout=0.01, recvSize=3) server.listen() sok = socket() sok.connect(('localhost', self.port)) postString = 'POST / HTTP/1.1\r\nContent-Type: application/x-www-form-urlencoded\r\nTransfer-Encoding: chunked\r\nContent-Encoding: deflate\r\n\r\nf\r\n%s\r\n5\r\n%s\r\n0\r\n' % ( postDataCompressed[:15], postDataCompressed[15:]) sok.send(postString) reactor.addTimer(0.2, lambda: self.fail("Test Stuck")) while self.requestData.get('Body', None) != postData: reactor.step()
def testSelfModifyingLoopSkipsEverySecondTimerAndDeletesTheWrongOneBUG( self): done = [] reactor = Reactor() def callback1(): self.assertEquals([], done) done.append(1) self.assertEquals([timer2, timer3], reactor._timers) def callback2(): self.assertEquals([1], done) done.append(2) self.assertEquals([timer3], reactor._timers) def callback3(): self.assertEquals([1, 2], done) done.append(3) self.assertEquals([], reactor._timers) timer1 = reactor.addTimer(0.0001, callback1) timer2 = reactor.addTimer(0.0002, callback2) timer3 = reactor.addTimer(0.0003, callback3) self.assertEquals([timer1, timer2, timer3], reactor._timers) sleep(0.04) reactor.step() self.assertEquals([1, 2, 3], done) self.assertEquals([], reactor._timers)
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 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 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 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 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 testReadFollowsTimer(self): reactor = Reactor(lambda r,w,o,t: (r,w,o)) t = [] def timer(): t.append('t1') def read(): t.append('t2') reactor.addTimer(0, timer) reactor.addReader('sok1', read) reactor.step() self.assertEquals(['t1', 't2'], t)
def testShouldCallPreviouslyRegisteredSignalHandlersAfterHandleShutdown( self): reactor = Reactor() called = [] def handleShutdown(): called.append('handleShutdown') testCoName = currentframe().f_code.co_name def prevIntHandler(signum, frame): self.assertEqual(SIGINT, signum) self.assertEqual(testCoName, frame.f_code.co_name) called.append('prevIntHandler') trace = CallTrace('Observer', methods={'handleShutdown': handleShutdown}) top = be(( Observable(), ( Observable(), # Only once calls walk the observer tree. (trace, ), ), )) origIntHandler = signal(SIGINT, prevIntHandler) try: shutdownHandler = registerShutdownHandler(statePath=self.tempdir, server=top, reactor=reactor) reactor.addTimer(0.01, lambda: None) with stdout_replaced() as output: try: kill(getpid(), SIGINT) reactor.loop() self.fail('should terminate') except KeyboardInterrupt: pass self.assertTrue( 'Scheduled for immediate shutdown.\n' in output.getvalue(), output.getvalue()) self.assertTrue('Shutdown completed.\n' in output.getvalue(), output.getvalue()) finally: shutdownHandler.unregister() signal(SIGINT, origIntHandler) self.assertEqual(['handleShutdown'], trace.calledMethodNames()) self.assertEqual( ((), {}), (trace.calledMethods[0].args, trace.calledMethods[0].kwargs)) self.assertEqual(['handleShutdown', 'prevIntHandler'], called)
def testMustRemoveToBeExecutedTimerNotTheFirstOne(self): reactor = Reactor() executed = [] def addNewTimer(): reactor.addTimer(0.001, lambda: executed.append('newTimer')) sleep(0.15) reactor.addTimer(0, lambda: (addNewTimer(), executed.append('zero'))) reactor.addTimer(0.1, lambda: executed.append('one')) reactor.step() reactor.step() self.assertEquals(0, len(reactor._timers)) self.assertEquals(['zero', 'newTimer', 'one'], executed)
def testTimerDeletesRead(self): reactor = Reactor(lambda r,w,o,t: (r,w,o)) self.read = self.timer = False def read(): self.read = True def timer(): self.timer = True reactor.removeReader('sok1') reactor.addTimer(0, timer) reactor.addReader('sok1', read) reactor.step() self.assertTrue(self.timer) self.assertFalse(self.read)
def testReadFollowsTimer(self): reactor = Reactor(lambda r, w, o, t: (r, w, o)) t = [] def timer(): t.append('t1') def read(): t.append('t2') reactor.addTimer(0, timer) reactor.addReader('sok1', read) reactor.step() self.assertEquals(['t1', 't2'], t)
def testReadChunkedPost(self): self.requestData = {} def handler(**kwargs): self.requestData = kwargs reactor = Reactor() server = HttpServer(reactor, self.port, handler, timeout=0.01, recvSize=3) server.listen() sok = socket() sok.connect(('localhost', self.port)) sok.send('POST / HTTP/1.0\r\nContent-Type: application/x-www-form-urlencoded\r\nTransfer-Encoding: chunked\r\n\r\n5\r\nabcde\r\n5\r\nfghij\r\n0\r\n') reactor.addTimer(0.2, lambda: self.fail("Test Stuck")) while self.requestData.get('Body', None) != 'abcdefghij': reactor.step()
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 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 testTimerDeletesRead(self): reactor = Reactor(lambda r, w, o, t: (r, w, o)) self.read = self.timer = False def read(): self.read = True def timer(): self.timer = True reactor.removeReader('sok1') reactor.addTimer(0, timer) reactor.addReader('sok1', read) reactor.step() self.assertTrue(self.timer) self.assertFalse(self.read)
def testTimeoutOnSilentServer(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, "", expectedrequest) errorArgs = [] class Handler: def throw(self, exception): errorArgs.append(exception) def error(exception): errorArgs.append(exception) reader = HttpReader(reactor, Connector(reactor, 'localhost', port), Handler(), "GET", "localhost", "/", timeout=0.01) reactor.addTimer(0.2, lambda: self.fail("Test Stuck")) while not errorArgs: reactor.step() serverThread.join() self.assertEquals('timeout while receiving data', str(errorArgs[0]))
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 testRemoveTimerWithSameTimestamp(self): reactor = Reactor() token1 = reactor.addTimer(1, lambda: None) token2 = reactor.addTimer(1, lambda: None) token2.time = token1.time reactor.removeTimer(token2) self.assertEquals([id(token1)], [id(t) for t in reactor._timers]) reactor.removeTimer(token1) self.assertEquals([], reactor._timers)
def testShouldNotRegisteredTwice(self): reactor = Reactor() trace = CallTrace('Observer') top = be(( Observable(), ( Observable(), # Only once calls walk the observer tree. (trace, ), ), )) self._createShutdownHandler(statePath=self.tempdir, server=top, reactor=reactor) try: registerShutdownHandler(statePath=self.tempdir, server='ignored', reactor='ignored') except AssertionError as e: self.assertEqual('Handler already registered, aborting.', str(e)) else: self.fail() reactor.addTimer(0.01, lambda: None) with stdout_replaced() as output: try: kill(getpid(), SIGTERM) reactor.loop() self.fail('should terminate') except SystemExit as e: self.assertEqual((0, ), e.args) self.assertTrue( 'Scheduled for immediate shutdown.\n' in output.getvalue(), output.getvalue()) self.assertTrue('Shutdown completed.\n' in output.getvalue(), output.getvalue()) # Only once! self.assertEqual(['handleShutdown'], trace.calledMethodNames()) self.assertEqual( ((), {}), (trace.calledMethods[0].args, trace.calledMethods[0].kwargs))
def testReadMultipartFormEndBoundary(self): httpRequest = open(inmydir('data/multipart-data-04')).read() self.requestData = {} def handler(**kwargs): self.requestData = kwargs reactor = Reactor() server = HttpServer(reactor, self.port, handler) server.listen() sok = socket() sok.connect(('localhost', self.port)) sok.send(httpRequest) reactor.addTimer(2, lambda: self.fail("Test Stuck")) while self.requestData.get('Form', None) == None: reactor.step() form = self.requestData['Form'] self.assertEquals(1, len(form)) self.assertEquals(3521*'X', form['id'][0])
def XXX_testPostMultipartFormCompressed(self): """Not yet""" httpRequest = open(inmydir('data/multipart-data-01-compressed')).read() self.requestData = {} def handler(**kwargs): self.requestData = kwargs reactor = Reactor() server = HttpServer(reactor, self.port, handler) server.listen() sok = socket() sok.connect(('localhost', self.port)) sok.send(httpRequest) reactor.addTimer(2, lambda: self.fail("Test Stuck")) while self.requestData.get('Form', None) == None: reactor.step() form = self.requestData['Form'] self.assertEquals(4, len(form)) self.assertEquals(['SOME ID'], form['id'])
def testInterruptedSelectDoesNotDisturbTimer(self): reactor = Reactor() self.time = False def signalHandler(signum, frame): self.alarm = True def timeout(): self.time = time() signal(SIGALRM, signalHandler) targetTime = time() + 1.1 reactor.addTimer(1.1, timeout) alarm(1) # alarm only accept ints.... try: with self.stderr_replaced() as s: while not self.time: reactor.step() self.assertTrue("4, 'Interrupted system call'" in s.getvalue(), s.getvalue()) self.assertTrue(self.alarm) self.assertTrue(targetTime - 0.01 < self.time, targetTime + 0.01) except ioerror: self.fail('must not fail on Interrupted system call')
def testRequestAndHeaders(self): port = randint(2**10, 2**16) v = 'vx.y.z' expectedrequest = "GET /aap/noot/mies HTTP/1.1\r\nHost: localhost\r\nUser-Agent: Weightless/%s\r\n\r\n" % v dataReceived = [] serverThread = server(port, "HTTP/1.1 200 OK\r\ncOnteNt-type: text/html\r\n\r\nHello World!", expectedrequest) class Generator(object): def __init__(self): self.throw = None self.next = None def send(self, data): dataReceived.append(data) reactor = Reactor() connection = Connector(reactor, 'localhost', port) reader = HttpReader(reactor, connection, Generator(), 'GET', 'localhost', '/aap/noot/mies', recvSize=7) reactor.addTimer(0.1, lambda: self.fail("Test Stuck")) while 'Hello World!' != "".join((x for x in dataReceived[1:] if x)): reactor.step() serverThread.join() self.assertEquals({'HTTPVersion': '1.1', 'StatusCode': '200', 'ReasonPhrase': 'OK', 'Headers': {'Content-Type': 'text/html'}, 'Client': ('127.0.0.1', MATCHALL)}, dataReceived[0])
def testReadMultipartFormEndBoundary(self): httpRequest = open(inmydir('data/multipart-data-04')).read() self.requestData = {} def handler(**kwargs): self.requestData = kwargs reactor = Reactor() server = HttpServer(reactor, self.port, handler) server.listen() sok = socket() sok.connect(('localhost', self.port)) sok.send(httpRequest) reactor.addTimer(2, lambda: self.fail("Test Stuck")) while self.requestData.get('Form', None) == None: reactor.step() form = self.requestData['Form'] self.assertEquals(1, len(form)) self.assertEquals(3521 * 'X', form['id'][0])
def testRequestAndHeaders(self): port = randint(2**10, 2**16) v = 'vx.y.z' expectedrequest = "GET /aap/noot/mies HTTP/1.1\r\nHost: localhost\r\nUser-Agent: Weightless/%s\r\n\r\n" % v dataReceived = [] serverThread = server( port, "HTTP/1.1 200 OK\r\ncOnteNt-type: text/html\r\n\r\nHello World!", expectedrequest) class Generator(object): def __init__(self): self.throw = None self.next = None def send(self, data): dataReceived.append(data) reactor = Reactor() connection = Connector(reactor, 'localhost', port) reader = HttpReader(reactor, connection, Generator(), 'GET', 'localhost', '/aap/noot/mies', recvSize=7) reactor.addTimer(0.1, lambda: self.fail("Test Stuck")) while 'Hello World!' != "".join((x for x in dataReceived[1:] if x)): reactor.step() serverThread.join() self.assertEquals( { 'HTTPVersion': '1.1', 'StatusCode': '200', 'ReasonPhrase': 'OK', 'Headers': { 'Content-Type': 'text/html' }, 'Client': ('127.0.0.1', MATCHALL) }, dataReceived[0])
def testPostMethodTimesOutOnBadBody(self): self.requestData = None def handler(**kwargs): self.requestData = kwargs done = [] def onDone(): fromServer = sok.recv(1024) self.assertTrue('HTTP/1.0 400 Bad Request' in fromServer) done.append(True) reactor = Reactor() server = HttpServer(reactor, self.port, handler, timeout=0.01) server.listen() reactor.addTimer(0.02, onDone) 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\n') while not done: reactor.step()
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 testReadChunkedAndCompressedPost(self): postData = 'AhjBeehCeehAhjBeehCeehAhjBeehCeehAhjBeehCeeh' postDataCompressed = compress(postData) self.assertEquals(20, len(postDataCompressed)) self.assertEquals(15, len(postDataCompressed[:15])) self.assertEquals(5, len(postDataCompressed[15:])) self.requestData = {} def handler(**kwargs): self.requestData = kwargs reactor = Reactor() server = HttpServer(reactor, self.port, handler, timeout=0.01, recvSize=3) server.listen() sok = socket() sok.connect(('localhost', self.port)) postString = 'POST / HTTP/1.1\r\nContent-Type: application/x-www-form-urlencoded\r\nTransfer-Encoding: chunked\r\nContent-Encoding: deflate\r\n\r\nf\r\n%s\r\n5\r\n%s\r\n0\r\n' % (postDataCompressed[:15], postDataCompressed[15:]) sok.send(postString) reactor.addTimer(0.2, lambda: self.fail("Test Stuck")) while self.requestData.get('Body', None) != postData: reactor.step()
def testReadChunkedPost(self): self.requestData = {} def handler(**kwargs): self.requestData = kwargs reactor = Reactor() server = HttpServer(reactor, self.port, handler, timeout=0.01, recvSize=3) server.listen() sok = socket() sok.connect(('localhost', self.port)) sok.send( 'POST / HTTP/1.0\r\nContent-Type: application/x-www-form-urlencoded\r\nTransfer-Encoding: chunked\r\n\r\n5\r\nabcde\r\n5\r\nfghij\r\n0\r\n' ) reactor.addTimer(0.2, lambda: self.fail("Test Stuck")) while self.requestData.get('Body', None) != 'abcdefghij': reactor.step()
def testWindowsPostMultipartForm(self): httpRequest = open(inmydir('data/multipart-data-02')).read() self.requestData = {} def handler(**kwargs): self.requestData = kwargs reactor = Reactor() server = HttpServer(reactor, self.port, handler) server.listen() sok = socket() sok.connect(('localhost', self.port)) sok.send(httpRequest) reactor.addTimer(2, lambda: self.fail("Test Stuck")) while self.requestData.get('Form', None) == None: reactor.step() form = self.requestData['Form'] self.assertEquals(4, len(form)) self.assertEquals(['SOME ID'], form['id']) self.assertEquals(1, len(form['somename'])) filename, mimetype, data = form['somename'][0] self.assertEquals('Bank Gothic Medium BT.ttf', filename) self.assertEquals('application/octet-stream', mimetype)
def testSelfModifyingLoopSkipsEverySecondTimerAndDeletesTheWrongOneBUG(self): done = [] reactor = Reactor() def callback1(): self.assertEquals([], done) done.append(1) self.assertEquals([timer2, timer3], reactor._timers) def callback2(): self.assertEquals([1], done) done.append(2) self.assertEquals([timer3], reactor._timers) def callback3(): self.assertEquals([1,2], done) done.append(3) self.assertEquals([], reactor._timers) timer1 = reactor.addTimer(0.0001, callback1) timer2 = reactor.addTimer(0.0002, callback2) timer3 = reactor.addTimer(0.0003, callback3) self.assertEquals([timer1, timer2, timer3], reactor._timers) sleep(0.04) reactor.step() self.assertEquals([1,2,3], done) self.assertEquals([], reactor._timers)
def testTextFileSeenAsFile(self): httpRequest = open(inmydir('data/multipart-data-03')).read() self.requestData = {} def handler(**kwargs): self.requestData = kwargs reactor = Reactor() server = HttpServer(reactor, self.port, handler) server.listen() sok = socket() sok.connect(('localhost', self.port)) sok.send(httpRequest) reactor.addTimer(2, lambda: self.fail("Test Stuck")) while self.requestData.get('Form', None) == None: reactor.step() form = self.requestData['Form'] self.assertEquals(4, len(form)) self.assertEquals(['SOME ID'], form['id']) self.assertEquals(1, len(form['somename'])) filename, mimetype, data = form['somename'][0] self.assertEquals('hello.bas', filename) self.assertEquals('text/plain', mimetype)
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 testInvalidGETRequestStartsOnlyOneTimer(self): _httpserver.RECVSIZE = 3 reactor = Reactor() timers = [] orgAddTimer = reactor.addTimer def addTimerInterceptor(*timer): timers.append(timer) return orgAddTimer(*timer) reactor.addTimer = addTimerInterceptor server = HttpServer(reactor, self.port, None, timeout=0.01) server.listen() sok = socket() sok.connect(('localhost', self.port)) sok.send('GET HTTP/1.0\r\n\r\n') # no path while select([sok],[], [], 0) != ([sok], [], []): reactor.step() response = sok.recv(4096) self.assertEquals('HTTP/1.0 400 Bad Request\r\n\r\n', response) self.assertEquals(1, len(timers))
def testTimer(self): reactor = Reactor() def itsTime(): itstime.append(True) reactor.addTimer(0.05, itsTime) reactor.addTimer(0.5, itsTime) reactor.addTimer(0.25, itsTime) start = time() itstime = [] while not itstime: reactor.step() self.assertTrue(0.04 < time() - start < 0.06, time() - start) itstime = [] while not itstime: reactor.step() self.assertTrue(0.20 < time() - start < 0.30, time()-start) itstime = [] while not itstime: reactor.step() self.assertTrue(0.45 < time() - start < 0.55, time()-start) itstime = []