/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠGoogle , ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . bir bit . artifact finder . model . db Ċ Ċ import Ġcom . bir bit . artifact finder . model .* Ċ import Ġcom . bir bit . artifact finder . vo . Art ifactory Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġjava . sql . SQLException Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . test . Test Coroutine Scope Ċ import Ġkotlinx . coroutines . test . run Blocking Test Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . junit . runners . JUnit 4 Ċ Ċ @ Experimental Cor outines Api Ċ @ RunWith ( JUnit 4 :: class ) Ċ class ĠArtifact Dao Impl Test Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdb Ġ= ĠArtifact Finder Db ( null ) ĊĠĠĠ Ġprivate Ġval Ġdao Ġ= Ġdb . artifact Dao ĊĠĠĠ Ġprivate Ġval Ġscope Ġ= ĠTest Coroutine Scope () ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġinsert Artifact () Ġ= Ġscope . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . find Artifact ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgroupId Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifact Id Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ= ĠAR TI FACT . version ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). isNull () ĊĠĠĠĠĠĠĠ ĠassertThat ( dao . insert Artifact ( AR TI FACT )). isEqualTo ( 1 L ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . find Artifact ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgroupId Ġ= ĠAR TI FACT . groupId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifact Id Ġ= ĠAR TI FACT . artifactId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ= ĠAR TI FACT . version ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( AR TI FACT . copy ( id Ġ= Ġ 1 )) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . find Artifact ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgroupId Ġ= Ġ" not _ true ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifact Id Ġ= ĠAR TI FACT . artifactId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ= ĠAR TI FACT . version ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). isNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġpending Artifact () Ġ= Ġscope . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . find Next Pending Artifact ( emptyList ()) ĊĠĠĠĠĠĠĠ Ġ). isNull () ĊĊĠĠĠĠĠĠĠ Ġdao . insert Pending Artifact ( PENDING ) ĊĠĠĠĠĠĠĠ Ġval Ġpending Ġ= ĠP ENDING . copy ( id Ġ= Ġ 1 ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . find Next Pending Artifact ( emptyList ()) ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . find Next Pending Artifact ( listOf ( 3 )) ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . find Next Pending Artifact ( listOf ( 3 , Ġ 5 )) ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . find Next Pending Artifact ( listOf ( 1 , Ġ 3 , Ġ 5 )) ĊĠĠĠĠĠĠĠ Ġ). isNull () ĊĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . find Next Pending Artifact ( listOf ( 1 )) ĊĠĠĠĠĠĠĠ Ġ). isNull () ĊĊĠĠĠĠĠĠĠ Ġdao . increment Pending Artifact Retry ( pending . id ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . find Next Pending Artifact ( emptyList ()) ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretries Ġ= Ġpending . retries Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġdao . mark Pending Artifact F etched ( 1 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . find Next Pending Artifact ( emptyList ()) ĊĠĠĠĠĠĠĠ Ġ). isNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġinsert Class Record _ without Artifact () Ġ= Ġscope . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . insert Class Record ( CLASS _ RECORD ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" class Ġrecord Ġw / o Ġartifact Ġshould Ġfail ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( sql Exception : ĠSQLException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignored ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertThat ( all Class Records ()). isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġinsert Class Record () Ġ= Ġscope . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclass Record Id Ġ= Ġdb . with Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartifact Id Ġ= Ġdao . insert Artifact ( AR TI FACT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . insert Class Record ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCLASS _ RECORD . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifact Id Ġ= Ġartifact Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertThat ( all Class Records ()). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCLASS _ RECORD . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġclass Record Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġtry Ġto Ġre - insert , Ġnothing Ġshould Ġhappen ĊĠĠĠĠĠĠĠ Ġdao . insert Class Record ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCLASS _ RECORD . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġclass Record Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( all Class Records ()). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCLASS _ RECORD . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġclass Record Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġall Class Records () Ġ= Ġdb . query (" SELECT Ġ* ĠFROM ĠClass Record ") Ġ{ ĊĠĠĠĠĠĠĠ Ġit . as Sequence (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClass Record ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġit . require Long ( Artifact Dao Impl . ID ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpkg Ġ= Ġit . require String ( Artifact Dao Impl . PKG ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġit . require String ( Artifact Dao Impl . NAME ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifact Id Ġ= Ġit . require Long ( Artifact Dao Impl . AR TI FACT _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}. toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġinsert Class Lookup Without Class () Ġ= Ġscope . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . insert Class Lookup ( CLASS _ LOOK UP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" class Ġlookup Ġwithout Ġclass Ġshould Ġfail ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠSQLException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignored ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġinsert Class Lookup () Ġ= Ġscope . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġartifact Id Ġ= Ġdao . insert Artifact ( AR TI FACT ) ĊĠĠĠĠĠĠĠ Ġval Ġclass Id Ġ= Ġdao . insert Class Record ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCLASS _ RECORD . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifact Id Ġ= Ġartifact Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġclass Lookup Ġ= ĠCLASS _ LOOK UP . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Id Ġ= Ġclass Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġdao . insert Class Lookup ( class Lookup ) ĊĠĠĠĠĠĠĠ ĠassertThat ( dao . all Look ups ()). contains Exactly ( class Lookup ) ĊĠĠĠĠĠĠĠ Ġdao . insert Class Lookup ( class Lookup ) ĊĠĠĠĠĠĠĠ ĠassertThat ( dao . all Look ups ()). contains Exactly ( class Lookup ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdeleting Artifact Deletes Related () Ġ= Ġscope . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġartifact Id Ġ= Ġdao . insert Artifact ( AR TI FACT ) ĊĠĠĠĠĠĠĠ Ġval Ġartifact Ġ= ĠAR TI FACT . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġartifact Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġclass Id Ġ= Ġdao . insert Class Record ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCLASS _ RECORD . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifact Id Ġ= Ġartifact . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġclass Lookup Ġ= ĠCLASS _ LOOK UP . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Id Ġ= Ġclass Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġdao . insert Class Lookup ( class Lookup ) ĊĠĠĠĠĠĠĠ Ġdao . delete Artifact ( artifact ) ĊĠĠĠĠĠĠĠ ĠassertThat ( dao . all Look ups ()). isEmpty () ĊĠĠĠĠĠĠĠ ĠassertThat ( all Class Records ()). isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdeleting Class Deletes Lookup () Ġ= Ġscope . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġartifact Id Ġ= Ġdao . insert Artifact ( AR TI FACT ) ĊĠĠĠĠĠĠĠ Ġval Ġartifact Ġ= ĠAR TI FACT . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġartifact Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġclass Id Ġ= Ġdao . insert Class Record ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCLASS _ RECORD . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifact Id Ġ= Ġartifact . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġclass Lookup Ġ= ĠCLASS _ LOOK UP . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Id Ġ= Ġclass Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġdao . insert Class Lookup ( class Lookup ) ĊĠĠĠĠĠĠĠ Ġdao . delete Class Record ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCLASS _ RECORD . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġclass Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifact Id Ġ= Ġartifact . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( dao . all Look ups ()). isEmpty () ĊĠĠĠĠĠĠĠ ĠassertThat ( all Class Records ()). isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcheck Version () Ġ= Ġscope . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ ĠassertThat ( db . query (" PR AG MA Ġuser _ version ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . next Row () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . require Int (" user _ version ") ĊĠĠĠĠĠĠĠ Ġ}). isEqualTo ( 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠAR TI FACT Ġ= ĠArtifact ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgroupId Ġ= Ġ" foo ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġartifact Id Ġ= Ġ" bar ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ= ĠVersion . fromString (" 2 . 2 . 0 ") !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġart ifactory Ġ= ĠArt ifactory . MA VEN ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval ĠP ENDING Ġ= ĠPending Artifact ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgroupId Ġ= ĠAR TI FACT . groupId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġartifact Id Ġ= ĠAR TI FACT . artifactId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ= ĠAR TI FACT . version , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġretries Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfetched Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġart ifactory Ġ= ĠArt ifactory . MA VEN ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval ĠCLASS _ LOOK UP Ġ= ĠClass Lookup ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidentifier Ġ= Ġ" foo . bar ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Id Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval ĠCLASS _ RECORD Ġ= ĠClass Record ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpkg Ġ= Ġ" foo . bar ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" B az ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġartifact Id Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ