Python/BLIPConnectionTest.py
author morrowa
Tue Jun 23 12:46:40 2009 -0700 (2009-06-23)
changeset 53 e9f209a24d53
parent 14 bb5faa9995d5
child 56 6c3b5372a307
permissions -rw-r--r--
Connections opened by listeners now close correctly.
jens@13
     1
#!/usr/bin/env python
jens@13
     2
# encoding: utf-8
jens@13
     3
"""
jens@13
     4
BLIPConnectionTest.py
jens@13
     5
jens@13
     6
Created by Jens Alfke on 2008-06-04.
jens@13
     7
This source file is test/example code, and is in the public domain.
jens@13
     8
"""
jens@13
     9
jens@13
    10
from BLIP import Connection, OutgoingRequest, kOpening
jens@13
    11
jens@13
    12
import asyncore
jens@13
    13
from cStringIO import StringIO
jens@13
    14
from datetime import datetime
jens@13
    15
import logging
jens@13
    16
import random
jens@13
    17
import unittest
jens@13
    18
jens@13
    19
jens@14
    20
kSendInterval = 0.2
jens@14
    21
kNBatchedMessages = 10
jens@14
    22
kUrgentEvery = 4
jens@13
    23
jens@13
    24
def randbool():
jens@13
    25
    return random.randint(0,1) == 1
jens@13
    26
jens@13
    27
jens@13
    28
class BLIPConnectionTest(unittest.TestCase):
jens@13
    29
jens@13
    30
    def setUp(self):
jens@13
    31
        self.connection = Connection( ('localhost',46353) )
jens@14
    32
        self.nRepliesPending = 0
jens@13
    33
   
jens@13
    34
    def sendRequest(self):
jens@13
    35
        size = random.randint(0,32767)
jens@13
    36
        io = StringIO()
jens@13
    37
        for i in xrange(0,size):
jens@13
    38
            io.write( chr(i % 256) )
jens@13
    39
        body = io.getvalue()
jens@13
    40
        io.close
jens@13
    41
    
jens@13
    42
        req = OutgoingRequest(self.connection, body,{'Content-Type': 'application/octet-stream',
jens@13
    43
                                                     'User-Agent':  'PyBLIP',
jens@13
    44
                                                     'Date': datetime.now(),
jens@13
    45
                                                     'Size': size})
jens@13
    46
        req.compressed = randbool()
jens@14
    47
        req.urgent     = (random.randint(0,kUrgentEvery-1)==0)
jens@13
    48
        req.response.onComplete = self.gotResponse
jens@13
    49
        return req.send()
jens@13
    50
    
jens@13
    51
    def gotResponse(self, response):
jens@14
    52
        self.nRepliesPending -= 1
jens@14
    53
        logging.info("Got response!: %s (%i pending)",response,self.nRepliesPending)
jens@13
    54
        request = response.request
jens@13
    55
        assert response.body == request.body
jens@13
    56
jens@13
    57
    def testClient(self):
jens@13
    58
        lastReqTime = None
jens@14
    59
        nIterations = 0
jens@14
    60
        while nIterations < 10:
jens@13
    61
            asyncore.loop(timeout=kSendInterval,count=1)
jens@13
    62
            
jens@13
    63
            now = datetime.now()
jens@14
    64
            if self.connection.status!=kOpening and (not lastReqTime or (now-lastReqTime).microseconds >= kSendInterval*1.0e6):
jens@13
    65
                lastReqTime = now
jens@14
    66
                for i in xrange(0,kNBatchedMessages):
jens@14
    67
                    if not self.sendRequest():
jens@14
    68
                        logging.warn("Couldn't send request (connection is probably closed)")
jens@14
    69
                        break;
jens@14
    70
                    self.nRepliesPending += 1
jens@14
    71
                nIterations += 1
jens@13
    72
    
jens@13
    73
    def tearDown(self):
jens@13
    74
        self.connection.close()
morrowa@51
    75
        asyncore.loop() # got to give it time to negotiate close; this call should exit eventually
jens@13
    76
jens@13
    77
if __name__ == '__main__':
morrowa@51
    78
    logging.basicConfig(level=logging.DEBUG)
jens@13
    79
    unittest.main()