package Ġio . sentry . jdbc Ċ Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . mock Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . wh enever Ċ import Ġcom . p 6 spy . engine . spy . P 6 DataSource Ċ import Ġio . sentry . I Hub Ċ import Ġio . sentry . S entry Options Ċ import Ġio . sentry . S entry Tracer Ċ import Ġio . sentry . Span Status Ċ import Ġio . sentry . Transaction Context Ċ import Ġorg . h sql db . jdbc . JDBC DataSource Ċ import Ġjavax . sql . DataSource Ċ import Ġkotlin . test . After Test Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertTrue Ċ Ċ class ĠS entry Jdbc EventListener Test Ġ{ ĊĊĠĠĠ Ġclass ĠFix ture Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġhub Ġ= Ġmock < I Hub >() ĊĠĠĠĠĠĠĠ Ġval Ġtx Ġ= ĠS entry Tracer ( Transaction Context (" name ", Ġ" op "), Ġhub ) ĊĠĠĠĠĠĠĠ Ġval Ġactual DataSource Ġ= ĠJDBC DataSource () ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetS ut ( with Running Transaction : ĠBoolean Ġ= Ġtrue , Ġexisting Row : ĠInt ? Ġ= Ġnull ): ĠDataSource Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( hub . options ). thenReturn ( S entry Options ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( with Running Transaction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( hub . span ). thenReturn ( tx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual DataSource . set URL (" jdbc : h sql db : mem : test db ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual DataSource . connection . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . prepareStatement (" CREATE ĠTABLE Ġfoo Ġ( id Ġint Ġunique ) "). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexisting Row ?. let Ġ{ Ġrow Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual DataSource . connection . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġit . prepareStatement (" INSERT ĠINTO Ġfoo ĠVALUES Ġ( ?) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatement . setInt ( 1 , Ġexisting Row ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatement . executeUpdate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs entry Query Execution Listener Ġ= ĠS entry Jdbc EventListener ( hub ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 6 spy DataSource Ġ= ĠP 6 DataSource ( actual DataSource ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 6 spy DataSource . set Jdbc EventListener Factory Ġ{ Ġs entry Query Execution Listener Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġp 6 spy DataSource ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġfixture Ġ= ĠFix ture () ĊĊĠĠĠ Ġ@ After Test ĊĠĠĠ Ġfun Ġclean () Ġ{ ĊĠĠĠĠĠĠĠ Ġfixture . actual DataSource . connection . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . prepareStatement (" drop Ġtable Ġfoo "). execute () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` creates Ġspans Ġfor Ġsuccessful Ġcalls `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= Ġfixture . getS ut () ĊĊĠĠĠĠĠĠĠ Ġsut . connection . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . prepareStatement (" INSERT ĠINTO Ġfoo ĠVALUES Ġ( 1 ) "). executeUpdate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . prepareStatement (" INSERT ĠINTO Ġfoo ĠVALUES Ġ( 2 ) "). executeUpdate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġfixture . tx . children . size ) ĊĠĠĠĠĠĠĠ Ġfixture . tx . children . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Span Status . OK , Ġit . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" db . query ", Ġit . operation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals (" INSERT ĠINTO Ġfoo ĠVALUES Ġ( 1 )", Ġfixture . tx . children [ 0 ]. description ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" INSERT ĠINTO Ġfoo ĠVALUES Ġ( 2 )", Ġfixture . tx . children [ 1 ]. description ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` creates Ġspans Ġfor Ġcalls Ġresulting Ġin Ġerror `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= Ġfixture . getS ut ( existing Row Ġ= Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsut . connection . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . prepareStatement (" INSERT ĠINTO Ġfoo ĠVALUES Ġ( 1 ) "). executeUpdate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġfixture . tx . children . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Span Status . INTERNAL _ ERROR , Ġfixture . tx . children [ 0 ]. status ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" INSERT ĠINTO Ġfoo ĠVALUES Ġ( 1 )", Ġfixture . tx . children [ 0 ]. description ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" db . query ", Ġfixture . tx . children [ 0 ]. operation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` does Ġnot Ġcreate Ġspans Ġwhen Ġthere Ġis Ġno Ġrunning Ġtransactions `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= Ġfixture . getS ut ( with Running Transaction Ġ= Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġsut . connection . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . prepareStatement (" INSERT ĠINTO Ġfoo ĠVALUES Ġ( 1 ) "). executeUpdate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . prepareStatement (" INSERT ĠINTO Ġfoo ĠVALUES Ġ( 2 ) "). executeUpdate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( fixture . tx . children . isEmpty ()) ĊĠĠĠ Ġ} Ċ } Ċ