/* Ċ Ġ* ĠCopyright ĠAmazon . com , ĠInc . Ġor Ġits Ġaffiliates . ĠAll ĠRights ĠReserved . Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 . Ċ Ġ*/ Ċ Ċ package Ġaws . sdk . kotlin . runtime . config . profile Ċ Ċ import Ġaws . sdk . kotlin . runtime . testing . run Suspend Test Ċ import Ġaws . smithy . kotlin . runtime . util . Operating System Ċ import Ġaws . smithy . kotlin . runtime . util . Os Family Ċ import Ġaws . smithy . kotlin . runtime . util . Platform Ċ import Ġio . mock k . co Every Ċ import Ġio . mock k . every Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . slot Ċ import Ġkotlinx . serialization . json .* Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assert Fails Ċ Ċ class ĠAws Profile Parser Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcan Pass TestSuite () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtest List Ġ= ĠJson . parse ToJson Element ( parser TestSuite Json ). jsonObject [" tests "] !!. json Array ĊĊĠĠĠĠĠĠĠ Ġtest List ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠTestCase . fromJson ( it . jsonObject ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ. filter Ġ{ ĠtestCase Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠtestCase Ġis ĠTestCase . Match Config Output Case Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠtestCase . name Ġ== Ġ" Property Ġvalues Ġcan Ġbe Ġcontinued Ġon Ġthe Ġnext Ġline ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Indexed Ġ{ Ġindex , ĠtestCase Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( testCase ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTestCase . Match Config Output Case Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġparse ( FileType . CONFIGURATION , ĠtestCase . config Input ). toJson Element () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Json Ġ= ĠJson . parse ToJson Element ( testCase . expected Output ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Json , Ġactual , Ġmessage Ġ= Ġ"[ idx =$ index ]: Ġ$ testCase ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTestCase . Match Credential Output Case Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġparse ( FileType . CRED ENTIAL , ĠtestCase . credential Input ). toJson Element () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( testCase . expected Output , Ġactual . toString (), Ġmessage Ġ= Ġ"[ idx =$ index ]: Ġ$ testCase ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTestCase . Match Config And Credential Output Case Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġload Configuration ({ ĠtestCase . config Input Ġ}, Ġ{ ĠtestCase . credential Input Ġ}). toJson Element () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( testCase . expected Output , Ġactual . toString (), Ġmessage Ġ= Ġ"[ idx =$ index ]: Ġ$ testCase ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTestCase . Match Error Case Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert Fails Ġ{ Ġparse ( FileType . CONFIGURATION , ĠtestCase . input ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġit Can Be Used In Tests () Ġ= Ġrun Suspend Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠNOTE : ĠThis Ġis Ġthe Ġminimal Ġmock Ġof Ġthe ĠPlatform Ġtype Ġneeded Ġto Ġsupport Ġaws Ġconfiguration Ġloading Ġof Ġa Ġspecific Ġk vp . ĊĠĠĠĠĠĠĠ Ġval Ġtest Platform Ġ= Ġmock k < Platform >() ĊĠĠĠĠĠĠĠ Ġval Ġprop Key Param Ġ= Ġslot < String >() ĊĠĠĠĠĠĠĠ Ġval ĠfilePath Ġ= Ġslot < String >() ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġtest Platform . getenv ( any ()) Ġ} Ġanswers Ġ{ Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġtest Platform . getProperty ( capture ( prop Key Param )) Ġ} Ġanswers Ġ{ Ġif Ġ( prop Key Param . captured Ġ== Ġ" user . home ") Ġ"/ home " Ġelse Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġtest Platform . filePath Separator Ġ} Ġreturns Ġ"/" ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġtest Platform . os Info () Ġ} Ġreturns ĠOperating System ( Os Family . Linux , Ġnull ) ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġtest Platform . readFile OrNull ( capture ( filePath )) Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filePath . captured Ġ== Ġ"/ home /. aws / config ") Ġ"[ profile Ġdefault ]\ nb oo Ġ= Ġh oo ". encode To ByteArray () Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals (" h oo ", Ġfn That Load s Configuration ( test Platform )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExample Ġfunction Ġthat Ġreads Ġthe Ġactive Ġprovide Ġand Ġreturns Ġtrue Ġif Ġa Ġkey Ġ" b oo " Ġexists . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġfn That Load s Configuration ( platform : ĠPlatform ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprofile Ġ= Ġload Active Aws Profile ( platform ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġprofile [" b oo "] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġit Can Merge Unique Profiles () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm 1 Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" a " Ġto Ġmap Of (" x " Ġto Ġ" 1 "), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġm 2 Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" b " Ġto Ġmap Of (" y " Ġto Ġ" 1 ") ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" a " Ġto Ġmap Of (" x " Ġto Ġ" 1 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" b " Ġto Ġmap Of (" y " Ġto Ġ" 1 ") ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġmerge Profiles ( m 1 , Ġm 2 ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġactual ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġit Can Merge Over lapping Profiles () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm 1 Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" a " Ġto Ġmap Of (" x " Ġto Ġ" 1 "), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġm 2 Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" a " Ġto Ġmap Of (" z " Ġto Ġ" 1 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" b " Ġto Ġmap Of (" y " Ġto Ġ" 1 "), ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" a " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" x " Ġto Ġ" 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" z " Ġto Ġ" 1 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" b " Ġto Ġmap Of (" y " Ġto Ġ" 1 ") ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġmerge Profiles ( m 1 , Ġm 2 ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġactual ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġlast Map W ins Mer ging In Profiles () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm 1 Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" a " Ġto Ġmap Of (" x " Ġto Ġ" 1 "), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġm 2 Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" a " Ġto Ġmap Of (" x " Ġto Ġ" 2 "), ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" a " Ġto Ġmap Of (" x " Ġto Ġ" 2 ") ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġmerge Profiles ( m 1 , Ġm 2 ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġactual ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsealed Ġclass ĠTestCase Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfrom Json ( json : ĠJsonObject ): ĠTestCase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġ( json [" name "] Ġas ĠJson Primitive ). content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig In Ġ= Ġ( json [" input "] !!. jsonObject [" configFile "] Ġas ĠJson Primitive ?) ?. content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcredential In Ġ= Ġ( json [" input "] !!. jsonObject [" credentials File "] Ġas ĠJson Primitive ?) ?. content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġjson [" output "] !!. jsonObject [" profiles "] ?. toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Containing Ġ= Ġ( json [" output "] !!. jsonObject [" error Containing "] Ġas ĠJson Primitive ?) ?. content ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( expected Ġ!= Ġnull Ġ|| Ġerror Containing Ġ!= Ġnull ) Ġ{ Ġ" Unexpected Ġoutput : Ġ$ json " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( config In Ġ!= Ġnull Ġ|| Ġcredential In Ġ!= Ġnull ) Ġ{ Ġ" Unexpected Ġoutput : Ġ$ json " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Error Case Ġ= Ġexpected Ġ== Ġnull Ġ&& Ġerror Containing Ġ!= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! isError Case ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig In Ġ!= Ġnull Ġ&& Ġcredential In Ġ!= Ġnull Ġ-> ĠMatch Config And Credential Output Case ( name , Ġconfig In , Ġcredential In , Ġexpected !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig In Ġ!= Ġnull Ġ-> ĠMatch Config Output Case ( name , Ġconfig In , Ġexpected !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcredential In Ġ!= Ġnull Ġ-> ĠMatch Credential Output Case ( name , Ġcredential In , Ġexpected !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unexpected Ġbranch Ġfrom Ġ$ json ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMatch Error Case ( name , Ġconfig In !! , Ġerror Containing !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠMatch Config Output Case ( val Ġname : ĠString , Ġval Ġconfig Input : ĠString , Ġval Ġexpected Output : ĠString ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTestCase () ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠMatch Credential Output Case ( val Ġname : ĠString , Ġval Ġcredential Input : ĠString , Ġval Ġexpected Output : ĠString ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTestCase () ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠMatch Config And Credential Output Case ( val Ġname : ĠString , Ġval Ġconfig Input : ĠString , Ġval Ġcredential Input : ĠString , Ġval Ġexpected Output : ĠString ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTestCase () ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠMatch Error Case ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected ErrorMessage : ĠString ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠTestCase () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPro duces Ġa Ġmerged ĠAWS Ġconfiguration Ġbased Ġon Ġoptional Ġconfiguration Ġand Ġcredential Ġfile Ġcontents . ĊĠĠĠĠ Ġ* Ġ@ param Ġconfiguration Fn Ġa Ġfunction Ġthat Ġwill Ġretrieve Ġa Ġconfiguration Ġfile Ġas Ġa ĠUTF - 8 Ġstring . ĊĠĠĠĠ Ġ* Ġ@ param Ġcredentials Fn Ġa Ġfunction Ġthat Ġwill Ġretrieve Ġa Ġconfiguration Ġfile Ġas Ġa ĠUTF - 8 Ġstring . ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġmap Ġcontaining Ġall Ġspecified Ġprofiles Ġdefined Ġin Ġconfiguration Ġand Ġcredential Ġfiles . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġload Configuration ( configuration Fn : Ġ() Ġ-> ĠString ?, Ġcredentials Fn : Ġ() Ġ-> ĠString ?): ĠProfile Map Ġ= ĊĠĠĠĠĠĠĠ Ġmerge Profiles ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse ( FileType . CONFIGURATION , Ġconfiguration Fn ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse ( FileType . CRED ENTIAL , Ġcredentials Fn ()), ĊĠĠĠĠĠĠĠ Ġ) Ċ } Ċ Ċ // ĠSee Ġhttps :// yout rack . jetbrains . com / issue / KT OR - 3 0 6 3 Ċ private Ġfun ĠMap < *, Ġ* >. toJson Element (): ĠJson Element Ġ{ ĊĠĠĠ Ġval Ġmap : ĠMutable Map < String , ĠJson Element > Ġ= Ġmutable Map Of () ĊĠĠĠ Ġthis . forEach Ġ{ Ġ( key , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠ Ġkey Ġas ĠString ĊĠĠĠĠĠĠĠ Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġmap [ key ] Ġ= ĠJson Null ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMap < *, Ġ*> Ġ-> Ġmap [ key ] Ġ= Ġvalue . toJson Element () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBoolean Ġ-> Ġmap [ key ] Ġ= ĠJson Primitive ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNumber Ġ-> Ġmap [ key ] Ġ= ĠJson Primitive ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġmap [ key ] Ġ= ĠJson Primitive ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEnum < *> Ġ-> Ġmap [ key ] Ġ= ĠJson Primitive ( value . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Can 't Ġserialize Ġunknown Ġtype : Ġ$ value ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠJsonObject ( map ) Ċ } Ċ