opentelemetry-java-instrume.../dd-java-agent/instrumentation/hibernate-4.3/src/test/groovy/ProcedureCallTest.groovy

176 lines
4.8 KiB
Groovy

import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.api.DDSpanTypes
import io.opentracing.tag.Tags
import org.hibernate.Session
import org.hibernate.SessionFactory
import org.hibernate.cfg.Configuration
import org.hibernate.exception.SQLGrammarException
import org.hibernate.procedure.ProcedureCall
import spock.lang.Shared
import javax.persistence.ParameterMode
import java.sql.Connection
import java.sql.DriverManager
import java.sql.Statement
class ProcedureCallTest extends AgentTestRunner {
@Shared
protected SessionFactory sessionFactory
@Shared
protected List<Value> prepopulated
def setupSpec() {
sessionFactory = new Configuration().configure().buildSessionFactory()
// Pre-populate the DB, so delete/update can be tested.
Session writer = sessionFactory.openSession()
writer.beginTransaction()
prepopulated = new ArrayList<>()
for (int i = 0; i < 2; i++) {
prepopulated.add(new Value("Hello :) " + i))
writer.save(prepopulated.get(i))
}
writer.getTransaction().commit()
writer.close()
// Create a stored procedure.
Connection conn = DriverManager.getConnection("jdbc:hsqldb:mem:test", "sa", "1")
Statement stmt = conn.createStatement()
stmt.execute("CREATE PROCEDURE TEST_PROC() MODIFIES SQL DATA BEGIN ATOMIC INSERT INTO Value VALUES (420, 'fred'); END")
stmt.close()
conn.close()
}
def cleanupSpec() {
if (sessionFactory != null) {
sessionFactory.close()
}
}
def "test ProcedureCall"() {
setup:
Session session = sessionFactory.openSession()
session.beginTransaction()
ProcedureCall call = session.createStoredProcedureCall("TEST_PROC")
call.getOutputs()
session.getTransaction().commit()
session.close()
expect:
assertTraces(1) {
trace(0, 4) {
span(0) {
serviceName "hibernate"
resourceName "hibernate.session"
operationName "hibernate.session"
spanType DDSpanTypes.HIBERNATE
parent()
tags {
"$Tags.COMPONENT.key" "java-hibernate"
"$Tags.SPAN_KIND.key" Tags.SPAN_KIND_CLIENT
defaultTags()
}
}
span(1) {
serviceName "hibernate"
resourceName "hibernate.transaction.commit"
operationName "hibernate.transaction.commit"
spanType DDSpanTypes.HIBERNATE
childOf span(0)
tags {
"$Tags.COMPONENT.key" "java-hibernate"
"$Tags.SPAN_KIND.key" Tags.SPAN_KIND_CLIENT
defaultTags()
}
}
span(2) {
serviceName "hibernate"
resourceName "TEST_PROC"
operationName "hibernate.procedure.getOutputs"
spanType DDSpanTypes.HIBERNATE
childOf span(0)
tags {
"$Tags.COMPONENT.key" "java-hibernate"
"$Tags.SPAN_KIND.key" Tags.SPAN_KIND_CLIENT
defaultTags()
}
}
span(3) {
serviceName "hsqldb"
spanType "sql"
childOf span(2)
}
}
}
}
def "test failing ProcedureCall"() {
setup:
Session session = sessionFactory.openSession()
session.beginTransaction()
ProcedureCall call = session.createStoredProcedureCall("TEST_PROC")
call.registerParameter("nonexistent", Long, ParameterMode.IN)
call.getParameterRegistration("nonexistent").bindValue(420L)
try {
call.getOutputs()
} catch (Exception e) {
// We expected this.
}
session.getTransaction().commit()
session.close()
expect:
assertTraces(1) {
trace(0, 3) {
span(0) {
serviceName "hibernate"
resourceName "hibernate.session"
operationName "hibernate.session"
spanType DDSpanTypes.HIBERNATE
parent()
tags {
"$Tags.COMPONENT.key" "java-hibernate"
"$Tags.SPAN_KIND.key" Tags.SPAN_KIND_CLIENT
defaultTags()
}
}
span(1) {
serviceName "hibernate"
resourceName "hibernate.transaction.commit"
operationName "hibernate.transaction.commit"
spanType DDSpanTypes.HIBERNATE
childOf span(0)
tags {
"$Tags.COMPONENT.key" "java-hibernate"
"$Tags.SPAN_KIND.key" Tags.SPAN_KIND_CLIENT
defaultTags()
}
}
span(2) {
serviceName "hibernate"
resourceName "TEST_PROC"
operationName "hibernate.procedure.getOutputs"
spanType DDSpanTypes.HIBERNATE
childOf span(0)
errored(true)
tags {
errorTags(SQLGrammarException, "could not prepare statement")
"$Tags.COMPONENT.key" "java-hibernate"
"$Tags.SPAN_KIND.key" Tags.SPAN_KIND_CLIENT
defaultTags()
}
}
}
}
}
}