2001-04-06 13:32:22 -03:00
|
|
|
# test asynchat -- requires threading
|
|
|
|
|
2001-04-14 11:35:43 -03:00
|
|
|
import thread # If this fails, we can't test this module
|
2001-04-06 13:43:49 -03:00
|
|
|
import asyncore, asynchat, socket, threading, time
|
2005-06-09 11:56:31 -03:00
|
|
|
import unittest
|
|
|
|
from test import test_support
|
2001-04-06 13:32:22 -03:00
|
|
|
|
|
|
|
HOST = "127.0.0.1"
|
|
|
|
PORT = 54321
|
|
|
|
|
|
|
|
class echo_server(threading.Thread):
|
|
|
|
|
|
|
|
def run(self):
|
|
|
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
2001-04-14 21:42:13 -03:00
|
|
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
2001-04-06 13:32:22 -03:00
|
|
|
sock.bind((HOST, PORT))
|
|
|
|
sock.listen(1)
|
|
|
|
conn, client = sock.accept()
|
|
|
|
buffer = ""
|
|
|
|
while "\n" not in buffer:
|
2005-06-09 11:56:31 -03:00
|
|
|
data = conn.recv(1)
|
2001-04-06 13:32:22 -03:00
|
|
|
if not data:
|
|
|
|
break
|
|
|
|
buffer = buffer + data
|
|
|
|
while buffer:
|
|
|
|
n = conn.send(buffer)
|
|
|
|
buffer = buffer[n:]
|
|
|
|
conn.close()
|
|
|
|
sock.close()
|
|
|
|
|
|
|
|
class echo_client(asynchat.async_chat):
|
|
|
|
|
2005-06-09 11:56:31 -03:00
|
|
|
def __init__(self, terminator):
|
2001-04-06 13:32:22 -03:00
|
|
|
asynchat.async_chat.__init__(self)
|
2005-06-09 11:56:31 -03:00
|
|
|
self.contents = None
|
2001-04-06 13:32:22 -03:00
|
|
|
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
|
self.connect((HOST, PORT))
|
2005-06-09 11:56:31 -03:00
|
|
|
self.set_terminator(terminator)
|
2001-04-06 13:32:22 -03:00
|
|
|
self.buffer = ""
|
|
|
|
|
|
|
|
def handle_connect(self):
|
2005-06-09 11:56:31 -03:00
|
|
|
pass
|
|
|
|
##print "Connected"
|
2001-04-06 13:32:22 -03:00
|
|
|
|
|
|
|
def collect_incoming_data(self, data):
|
|
|
|
self.buffer = self.buffer + data
|
|
|
|
|
|
|
|
def found_terminator(self):
|
2005-06-09 11:56:31 -03:00
|
|
|
#print "Received:", repr(self.buffer)
|
|
|
|
self.contents = self.buffer
|
2001-04-06 13:32:22 -03:00
|
|
|
self.buffer = ""
|
|
|
|
self.close()
|
|
|
|
|
|
|
|
|
2005-06-09 11:56:31 -03:00
|
|
|
class TestAsynchat(unittest.TestCase):
|
|
|
|
def setUp (self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def tearDown (self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def test_line_terminator(self):
|
|
|
|
s = echo_server()
|
|
|
|
s.start()
|
|
|
|
time.sleep(1) # Give server time to initialize
|
|
|
|
c = echo_client('\n')
|
|
|
|
c.push("hello ")
|
|
|
|
c.push("world\n")
|
|
|
|
asyncore.loop()
|
|
|
|
|
|
|
|
self.assertEqual(c.contents, 'hello world')
|
|
|
|
|
|
|
|
def test_numeric_terminator(self):
|
|
|
|
# Try reading a fixed number of bytes
|
|
|
|
s = echo_server()
|
|
|
|
s.start()
|
|
|
|
time.sleep(1) # Give server time to initialize
|
|
|
|
c = echo_client(6L)
|
|
|
|
c.push("hello ")
|
|
|
|
c.push("world\n")
|
|
|
|
asyncore.loop()
|
|
|
|
|
|
|
|
self.assertEqual(c.contents, 'hello ')
|
|
|
|
|
|
|
|
|
|
|
|
def test_main(verbose=None):
|
|
|
|
test_support.run_unittest(TestAsynchat)
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
test_main(verbose=True)
|