diff --git a/greentest/__init__.py b/greentest/__init__.py index 986da79..8595e84 100644 --- a/greentest/__init__.py +++ b/greentest/__init__.py @@ -20,6 +20,7 @@ # package is named greentest, not test, so it won't be confused with test in stdlib import sys +import unittest disabled_marker = '-*-*-*-*-*- disabled -*-*-*-*-*-' def exit_disabled(): @@ -30,4 +31,18 @@ def exit_unless_twisted(): if 'Twisted' not in type(get_hub()).__name__: 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() + diff --git a/greentest/parse_results.py b/greentest/parse_results.py index 8a581d0..0f3afac 100755 --- a/greentest/parse_results.py +++ b/greentest/parse_results.py @@ -7,7 +7,7 @@ import glob def parse_stdout(s): argv = re.search('^===ARGV=(.*?)$', s, re.M).group(1) - argv = eval(argv) + argv = argv.split() testname = argv[-1] del argv[-1] hub = None @@ -86,6 +86,7 @@ def main(db): except Exception: parse_error += 1 sys.stderr.write('Failed to parse id=%s\n' % id) + print repr(stdout) traceback.print_exc() else: print id, hub, testname, runs, errors, fails, timeouts diff --git a/greentest/record_results.py b/greentest/record_results.py index 109bf2a..fc1a02a 100755 --- a/greentest/record_results.py +++ b/greentest/record_results.py @@ -5,7 +5,10 @@ Usage: %prog program [args] """ import sys import os -import sqlite3 +try: + import sqlite3 +except ImportError: + import pysqlite2.dbapi2 as sqlite3 import warnings from greentest import disabled_marker diff --git a/greentest/runall.py b/greentest/runall.py index 19a0ad6..a063192 100755 --- a/greentest/runall.py +++ b/greentest/runall.py @@ -32,7 +32,7 @@ from with_eventlet import import_reactor first_hubs = ['selecthub', 'poll', 'selects', 'twistedr'] 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 # the following aren't in the default list unless --all option present diff --git a/greentest/test__coros_semaphore.py b/greentest/test__coros_semaphore.py index d3bae85..a6c5555 100644 --- a/greentest/test__coros_semaphore.py +++ b/greentest/test__coros_semaphore.py @@ -18,11 +18,11 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -from __future__ import with_statement import unittest from eventlet import api, coros +from greentest import LimitedTestCase -class TestSemaphore(unittest.TestCase): +class TestSemaphore(LimitedTestCase): def test_bounded(self): # this was originally semaphore's doctest @@ -42,8 +42,7 @@ class TestSemaphore(unittest.TestCase): def test_bounded_with_zero_limit(self): sem = coros.semaphore(0, 0) api.spawn(sem.acquire) - with api.timeout(0.001): - sem.release() + sem.release() if __name__=='__main__': diff --git a/greentest/test__event.py b/greentest/test__event.py index 603c424..319a727 100644 --- a/greentest/test__event.py +++ b/greentest/test__event.py @@ -18,14 +18,14 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -from __future__ import with_statement import unittest 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 -class TestEvent(unittest.TestCase): +class TestEvent(LimitedTestCase): def test_send_exc(self): log = [] @@ -36,12 +36,13 @@ class TestEvent(unittest.TestCase): result = e.wait() log.append(('received', result)) except Exception, ex: - log.append(('catched', type(ex).__name__)) + log.append(('catched', ex)) spawn(waiter) sleep(0) # let waiter to block on e.wait() - e.send(exc=Exception()) + obj = Exception() + e.send(exc=obj) sleep(0) - assert log == [('catched', 'Exception')], log + assert log == [('catched', obj)], log def test_send(self): event1 = event() @@ -52,9 +53,9 @@ class TestEvent(unittest.TestCase): try: result = event1.wait() except ValueError: - with timeout(DELAY, None): - result = event2.wait() - raise AssertionError('Nobody sent anything to event2 yet it received %r' % (result, )) + X = object() + result = with_timeout(DELAY, event2.wait, timeout_value=X) + assert result is X, 'Nobody sent anything to event2 yet it received %r' % (result, ) if __name__=='__main__': diff --git a/greentest/test__proc.py b/greentest/test__proc.py index f6ed1be..d49d6f9 100644 --- a/greentest/test__proc.py +++ b/greentest/test__proc.py @@ -18,22 +18,14 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -from __future__ import with_statement import sys import unittest -from eventlet.api import sleep, timeout +from eventlet.api import sleep, with_timeout from eventlet import api, proc, coros +from greentest import LimitedTestCase 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): def test_send(self): @@ -157,17 +149,10 @@ class TestCase(LimitedTestCase): return event, myproc, proc_finished_flag, queue def check_timed_out(self, event, myproc, proc_finished_flag, queue): - with timeout(DELAY, None): - event.wait() - raise AssertionError('should not get there') - - 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') + X = object() + assert with_timeout(DELAY, event.wait, timeout_value=X) is X + assert with_timeout(DELAY, queue.wait, timeout_value=X) is X + assert with_timeout(DELAY, proc.waitall, [myproc], timeout_value=X) is X assert proc_finished_flag == [], proc_finished_flag @@ -230,10 +215,9 @@ class TestRaise_link(TestCase): assert not p, p - with timeout(DELAY): - self.assertRaises(ValueError, event.wait) - self.assertRaises(ValueError, queue.wait) - self.assertRaises(kill_exc_type, proc.waitall, [receiver]) + self.assertRaises(ValueError, event.wait) + self.assertRaises(ValueError, queue.wait) + self.assertRaises(kill_exc_type, proc.waitall, [receiver]) sleep(DELAY) assert not proc_flag, proc_flag assert not callback_flag, callback_flag @@ -261,10 +245,9 @@ class TestRaise_link(TestCase): assert not p, p - with timeout(DELAY): - self.assertRaises(proc.ProcExit, event.wait) - self.assertRaises(proc.ProcExit, queue.wait) - self.assertRaises(kill_exc_type, proc.waitall, [receiver]) + self.assertRaises(proc.ProcExit, event.wait) + self.assertRaises(proc.ProcExit, queue.wait) + self.assertRaises(kill_exc_type, proc.waitall, [receiver]) sleep(DELAY) assert not proc_flag, proc_flag @@ -386,9 +369,10 @@ class TestStuff(unittest.TestCase): e.send_exception(*sys.exc_info()) p = proc.spawn_link(func) try: - e.wait() - except ZeroDivisionError: - pass + try: + e.wait() + except ZeroDivisionError: + pass finally: p.unlink() sleep(DELAY) diff --git a/greentest/test__twistedutil_protocol.py b/greentest/test__twistedutil_protocol.py index c72a568..8aa53a9 100644 --- a/greentest/test__twistedutil_protocol.py +++ b/greentest/test__twistedutil_protocol.py @@ -30,31 +30,36 @@ import eventlet.twistedutil.protocol as pr from eventlet.twistedutil.protocols.basic import LineOnlyReceiverTransport from eventlet.api import spawn, sleep, with_timeout, call_after from eventlet.coros import event -from eventlet.green import socket + +try: + from eventlet.green import socket +except SyntaxError: + socket = None DELAY=0.01 -def setup_server_socket(self, delay=DELAY, port=0): - s = socket.socket() - s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - s.bind(('127.0.0.1', port)) - port = s.getsockname()[1] - s.listen(5) - s.settimeout(delay*3) - def serve(): - conn, addr = s.accept() - conn.settimeout(delay+1) - try: - hello = conn.makefile().readline()[:-2] - except socket.timeout: - return - conn.sendall('you said %s. ' % hello) - sleep(delay) - conn.sendall('BYE') - sleep(delay) - #conn.close() - spawn(serve) - return port +if socket is not None: + def setup_server_socket(self, delay=DELAY, port=0): + s = socket.socket() + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + s.bind(('127.0.0.1', port)) + port = s.getsockname()[1] + s.listen(5) + s.settimeout(delay*3) + def serve(): + conn, addr = s.accept() + conn.settimeout(delay+1) + try: + hello = conn.makefile().readline()[:-2] + except socket.timeout: + return + conn.sendall('you said %s. ' % hello) + sleep(delay) + conn.sendall('BYE') + sleep(delay) + #conn.close() + spawn(serve) + return port def setup_server_SpawnFactory(self, delay=DELAY, port=0): def handle(conn): @@ -86,7 +91,7 @@ class TestCase(unittest.TestCase): class TestUnbufferedTransport(TestCase): gtransportClass = pr.UnbufferedTransport - setup_server = setup_server_socket + setup_server = setup_server_SpawnFactory def test_full_read(self): self.conn.write('hello\r\n') @@ -102,17 +107,9 @@ class TestUnbufferedTransport_bufsize1(TestUnbufferedTransport): transportBufferSize = 1 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): gtransportClass = pr.GreenTransport - setup_server = setup_server_socket + setup_server = setup_server_SpawnFactory def test_read(self): self.conn.write('hello\r\n') @@ -158,15 +155,8 @@ class TestGreenTransport(TestUnbufferedTransport): class TestGreenTransport_bufsize1(TestGreenTransport): 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): - setup_server = setup_server_socket + setup_server = setup_server_SpawnFactory gtransportClass = pr.GreenTransport def test_read_error(self): @@ -201,6 +191,23 @@ class TestGreenTransportError(TestCase): # 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): def test_server_connectionMade_never_called(self): diff --git a/greentest/with_timeout.py b/greentest/with_timeout.py index 03023a9..52bc559 100755 --- a/greentest/with_timeout.py +++ b/greentest/with_timeout.py @@ -99,7 +99,11 @@ def execf(): class TestCase(unittest.TestCase): base = unittest.TestCase 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: return print name, ' ' @@ -123,11 +127,12 @@ while True: os.unlink(CURRENT_TEST_FILENAME) except: pass - print '===ARGV=%r' % (sys.argv,) - print '===TIMEOUT=%r' % TIMEOUT - sys.stdout.flush() child = os.fork() 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() break else: