Skip to content

Commit 6276906

Browse files
committed
[#2518] Test sessions with lazy connection creation
1 parent 0f7de03 commit 6276906

File tree

3 files changed

+149
-3
lines changed

3 files changed

+149
-3
lines changed

hibernate-reactive-core/src/test/java/org/hibernate/reactive/BatchingConnectionTest.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
*/
66
package org.hibernate.reactive;
77

8-
98
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
109
import org.hibernate.cfg.AvailableSettings;
1110
import org.hibernate.cfg.Configuration;
1211
import org.hibernate.reactive.mutiny.impl.MutinySessionImpl;
1312
import org.hibernate.reactive.mutiny.impl.MutinyStatelessSessionImpl;
1413
import org.hibernate.reactive.pool.BatchingConnection;
14+
import org.hibernate.reactive.pool.ReactiveConnection;
1515
import org.hibernate.reactive.pool.impl.SqlClientConnection;
1616
import org.hibernate.reactive.stage.impl.StageSessionImpl;
1717
import org.hibernate.reactive.stage.impl.StageStatelessSessionImpl;
@@ -30,7 +30,6 @@
3030
import static org.junit.jupiter.api.Assertions.assertEquals;
3131

3232
@Timeout(value = 10, timeUnit = MINUTES)
33-
3433
public class BatchingConnectionTest extends ReactiveSessionTest {
3534

3635
private static SqlStatementTracker sqlTracker;
@@ -65,6 +64,27 @@ private static boolean filter(String s) {
6564
return false;
6665
}
6766

67+
@Override
68+
protected void assertConnectionIsLazy(ReactiveConnection connection) {
69+
assertConnectionIsLazy( connection, false );
70+
}
71+
72+
@Override
73+
protected void assertConnectionIsLazy(ReactiveConnection connection, boolean stateless) {
74+
final ReactiveConnection actualConnection;
75+
if ( !stateless ) {
76+
// Only the stateful session creates a batching connection
77+
assertThat( connection ).isInstanceOf( BatchingConnection.class );
78+
// A little hack, withBatchSize returns the underlying connection when the parameter is less than 1
79+
actualConnection = connection.withBatchSize( -1 );
80+
}
81+
else {
82+
actualConnection = connection;
83+
}
84+
assertThat( actualConnection.getClass().getName() )
85+
.isEqualTo( org.hibernate.reactive.pool.impl.SqlClientPool.class.getName() + "$ProxyConnection" );
86+
}
87+
6888
@Test
6989
public void testBatchingWithPersistAll(VertxTestContext context) {
7090
test( context, openSession().thenCompose( s -> s

hibernate-reactive-core/src/test/java/org/hibernate/reactive/ReactiveMultitenantTest.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@
1010
import org.hibernate.LockMode;
1111
import org.hibernate.cfg.AvailableSettings;
1212
import org.hibernate.cfg.Configuration;
13-
import org.hibernate.reactive.provider.Settings;
1413
import org.hibernate.reactive.annotations.EnabledFor;
14+
import org.hibernate.reactive.provider.Settings;
15+
import org.hibernate.reactive.stage.Stage;
1516

1617
import org.junit.jupiter.api.Test;
1718

@@ -97,6 +98,27 @@ public void testTenantSelection(VertxTestContext context) {
9798
);
9899
}
99100

101+
@Test
102+
public void testTenantSelectionWithProxy(VertxTestContext context) {
103+
TENANT_RESOLVER.setTenantIdentifier( TENANT_1 );
104+
Stage.Session t1Session = getSessionFactory().createSession();
105+
test(
106+
context, t1Session
107+
.createNativeQuery( "select current_database()" )
108+
.getSingleResult()
109+
.thenAccept( result -> assertThat( result ).isEqualTo( TENANT_1.getDbName() ) )
110+
.thenCompose( v -> t1Session.close() )
111+
.thenAccept( v -> TENANT_RESOLVER.setTenantIdentifier( TENANT_2 ) )
112+
.thenApply( v -> getSessionFactory().createSession() )
113+
.thenCompose( t2Session -> t2Session
114+
.createNativeQuery( "select current_database()" )
115+
.getSingleResult()
116+
.thenAccept( result -> assertThat( result ).isEqualTo( TENANT_2.getDbName() ) )
117+
.thenCompose( v -> t2Session.close() )
118+
)
119+
);
120+
}
121+
100122
@Test
101123
public void testTenantSelectionStatelessSession(VertxTestContext context) {
102124
TENANT_RESOLVER.setTenantIdentifier( TENANT_1 );

hibernate-reactive-core/src/test/java/org/hibernate/reactive/ReactiveSessionTest.java

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,13 @@
1313
import org.hibernate.HibernateException;
1414
import org.hibernate.LockMode;
1515
import org.hibernate.reactive.common.AffectedEntities;
16+
import org.hibernate.reactive.mutiny.Mutiny;
17+
import org.hibernate.reactive.mutiny.impl.MutinySessionImpl;
18+
import org.hibernate.reactive.mutiny.impl.MutinyStatelessSessionImpl;
19+
import org.hibernate.reactive.pool.ReactiveConnection;
1620
import org.hibernate.reactive.stage.Stage;
21+
import org.hibernate.reactive.stage.impl.StageSessionImpl;
22+
import org.hibernate.reactive.stage.impl.StageStatelessSessionImpl;
1723

1824
import org.junit.jupiter.api.Disabled;
1925
import org.junit.jupiter.api.Test;
@@ -55,6 +61,104 @@ private CompletionStage<String> selectNameFromId(Integer id) {
5561
);
5662
}
5763

64+
@Test
65+
public void reactivePersistFindRemoveWithSessionProxy(VertxTestContext context) {
66+
final GuineaPig guineaPig = new GuineaPig( 5, "Aloi" );
67+
Stage.Session session = getSessionFactory().createSession();
68+
assertConnectionIsLazy( ( (StageSessionImpl) session ).getReactiveConnection() );
69+
session.setBatchSize( 55 );
70+
71+
test( context, session
72+
.persist( guineaPig )
73+
.thenCompose( v -> session.flush() )
74+
.thenAccept( v -> session.detach( guineaPig ) )
75+
.thenAccept( v -> assertThat( session.contains( guineaPig ) ).isFalse() )
76+
.thenCompose( v -> session.find( GuineaPig.class, guineaPig.getId() ) )
77+
.thenAccept( actualPig -> {
78+
assertThatPigsAreEqual( guineaPig, actualPig );
79+
assertThat( session.contains( actualPig ) ).isTrue();
80+
assertThat( session.contains( guineaPig ) ).isFalse();
81+
assertThat( session.getLockMode( actualPig ) ).isEqualTo( LockMode.READ );
82+
assertThat( session.getBatchSize() ).isEqualTo( 55 );
83+
session.detach( actualPig );
84+
assertThat( session.contains( actualPig ) ).isFalse();
85+
} )
86+
.thenCompose( v -> session.find( GuineaPig.class, guineaPig.getId() ) )
87+
.thenCompose( session::remove )
88+
.thenCompose( v -> session.flush() )
89+
.thenCompose( v -> session.close() )
90+
);
91+
}
92+
93+
@Test
94+
public void reactiveInsertGetDeleteWithStatelessSessionProxy(VertxTestContext context) {
95+
final GuineaPig guineaPig = new GuineaPig( 5, "Aloi" );
96+
Stage.StatelessSession session = getSessionFactory().createStatelessSession();
97+
assertConnectionIsLazy( ( (StageStatelessSessionImpl) session ).getReactiveConnection(), true );
98+
test( context, session
99+
.insert( guineaPig )
100+
.thenCompose( v -> session.get( GuineaPig.class, guineaPig.getId() ) )
101+
.thenAccept( actualPig -> assertThatPigsAreEqual( guineaPig, actualPig ) )
102+
.thenCompose( v -> session.get( GuineaPig.class, guineaPig.getId() ) )
103+
.thenCompose( session::delete )
104+
.thenCompose( v -> session.close() )
105+
);
106+
}
107+
108+
@Test
109+
public void reactivePersistFindRemoveWithSessionProxyAndMutiny(VertxTestContext context) {
110+
final GuineaPig guineaPig = new GuineaPig( 5, "Aloi" );
111+
Mutiny.Session session = getMutinySessionFactory().createSession();
112+
assertConnectionIsLazy( ( (MutinySessionImpl) session ).getReactiveConnection() );
113+
session.setBatchSize( 55 );
114+
test( context, session
115+
.persist( guineaPig )
116+
.call( session::flush )
117+
.chain( () -> {
118+
session.detach( guineaPig );
119+
assertThat( session.contains( guineaPig ) ).isFalse();
120+
return session.find( GuineaPig.class, guineaPig.getId() );
121+
} )
122+
.chain( actualPig -> {
123+
assertThatPigsAreEqual( guineaPig, actualPig );
124+
assertThat( session.contains( actualPig ) ).isTrue();
125+
assertThat( session.contains( guineaPig ) ).isFalse();
126+
assertThat( session.getLockMode( actualPig ) ).isEqualTo( LockMode.READ );
127+
assertThat( session.getBatchSize() ).isEqualTo( 55 );
128+
session.detach( actualPig );
129+
assertThat( session.contains( actualPig ) ).isFalse();
130+
return session.find( GuineaPig.class, guineaPig.getId() );
131+
} )
132+
.chain( session::remove )
133+
.call( session::flush )
134+
.eventually( session::close )
135+
);
136+
}
137+
138+
protected void assertConnectionIsLazy(ReactiveConnection connection, boolean stateless) {
139+
assertConnectionIsLazy( connection );
140+
}
141+
142+
protected void assertConnectionIsLazy(ReactiveConnection connection) {
143+
assertThat( connection.getClass().getName() )
144+
.isEqualTo( org.hibernate.reactive.pool.impl.SqlClientPool.class.getName() + "$ProxyConnection" );
145+
}
146+
147+
@Test
148+
public void reactiveInsertGetDeleteWithStatelessSessionProxyAndMutiny(VertxTestContext context) {
149+
final GuineaPig guineaPig = new GuineaPig( 5, "Aloi" );
150+
Mutiny.StatelessSession session = getMutinySessionFactory().createStatelessSession();
151+
assertConnectionIsLazy( ( (MutinyStatelessSessionImpl) session ).getReactiveConnection(), true );
152+
test( context, session
153+
.insert( guineaPig )
154+
.chain( () -> session.get( GuineaPig.class, guineaPig.getId() ) )
155+
.invoke( actualPig -> assertThatPigsAreEqual( guineaPig, actualPig ) )
156+
.chain( () -> session.get( GuineaPig.class, guineaPig.getId() ) )
157+
.call( session::delete )
158+
.eventually( session::close )
159+
);
160+
}
161+
58162
@Test
59163
public void reactiveFind(VertxTestContext context) {
60164
final GuineaPig expectedPig = new GuineaPig( 5, "Aloi" );

0 commit comments

Comments
 (0)