made test suite runnable under 2.4; it logs the Python version in the output

This commit is contained in:
Denis Bilenko
2009-01-12 19:28:35 +06:00
parent 2948ef52ae
commit 227fdbc1c8
9 changed files with 107 additions and 92 deletions

View File

@@ -20,6 +20,7 @@
# package is named greentest, not test, so it won't be confused with test in stdlib # package is named greentest, not test, so it won't be confused with test in stdlib
import sys import sys
import unittest
disabled_marker = '-*-*-*-*-*- disabled -*-*-*-*-*-' disabled_marker = '-*-*-*-*-*- disabled -*-*-*-*-*-'
def exit_disabled(): def exit_disabled():
@@ -30,4 +31,18 @@ def exit_unless_twisted():
if 'Twisted' not in type(get_hub()).__name__: if 'Twisted' not in type(get_hub()).__name__:
exit_disabled() exit_disabled()
def exit_unless_25():
print sys.version_info[:2]<(2, 5)
if sys.version_info[:2]<(2, 5):
exit_disabled()
class LimitedTestCase(unittest.TestCase):
def setUp(self):
from eventlet import api
self.timer = api.exc_after(1, RuntimeError('test is taking too long'))
def tearDown(self):
self.timer.cancel()

View File

@@ -7,7 +7,7 @@ import glob
def parse_stdout(s): def parse_stdout(s):
argv = re.search('^===ARGV=(.*?)$', s, re.M).group(1) argv = re.search('^===ARGV=(.*?)$', s, re.M).group(1)
argv = eval(argv) argv = argv.split()
testname = argv[-1] testname = argv[-1]
del argv[-1] del argv[-1]
hub = None hub = None
@@ -86,6 +86,7 @@ def main(db):
except Exception: except Exception:
parse_error += 1 parse_error += 1
sys.stderr.write('Failed to parse id=%s\n' % id) sys.stderr.write('Failed to parse id=%s\n' % id)
print repr(stdout)
traceback.print_exc() traceback.print_exc()
else: else:
print id, hub, testname, runs, errors, fails, timeouts print id, hub, testname, runs, errors, fails, timeouts

View File

@@ -5,7 +5,10 @@ Usage: %prog program [args]
""" """
import sys import sys
import os import os
import sqlite3 try:
import sqlite3
except ImportError:
import pysqlite2.dbapi2 as sqlite3
import warnings import warnings
from greentest import disabled_marker from greentest import disabled_marker

View File

@@ -32,7 +32,7 @@ from with_eventlet import import_reactor
first_hubs = ['selecthub', 'poll', 'selects', 'twistedr'] first_hubs = ['selecthub', 'poll', 'selects', 'twistedr']
first_reactors = ['selectreactor', 'pollreactor', 'epollreactor'] first_reactors = ['selectreactor', 'pollreactor', 'epollreactor']
COMMAND = './record_results.py ./with_timeout.py ./with_eventlet.py %(setup)s %(test)s' COMMAND = './record_results.py ' + sys.executable + ' ./with_timeout.py ./with_eventlet.py %(setup)s %(test)s'
PARSE_PERIOD = 10 PARSE_PERIOD = 10
# the following aren't in the default list unless --all option present # the following aren't in the default list unless --all option present

View File

@@ -18,11 +18,11 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE. # THE SOFTWARE.
from __future__ import with_statement
import unittest import unittest
from eventlet import api, coros from eventlet import api, coros
from greentest import LimitedTestCase
class TestSemaphore(unittest.TestCase): class TestSemaphore(LimitedTestCase):
def test_bounded(self): def test_bounded(self):
# this was originally semaphore's doctest # this was originally semaphore's doctest
@@ -42,8 +42,7 @@ class TestSemaphore(unittest.TestCase):
def test_bounded_with_zero_limit(self): def test_bounded_with_zero_limit(self):
sem = coros.semaphore(0, 0) sem = coros.semaphore(0, 0)
api.spawn(sem.acquire) api.spawn(sem.acquire)
with api.timeout(0.001): sem.release()
sem.release()
if __name__=='__main__': if __name__=='__main__':

View File

@@ -18,14 +18,14 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE. # THE SOFTWARE.
from __future__ import with_statement
import unittest import unittest
from eventlet.coros import event from eventlet.coros import event
from eventlet.api import spawn, sleep, exc_after, timeout from eventlet.api import spawn, sleep, exc_after, with_timeout
from greentest import LimitedTestCase
DELAY= 0.01 DELAY= 0.01
class TestEvent(unittest.TestCase): class TestEvent(LimitedTestCase):
def test_send_exc(self): def test_send_exc(self):
log = [] log = []
@@ -36,12 +36,13 @@ class TestEvent(unittest.TestCase):
result = e.wait() result = e.wait()
log.append(('received', result)) log.append(('received', result))
except Exception, ex: except Exception, ex:
log.append(('catched', type(ex).__name__)) log.append(('catched', ex))
spawn(waiter) spawn(waiter)
sleep(0) # let waiter to block on e.wait() sleep(0) # let waiter to block on e.wait()
e.send(exc=Exception()) obj = Exception()
e.send(exc=obj)
sleep(0) sleep(0)
assert log == [('catched', 'Exception')], log assert log == [('catched', obj)], log
def test_send(self): def test_send(self):
event1 = event() event1 = event()
@@ -52,9 +53,9 @@ class TestEvent(unittest.TestCase):
try: try:
result = event1.wait() result = event1.wait()
except ValueError: except ValueError:
with timeout(DELAY, None): X = object()
result = event2.wait() result = with_timeout(DELAY, event2.wait, timeout_value=X)
raise AssertionError('Nobody sent anything to event2 yet it received %r' % (result, )) assert result is X, 'Nobody sent anything to event2 yet it received %r' % (result, )
if __name__=='__main__': if __name__=='__main__':

View File

@@ -18,22 +18,14 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE. # THE SOFTWARE.
from __future__ import with_statement
import sys import sys
import unittest import unittest
from eventlet.api import sleep, timeout from eventlet.api import sleep, with_timeout
from eventlet import api, proc, coros from eventlet import api, proc, coros
from greentest import LimitedTestCase
DELAY = 0.01 DELAY = 0.01
class LimitedTestCase(unittest.TestCase):
def setUp(self):
self.timer = api.exc_after(1, api.TimeoutError('test is taking too long'))
def tearDown(self):
self.timer.cancel()
class TestEventSource(LimitedTestCase): class TestEventSource(LimitedTestCase):
def test_send(self): def test_send(self):
@@ -157,17 +149,10 @@ class TestCase(LimitedTestCase):
return event, myproc, proc_finished_flag, queue return event, myproc, proc_finished_flag, queue
def check_timed_out(self, event, myproc, proc_finished_flag, queue): def check_timed_out(self, event, myproc, proc_finished_flag, queue):
with timeout(DELAY, None): X = object()
event.wait() assert with_timeout(DELAY, event.wait, timeout_value=X) is X
raise AssertionError('should not get there') assert with_timeout(DELAY, queue.wait, timeout_value=X) is X
assert with_timeout(DELAY, proc.waitall, [myproc], timeout_value=X) is X
with timeout(DELAY, None):
queue.wait()
raise AssertionError('should not get there')
with timeout(DELAY, None):
print repr(proc.waitall([myproc]))
raise AssertionError('should not get there')
assert proc_finished_flag == [], proc_finished_flag assert proc_finished_flag == [], proc_finished_flag
@@ -230,10 +215,9 @@ class TestRaise_link(TestCase):
assert not p, p assert not p, p
with timeout(DELAY): self.assertRaises(ValueError, event.wait)
self.assertRaises(ValueError, event.wait) self.assertRaises(ValueError, queue.wait)
self.assertRaises(ValueError, queue.wait) self.assertRaises(kill_exc_type, proc.waitall, [receiver])
self.assertRaises(kill_exc_type, proc.waitall, [receiver])
sleep(DELAY) sleep(DELAY)
assert not proc_flag, proc_flag assert not proc_flag, proc_flag
assert not callback_flag, callback_flag assert not callback_flag, callback_flag
@@ -261,10 +245,9 @@ class TestRaise_link(TestCase):
assert not p, p assert not p, p
with timeout(DELAY): self.assertRaises(proc.ProcExit, event.wait)
self.assertRaises(proc.ProcExit, event.wait) self.assertRaises(proc.ProcExit, queue.wait)
self.assertRaises(proc.ProcExit, queue.wait) self.assertRaises(kill_exc_type, proc.waitall, [receiver])
self.assertRaises(kill_exc_type, proc.waitall, [receiver])
sleep(DELAY) sleep(DELAY)
assert not proc_flag, proc_flag assert not proc_flag, proc_flag
@@ -386,9 +369,10 @@ class TestStuff(unittest.TestCase):
e.send_exception(*sys.exc_info()) e.send_exception(*sys.exc_info())
p = proc.spawn_link(func) p = proc.spawn_link(func)
try: try:
e.wait() try:
except ZeroDivisionError: e.wait()
pass except ZeroDivisionError:
pass
finally: finally:
p.unlink() p.unlink()
sleep(DELAY) sleep(DELAY)

View File

@@ -30,31 +30,36 @@ import eventlet.twistedutil.protocol as pr
from eventlet.twistedutil.protocols.basic import LineOnlyReceiverTransport from eventlet.twistedutil.protocols.basic import LineOnlyReceiverTransport
from eventlet.api import spawn, sleep, with_timeout, call_after from eventlet.api import spawn, sleep, with_timeout, call_after
from eventlet.coros import event from eventlet.coros import event
from eventlet.green import socket
try:
from eventlet.green import socket
except SyntaxError:
socket = None
DELAY=0.01 DELAY=0.01
def setup_server_socket(self, delay=DELAY, port=0): if socket is not None:
s = socket.socket() def setup_server_socket(self, delay=DELAY, port=0):
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s = socket.socket()
s.bind(('127.0.0.1', port)) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
port = s.getsockname()[1] s.bind(('127.0.0.1', port))
s.listen(5) port = s.getsockname()[1]
s.settimeout(delay*3) s.listen(5)
def serve(): s.settimeout(delay*3)
conn, addr = s.accept() def serve():
conn.settimeout(delay+1) conn, addr = s.accept()
try: conn.settimeout(delay+1)
hello = conn.makefile().readline()[:-2] try:
except socket.timeout: hello = conn.makefile().readline()[:-2]
return except socket.timeout:
conn.sendall('you said %s. ' % hello) return
sleep(delay) conn.sendall('you said %s. ' % hello)
conn.sendall('BYE') sleep(delay)
sleep(delay) conn.sendall('BYE')
#conn.close() sleep(delay)
spawn(serve) #conn.close()
return port spawn(serve)
return port
def setup_server_SpawnFactory(self, delay=DELAY, port=0): def setup_server_SpawnFactory(self, delay=DELAY, port=0):
def handle(conn): def handle(conn):
@@ -86,7 +91,7 @@ class TestCase(unittest.TestCase):
class TestUnbufferedTransport(TestCase): class TestUnbufferedTransport(TestCase):
gtransportClass = pr.UnbufferedTransport gtransportClass = pr.UnbufferedTransport
setup_server = setup_server_socket setup_server = setup_server_SpawnFactory
def test_full_read(self): def test_full_read(self):
self.conn.write('hello\r\n') self.conn.write('hello\r\n')
@@ -102,17 +107,9 @@ class TestUnbufferedTransport_bufsize1(TestUnbufferedTransport):
transportBufferSize = 1 transportBufferSize = 1
setup_server = setup_server_SpawnFactory setup_server = setup_server_SpawnFactory
class TestUnbufferedTransport_SpawnFactory(TestUnbufferedTransport):
setup_server = setup_server_SpawnFactory
class TestUnbufferedTransport_SpawnFactory_bufsize1(TestUnbufferedTransport):
transportBufferSize = 1
setup_server = setup_server_SpawnFactory
class TestGreenTransport(TestUnbufferedTransport): class TestGreenTransport(TestUnbufferedTransport):
gtransportClass = pr.GreenTransport gtransportClass = pr.GreenTransport
setup_server = setup_server_socket setup_server = setup_server_SpawnFactory
def test_read(self): def test_read(self):
self.conn.write('hello\r\n') self.conn.write('hello\r\n')
@@ -158,15 +155,8 @@ class TestGreenTransport(TestUnbufferedTransport):
class TestGreenTransport_bufsize1(TestGreenTransport): class TestGreenTransport_bufsize1(TestGreenTransport):
transportBufferSize = 1 transportBufferSize = 1
class TestGreenTransport_SpawnFactory(TestGreenTransport):
setup_server = setup_server_SpawnFactory
class TestGreenTransport_SpawnFactory_bufsize1(TestGreenTransport):
transportBufferSize = 1
setup_server = setup_server_SpawnFactory
class TestGreenTransportError(TestCase): class TestGreenTransportError(TestCase):
setup_server = setup_server_socket setup_server = setup_server_SpawnFactory
gtransportClass = pr.GreenTransport gtransportClass = pr.GreenTransport
def test_read_error(self): def test_read_error(self):
@@ -201,6 +191,23 @@ class TestGreenTransportError(TestCase):
# self.assertEqual('', self.conn.recv()) # self.assertEqual('', self.conn.recv())
# #
if socket is not None:
class TestUnbufferedTransport_socketserver(TestUnbufferedTransport):
setup_server = setup_server_socket
class TestUnbufferedTransport_socketserver_bufsize1(TestUnbufferedTransport):
transportBufferSize = 1
setup_server = setup_server_socket
class TestGreenTransport_socketserver(TestGreenTransport):
setup_server = setup_server_socket
class TestGreenTransport_socketserver_bufsize1(TestGreenTransport):
transportBufferSize = 1
setup_server = setup_server_socket
class TestTLSError(unittest.TestCase): class TestTLSError(unittest.TestCase):
def test_server_connectionMade_never_called(self): def test_server_connectionMade_never_called(self):

View File

@@ -99,7 +99,11 @@ def execf():
class TestCase(unittest.TestCase): class TestCase(unittest.TestCase):
base = unittest.TestCase base = unittest.TestCase
def run(self, result=None): def run(self, result=None):
name = "%s.%s" % (self.__class__.__name__, self._testMethodName) try:
testMethodName = self._testMethodName
except:
testMethodName = self.__testMethodName
name = "%s.%s" % (self.__class__.__name__, testMethodName)
if name in disabled_tests: if name in disabled_tests:
return return
print name, ' ' print name, ' '
@@ -123,11 +127,12 @@ while True:
os.unlink(CURRENT_TEST_FILENAME) os.unlink(CURRENT_TEST_FILENAME)
except: except:
pass pass
print '===ARGV=%r' % (sys.argv,)
print '===TIMEOUT=%r' % TIMEOUT
sys.stdout.flush()
child = os.fork() child = os.fork()
if child == 0: if child == 0:
print '===PYTHON=%s.%s.%s' % sys.version_info[:3]
print '===ARGV=%s' % ' '.join(sys.argv)
print '===TIMEOUT=%r' % TIMEOUT
sys.stdout.flush()
execf() execf()
break break
else: else: