package Ġcom . github . ays nc . sql . db . integration . pool Ċ Ċ import Ġcom . github . ays nc . sql . db . integration . Database TestHelper Ċ import Ġcom . github . ays nc . sql . db . verify Exception Ċ import Ġcom . github . j async . sql . db . exceptions . Connection Still Running Query Exception Ċ import Ġcom . github . j async . sql . db . invoke Ċ import Ġcom . github . j async . sql . db . pool . Async Object Pool Ċ import Ġcom . github . j async . sql . db . pool . Pool Configuration Ċ import Ġcom . github . j async . sql . db . pool . Pool Ex hausted Exception Ċ import Ġcom . github . j async . sql . db . pool . Single Th readed Async Object Pool Ċ import Ġcom . github . j async . sql . db . postgresql . PostgreSQL Connection Ċ import Ġcom . github . j async . sql . db . postgresql . pool . PostgreSQL ConnectionFactory Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . junit . Test Ċ import Ġjava . nio . channels . Closed Channel Exception Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ import Ġjava . util . concurrent . ExecutionException Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠSingle Th readed Async Object Pool Spec Ġ: ĠDatabase TestHelper () Ġ{ ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ`" pool " Ġshould Ġ" give Ġme Ġa Ġvalid Ġobject Ġwhen ĠI Ġask Ġfor Ġone "` () Ġ{ ĊĊĠĠĠ Ġwith Pool Ġ{ Ġpool Ġ-> ĊĠĠĠĠĠ Ġval Ġconnection Ġ= Ġget ( pool ) ĊĠĠĠĠĠ Ġval Ġresult Ġ= Ġexecute Test ( connection ) ĊĠĠĠĠĠ Ġpool . give Back ( connection ) ĊĠĠĠĠĠ Ġresult ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ`" pool " Ġshould Ġ" enqueue Ġan Ġaction Ġif Ġthe Ġpool Ġis Ġfull " Ġ` () Ġ{ ĊĊĠĠĠ Ġwith Pool ({ Ġpool Ġ-> ĊĊĠĠĠĠĠ Ġval Ġconnection Ġ= Ġget ( pool ) ĊĠĠĠĠĠ Ġval Ġpromises : ĠList < Comp letableFuture < PostgreSQL Connection >> Ġ= ĠlistOf ( pool . take (), Ġpool . take (), Ġpool . take ()) ĊĊĠĠĠĠĠ ĠassertThat ( pool . available s (). size ). isEqualTo ( 0 ) ĊĠĠĠĠĠ ĠassertThat ( pool . in Use (). size ). isEqualTo ( 1 ) ĊĠĠĠĠĠ ĠassertThat ( pool . queued (). size ). is LessThan OrEqualTo ( 3 ) ĊĊĠĠĠĠĠ Ġ/* Ġpool . take Ġcall Ġcheckout Ġthat Ġcall Ġthis . main Pool . action , ĊĠĠĠĠĠ Ġso Ġenqueue Promise Ġcalled Ġin ĠexecutorService , ĊĠĠĠĠĠ Ġso Ġthere Ġis Ġno Ġgu ar ant ies Ġthat Ġall Ġpromises Ġin Ġqueue Ġat Ġthat Ġmoment ĊĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠ Ġval Ġdeadline Ġ= ĠTimeUnit . SECONDS . to Millis ( 5 ) ĊĠĠĠĠĠ Ġwhile Ġ( pool . queued (). size Ġ< Ġ 3 Ġ|| ĠSystem . currentTimeMillis () Ġ< Ġdeadline ) Ġ{ ĊĠĠĠĠĠĠĠ ĠThread . sleep ( 5 0 ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠassertThat ( pool . queued (). size ). isEqualTo ( 3 ) ĊĊĠĠĠĠĠ Ġexecute Test ( connection ) ĊĊĠĠĠĠĠ Ġpool . give Back ( connection ) ĊĊĠĠĠĠĠ Ġval Ġpools : ĠList < Comp letableFuture < Async Object Pool < PostgreSQL Connection >>> Ġ= Ġpromises . map Ġ{ Ġpromise Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġcon Ġ= Ġpromise . get ( 5 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġexecute Test ( con ) ĊĠĠĠĠĠĠĠ Ġpool . give Back ( con ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġpools . last (). get ( 5 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠ ĠassertThat ( pool . available s (). size ). isEqualTo ( 1 ) ĊĠĠĠĠĠ ĠassertThat ( pool . in Use (). size ). isEqualTo ( 0 ) ĊĠĠĠĠĠ ĠassertThat ( pool . queued (). size ). isEqualTo ( 0 ) ĊĊĠĠĠ Ġ}, Ġ 1 , Ġ 3 ) ĊĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ`" pool " Ġshould Ġ" ex haust Ġthe Ġpool "` () Ġ{ ĊĊĠĠĠ Ġwith Pool ({ Ġpool Ġ-> ĊĠĠĠĠĠ Ġ( 1 .. 2 ). forEach Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ Ġpool . take () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġverify Exception ( ExecutionException :: class . java , ĠPool Ex hausted Exception :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠ Ġawait ( pool . take ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, Ġ 1 , Ġ 1 ) ĊĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ`" pool " Ġshould Ġ" it Ġshould Ġremove Ġidle Ġconnections Ġonce Ġthe Ġtime Ġlimit Ġhas Ġbeen Ġreached " Ġ` () Ġ{ ĊĊĠĠĠ Ġwith Pool ({ Ġpool Ġ-> ĊĠĠĠĠĠ Ġval Ġconnections Ġ= Ġ( 1 .. 5 ). map Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġget ( pool ) ĊĠĠĠĠĠĠĠ Ġexecute Test ( connection ) ĊĠĠĠĠĠĠĠ Ġconnection ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġconnections . forEach Ġ{ Ġconnection Ġ-> Ġawait ( pool . give Back ( connection )) Ġ} ĊĊĠĠĠĠĠ ĠassertThat ( pool . available s (). size ). isEqualTo ( 5 ) ĊĊĠĠĠĠĠ ĠThread . sleep ( 2 0 0 0 ) ĊĊĠĠĠĠĠ ĠassertThat ( pool . available s ()). isEmpty () ĊĊĠĠĠ Ġ}, Ġvalidation Interval Ġ= Ġ 1 0 0 0 ) ĊĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ`" pool " Ġshould Ġ" it Ġshould Ġvalidate Ġreturned Ġconnections Ġbefore Ġsending Ġthem Ġback Ġto Ġthe Ġpool " Ġ` () Ġ{ ĊĊĠĠĠ Ġwith Pool Ġ{ Ġpool Ġ-> ĊĠĠĠĠĠ Ġval Ġconnection Ġ= Ġget ( pool ) ĊĠĠĠĠĠ Ġawait ( connection . disconnect ()) ĊĊĠĠĠĠĠ ĠassertThat ( pool . in Use (). size ). isEqualTo ( 1 ) ĊĊĠĠĠĠĠ Ġverify Exception ( ExecutionException :: class . java , ĠClosed Channel Exception :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠ Ġawait ( pool . give Back ( connection )) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠassertThat ( pool . available s (). size ). isEqualTo ( 0 ) ĊĠĠĠĠĠ ĠassertThat ( pool . in Use (). size ). isEqualTo ( 0 ) ĊĠĠĠ Ġ} ĊĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ`" pool " Ġshould Ġ" it Ġshould Ġnot Ġaccept Ġreturned Ġconnections Ġthat Ġaren 't Ġready Ġfor Ġquery " Ġ` () Ġ{ ĊĊĠĠĠ Ġwith Pool Ġ{ Ġpool Ġ-> ĊĠĠĠĠĠ Ġval Ġconnection Ġ= Ġget ( pool ) ĊĠĠĠĠĠ Ġconnection . send PreparedStatement (" SELECT Ġpg _ sleep ( 3 )") ĊĊĠĠĠĠĠ Ġverify Exception ( ExecutionException :: class . java , ĠConnection Still Running Query Exception :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠ Ġawait ( pool . give Back ( connection )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠassertThat ( pool . available s (). size ). isEqualTo ( 0 ) ĊĠĠĠĠĠ ĠassertThat ( pool . in Use (). size ). isEqualTo ( 0 ) ĊĠĠĠ Ġ} ĊĊĠ Ġ} ĊĊĊĠ Ġprivate Ġfun Ġ< T > Ġwith Pool ( ĊĠĠĠĠĠ Ġfn : Ġ( Single Th readed Async Object Pool < PostgreSQL Connection >) Ġ-> ĠT , ĊĠĠĠĠĠ Ġmax Objects : ĠInt Ġ= Ġ 5 , ĊĠĠĠĠĠ Ġmax Queue Size : ĠInt Ġ= Ġ 5 , ĊĠĠĠĠĠ Ġvalidation Interval : ĠLong Ġ= Ġ 3 0 0 0 ĊĠ Ġ): ĠT Ġ{ ĊĊĠĠĠ Ġval Ġpool Configuration Ġ= ĠPool Configuration ( ĊĠĠĠĠĠĠĠ Ġmax Idle Ġ= Ġ 1 0 0 0 , ĊĠĠĠĠĠĠĠ Ġmax Objects Ġ= Ġmax Objects , ĊĠĠĠĠĠĠĠ Ġmax Queue Size Ġ= Ġmax Queue Size , ĊĠĠĠĠĠĠĠ Ġvalidation Interval Ġ= Ġvalidation Interval ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġfactory Ġ= ĠPostgreSQL ConnectionFactory ( this . conf ) ĊĠĠĠ Ġval Ġpool Ġ= ĠSingle Th readed Async Object Pool < PostgreSQL Connection >( factory , Ġpool Configuration ) ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġreturn Ġfn ( pool ) ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠ Ġpool . close (). get () ĊĠĠĠ Ġ} ĊĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġexecute Test ( connection : ĠPostgreSQL Connection ) Ġ= ĠassertThat ( executeQuery ( connection , Ġ" SELECT Ġ 0 "). rows !!. get ( 0 )( 0 )). isEqualTo ( 0 ) ĊĊĠ Ġfun Ġget ( pool : ĠSingle Th readed Async Object Pool < PostgreSQL Connection >): ĠPostgreSQL Connection Ġ{ ĊĠĠĠ Ġval Ġfuture Ġ= Ġpool . take () ĊĠĠĠ Ġreturn Ġfuture . get ( 5 , ĠTimeUnit . SECONDS ) ĊĠ Ġ} Ċ Ċ } Ċ