Ejemplo n.º 1
0
 def testGlobalReactor(self):
     from weightless.io import reactor
     thereactor = Reactor()
     def handler():
         self.assertEquals(thereactor, reactor())
     thereactor.addTimer(0, handler)
     thereactor.step()
Ejemplo n.º 2
0
 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))
Ejemplo n.º 3
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:]))
Ejemplo n.º 4
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]))
Ejemplo n.º 5
0
 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))
Ejemplo n.º 6
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()
Ejemplo n.º 7
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))
Ejemplo n.º 8
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)
Ejemplo n.º 9
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()
Ejemplo n.º 10
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)
Ejemplo n.º 11
0
 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))
Ejemplo n.º 12
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)
Ejemplo n.º 13
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)
Ejemplo n.º 14
0
    def testGlobalReactor(self):
        from weightless.io import reactor
        thereactor = Reactor()

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

        thereactor.addTimer(0, handler)
        thereactor.step()
Ejemplo n.º 15
0
    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))
Ejemplo n.º 16
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)
Ejemplo n.º 17
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)
Ejemplo n.º 18
0
 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)
Ejemplo n.º 19
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)
Ejemplo n.º 20
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)
Ejemplo n.º 21
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)
Ejemplo n.º 22
0
    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)
Ejemplo n.º 23
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)
Ejemplo n.º 24
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)
Ejemplo n.º 25
0
    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)
Ejemplo n.º 26
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)
Ejemplo n.º 27
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)
Ejemplo n.º 28
0
    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()
Ejemplo n.º 29
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))
Ejemplo n.º 30
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))
Ejemplo n.º 31
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)
Ejemplo n.º 32
0
 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]))
Ejemplo n.º 33
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:]))
Ejemplo n.º 34
0
    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)
Ejemplo n.º 35
0
    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))
Ejemplo n.º 36
0
    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)
Ejemplo n.º 37
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])
Ejemplo n.º 38
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'])
Ejemplo n.º 39
0
 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')
Ejemplo n.º 40
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])
Ejemplo n.º 41
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])
Ejemplo n.º 42
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])
Ejemplo n.º 43
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'])
Ejemplo n.º 44
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()
Ejemplo n.º 45
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__
Ejemplo n.º 46
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))
Ejemplo n.º 47
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()
Ejemplo n.º 48
0
    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()
Ejemplo n.º 49
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)
Ejemplo n.º 50
0
    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)
Ejemplo n.º 51
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)
Ejemplo n.º 52
0
    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)
Ejemplo n.º 53
0
    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)
Ejemplo n.º 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__
Ejemplo n.º 55
0
    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)
Ejemplo n.º 56
0
    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')
Ejemplo n.º 57
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)
Ejemplo n.º 58
0
 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))
Ejemplo n.º 59
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)
Ejemplo n.º 60
0
 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 = []