Added testcases for GreenPipe.seek and truncate, fixed problem with GreenPipe(file_name).
This commit is contained in:
@@ -376,7 +376,7 @@ class GreenPipe(_fileobject):
|
|||||||
raise TypeError('f(ile) should be int, str, unicode or file, not %r' % f)
|
raise TypeError('f(ile) should be int, str, unicode or file, not %r' % f)
|
||||||
|
|
||||||
if isinstance(f, basestring):
|
if isinstance(f, basestring):
|
||||||
f = open(f, mode, bufsize=0)
|
f = open(f, mode, 0)
|
||||||
|
|
||||||
if isinstance(f, int):
|
if isinstance(f, int):
|
||||||
fileno = f
|
fileno = f
|
||||||
|
@@ -13,6 +13,7 @@ import eventlet
|
|||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import array
|
import array
|
||||||
|
import tempfile, shutil
|
||||||
|
|
||||||
def bufsized(sock, size=1):
|
def bufsized(sock, size=1):
|
||||||
""" Resize both send and receive buffers on a socket.
|
""" Resize both send and receive buffers on a socket.
|
||||||
@@ -31,7 +32,7 @@ def min_buf_size():
|
|||||||
test_sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1)
|
test_sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1)
|
||||||
return test_sock.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)
|
return test_sock.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)
|
||||||
|
|
||||||
class TestGreenIo(LimitedTestCase):
|
class TestGreenSocket(LimitedTestCase):
|
||||||
def assertWriteToClosedFileRaises(self, fd):
|
def assertWriteToClosedFileRaises(self, fd):
|
||||||
if sys.version_info[0]<3:
|
if sys.version_info[0]<3:
|
||||||
# 2.x socket._fileobjects are odd: writes don't check
|
# 2.x socket._fileobjects are odd: writes don't check
|
||||||
@@ -450,6 +451,56 @@ class TestGreenIo(LimitedTestCase):
|
|||||||
server.close()
|
server.close()
|
||||||
client.close()
|
client.close()
|
||||||
|
|
||||||
|
@skip_with_pyevent
|
||||||
|
def test_raised_multiple_readers(self):
|
||||||
|
debug.hub_prevent_multiple_readers(True)
|
||||||
|
|
||||||
|
def handle(sock, addr):
|
||||||
|
sock.recv(1)
|
||||||
|
sock.sendall("a")
|
||||||
|
raise eventlet.StopServe()
|
||||||
|
listener = eventlet.listen(('127.0.0.1', 0))
|
||||||
|
server = eventlet.spawn(eventlet.serve,
|
||||||
|
listener,
|
||||||
|
handle)
|
||||||
|
def reader(s):
|
||||||
|
s.recv(1)
|
||||||
|
|
||||||
|
s = eventlet.connect(('127.0.0.1', listener.getsockname()[1]))
|
||||||
|
a = eventlet.spawn(reader, s)
|
||||||
|
eventlet.sleep(0)
|
||||||
|
self.assertRaises(RuntimeError, s.recv, 1)
|
||||||
|
s.sendall('b')
|
||||||
|
a.wait()
|
||||||
|
|
||||||
|
|
||||||
|
class TestGreenPipe(LimitedTestCase):
|
||||||
|
def setUp(self):
|
||||||
|
super(self.__class__, self).setUp()
|
||||||
|
self.tempdir = tempfile.mkdtemp('_green_pipe_test')
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
shutil.rmtree(self.tempdir)
|
||||||
|
super(self.__class__, self).tearDown()
|
||||||
|
|
||||||
|
def test_pipe(self):
|
||||||
|
r,w = os.pipe()
|
||||||
|
rf = greenio.GreenPipe(r, 'r');
|
||||||
|
wf = greenio.GreenPipe(w, 'w', 0);
|
||||||
|
def sender(f, content):
|
||||||
|
for ch in content:
|
||||||
|
eventlet.sleep(0.0001)
|
||||||
|
f.write(ch)
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
one_line = "12345\n";
|
||||||
|
eventlet.spawn(sender, wf, one_line*5)
|
||||||
|
for i in xrange(5):
|
||||||
|
line = rf.readline()
|
||||||
|
eventlet.sleep(0.01)
|
||||||
|
self.assertEquals(line, one_line)
|
||||||
|
self.assertEquals(rf.readline(), '')
|
||||||
|
|
||||||
def test_pipe_read(self):
|
def test_pipe_read(self):
|
||||||
# ensure that 'readline' works properly on GreenPipes when data is not
|
# ensure that 'readline' works properly on GreenPipes when data is not
|
||||||
# immediately available (fd is nonblocking, was raising EAGAIN)
|
# immediately available (fd is nonblocking, was raising EAGAIN)
|
||||||
@@ -501,28 +552,33 @@ class TestGreenIo(LimitedTestCase):
|
|||||||
% (expected[:4], expected[-4:], buf[:4], buf[-4:], i))
|
% (expected[:4], expected[-4:], buf[:4], buf[-4:], i))
|
||||||
gt.wait()
|
gt.wait()
|
||||||
|
|
||||||
|
def test_seek_on_buffered_pipe(self):
|
||||||
|
f = greenio.GreenPipe(self.tempdir+"/TestFile", 'w+', 1024)
|
||||||
|
self.assertEquals(f.tell(),0)
|
||||||
|
f.seek(0,2)
|
||||||
|
self.assertEquals(f.tell(),0)
|
||||||
|
f.write('1234567890')
|
||||||
|
f.seek(0,2)
|
||||||
|
self.assertEquals(f.tell(),10)
|
||||||
|
f.seek(0)
|
||||||
|
value = f.read(1)
|
||||||
|
self.assertEqual(value, '1')
|
||||||
|
self.assertEquals(f.tell(),1)
|
||||||
|
value = f.read(1)
|
||||||
|
self.assertEqual(value, '2')
|
||||||
|
self.assertEquals(f.tell(),2)
|
||||||
|
f.seek(0, 1)
|
||||||
|
self.assertEqual(f.readline(), '34567890')
|
||||||
|
f.seek(0)
|
||||||
|
self.assertEqual(f.readline(), '1234567890')
|
||||||
|
f.seek(0, 2)
|
||||||
|
self.assertEqual(f.readline(), '')
|
||||||
|
|
||||||
@skip_with_pyevent
|
def test_truncate(self):
|
||||||
def test_raised_multiple_readers(self):
|
f = greenio.GreenPipe(self.tempdir+"/TestFile", 'w+', 1024)
|
||||||
debug.hub_prevent_multiple_readers(True)
|
f.write('1234567890')
|
||||||
|
f.truncate(9)
|
||||||
def handle(sock, addr):
|
self.assertEquals(f.tell(), 9)
|
||||||
sock.recv(1)
|
|
||||||
sock.sendall("a")
|
|
||||||
raise eventlet.StopServe()
|
|
||||||
listener = eventlet.listen(('127.0.0.1', 0))
|
|
||||||
server = eventlet.spawn(eventlet.serve,
|
|
||||||
listener,
|
|
||||||
handle)
|
|
||||||
def reader(s):
|
|
||||||
s.recv(1)
|
|
||||||
|
|
||||||
s = eventlet.connect(('127.0.0.1', listener.getsockname()[1]))
|
|
||||||
a = eventlet.spawn(reader, s)
|
|
||||||
eventlet.sleep(0)
|
|
||||||
self.assertRaises(RuntimeError, s.recv, 1)
|
|
||||||
s.sendall('b')
|
|
||||||
a.wait()
|
|
||||||
|
|
||||||
|
|
||||||
class TestGreenIoLong(LimitedTestCase):
|
class TestGreenIoLong(LimitedTestCase):
|
||||||
|
Reference in New Issue
Block a user