def test_block(self): pool = ConnectionPool('mypool', 1, close_conn, MyConnection, 'local', 8888, db=3) conn_holder1 = pool.get() self.assertRaises(gevent.queue.Empty, pool.get, block=True, timeout=0.1) # Spawn a greenlet to release the conn. gevent.spawn(pool.put, conn_holder1) conn_holder3 = pool.get() self.assertEquals(conn_holder3, conn_holder1)
def test_failed_connection_creation(self): pool = ConnectionPool('mypool', 1, close_conn, MyBadConnection, 'local', 8888, db=3) self.assertEqual(1, pool.qsize()) with self.assertRaises(Exception) as cm1: pool.get() self.assertEqual('Failed to create Connection', str(cm1.exception)) # Make sure the connection is returned to the pool. self.assertEqual(1, pool.qsize()) with self.assertRaises(Exception) as cm2: with pool.get_connection(): pass self.assertEqual('Failed to create Connection', str(cm2.exception)) self.assertEqual(1, pool.qsize())
def test_get_put(self): pool = ConnectionPool('mypool', 2, close_conn, MyConnection, 'local', 8888, db=3) self.assertEqual(2, pool.qsize()) self.assertEqual(0, pool.num_connected) self.assertEqual(0, pool.num_in_use) # Get one. start_ts = time.time() conn_holder1 = pool.get() end_ts = time.time() self.assertEqual(1, pool.qsize()) self.assertEqual(1, pool.num_connected) self.assertEqual(1, pool.num_in_use) self.assertIsNot(conn_holder1.conn, None) self.assertIsInstance(conn_holder1.conn, MyConnection) self.assertEqual('local', conn_holder1.conn.host) self.assertEqual(8888, conn_holder1.conn.port) self.assertEqual(3, conn_holder1.conn.db) self.assertTrue(start_ts <= conn_holder1.last_access_time <= end_ts) # Get another. conn_holder2 = pool.get() self.assertEqual(0, pool.qsize()) self.assertEqual(2, pool.num_connected) self.assertEqual(2, pool.num_in_use) self.assertIsNot(conn_holder2.conn, None) self.assertIsInstance(conn_holder2.conn, MyConnection) self.assertEqual('local', conn_holder2.conn.host) self.assertEqual(8888, conn_holder2.conn.port) self.assertEqual(3, conn_holder2.conn.db) self.assertIsNot(conn_holder1, conn_holder2) self.assertIsNot(conn_holder1.conn, conn_holder2.conn) # Put both back. pool.put(conn_holder1) self.assertEqual(1, pool.qsize()) self.assertEqual(2, pool.num_connected) self.assertEqual(1, pool.num_in_use) pool.put(conn_holder2) self.assertEqual(2, pool.qsize()) self.assertEqual(2, pool.num_connected) self.assertEqual(0, pool.num_in_use) # LIFO conn_holder3 = pool.get() self.assertEqual(1, pool.qsize()) self.assertEqual(2, pool.num_connected) self.assertEqual(1, pool.num_in_use) self.assertIs(conn_holder3, conn_holder2) self.assertIs(conn_holder3.conn, conn_holder2.conn) # remember its conn for later use. conn_3 = conn_holder3.conn conn_holder4 = pool.get() self.assertEqual(0, pool.qsize()) self.assertEqual(2, pool.num_connected) self.assertEqual(2, pool.num_in_use) self.assertIs(conn_holder4, conn_holder1) self.assertIs(conn_holder4.conn, conn_holder1.conn) # Replace one. pool.put(conn_holder3, replace=True) self.assertEqual(1, pool.qsize()) self.assertEqual(1, pool.num_connected) self.assertEqual(1, pool.num_in_use) pool.put(conn_holder4) self.assertEqual(2, pool.qsize()) self.assertEqual(1, pool.num_connected) self.assertEqual(0, pool.num_in_use) # Get them again. conn_holder5 = pool.get() self.assertEqual(1, pool.qsize()) self.assertEqual(1, pool.num_connected) self.assertEqual(1, pool.num_in_use) self.assertIs(conn_holder5, conn_holder4) self.assertIs(conn_holder5.conn, conn_holder4.conn) # This is the replacement of conn_3. conn_holder6 = pool.get() self.assertEqual(0, pool.qsize()) self.assertEqual(2, pool.num_connected) self.assertEqual(2, pool.num_in_use) # Connetion holder is the same. self.assertIs(conn_holder6, conn_holder3) # Connection held is different. self.assertIsNot(conn_holder6.conn, conn_3)