Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,47 +4,54 @@
*/
package org.hibernate.test.agroal;

import org.hibernate.agroal.internal.AgroalConnectionProvider;
import org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.ConnectionProviderJdbcConnectionAccess;
import org.hibernate.engine.jdbc.spi.JdbcServices;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.service.spi.ServiceRegistryImplementor;
import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.ServiceRegistry;
import org.hibernate.testing.orm.junit.ServiceRegistryScope;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
import org.junit.jupiter.api.Test;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.ConnectionProviderJdbcConnectionAccess;
import org.hibernate.engine.jdbc.spi.JdbcServices;
import org.hibernate.agroal.internal.AgroalConnectionProvider;

import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import org.junit.Test;

import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hibernate.testing.orm.junit.ExtraAssertions.assertTyping;
import static org.junit.jupiter.api.Assertions.fail;

/**
* @author Brett Meyer
*/
public class AgroalConnectionProviderTest extends BaseCoreFunctionalTestCase {
public class AgroalConnectionProviderTest {

@Test
public void testAgroalConnectionProvider() throws Exception {
JdbcServices jdbcServices = serviceRegistry().requireService( JdbcServices.class );
ConnectionProviderJdbcConnectionAccess connectionAccess = assertTyping(
ConnectionProviderJdbcConnectionAccess.class,
jdbcServices.getBootstrapJdbcConnectionAccess()
);
assertTyping( AgroalConnectionProvider.class, connectionAccess.getConnectionProvider() );
@ServiceRegistry
@DomainModel
@SessionFactory
public void testAgroalConnectionProvider(ServiceRegistryScope registryScope, SessionFactoryScope factoryScope) throws Exception {
final SessionFactoryImplementor sessionFactory = factoryScope.getSessionFactory();

var serviceRegistry = registryScope.getRegistry();

JdbcServices jdbcServices = serviceRegistry.requireService( JdbcServices.class );
var connectionAccess = assertTyping( ConnectionProviderJdbcConnectionAccess.class, jdbcServices.getBootstrapJdbcConnectionAccess() );
assertThat( connectionAccess ).isInstanceOf( ConnectionProviderJdbcConnectionAccess.class );
var agroalConnectionProvider = assertTyping( AgroalConnectionProvider.class, connectionAccess.getConnectionProvider() );

AgroalConnectionProvider agroalConnectionProvider = (AgroalConnectionProvider) connectionAccess.getConnectionProvider();
// For simplicity's sake, using the following in hibernate.properties:
// hibernate.agroal.maxSize 2
// hibernate.agroal.minSize 2
List<Connection> conns = new ArrayList<>();
for ( int i = 0; i < 2; i++ ) {
Connection conn = agroalConnectionProvider.getConnection();
assertNotNull( conn );
assertFalse( conn.isClosed() );
assertThat( conn ).isNotNull();
assertThat( conn.isClosed() ).isFalse();
conns.add( conn );
}

Expand All @@ -54,24 +61,30 @@ public void testAgroalConnectionProvider() throws Exception {
}
catch (SQLException e) {
// expected
assertTrue( e.getMessage().contains( "timeout" ) );
assertThat( e.getMessage() ).contains( "timeout" );
}

for ( Connection conn : conns ) {
agroalConnectionProvider.closeConnection( conn );
assertTrue( conn.isClosed() );
assertThat( conn.isClosed() ).isTrue();
}

releaseSessionFactory();
// NOTE : The JUnit 5 infrastructure versus the JUnit 4 infrastructure causes the
// StandardServiceRegistry (the SF registry's parent) to be created with auto-closure disabled.
// That is not the normal process.
// So here we explicitly close the parent.
sessionFactory.close();
( (ServiceRegistryImplementor) serviceRegistry ).destroy();
assert serviceRegistry.getParentServiceRegistry() != null : "Expecting parent service registry";
( (ServiceRegistryImplementor) serviceRegistry.getParentServiceRegistry() ).destroy();

try {
agroalConnectionProvider.getConnection();
fail( "Exception expected -- the pool should have been shutdown." );
}
catch (Exception e) {
// expected
assertTrue( e.getMessage() + " does not contain 'closed' or 'shutting down'",
e.getMessage().contains( "closed" ) || e.getMessage().contains( "shutting down" ) );
assertThat( e.getMessage() ).containsAnyOf( "closed", "shutting down" );
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,58 +4,63 @@
*/
package org.hibernate.test.agroal;

import org.hibernate.cfg.AvailableSettings;
import org.hibernate.cfg.Configuration;
import org.hibernate.test.agroal.util.PreparedStatementSpyConnectionProvider;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import org.junit.Test;
import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.ServiceRegistry;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
import org.hibernate.testing.orm.junit.Setting;
import org.hibernate.testing.orm.junit.SettingProvider;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import org.junit.jupiter.api.Test;

import java.sql.Connection;
import java.util.List;

import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hibernate.cfg.JdbcSettings.AUTOCOMMIT;
import static org.hibernate.cfg.JdbcSettings.CONNECTION_PROVIDER;
import static org.hibernate.cfg.JdbcSettings.CONNECTION_PROVIDER_DISABLES_AUTOCOMMIT;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

/**
* @author Vlad Mihalcea
*/
public class AgroalSkipAutoCommitTest extends BaseCoreFunctionalTestCase {

private PreparedStatementSpyConnectionProvider connectionProvider = new PreparedStatementSpyConnectionProvider();

@Override
protected void configure(Configuration configuration) {
configuration.getProperties().put( AvailableSettings.CONNECTION_PROVIDER, connectionProvider );
configuration.getProperties().put( AvailableSettings.CONNECTION_PROVIDER_DISABLES_AUTOCOMMIT, Boolean.TRUE );
configuration.getProperties().put( AvailableSettings.AUTOCOMMIT, Boolean.FALSE.toString() );
}

@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class<?>[]{ City.class };
}
public class AgroalSkipAutoCommitTest {
private static final PreparedStatementSpyConnectionProvider connectionProvider = new PreparedStatementSpyConnectionProvider();
private static final SettingProvider.Provider<PreparedStatementSpyConnectionProvider> connectionProviderProvider = () -> connectionProvider;

@Test
public void test() {
@ServiceRegistry(
settings = {
@Setting( name = CONNECTION_PROVIDER_DISABLES_AUTOCOMMIT, value = "true" ),
@Setting( name = AUTOCOMMIT, value = "false" )
},
settingProviders = @SettingProvider(settingName = CONNECTION_PROVIDER, provider = ConnectionProviderProvider.class)
)
@DomainModel( annotatedClasses = City.class )
@SessionFactory
public void test(SessionFactoryScope factoryScope) {
factoryScope.getSessionFactory();
connectionProvider.clear();
doInHibernate( this::sessionFactory, session -> {
factoryScope.inTransaction( (session) -> {
City city = new City();
city.setId( 1L );
city.setName( "Cluj-Napoca" );
session.persist( city );

assertTrue( connectionProvider.getAcquiredConnections().isEmpty() );
assertTrue( connectionProvider.getReleasedConnections().isEmpty() );
assertThat( connectionProvider.getAcquiredConnections().isEmpty() ).isTrue();
assertThat( connectionProvider.getReleasedConnections().isEmpty() ).isTrue();
} );
verifyConnections();

connectionProvider.clear();
doInHibernate( this::sessionFactory, session -> {
factoryScope.inTransaction( (session) -> {
City city = session.find( City.class, 1L );
assertEquals( "Cluj-Napoca", city.getName() );
assertThat( city.getName() ).isEqualTo( "Cluj-Napoca" );
} );
verifyConnections();
}
Expand Down Expand Up @@ -101,4 +106,11 @@ public void setName(String name) {
this.name = name;
}
}

public static class ConnectionProviderProvider implements SettingProvider.Provider<PreparedStatementSpyConnectionProvider> {
@Override
public PreparedStatementSpyConnectionProvider getSetting() {
return connectionProvider;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,22 @@
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;

import org.hibernate.test.agroal.util.GradleParallelTestingAgroalConnectionProvider;
import org.hibernate.testing.SkipForDialect;
import org.hibernate.testing.common.connections.BaseTransactionIsolationConfigTest;
import org.hibernate.testing.orm.common.BaseTransactionIsolationConfigTest;
import org.hibernate.testing.orm.junit.ServiceRegistryScope;
import org.hibernate.testing.orm.junit.SkipForDialect;

/**
* @author Steve Ebersole
*/
@SkipForDialect(value = TiDBDialect.class, comment = "Doesn't support SERIALIZABLE isolation")
@SkipForDialect(value = AltibaseDialect.class, comment = "Altibase cannot change isolation level in autocommit mode")
@SkipForDialect(value = GaussDBDialect.class, comment = "GaussDB does not support SERIALIZABLE isolation")
@SkipForDialect(dialectClass = TiDBDialect.class,
reason = "Doesn't support SERIALIZABLE isolation")
@SkipForDialect(dialectClass = AltibaseDialect.class,
reason = "Altibase cannot change isolation level in autocommit mode")
@SkipForDialect(dialectClass = GaussDBDialect.class,
reason = "GaussDB does not support SERIALIZABLE isolation")
public class AgroalTransactionIsolationConfigTest extends BaseTransactionIsolationConfigTest {
@Override
protected ConnectionProvider getConnectionProviderUnderTest() {
protected ConnectionProvider getConnectionProviderUnderTest(ServiceRegistryScope registryScope) {
return new GradleParallelTestingAgroalConnectionProvider();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,55 +4,49 @@
*/
package org.hibernate.test.c3p0;

import java.lang.management.ManagementFactory;
import java.util.Set;
import javax.management.MBeanServer;
import javax.management.ObjectName;

import org.hibernate.c3p0.internal.C3P0ConnectionProvider;
import org.hibernate.dialect.SybaseASEDialect;
import org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.ConnectionProviderJdbcConnectionAccess;
import org.hibernate.engine.jdbc.spi.JdbcServices;

import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.ServiceRegistry;
import org.hibernate.testing.orm.junit.ServiceRegistryScope;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
import org.hibernate.testing.orm.junit.SkipForDialect;
import org.junit.Test;
import org.junit.jupiter.api.Test;

import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;
import java.util.Set;

import static org.assertj.core.api.Assertions.assertThat;
import static org.hibernate.testing.orm.junit.ExtraAssertions.assertTyping;

/**
* @author Strong Liu
*/
@SkipForDialect(dialectClass = SybaseASEDialect.class,
reason = "JtdsConnection.isValid not implemented")
public class C3P0ConnectionProviderTest extends BaseCoreFunctionalTestCase {

@Override
protected void releaseSessionFactory() {
super.releaseSessionFactory();
try {
//c3p0 does not close physical connections right away, so without this hack a connection leak false alarm is triggered.
Thread.sleep( 100 );
}
catch ( InterruptedException e ) {
}
}

@ServiceRegistry
@DomainModel
@SessionFactory
public class C3P0ConnectionProviderTest {
@Test
public void testC3P0isDefaultWhenThereIsC3P0Properties() {
JdbcServices jdbcServices = serviceRegistry().requireService( JdbcServices.class );
ConnectionProviderJdbcConnectionAccess connectionAccess =
assertTyping(
public void testC3P0isDefaultWhenThereIsC3P0Properties(ServiceRegistryScope registryScope) throws Exception {
var serviceRegistry = registryScope.getRegistry();
var jdbcServices = serviceRegistry.requireService( JdbcServices.class );
var connectionAccess = assertTyping(
ConnectionProviderJdbcConnectionAccess.class,
jdbcServices.getBootstrapJdbcConnectionAccess()
);
assertTrue( connectionAccess.getConnectionProvider() instanceof C3P0ConnectionProvider );
);
assertThat( connectionAccess.getConnectionProvider() ).isInstanceOf( C3P0ConnectionProvider.class );
}

@Test
public void testHHH6635() throws Exception {
public void testHHH6635(SessionFactoryScope factoryScope) throws Exception {
var sf = factoryScope.getSessionFactory();

Check notice

Code scanning / CodeQL

Unread local variable Note test

Variable 'SessionFactoryImplementor sf' is never read.
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
Set<ObjectName> set = mBeanServer.queryNames( null, null );
boolean mbeanfound = false;
Expand All @@ -63,29 +57,30 @@
// see according c3p0 settings in META-INF/persistence.xml

int actual_minPoolSize = (Integer) mBeanServer.getAttribute( obj, "minPoolSize" );
assertEquals( 0, actual_minPoolSize );
assertThat( actual_minPoolSize ).isEqualTo( 0 );

int actual_initialPoolSize = (Integer) mBeanServer.getAttribute( obj, "initialPoolSize" );
assertEquals( 0, actual_initialPoolSize );
assertThat( actual_initialPoolSize ).isEqualTo( 0 );

int actual_maxPoolSize = (Integer) mBeanServer.getAttribute( obj, "maxPoolSize" );
assertEquals( 800, actual_maxPoolSize );
assertThat( actual_maxPoolSize ).isEqualTo( 800 );

int actual_maxStatements = (Integer) mBeanServer.getAttribute( obj, "maxStatements" );
assertEquals( 50, actual_maxStatements );
assertThat( actual_maxStatements ).isEqualTo( 50 );

int actual_maxIdleTime = (Integer) mBeanServer.getAttribute( obj, "maxIdleTime" );
assertEquals( 300, actual_maxIdleTime );
assertThat( actual_maxIdleTime ).isEqualTo( 300 );

int actual_idleConnectionTestPeriod = (Integer) mBeanServer.getAttribute(
obj,
"idleConnectionTestPeriod"
);
assertEquals( 3000, actual_idleConnectionTestPeriod );
assertThat( actual_idleConnectionTestPeriod ).isEqualTo( 3000 );

break;
}
}

assertTrue( "PooledDataSource BMean not found, please verify version of c3p0", mbeanfound );
assertThat( mbeanfound ).as( "PooledDataSource BMean not found, please verify version of c3p0" ).isTrue();
}
}
Loading