Пример #1
0
    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'])
Пример #2
0
    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)
Пример #3
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()
Пример #4
0
    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'])
Пример #5
0
    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'])
Пример #6
0
 def testGlobalReactor(self):
     from weightless.io import reactor
     thereactor = Reactor()
     def handler():
         self.assertEquals(thereactor, reactor())
     thereactor.addTimer(0, handler)
     thereactor.step()
Пример #7
0
    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)
Пример #8
0
    def testReaderOrWriterDoesNotMaskKeyboardInterrupt(self):
        fd, path = mkstemp()
        reactor = Reactor()

        def raiser():
            raise KeyboardInterrupt('Ctrl-C')

        reactor.addReader(sok=fd, sink=raiser)
        self.assertEquals([raiser],
                          [c.callback for c in reactor._readers.values()])
        try:
            reactor.step()
            self.fail('step() must raise KeyboardInterrupt')
        except KeyboardInterrupt:
            self.assertEquals([],
                              [c.callback for c in reactor._readers.values()])

        fd, path = mkstemp()
        reactor = Reactor()
        reactor.addWriter(sok=fd, source=raiser)
        try:
            reactor.step()
            self.fail('step() must raise KeyboardInterrupt')
        except KeyboardInterrupt:
            self.assertEquals([],
                              [c.callback for c in reactor._readers.values()])
Пример #9
0
    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]))
Пример #10
0
    def testSmallFragmentsWhileSendingResponse(self):
        def response(**kwargs):
            yield 'some text that is longer than '
            yield 'the lenght of fragments sent'

        reactor = Reactor()
        server = HttpServer(reactor, self.port, response, recvSize=3)
        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 reactor._writers:
            reactor.step()
        serverSok, handler = reactor._writers.items()[0]
        originalSend = serverSok.send

        def sendOnlyManagesToActuallySendThreeBytesPerSendCall(data, *options):
            originalSend(data[:3], *options)
            return 3

        serverSok.send = sendOnlyManagesToActuallySendThreeBytesPerSendCall
        for i in range(21):
            reactor.step()
        fragment = sok.recv(4096)
        self.assertEquals(
            'some text that is longer than the lenght of fragments sent',
            fragment)
Пример #11
0
    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)
Пример #12
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()
Пример #13
0
    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()
Пример #14
0
    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))
Пример #15
0
    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)
Пример #16
0
    def testReaderOrWriterDoesNotMaskSystemExit(self):
        fd, path = mkstemp()
        reactor = Reactor()

        def raiser():
            raise SystemExit('shutdown...')

        reactor.addReader(sok=fd, sink=raiser)
        self.assertEquals([raiser],
                          [c.callback for c in reactor._readers.values()])
        try:
            reactor.step()
            self.fail('step() must raise SystemExit')
        except SystemExit:
            self.assertEquals([],
                              [c.callback for c in reactor._readers.values()])

        fd, path = mkstemp()
        reactor = Reactor()
        reactor.addWriter(sok=fd, source=raiser)
        try:
            reactor.step()
            self.fail('step() must raise SystemExit')
        except SystemExit:
            self.assertEquals([],
                              [c.callback for c in reactor._readers.values()])
Пример #17
0
    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))
Пример #18
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:]))
Пример #19
0
    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'])
Пример #20
0
 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))
Пример #21
0
 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)
Пример #22
0
 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)
Пример #23
0
    def testGlobalReactor(self):
        from weightless.io import reactor
        thereactor = Reactor()

        def handler():
            self.assertEquals(thereactor, reactor())

        thereactor.addTimer(0, handler)
        thereactor.step()
Пример #24
0
 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()
Пример #25
0
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
Пример #26
0
    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))
Пример #27
0
 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)
Пример #28
0
 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()
Пример #29
0
 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)
Пример #30
0
 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')
Пример #31
0
 def testWriteFollowsRead(self):
     reactor = Reactor(lambda r,w,o,t: (r,w,o))
     t = []
     def read():
         t.append('t1')
     def write():
         t.append('t2')
     reactor.addWriter('sok1', write)
     reactor.addReader('sok1', read)
     reactor.step()
     self.assertEquals(['t1', 't2'], t)
Пример #32
0
 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)
Пример #33
0
    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)
Пример #34
0
 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__
Пример #35
0
 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')
Пример #36
0
 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)
Пример #37
0
    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)
Пример #38
0
    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)
Пример #39
0
 def testReadDeletesWrite(self):
     reactor = Reactor(lambda r,w,o,t: (r,w,o))
     self.read = self.write = False
     def read():
         self.read = True
         reactor.removeWriter('sok1')
     def write():
         self.write = True
     reactor.addWriter('sok1', write)
     reactor.addReader('sok1', read)
     reactor.step()
     self.assertTrue(self.read)
     self.assertFalse(self.write)
Пример #40
0
 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__
Пример #41
0
 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)
Пример #42
0
 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)
Пример #43
0
 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]))
Пример #44
0
    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))
Пример #45
0
 def testSuspendProtocol(self):
     reactor = Reactor(select_func=mockselect)
     suspend = Suspend()
     def handler(**httpvars):
         yield 'before suspend'
         yield suspend
         yield "result = %s" % suspend.getResult()
         yield 'after suspend'
     listener = MyMockSocket()
     port = 9
     httpserver = HttpServer(reactor, port, handler, sok=listener)
     httpserver.listen()
     reactor.removeReader(listener) # avoid new connections
     httpserver._acceptor._accept()
     reactor.step()
     reactor.step()
     self.assertEquals(1, len(reactor._writers))
     reactor.step()
     self.assertEquals(reactor, suspend._reactor)
     self.assertEquals(0, len(reactor._writers))
     suspend.resume('RESPONSE')
     reactor.step()
     reactor.step()
     reactor.step()
     self.assertEquals(['before suspend', 'result = RESPONSE', 'after suspend'], listener.data)
Пример #46
0
    def testWriteFollowsRead(self):
        reactor = Reactor(lambda r, w, o, t: (r, w, o))
        t = []

        def read():
            t.append('t1')

        def write():
            t.append('t2')

        reactor.addWriter('sok1', write)
        reactor.addReader('sok1', read)
        reactor.step()
        self.assertEquals(['t1', 't2'], t)
Пример #47
0
 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))
Пример #48
0
 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)
Пример #49
0
 def testWrongUseAfterSuspending(self):
     reactor = Reactor(select_func=mockselect)
     handle = ['initial value']
     def callback():
         handle[0] = reactor.suspend()
     sok = MockSocket()
     reactor.addWriter(sok, callback)
     reactor.step()
     self.assertEquals(sok, handle[0])
     try:
         reactor.addWriter(sok, callback)
         self.fail("Exception not raised")
     except ValueError, e:
         self.assertEquals('Socket is suspended', str(e))
Пример #50
0
    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)
Пример #51
0
 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))
Пример #52
0
 def testConnect(self):
     self.req = False
     def onRequest(**kwargs):
         self.req = True
         yield 'nosens'
     reactor = Reactor()
     server = HttpServer(reactor, self.port, onRequest)
     server.listen()
     sok = socket()
     sok.connect(('localhost', self.port))
     sok.send('GET / HTTP/1.0\r\n\r\n')
     reactor.step() # connect/accept
     reactor.step() # read GET request
     reactor.step() # call onRequest for response data
     self.assertEquals(True, self.req)
Пример #53
0
 def testGetRidOfClosedSocket(self):
     reactor = Reactor()
     sok = socket()
     sok.close()
     callbacks = []
     def callback():
         callbacks.append(True)
     reactor.addReader(sok, callback)
     reactor.addWriter(sok, callback)
     with self.stderr_replaced() as s:
         reactor.step()
         reactor.step()
         self.assertTrue("Bad file descriptor" in s.getvalue(), s.getvalue())
     self.assertEquals({}, reactor._readers)
     self.assertEquals([True, True], callbacks)
Пример #54
0
    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__
Пример #55
0
    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)
Пример #56
0
 def testReadFile(self):
     reactor = Reactor()
     fd, path = mkstemp()
     os.write(fd, 'some data')
     os.close(fd)
     try:
         f = open(path)
         def readable():
             self.readable = True
         reactor.addReader(f, readable)
         reactor.step()
         self.assertTrue(self.readable)
     finally:
         f.close()
         os.remove(path)
Пример #57
0
    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)
Пример #58
0
 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)