diff options
author | Daniele Varrazzo <daniele.varrazzo@gmail.com> | 2010-04-11 01:05:31 +0100 |
---|---|---|
committer | Daniele Varrazzo <daniele.varrazzo@gmail.com> | 2010-04-11 01:05:31 +0100 |
commit | 595dc7effa35eb4887fb26a91b15488002e9969f (patch) | |
tree | c746804b5dd7e6b352db846e41c698a81041ac2e /tests/test_async.py | |
parent | 88fe5f91d2834a50ab98afbff653a424ea132c8e (diff) | |
download | psycopg2-595dc7effa35eb4887fb26a91b15488002e9969f.tar.gz |
Added a test to check poll() correctly calls PQflush.
When a large query is sent to the backend (and probably in high
concurrency situations), writing the query could block. In
this case PQflush() should be called until it returns 0. The test checks
this is done correctly.
Diffstat (limited to 'tests/test_async.py')
-rwxr-xr-x | tests/test_async.py | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/tests/test_async.py b/tests/test_async.py index dc5b800..da084bd 100755 --- a/tests/test_async.py +++ b/tests/test_async.py @@ -14,6 +14,21 @@ else: import py3tests as tests +class PollableStub(object): + """A 'pollable' wrapper allowing analysis of the `poll()` calls.""" + def __init__(self, pollable): + self.pollable = pollable + self.polls = [] + + def fileno(self): + return self.pollable.fileno() + + def poll(self): + rv = self.pollable.poll() + self.polls.append(rv) + return rv + + class AsyncTests(unittest.TestCase): def setUp(self): @@ -285,6 +300,21 @@ class AsyncTests(unittest.TestCase): conn.close() + def test_flush_on_write(self): + # a very large query requires a flush loop to be sent to the backend + curs = self.conn.cursor() + for mb in 1, 5, 10, 20, 50: + size = mb * 1024 * 1024 + print "\nplease wait: sending", mb, "MB query to the server", + stub = PollableStub(curs) + curs.execute("select %s;", ('x' * size,)) + self.wait(stub) + self.assertEqual(size, len(curs.fetchone()[0])) + if stub.polls.count(psycopg2.extensions.POLL_WRITE) > 1: + return + + self.fail("sending a large query didn't trigger block on write.") + def test_suite(): return unittest.TestLoader().loadTestsFromName(__name__) |