package Ġcom . cd sap . tal ai ot Ċ Ċ import Ġorg . test containers . rem ot ec ache . K Redis Container Ċ import Ġorg . test containers . influxdb . K In flux DB Container Ċ import Ġcom . cd sap . tal ai ot . utils . Temporary Folder Ċ import Ġio . kot lint est . Spec Ċ import Ġio . kot lint est . specs . Behavior Spec Ċ import Ġjunit . framework . Assert . assertTrue Ċ import Ġorg . gradle . test kit . runner . Gradle Runner Ċ import Ġorg . influxdb . dto . Query Ċ Ċ /** Ċ Ġ* ĠE 2 E ĠTest Ġto Ġcheck Ġthe Ġif Ġthe Ġevent ĠBuild Cache Remote Load Build Operation Type Ġis Ġemitted Ġby ĠGradle . Ċ Ġ* ĠWe Ġwant Ġto Ġcheck Ġthe Ġoutput Ġof Ġthe Ġbuild Ġbut Ġas Ġwell Ġthe Ġcorrect Ġbehavior Ġof ĠT al ai ot Ġwith Ġa Ġgiven ĠPublisher . Ċ Ġ*/ Ċ class ĠBuild Cache Remote Load Build Operation Type Test Ġ: ĠBehavior Spec () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcontainer Redis Ġ= ĠK Redis Container () ĊĠĠĠ Ġprivate Ġval Ġcontainer In flux Db Ġ= ĠK In flux DB Container (). with Auth Enabled ( false ) ĊĊĠĠĠ Ġval Ġin flux DB Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġcontainer In flux Db . new In flux DB ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbefore Spec ( spec : ĠSpec ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . before Spec ( spec ) ĊĠĠĠĠĠĠĠ Ġcontainer Redis . start () ĊĠĠĠĠĠĠĠ Ġcontainer In flux Db . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġafter Spec ( spec : ĠSpec ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . after Spec ( spec ) ĊĠĠĠĠĠĠĠ Ġcontainer Redis . stop () ĊĠĠĠĠĠĠĠ Ġcontainer In flux Db . stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġgiven (" A Ġproject Ġwith ĠT al ai ot Ġand ĠRemote ĠC aching Ġenabled Ġusing ĠRedis Ġas ĠRemote ĠC aching ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Project Dir Ġ= ĠTemporary Folder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Project Dir . create () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Project Dir . new File (" gradle . properties ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append Text ( Configuration . gradle Properties ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Project Dir . new File (" settings . gradle ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append Text ( Configuration . settings Gradle ( container Redis . http Host Address )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Project Dir . new File (" build . gradle ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append Text ( Configuration . build Gradle ( container In flux Db . url )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Project Dir . new File In Path (" src / main / java / A . java ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append Text ( Configuration . create File ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` when ` (" there Ġare Ġa Ġsequence Ġof Ġexecution Ġfor Ġtasks : Ġassemble , Ġclean , Ġassemble Ġagain ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst As semble Execution Ġ= ĠGradle Runner . create () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Project Dir ( test Project Dir . getRoot ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Arguments (" assemble ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Plugin Classpath () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclean Execution Ġ= ĠGradle Runner . create () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Project Dir ( test Project Dir . getRoot ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Arguments (" clean ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Plugin Classpath () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecond As semble Execution Ġ= ĠGradle Runner . create () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Project Dir ( test Project Dir . getRoot ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Arguments (" assemble ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Plugin Classpath () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthen (" First Ġassemble Ġexecution Ġfeed Ġthe Ġcache Ġand ĠSecond Ġassemble Ġexecution Ġcontains Ġbuild ĠInfo Ġwith Ġthe Ġtask Ġstate Ġcoming Ġfrom Ġcache ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠJust Ġassert Ġthe Ġoutput Ġto Ġcheck Ġthe Ġstate Ġof Ġthe Ġtasks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue (! first As semble Execution . output . contains (" FROM - CACHE ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( second As semble Execution . output . contains (" FROM - CACHE ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠT al ai ot Ġwas Ġconfigured Ġwith ĠIn flux Db . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLet 's Ġcheck Ġif Ġthe Ġcache able Ġtask Ġexists Ġin Ġthe Ġtwo Ġexecution s Ġwith Ġthe Ġdifferent Ġstates ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġtest Ġthe Ġcaching Ġproperties ( remote Cache Hit ) Ġhave Ġbeen Ġemitted Ġproperly Ġfrom ĠGradle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Result Task Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin flux DB . query ( Query (" select Ġ* Ġfrom Ġtracking . rp T al ai ot . task Ġwhere Ġtask = ': compile Java ' ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Execution Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask Result Task . results . join ToString Ġ{ Ġit . series . join ToString Ġ{ Ġit . values [ 0 ]. join ToString () Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecond Execution Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask Result Task . results . join ToString Ġ{ Ġit . series . join ToString Ġ{ Ġit . values [ 1 ]. join ToString () Ġ} Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( task Result Task . results [ 0 ]. series [ 0 ]. values . size Ġ== Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( first Execution . contains (" EXECUT ED ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( second Execution . contains (" FROM _ CACHE ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremote Cache Hit Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin flux DB . query ( Query (" select Ġ* Ġfrom Ġtracking . rp T al ai ot . task Ġwhere Ġremote Cache Hit =' true ' ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( remote Cache Hit . results [ 0 ]. series [ 0 ]. values . size Ġ== Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Project Dir . delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ object ĠConfiguration Ġ{ ĊĠĠĠ Ġval Ġgradle Properties Ġ= Ġ" org . gradle . caching = true " ĊĠĠĠ Ġfun Ġsettings Gradle ( container Url : ĠString ) Ġ= Ġ""" ĊĠĠĠĠĠĠĠ Ġbuild script Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepositories Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaven Local () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaven Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ' https :// plugins . gradle . org / m 2 /' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclasspath Ġ' gradle . plugin . net . idle state : gradle - redis - build - cache : 1 . 2 . 1 ' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuild Cache Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Build Cache Service ( net . idle state . gradle . caching . Redis Build Cache . class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnet . idle state . gradle . caching . Redis Build Cache Service Factory . class ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote ( Ġnet . idle state . gradle . caching . Redis Build Cache . class Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost Ġ= Ġ' localhost ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġport Ġ= Ġ${ container Url . split (": ")[ 1 ]} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠ Ġfun Ġbuild Gradle ( container Url : ĠString ) Ġ= Ġ""" ĊĠĠĠĠĠĠĠ Ġplugins Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ' java ' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ' com . cd sap . tal ai ot ' ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĊĠĠĠĠĠĠĠ Ġtal ai ot { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublish ers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger Ġ= Ġcom . cd sap . tal ai ot . logger . Log Tracker . Mode . INFO ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin flux Db Publisher Ġ{ ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Name Ġ= Ġ" tracking " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġ"$ container Url " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask Metric Name Ġ= Ġ" task " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Metric Name Ġ= Ġ" build " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĠĠĠĠĠĠĠĠĊĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠ Ġfun Ġcreate File () Ġ= Ġ""" ĊĠĠĠĠĠĠĠ Ġclass ĠA Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublic ĠA (){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ""" . trim Indent () Ċ } Ċ