|
3 | 3 | import java.util.List; |
4 | 4 | import java.util.Locale; |
5 | 5 |
|
| 6 | +import org.hibernate.dialect.H2Dialect; |
6 | 7 | import org.hibernate.event.jfr.internal.JdbcPreparedStatementCreationEvent; |
7 | 8 | import org.hibernate.event.jfr.internal.JdbcPreparedStatementExecutionEvent; |
8 | | - |
| 9 | +import org.hibernate.procedure.ProcedureCall; |
9 | 10 | import org.hibernate.testing.orm.junit.DomainModel; |
| 11 | +import org.hibernate.testing.orm.junit.RequiresDialect; |
10 | 12 | import org.hibernate.testing.orm.junit.SessionFactory; |
11 | 13 | import org.hibernate.testing.orm.junit.SessionFactoryScope; |
12 | 14 | import org.junit.jupiter.api.Test; |
13 | 15 |
|
14 | 16 | import jakarta.persistence.Entity; |
15 | 17 | import jakarta.persistence.Id; |
| 18 | +import jakarta.persistence.ParameterMode; |
16 | 19 | import jdk.jfr.consumer.RecordedEvent; |
17 | 20 | import org.moditect.jfrunit.EnableEvent; |
18 | 21 | import org.moditect.jfrunit.JfrEventTest; |
@@ -85,6 +88,53 @@ public void testJdbcPreparedStatementEventNoFired(SessionFactoryScope scope) { |
85 | 88 | assertThat( events ).hasSize( 0 ); |
86 | 89 | } |
87 | 90 |
|
| 91 | + @Test |
| 92 | + @RequiresDialect(H2Dialect.class) |
| 93 | + @EnableEvent(JdbcPreparedStatementCreationEvent.NAME) |
| 94 | + @EnableEvent(JdbcPreparedStatementExecutionEvent.NAME) |
| 95 | + public void testJdbcPreparedStatementEventStoredProcedure(SessionFactoryScope scope) { |
| 96 | + scope.inTransaction( |
| 97 | + session -> { |
| 98 | + ProcedureCall call = session.createStoredProcedureCall("DB_OBJECT_SQL", String.class) |
| 99 | + .registerStoredProcedureParameter(1, String.class, ParameterMode.IN) |
| 100 | + .registerStoredProcedureParameter(2, String.class, ParameterMode.IN) |
| 101 | + .setParameter(1, "USER") |
| 102 | + .setParameter(2, "SA"); |
| 103 | + boolean hasResult = call.execute(); |
| 104 | + assertThat( hasResult ).isTrue(); |
| 105 | + Object createSa = call.getSingleResult(); |
| 106 | + assertThat( createSa ).isInstanceOf( String.class ); |
| 107 | + assertThat( ((String) createSa).toLowerCase( Locale.ROOT ) ).contains( "create user if not exists " ); |
| 108 | + |
| 109 | + final List<RecordedEvent> events = jfrEvents.events() |
| 110 | + .filter( |
| 111 | + recordedEvent -> |
| 112 | + { |
| 113 | + String eventName = recordedEvent.getEventType().getName(); |
| 114 | + return eventName.equals( JdbcPreparedStatementCreationEvent.NAME ) |
| 115 | + || eventName.equals( JdbcPreparedStatementExecutionEvent.NAME ); |
| 116 | + } |
| 117 | + ).toList(); |
| 118 | + assertThat( events ).hasSize( 2 ); |
| 119 | + |
| 120 | + RecordedEvent preparedStatementCreationEvent = events.get( 0 ); |
| 121 | + assertThat( preparedStatementCreationEvent.getEventType().getName() ) |
| 122 | + .isEqualTo( JdbcPreparedStatementCreationEvent.NAME ); |
| 123 | + assertThat( preparedStatementCreationEvent.getLong( "executionTime" ) ).isGreaterThan( 0 ); |
| 124 | + assertThat( preparedStatementCreationEvent.getString( "sql" ).toLowerCase( Locale.ROOT ) ) |
| 125 | + .contains( "{call " ); |
| 126 | + |
| 127 | + RecordedEvent preparedStatementExecutionEvent = events.get( 1 ); |
| 128 | + assertThat( preparedStatementExecutionEvent.getEventType().getName() ) |
| 129 | + .isEqualTo( JdbcPreparedStatementExecutionEvent.NAME ); |
| 130 | + assertThat( preparedStatementExecutionEvent.getLong( "executionTime" ) ).isGreaterThan( 0 ); |
| 131 | + assertThat( preparedStatementExecutionEvent.getString( "sql" ) ) |
| 132 | + .isEqualTo( preparedStatementCreationEvent.getString( "sql" ) ); |
| 133 | + } |
| 134 | + ); |
| 135 | + |
| 136 | + } |
| 137 | + |
88 | 138 | @Entity(name = "TestEntity") |
89 | 139 | public static class TestEntity { |
90 | 140 | @Id |
|
0 commit comments