package Ġnet . cord a . common . configuration . parsing . internal Ċ Ċ import Ġcom . types afe . config . Config Ċ import Ġnet . cord a . common . validation . internal . Validated . Companion . invalid Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . junit . Test Ċ import Ġjava . util . concurrent . atomic . Atomic Long Ċ Ċ class ĠSpecification Test Ġ{ ĊĊĠĠĠ Ġprivate Ġobject ĠRpc Settings Spec Ġ: ĠConfiguration . Specification < Rpc Settings >(" Rpc Settings ") Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġobject ĠAdd resses Spec Ġ: ĠConfiguration . Specification < Addresses >(" Addresses ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprincipal Ġby Ġstring (). map Valid (:: parse Address ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadmin Ġby Ġstring (). map Valid (:: parse Address ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġparse Valid ( configuration : ĠConfig , Ġoptions : ĠConfiguration . Options ) Ġ= Ġconfiguration . with Options ( options ). let Ġ{ Ġvalid ( Addresses ( it [ principal ], Ġit [ admin ])) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġparse Address ( raw Value : ĠString ): ĠValid < Address > Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAddress . valid From Raw Value ( raw Value ) Ġ{ Ġerror Ġ-> ĠConfiguration . Validation . Error . Bad Value . of ( error ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġuse Ssl Ġby Ġboolean () ĊĠĠĠĠĠĠĠ Ġval Ġaddresses Ġby Ġnested ( Addresses Spec ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġparse Valid ( configuration : ĠConfig , Ġoptions : ĠConfiguration . Options ) Ġ= Ġconfiguration . with Options ( options ). let Ġ{ Ġvalid < Rpc Settings >( Rpc Settings Impl ( it [ addresses ], Ġit [ use Ssl ])) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( timeout = 3 0 0 _ 0 0 0 ) Ċ ĉ fun Ġparse () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġuse Ssl Value Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġprincipal Address Value Ġ= ĠAddress (" localhost ", Ġ 8 0 8 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġadmin Address Value Ġ= ĠAddress (" 1 2 7 . 0 . 0 . 1 ", Ġ 8 0 8 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġaddresses Value Ġ= Ġconfig Object (" principal " Ġto Ġ"${ principal Address Value . host }:${ principal Address Value . port }", Ġ" admin " Ġto Ġ"${ admin Address Value . host }:${ admin Address Value . port }") ĊĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= Ġconfig Object (" use Ssl " Ġto Ġuse Ssl Value , Ġ" addresses " Ġto Ġaddresses Value ). to Config () ĊĊĠĠĠĠĠĠĠ Ġval Ġrpc Settings Ġ= ĠRpc Settings Spec . parse ( configuration ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( rpc Settings . isValid ). isTrue () ĊĠĠĠĠĠĠĠ ĠassertThat ( rpc Settings . value ()). satisf ies Ġ{ Ġvalue Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( value . use Ssl ). isEqualTo ( use Ssl Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( value . addresses ). satisf ies Ġ{ Ġaddresses Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( addresses . principal ). isEqualTo ( principal Address Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( addresses . admin ). isEqualTo ( admin Address Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( timeout = 3 0 0 _ 0 0 0 ) Ċ ĉ fun Ġparse _ list _ aggregation () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġspec Ġ= Ġobject Ġ: ĠConfiguration . Specification < Atomic Long >(" Atomic Long ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġmax Element Ġby Ġlong (" elements "). list (). map Ġ{ Ġelements Ġ-> Ġelements . max () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġparse Valid ( configuration : ĠConfig , Ġoptions : ĠConfiguration . Options ): ĠValid < Atomic Long > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġconfiguration . with Options ( options ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalid ( Atomic Long ( config [ max Element ] !! )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġelements Ġ= ĠlistOf ( 1 L , Ġ 1 0 L , Ġ 2 L ) ĊĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= Ġconfig Object (" elements " Ġto Ġelements ). to Config () ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġspec . parse ( configuration ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( result . isValid ). isTrue () ĊĠĠĠĠĠĠĠ ĠassertThat ( result . value (). get ()). isEqualTo ( elements . max ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( timeout = 3 0 0 _ 0 0 0 ) Ċ ĉ fun Ġvalidate () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġprincipal Address Value Ġ= ĠAddress (" localhost ", Ġ 8 0 8 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġadmin Address Value Ġ= ĠAddress (" 1 2 7 . 0 . 0 . 1 ", Ġ 8 0 8 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġaddresses Value Ġ= Ġconfig Object (" principal " Ġto Ġ"${ principal Address Value . host }:${ principal Address Value . port }", Ġ" admin " Ġto Ġ"${ admin Address Value . host }:${ admin Address Value . port }") ĊĠĠĠĠĠĠĠ Ġ// ĠHere Ġ" use Ssl " Ġshouldn 't Ġbe Ġ` null `, Ġhence Ġcausing Ġthe Ġvalidation Ġto Ġfail . ĊĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= Ġconfig Object (" use Ssl " Ġto Ġnull , Ġ" addresses " Ġto Ġaddresses Value ). to Config () ĊĊĠĠĠĠĠĠĠ Ġval Ġrpc Settings Ġ= ĠRpc Settings Spec . parse ( configuration ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( rpc Settings . errors ). has Size ( 1 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( rpc Settings . errors . first ()). isInstanceOf Satisf ying ( Configuration . Validation . Error . Missing Value :: class . java ) Ġ{ Ġerror Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( error . path ). contains Exactly (" use Ssl ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( timeout = 3 0 0 _ 0 0 0 ) Ċ ĉ fun Ġvalidate _ list _ aggregation () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġparse Max ( elements : ĠList < Long >): ĠValid < Long > Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( elements . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinvalid ( Configuration . Validation . Error . Bad Value . of (" element Ġlist Ġcannot Ġbe Ġempty ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( elements . any Ġ{ Ġelement Ġ-> Ġelement Ġ<= Ġ 1 Ġ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinvalid ( Configuration . Validation . Error . Bad Value . of (" elements Ġcannot Ġbe Ġless Ġthan Ġor Ġequal Ġto Ġ 1 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalid ( elements . max () !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġspec Ġ= Ġobject Ġ: ĠConfiguration . Specification < Atomic Long >(" Atomic Long ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġmax Element Ġby Ġlong (" elements "). list (). map Valid (:: parse Max ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġparse Valid ( configuration : ĠConfig , Ġoptions : ĠConfiguration . Options ): ĠValid < Atomic Long > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġconfiguration . with Options ( options ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalid ( Atomic Long ( config [ max Element ])) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġelements Ġ= ĠlistOf ( 1 L , Ġ 1 0 L , Ġ 2 L ) ĊĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= Ġconfig Object (" elements " Ġto Ġelements ). to Config () ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġspec . parse ( configuration ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( result . errors ). has Size ( 1 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( result . errors . first ()). isInstanceOf Satisf ying ( Configuration . Validation . Error . Bad Value :: class . java ) Ġ{ Ġerror Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( error . path ). contains Exactly (" elements ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( error . message ). contains (" elements Ġcannot Ġbe Ġless Ġthan Ġor Ġequal Ġto Ġ 1 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( timeout = 3 0 0 _ 0 0 0 ) Ċ ĉ fun Ġvalidate _ with _ domain _ specific _ errors () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġuse Ssl Value Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġprincipal Address Value Ġ= ĠAddress (" localhost ", Ġ 8 0 8 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġadmin Address Value Ġ= ĠAddress (" 1 2 7 . 0 . 0 . 1 ", Ġ 8 0 8 1 ) ĊĠĠĠĠĠĠĠ Ġ// ĠHere , Ġfor Ġthe Ġ" principal " Ġproperty , Ġthe Ġvalue Ġis Ġincorrect , Ġas Ġthe Ġport Ġvalue Ġis Ġun accept able . ĊĠĠĠĠĠĠĠ Ġval Ġaddresses Value Ġ= Ġconfig Object (" principal " Ġto Ġ"${ principal Address Value . host } :- 1 0 ", Ġ" admin " Ġto Ġ"${ admin Address Value . host }:${ admin Address Value . port }") ĊĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= Ġconfig Object (" use Ssl " Ġto Ġuse Ssl Value , Ġ" addresses " Ġto Ġaddresses Value ). to Config () ĊĊĠĠĠĠĠĠĠ Ġval Ġrpc Settings Ġ= ĠRpc Settings Spec . parse ( configuration ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( rpc Settings . errors ). has Size ( 1 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( rpc Settings . errors . first ()). isInstanceOf Satisf ying ( Configuration . Validation . Error . Bad Value :: class . java ) Ġ{ Ġerror Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( error . path ). contains Exactly (" addresses ", Ġ" principal ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( error . key Name ). isEqualTo (" principal ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( error . typeName ). isEqualTo ( Address :: class . java . simple Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( timeout = 3 0 0 _ 0 0 0 ) Ċ ĉ fun Ġchained _ deleg ated _ properties _ are _ not _ added _ multiple _ times () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġspec Ġ= Ġobject Ġ: ĠConfiguration . Specification < List < String > ?> (" Test ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmy Prop Ġby Ġstring (). list (). optional () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġparse Valid ( configuration : ĠConfig , Ġoptions : ĠConfiguration . Options ) Ġ= Ġconfiguration . with Options ( options ). let Ġ{ Ġvalid ( it [ my Prop ]) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertThat ( spec . properties ). has Size ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinterface ĠRpc Settings Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġaddresses : ĠAdd resses ĊĠĠĠĠĠĠĠ Ġval Ġuse Ssl : ĠBoolean ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠRpc Settings Impl ( override Ġval Ġaddresses : ĠAdd resses , Ġoverride Ġval Ġuse Ssl : ĠBoolean ) Ġ: ĠRpc Settings Ċ }