/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠArm ory , Ġ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 . netflix . spin n aker . gradle . extension Ċ Ċ import Ġcom . netflix . spin n aker . gradle . extension . compatibility .* Ċ import Ġcom . netflix . spin n aker . gradle . extension . extensions . Sp inn aker Bundle Extension Ċ import Ġcom . netflix . spin n aker . gradle . extension . extensions . Sp inn aker Plugin Extension Ċ import Ġcom . sun . net . http server . HttpServer Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . kotlin . dsl . with Gro ovy Builder Ċ import Ġorg . gradle . test fixtures . Project Builder Ċ import Ġjava . lang . IllegalStateException Ċ import Ġjava . net . Inet SocketAddress Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertNotNull Ċ import Ġkotlin . test . Test Ċ Ċ /** Ċ Ġ* ĠUnit Ġtests Ġfor Ġthe Ġcompatibility Ġtest Ġrunner Ġplugin . Ċ Ġ* Ġ*/ Ċ class ĠSp inn aker Compatibility TestRunner Plugin Test Ġ{ ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` compatibility - test - runner Ġplugin Ġregisters Ġtasks , Ġsource Ġsets , Ġand Ġconfigurations `() Ġ{ ĊĠĠĠ Ġval Ġservice Ġ= Ġ" or ca " ĊĠĠĠ Ġval Ġcompatibility Ġ= ĠlistOf (" 1 . 2 1 . 1 ", Ġ" 1 . 2 2 . 0 ") ĊĊĠĠĠ Ġval Ġ( root Project , Ġsub project ) Ġ= Ġwith Projects Ġ{ ĊĠĠĠĠĠ Ġroot Project Ġ{ ĊĠĠĠĠĠĠĠ Ġplugins . apply (" io . spin n aker . plugin . bundler ") ĊĠĠĠĠĠĠĠ Ġsp inn aker Bundle Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcompatibility Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsp inn aker Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompatibility . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġsub project ("$ service - plugin ") Ġ{ ĊĠĠĠĠĠĠĠ Ġplugins . apply (" io . spin n aker . plugin . compatibility - test - runner ") ĊĠĠĠĠĠĠĠ Ġplugins . apply (" io . spin n aker . plugin . service - extension ") ĊĠĠĠĠĠĠĠ Ġsp inn aker Plugin Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠserviceName Ġ= Ġservice ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠVerify Ġtasks , Ġsource Ġsets , Ġand Ġconfigurations Ġexist . ĊĠĠĠ ĠassertNotNull ( root Project . tasks . find ByName ( Sp inn aker Compatibility TestRunner Plugin . TASK _ NAME )) ĊĠĠĠ Ġcompatibility . forEach Ġ{ ĊĠĠĠĠĠ Ġsub project . tasks . find ByName ("${ Sp inn aker Compatibility TestRunner Plugin . TASK _ NAME }- $ service - plugin -$ it "). also Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠ Ġrequire ( task Ġis ĠCompatibility Test Task ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( task . result . get (). as File . path , Ġsub project . build Dir . to Path (). resolve (" compatibility /$ it . json "). toString ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠassertNotNull ( sub project . source Sets . find ByName (" compatibility -$ it ")) ĊĠĠĠĠĠ ĠassertNotNull ( sub project . configurations . find ByName (" compatibility -${ it } Implementation ")) ĊĠĠĠĠĠ ĠassertNotNull ( sub project . configurations . find ByName (" compatibility -${ it } Runtime ")) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` compatibility - test - runner Ġplugin Ġregisters Ġtasks , Ġsource Ġsets , Ġand Ġconfigurations Ġ( simple ĠDSL Ġstyle )` () Ġ{ ĊĠĠĠ Ġval Ġservice Ġ= Ġ" or ca " ĊĠĠĠ Ġval Ġcompatibility Ġ= ĠlistOf (" 1 . 2 1 . 1 ", Ġ" 1 . 2 2 . 0 ") ĊĊĠĠĠ Ġval Ġ( root Project , Ġsub project ) Ġ= Ġwith Projects Ġ{ ĊĠĠĠĠĠ Ġroot Project Ġ{ ĊĠĠĠĠĠĠĠ Ġplugins . apply (" io . spin n aker . plugin . bundler ") ĊĠĠĠĠĠĠĠ Ġsp inn aker Bundle Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcompatibility Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsp inn aker Ġ= Ġcompatibility ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġsub project ("$ service - plugin ") Ġ{ ĊĠĠĠĠĠĠĠ Ġplugins . apply (" io . spin n aker . plugin . compatibility - test - runner ") ĊĠĠĠĠĠĠĠ Ġplugins . apply (" io . spin n aker . plugin . service - extension ") ĊĠĠĠĠĠĠĠ Ġsp inn aker Plugin Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠserviceName Ġ= Ġservice ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠVerify Ġtasks , Ġsource Ġsets , Ġand Ġconfigurations Ġexist . ĊĠĠĠ ĠassertNotNull ( root Project . tasks . find ByName ( Sp inn aker Compatibility TestRunner Plugin . TASK _ NAME )) ĊĠĠĠ Ġcompatibility . forEach Ġ{ ĊĠĠĠĠĠ Ġsub project . tasks . find ByName ("${ Sp inn aker Compatibility TestRunner Plugin . TASK _ NAME }- $ service - plugin -$ it "). also Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠ Ġrequire ( task Ġis ĠCompatibility Test Task ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( task . result . get (). as File . path , Ġsub project . build Dir . to Path (). resolve (" compatibility /$ it . json "). toString ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠassertNotNull ( sub project . source Sets . find ByName (" compatibility -$ it ")) ĊĠĠĠĠĠ ĠassertNotNull ( sub project . configurations . find ByName (" compatibility -${ it } Implementation ")) ĊĠĠĠĠĠ ĠassertNotNull ( sub project . configurations . find ByName (" compatibility -${ it } Runtime ")) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` compatibility - test - runner Ġsets Ġservice ĠGradle ĠB OM Ġversion Ġusing ĠH aly ard ĠB OM `() Ġ{ ĊĠĠĠ Ġval Ġservice Ġ= Ġ" or ca " ĊĠĠĠ Ġval Ġcompatibility Ġ= ĠlistOf (" 1 . 2 1 . 1 ", Ġ" 1 . 2 2 . 0 ") ĊĊĠĠĠ Ġ// ĠSet Ġup Ġb om Ġserver . ĊĠĠĠ Ġval Ġhal config Server Ġ= ĠHttp Server . create ( Inet SocketAddress ( 0 ), Ġ 0 ). apply Ġ{ ĊĠĠĠĠĠ Ġcompatibility . forEach Ġ{ Ġversion Ġ-> ĊĠĠĠĠĠĠĠ Ġcreate Context ("/ bom /${ version }. yml ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit . response Headers . set (" Content - Type ", Ġ" application / x - yaml ") ĊĠĠĠĠĠĠĠĠĠ Ġit . send Response Headers ( 2 0 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠ Ġit . response Body . write (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġversion : Ġ"$ version " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservices : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ service }: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion : Ġ" google - service - version -${ version }" ĊĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (). toByteArray ()) ĊĠĠĠĠĠĠĠĠĠ Ġit . response Body . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġstart () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġ(_, Ġsub project ) Ġ= Ġwith Projects Ġ{ ĊĠĠĠĠĠ Ġroot Project Ġ{ ĊĠĠĠĠĠĠĠ Ġplugins . apply (" io . spin n aker . plugin . bundler ") ĊĠĠĠĠĠĠĠ Ġsp inn aker Bundle Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcompatibility Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsp inn aker Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompatibility . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhal config Base URL Ġ= Ġ" http :// localhost :${ hal config Server . address . port }" ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġsub project ("$ service - plugin ") Ġ{ ĊĠĠĠĠĠĠĠ Ġplugins . apply (" io . spin n aker . plugin . compatibility - test - runner ") ĊĠĠĠĠĠĠĠ Ġplugins . apply (" io . spin n aker . plugin . service - extension ") ĊĠĠĠĠĠĠĠ Ġsp inn aker Plugin Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠserviceName Ġ= Ġservice ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTrigger Ġlifecycle Ġhooks . ĊĠĠĠ Ġsub project . evaluate () ĊĊĠĠĠ Ġcompatibility . forEach Ġ{ Ġversion Ġ-> ĊĠĠĠĠĠ Ġval Ġruntime Ġ= Ġsub project . configurations . find ByName (" compatibility -${ version } Runtime ") ĊĠĠĠĠĠ ĠassertNotNull ( runtime ) ĊĊĠĠĠĠĠ Ġval Ġb om Ġ= Ġruntime . dependencies . find Ġ{ Ġdependency Ġ-> ĊĠĠĠĠĠĠĠ Ġdependency . group Ġ== Ġ" io . spin n aker .${ service }" Ġ&& Ġdependency . name Ġ== Ġ"$ service - bom " ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠassertNotNull ( bom ) ĊĠĠĠĠĠ ĠassertEquals (" google - service - version -${ version }", Ġb om . version ) ĊĠĠĠĠĠ Ġassert ( bom . force ) Ġ{ Ġ" expected Ġgradle ĠB OM Ġdependency Ġversion Ġto Ġbe Ġforced " Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` compatibility - test - runner Ġresolves Ġversion Ġaliases `() Ġ{ ĊĠĠĠ Ġval Ġservice Ġ= Ġ" or ca " ĊĠĠĠ Ġval Ġcompatibility Ġ= ĠlistOf (" supported ", Ġ" latest ", Ġ" nightly ", Ġ" 1 . 2 2 . 0 ") ĊĊĠĠĠ Ġ// ĠSet Ġup ĠSp inn aker Ġversions Ġserver . ĊĠĠĠ Ġval Ġhal config Server Ġ= ĠHttp Server . create ( Inet SocketAddress ( 0 ), Ġ 0 ). apply Ġ{ ĊĠĠĠĠĠ Ġcreate Context ("/ versions . yml ") Ġ{ ĊĠĠĠĠĠĠĠ Ġit . response Headers . set (" Content - Type ", Ġ" application / x - yaml ") ĊĠĠĠĠĠĠĠ Ġit . send Response Headers ( 2 0 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġit . response Body . write (""" ĊĠĠĠĠĠĠĠĠĠ Ġlatest Sp inn aker : Ġ" 1 . 2 2 . 1 " ĊĠĠĠĠĠĠĠĠĠ Ġversions : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- Ġversion : Ġ 1 . 2 2 . 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- Ġversion : Ġ 1 . 2 1 . 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- Ġversion : Ġ 1 . 2 0 . 7 ĊĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (). toByteArray ()) ĊĠĠĠĠĠĠĠ Ġit . response Body . close () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġstart () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġ(_, Ġsub project ) Ġ= Ġwith Projects Ġ{ ĊĠĠĠĠĠ Ġroot Project Ġ{ ĊĠĠĠĠĠĠĠ Ġplugins . apply (" io . spin n aker . plugin . bundler ") ĊĠĠĠĠĠĠĠ Ġsp inn aker Bundle Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcompatibility Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsp inn aker Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompatibility . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhal config Base URL Ġ= Ġ" http :// localhost :${ hal config Server . address . port }" ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġsub project ("$ service - plugin ") Ġ{ ĊĠĠĠĠĠĠĠ Ġplugins . apply (" io . spin n aker . plugin . compatibility - test - runner ") ĊĠĠĠĠĠĠĠ Ġplugins . apply (" io . spin n aker . plugin . service - extension ") ĊĠĠĠĠĠĠĠ Ġsp inn aker Plugin Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠserviceName Ġ= Ġservice ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠlistOf ( ĊĠĠĠĠĠ Ġ" 1 . 2 2 . 1 ", Ġ// Ġ" latest ", Ġbut Ġalso Ġincluded Ġin Ġ" supported " ĊĠĠĠĠĠ Ġ" 1 . 2 2 . 0 ", Ġ// Ġexplicit ĊĠĠĠĠĠ Ġ" 1 . 2 1 . 4 ", Ġ// Ġincluded Ġin Ġ" supported " ĊĠĠĠĠĠ Ġ" 1 . 2 0 . 7 ", Ġ// Ġincluded Ġin Ġ" supported " ĊĠĠĠĠĠ Ġ" master - latest - validated " Ġ// Ġ" nightly " ĊĠĠĠ Ġ). forEach Ġ{ ĊĠĠĠĠĠ ĠassertNotNull ( sub project . tasks . find ByName ("${ Sp inn aker Compatibility TestRunner Plugin . TASK _ NAME }- $ service - plugin -$ it ")) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠProject . evaluate () Ġ= Ġwith Gro ovy Builder Ġ{ Ġ" evaluate "() Ġ} Ċ Ċ private Ġfun Ġwith Projects ( dsl : ĠProjects Dsl . () Ġ-> ĠUnit ): ĠPair < Project , ĠProject > Ġ{ ĊĠ Ġval Ġroot Project Ġ= ĠProject Builder . builder (). build () ĊĠ Ġval Ġsub project Builder Ġ= ĠProject Builder . builder (). with Parent ( root Project ) ĊĠ Ġvar Ġsub project : ĠProject ? Ġ= Ġnull ĊĊĠ Ġobject Ġ: ĠProjects Dsl Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġroot Project ( dsl : ĠProject . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠ Ġroot Project . dsl () ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġsub project ( name : ĠString , Ġd sl : ĠProject . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠ Ġsub project Ġ= Ġsub project Builder . with Name ( name ). build (). also Ġ{ Ġit . dsl () Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ}. dsl () ĊĊĠ Ġreturn Ġif Ġ( sub project Ġ!= Ġnull ) ĠPair ( root Project , Ġsub project !! ) Ġelse Ġthrow ĠIllegalStateException (" Must Ġconfigure Ġsub project !") Ċ } Ċ Ċ private Ġinterface ĠProjects Dsl Ġ{ ĊĠ Ġfun Ġroot Project ( dsl : ĠProject . () Ġ-> ĠUnit ) ĊĠ Ġfun Ġsub project ( name : ĠString , Ġd sl : ĠProject . () Ġ-> ĠUnit ) Ċ } Ċ Ċ private Ġfun ĠProject . spin n aker Bundle ( dsl : ĠSp inn aker Bundle Extension . () Ġ-> ĠUnit ) Ġ= ĊĠ Ġextensions . getBy Type ( Sp inn aker Bundle Extension :: class . java ). dsl () Ċ Ċ private Ġfun ĠProject . spin n aker Plugin ( dsl : ĠSp inn aker Plugin Extension . () Ġ-> ĠUnit ) Ġ= ĊĠ Ġextensions . getBy Type ( Sp inn aker Plugin Extension :: class . java ). dsl () ĊĊ