Exemple #1
0
    def test_acquire(self):
        mock_dbapi2 = mock.MagicMock()

        params = {
            'server': 'hostname',
            'arg1': 1234,
            'arg2': 'foobar',
        }
        pool = ConnectionPool(mock_dbapi2, params, maxsize=10)

        conn = pool.acquire()

        mock_dbapi2.assert_has_calls([
            mock.call.connect(**params),
        ])
        pool.release(conn)

        mock_dbapi2.assert_has_calls([
            mock.call.connect(**params),
            mock.call.connect().rollback(),
        ])

        mock_dbapi2.reset_mock()

        conn2 = pool.acquire()

        self.assertEqual(id(conn), id(conn2))

        pool.release(conn2)

        mock_dbapi2.assert_has_calls([
            mock.call.connect().rollback(),
        ])
Exemple #2
0
    def test_release_exception(self): # pylint: disable=no-self-use
        class MockDBAPI2Error(Exception):
            pass

        mock_dbapi2 = mock.MagicMock()
        type(mock_dbapi2).Error = \
            mock.PropertyMock(return_value=MockDBAPI2Error)

        pool = ConnectionPool(mock_dbapi2, {}, maxsize=10)
        mock_dbapi2.connect.return_value.rollback.side_effect = MockDBAPI2Error

        pool.release(pool.acquire())

        # Verify the connection is closed on rollback error.
        mock_dbapi2.assert_has_calls(
            [
                mock.call.connect(),
                mock.call.connect().rollback(),
                mock.call.connect().close(),
            ]
        )

        # ... and the connection is not returned to the pool.
        mock_dbapi2.connect.return_value.rollback.side_effect = None

        mock_dbapi2.reset_mock()
        pool.release(pool.acquire())

        mock_dbapi2.assert_has_calls(
            [
                mock.call.connect(),
                mock.call.connect().rollback(),
            ]
        )
Exemple #3
0
    def test_finalize(self):  # pylint: disable=no-self-use
        mock_dbapi2 = mock.MagicMock()
        pool = ConnectionPool(mock_dbapi2, {}, maxsize=10)

        pool.release(pool.acquire())

        pool.finalize()

        mock_dbapi2.assert_has_calls([
            mock.call.connect(),
            mock.call.connect().rollback(),
            mock.call.connect().close(),
        ])
Exemple #4
0
    def test_finalize(self): # pylint: disable=no-self-use
        mock_dbapi2 = mock.MagicMock()
        pool = ConnectionPool(mock_dbapi2, {}, maxsize=10)

        pool.release(pool.acquire())

        pool.finalize()

        mock_dbapi2.assert_has_calls(
            [
                mock.call.connect(),
                mock.call.connect().rollback(),
                mock.call.connect().close(),
            ]
        )
Exemple #5
0
    def test_maxsize(self): # pylint: disable=no-self-use
        mock_dbapi2 = mock.MagicMock()
        pool = ConnectionPool(mock_dbapi2, {}, maxsize=1)

        conn1 = pool.acquire()
        pool.release(conn1)
        conn2 = pool.acquire()
        mock_dbapi2.assert_has_calls(
            [
                mock.call.connect(),
                mock.call.connect().rollback(), # .release(conn1)
            ]
        )

        mock_dbapi2.reset_mock()
        pool.release(conn2)

        mock_dbapi2.assert_has_calls(
            [
                mock.call.connect().rollback(), # .release(conn2)
            ]
        )

        mock_dbapi2.reset_mock()
        conn3 = pool.acquire() # this should come from the pool
        mock_dbapi2.assert_has_calls([])

        mock_dbapi2.reset_mock()
        conn4 = pool.acquire() # new connection
        mock_dbapi2.assert_has_calls(
            [
                mock.call.connect(),
            ]
        )

        mock_dbapi2.reset_mock()
        pool.release(conn4) # return conn4 to pool
        mock_dbapi2.assert_has_calls(
            [
                mock.call.connect().rollback(),
            ]
        )

        mock_dbapi2.reset_mock()
        pool.release(conn3) # pool is full, close the connection
        mock_dbapi2.assert_has_calls(
            [
                mock.call.connect().rollback(),
                mock.call.connect().close(),
            ]
        )
Exemple #6
0
    def test_idlettl(self): # pylint: disable=no-self-use
        idlettl = 10

        mock_dbapi2 = mock.MagicMock()
        pool = ConnectionPool(mock_dbapi2, {}, idlettl=idlettl)

        now = time.time()

        with mock.patch('time.time', return_value=now) as mock_time:
            conn1 = pool.acquire()
            pool.release(conn1)

            mock_time.return_value += idlettl

            conn2 = pool.acquire()
            pool.release(conn2)

            mock_time.return_value += idlettl + 1

            conn3 = pool.acquire()
            pool.release(conn3)

            mock_dbapi2.assert_has_calls(
                [
                    mock.call.connect(),
                    mock.call.connect().rollback(), # .release(conn1)
                    mock.call.connect().rollback(), # .release(conn2)
                    mock.call.connect().close(), # .release(conn2)
                    mock.call.connect(),
                    mock.call.connect().rollback(), # .release(conn3)
                ]
            )
Exemple #7
0
    def test_acquire(self):
        mock_dbapi2 = mock.MagicMock()

        params = {
            'server': 'hostname',
            'arg1': 1234,
            'arg2': 'foobar',
        }
        pool = ConnectionPool(mock_dbapi2, params, maxsize=10)

        conn = pool.acquire()

        mock_dbapi2.assert_has_calls(
            [
                mock.call.connect(**params),
            ]
        )
        pool.release(conn)

        mock_dbapi2.assert_has_calls(
            [
                mock.call.connect(**params),
                mock.call.connect().rollback(),
            ]
        )

        mock_dbapi2.reset_mock()

        conn2 = pool.acquire()

        self.assertEqual(id(conn), id(conn2))

        pool.release(conn2)

        mock_dbapi2.assert_has_calls(
            [
                mock.call.connect().rollback(),
            ]
        )
Exemple #8
0
    def test_block(self):  # pylint: disable=no-self-use
        mock_dbapi2 = mock.MagicMock()
        pool = ConnectionPool(mock_dbapi2, {}, maxsize=1, block=True)

        conn1 = pool.acquire()

        def target():
            time.sleep(.01)
            pool.release(conn1)

        thread = threading.Thread(target=target)
        thread.start()
        conn2 = pool.acquire(
        )  # should block waiting for background thread to relase conn1
        thread.join()
        pool.release(conn2)

        mock_dbapi2.assert_has_calls([
            mock.call.connect(),
            mock.call.connect().rollback(),
            mock.call.connect().rollback(),
        ])
Exemple #9
0
    def test_block(self): # pylint: disable=no-self-use
        mock_dbapi2 = mock.MagicMock()
        pool = ConnectionPool(mock_dbapi2, {}, maxsize=1, block=True)

        conn1 = pool.acquire()

        def target():
            time.sleep(.01)
            pool.release(conn1)

        thread = threading.Thread(target=target)
        thread.start()
        conn2 = pool.acquire() # should block waiting for background thread to relase conn1
        thread.join()
        pool.release(conn2)

        mock_dbapi2.assert_has_calls(
            [
                mock.call.connect(),
                mock.call.connect().rollback(),
                mock.call.connect().rollback(),
            ]
        )