Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
Always enable WrappedConnectionProvider, but disabled for MySQL conne…
Browse files Browse the repository at this point in the history
…ctions

This allows zanata.war to be run against H2 for testing purposes
(functional tests), but still check for potential problems with MySQL
streaming ResultSets.
  • Loading branch information
seanf committed Jul 2, 2013
1 parent 2e80dac commit 4f1dfe3
Show file tree
Hide file tree
Showing 10 changed files with 152 additions and 106 deletions.
Expand Up @@ -19,7 +19,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.zanata.jdbc;
package org.zanata.database;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
Expand Down
Expand Up @@ -19,7 +19,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.zanata.jdbc;
package org.zanata.database;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
Expand Down
Expand Up @@ -19,7 +19,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.zanata.jdbc;
package org.zanata.database;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
Expand Down
Expand Up @@ -19,7 +19,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.zanata.jdbc;
package org.zanata.database;

import java.sql.SQLException;

Expand Down
Expand Up @@ -19,13 +19,13 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.zanata.dao;
package org.zanata.database;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;

import org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl;
import org.zanata.jdbc.ConnectionWrapper;

/**
* This class wraps JDBC Connections/Statements/ResultSets to detect
Expand All @@ -38,11 +38,22 @@
*/
public class WrappedConnectionProvider extends DriverManagerConnectionProviderImpl
{
private static final long serialVersionUID = 1L;

@Override
public Connection getConnection() throws SQLException
{
Connection connection = super.getConnection();
return ConnectionWrapper.wrap(connection);
DatabaseMetaData metaData = connection.getMetaData();
String databaseName = metaData.getDatabaseProductName();
if ("MySQL".equals(databaseName))
{
return connection;
}
else
{
return ConnectionWrapper.wrap(connection);
}
}

}
Expand Up @@ -57,7 +57,9 @@

<!-- Automatic schema export and drop -->
<property name="hibernate.hbm2ddl.auto" value="${env.hibernate.hbm2ddl.auto}"/>


<property name="hibernate.connection.provider_class" value="org.zanata.database.WrappedConnectionProvider" />

<!-- Logging -->
<property name="hibernate.show_sql" value="${env.hibernate.show_sql}"/>
<property name="hibernate.use_sql_comments" value="true"/>
Expand Down
97 changes: 0 additions & 97 deletions zanata-war/src/test/java/org/zanata/dao/TextFlowStreamDAOTest.java
Expand Up @@ -2,36 +2,21 @@

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.MatcherAssert.assertThat;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Iterator;

import lombok.Cleanup;
import lombok.extern.slf4j.Slf4j;

import org.dbunit.operation.DatabaseOperation;
import org.hamcrest.Matchers;
import org.hibernate.JDBCException;
import org.hibernate.Query;
import org.hibernate.ScrollMode;
import org.hibernate.ScrollableResults;
import org.hibernate.Session;
import org.hibernate.ejb.HibernateEntityManagerFactory;
import org.hibernate.jdbc.Work;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.zanata.ZanataDbunitJpaTest;
import org.zanata.jdbc.StreamingResultSetSQLException;
import org.zanata.model.HProject;
import org.zanata.model.HProjectIteration;
import org.zanata.model.HTextFlow;
import org.zanata.util.CloseableIterator;

@Test(groups = { "jpa-tests" })
@Slf4j
public class TextFlowStreamDAOTest extends ZanataDbunitJpaTest
{

Expand All @@ -58,88 +43,6 @@ public void setup()
projectIterDao = new ProjectIterationDAO(session);
}

@Test
public void testWrapperWithNestedExecute() throws Exception
{
@Cleanup
ScrollableResults scroll1 = streamQuery("from HTextFlow");
try
{
session.doWork(new Work()
{
@Override
public void execute(Connection connection) throws SQLException
{
Statement statement = connection.createStatement();
statement.executeUpdate("delete from HTextFlow where 0=1");
}
});
Assert.fail("Failed to detect concurrent ResultSet - is WrappedConnectionProvider enabled?");
}
catch (JDBCException e)
{
if (!(e.getSQLException() instanceof StreamingResultSetSQLException))
{
throw e;
}
}
}

@Test
public void testWrapperWithNestedStreaming() throws Exception
{
@Cleanup
ScrollableResults scroll1 = streamQuery("from HTextFlow");
try
{
@Cleanup
ScrollableResults scroll2 = streamQuery("from HTextFlowTarget");
Assert.fail("Failed to detect concurrent ResultSet - is WrappedConnectionProvider enabled?");
}
catch (JDBCException e)
{
if (!(e.getSQLException() instanceof StreamingResultSetSQLException))
{
throw e;
}
}
}

@Test
public void testWrapperWithNestedResults() throws Exception
{
@Cleanup
ScrollableResults scroll1 = streamQuery("from HTextFlow");
try
{
@Cleanup
ScrollableResults scroll2 = scrollQuery("from HTextFlowTarget");
Assert.fail("Failed to detect concurrent ResultSet - is WrappedConnectionProvider enabled?");
}
catch (JDBCException e)
{
if (!(e.getSQLException() instanceof StreamingResultSetSQLException))
{
throw e;
}
}
}

private ScrollableResults streamQuery(String queryString)
{
Query q = session.createQuery(queryString);
q.setFetchSize(Integer.MIN_VALUE);
ScrollableResults scroll = q.scroll(ScrollMode.FORWARD_ONLY);
return scroll;
}

private ScrollableResults scrollQuery(String queryString)
{
Query q = session.createQuery(queryString);
ScrollableResults scroll = q.scroll();
return scroll;
}

@Test
public void findAllTextFlows() throws Exception
{
Expand Down
@@ -0,0 +1,128 @@
package org.zanata.database;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

import lombok.Cleanup;

import org.dbunit.operation.DatabaseOperation;
import org.hibernate.JDBCException;
import org.hibernate.Query;
import org.hibernate.ScrollMode;
import org.hibernate.ScrollableResults;
import org.hibernate.Session;
import org.hibernate.jdbc.Work;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.zanata.ZanataDbunitJpaTest;

@Test(groups = { "jpa-tests" })
public class WrappedConnectionProviderTest extends ZanataDbunitJpaTest
{

private Session session;

@Override
protected void prepareDBUnitOperations()
{
beforeTestOperations.add(new DataSetOperation("org/zanata/test/model/ProjectsData.dbunit.xml", DatabaseOperation.CLEAN_INSERT));
beforeTestOperations.add(new DataSetOperation("org/zanata/test/model/TextFlowTestData.dbunit.xml", DatabaseOperation.CLEAN_INSERT));
beforeTestOperations.add(new DataSetOperation("org/zanata/test/model/LocalesData.dbunit.xml", DatabaseOperation.CLEAN_INSERT));
beforeTestOperations.add(new DataSetOperation("org/zanata/test/model/AccountData.dbunit.xml", DatabaseOperation.CLEAN_INSERT));
}

@BeforeMethod(firstTimeOnly = true)
public void setup()
{
session = getSession();
}

@Test
public void testWrapperWithNestedExecute() throws Exception
{
@Cleanup
ScrollableResults scroll1 = streamQuery("from HTextFlow");
try
{
session.doWork(new Work()
{
@Override
public void execute(Connection connection) throws SQLException
{
Statement statement = connection.createStatement();
statement.executeUpdate("delete from HTextFlow where 0=1");
}
});
concurrentResultSetNotDetected();
}
catch (JDBCException e)
{
checkExceptionType(e);
}
}

@Test
public void testWrapperWithNestedStreaming() throws Exception
{
@Cleanup
ScrollableResults scroll1 = streamQuery("from HTextFlow");
try
{
@Cleanup
ScrollableResults scroll2 = streamQuery("from HTextFlowTarget");
concurrentResultSetNotDetected();
}
catch (JDBCException e)
{
checkExceptionType(e);
}
}

@Test
public void testWrapperWithNestedResults() throws Exception
{
@Cleanup
ScrollableResults scroll1 = streamQuery("from HTextFlow");
try
{
@Cleanup
ScrollableResults scroll2 = scrollQuery("from HTextFlowTarget");
concurrentResultSetNotDetected();
}
catch (JDBCException e)
{
checkExceptionType(e);
}
}

private void concurrentResultSetNotDetected()
{
Assert.fail("Failed to detect concurrent ResultSet - is WrappedConnectionProvider enabled in persistence.xml?");
}

private void checkExceptionType(JDBCException e)
{
if (!(e.getSQLException() instanceof StreamingResultSetSQLException))
{
throw e;
}
}

private ScrollableResults streamQuery(String queryString)
{
Query q = session.createQuery(queryString);
q.setFetchSize(Integer.MIN_VALUE);
ScrollableResults scroll = q.scroll(ScrollMode.FORWARD_ONLY);
return scroll;
}

private ScrollableResults scrollQuery(String queryString)
{
Query q = session.createQuery(queryString);
ScrollableResults scroll = q.scroll();
return scroll;
}

}
2 changes: 1 addition & 1 deletion zanata-war/src/test/resources/META-INF/persistence.xml
Expand Up @@ -60,7 +60,7 @@
<property name="hibernate.cache.region.factory_class" value="org.hibernate.testing.cache.CachingRegionFactory" />
<property name="hibernate.hbm2ddl.auto" value="create"/>

<property name="hibernate.connection.provider_class" value="org.zanata.dao.WrappedConnectionProvider" />
<property name="hibernate.connection.provider_class" value="org.zanata.database.WrappedConnectionProvider" />

<property name="hibernate.connection.driver_class" value="org.h2.Driver" />
<!-- Configure the in-memory database to be shared, and so that it
Expand Down
2 changes: 2 additions & 0 deletions zanata-war/src/test/resources/arquillian/persistence.xml
Expand Up @@ -65,6 +65,8 @@
<property name="hibernate.cache.region.factory_class" value="org.hibernate.testing.cache.CachingRegionFactory" />
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>

<property name="hibernate.connection.provider_class" value="org.zanata.database.WrappedConnectionProvider" />

<!--<property name="hibernate.connection.driver_class" value="org.h2.Driver" />
&lt;!&ndash; Configure the in-memory database to be shared, and so that it
doesn't disappear after it has been set up by Hibernate: &ndash;&gt;
Expand Down

0 comments on commit 4f1dfe3

Please sign in to comment.