package Ġorg . ev om aster . core . problem . rest . service Ċ Ċ import Ġcom . google . inject . Inject Ċ import Ġio . swagger . models . Swagger Ċ import Ġio . swagger . parser . Swagger Parser Ċ import Ġio . swagger . v 3 . o as . models . Open API Ċ import Ġorg . ev om aster . client . java . controller . api . dto . S ut Info Dto Ċ import Ġorg . ev om aster . core . EM Config Ċ import Ġorg . ev om aster . core . Lazy Ċ import Ġorg . ev om aster . core . database . Db Action Ċ import Ġorg . ev om aster . core . database . Db Action Utils Ċ import Ġorg . ev om aster . core . database . Sql Insert Builder Ċ import Ġorg . ev om aster . core . output . Output Format Ċ import Ġorg . ev om aster . core . problem . rest .* Ċ import Ġorg . ev om aster . core . problem . rest . auth . Authentication Header Ċ import Ġorg . ev om aster . core . problem . rest . auth . Authentication Info Ċ import Ġorg . ev om aster . core . problem . rest . auth . Cookie Login Ċ import Ġorg . ev om aster . core . problem . rest . auth . No Auth Ċ import Ġorg . ev om aster . core . problem . rest . param . Path Param Ċ import Ġorg . ev om aster . core . remote . S ut Problem Exception Ċ import Ġorg . ev om aster . core . remote . service . Remote Controller Ċ import Ġorg . ev om aster . core . search . Action Ċ import Ġorg . ev om aster . core . search . gene . Dis rupt ive Gene Ċ import Ġorg . ev om aster . core . search . gene . Gene Ċ import Ġorg . ev om aster . core . search . gene . Object Gene Ċ import Ġorg . ev om aster . core . search . gene . Optional Gene Ċ import Ġorg . ev om aster . core . search . service . Sampler Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . net . Connect Exception Ċ import Ġjava . net . Malformed URLException Ċ import Ġjavax . annotation . Post Construct Ċ import Ġjavax . ws . rs . client . Client Builder Ċ import Ġjavax . ws . rs . core . MediaType Ċ import Ġjavax . ws . rs . core . Response ĊĊ Ċ class ĠRest Sampler Ġ: ĠSampler < Rest Individual > (){ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog : ĠLogger Ġ= ĠLoggerFactory . getLogger ( Rest Sampler :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Inject ( optional Ġ= Ġtrue ) ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrc : ĠRemote Controller ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġconfiguration : ĠEM Config ĊĊĠĠĠ Ġprivate Ġval Ġauthentic ations : ĠMutable List < Authentication Info > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġprivate Ġval Ġad Hoc Initial Individual s : ĠMutable List < Rest Action > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġprivate Ġvar Ġsql Insert Builder : ĠSql Insert Builder ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġexisting Sql Data Ġ: ĠList < Db Action > Ġ= ĠlistOf () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ// private Ġval Ġmodel Cluster : ĠMutable Map < String , ĠObject Gene > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġ// private Ġval Ġused Objects : ĠUsed Objects Ġ= ĠUsed Objects () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġswagger : ĠOpenAPI ĊĊĠĠĠ Ġ@ Post Construct ĊĠĠĠ Ġprivate Ġfun Ġinitialize () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġlog . debug (" Initializing Ġ{}", ĠRest Sampler :: class . simple Name ) ĊĊĠĠĠĠĠĠĠ Ġif ( configuration . black Box Ġ&& Ġ! configuration . bb Experiment s ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit For Black Box () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrc . check Connection () ĊĊĠĠĠĠĠĠĠ Ġval Ġstarted Ġ= Ġrc . start S UT () ĊĠĠĠĠĠĠĠ Ġif Ġ(! started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠS ut Problem Exception (" Failed Ġto Ġstart Ġthe Ġsystem Ġunder Ġtest ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġinfo Dto Ġ= Ġrc . getS ut Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠS ut Problem Exception (" Failed Ġto Ġretrieve Ġthe Ġinfo Ġabout Ġthe Ġsystem Ġunder Ġtest ") ĊĊĠĠĠĠĠĠĠ Ġval Ġswagger URL Ġ= Ġinfo Dto . rest Problem ?. swagger Json Url ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Missing Ġinformation Ġabout Ġthe ĠSwagger ĠURL ") ĊĊĠĠĠĠĠĠĠ Ġswagger Ġ= ĠOpen Api Access . get Open API ( swagger URL ) ĊĠĠĠĠĠĠĠ Ġif Ġ( swagger . paths Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠS ut Problem Exception (" There Ġis Ġno Ġendpoint Ġdefinition Ġin Ġthe Ġretrieved ĠSwagger Ġfile ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġaction Cluster . clear () ĊĠĠĠĠĠĠĠ ĠRest Action Builder V 3 . add Actions From Swagger ( swagger , Ġaction Cluster , Ġinfo Dto . rest Problem ?. endpoints To Skip Ġ?: ĠlistOf ()) ĊĊĠĠĠĠĠĠĠ Ġ// model Cluster . clear () ĊĠĠĠĠĠĠ Ġ// ĠRest Action Builder . get Models From Swagger ( swagger , Ġmodel Cluster ) ĊĊĠĠĠĠĠĠĠ Ġsetup Authentication ( info Dto ) ĊĊĠĠĠĠĠĠĠ Ġinit Ad Hoc Initial Individual s () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( info Dto . sql Schema Dto Ġ!= Ġnull Ġ&& Ġconfiguration . should Generate Sql Data ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql Insert Builder Ġ= ĠSql Insert Builder ( info Dto . sql Schema Dto , Ġrc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexisting Sql Data Ġ= Ġsql Insert Builder !!. extract Existing PK s () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( configuration . output Format Ġ== ĠOutput Format . DEFAULT ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformat Ġ= ĠOutput Format . valueOf ( info Dto . default Output Format ?. toString () !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration . output Format Ġ= Ġformat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e Ġ: ĠException ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠS ut Problem Exception (" Failed Ġto Ġuse Ġtest Ġoutput Ġformat : Ġ" Ġ+ Ġinfo Dto . default Output Format ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlog . debug (" Done Ġinitializing Ġ{}", ĠRest Sampler :: class . simple Name ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġinit For Black Box () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġswagger Ġ= ĠOpen Api Access . get Open API ( configuration . bb Swagger Url ) ĊĠĠĠĠĠĠĠ Ġif Ġ( swagger . paths Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠS ut Problem Exception (" There Ġis Ġno Ġendpoint Ġdefinition Ġin Ġthe Ġretrieved ĠSwagger Ġfile ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġaction Cluster . clear () ĊĠĠĠĠĠĠĠ ĠRest Action Builder V 3 . add Actions From Swagger ( swagger , Ġaction Cluster , ĠlistOf ()) ĊĊĠĠĠĠĠĠĠ Ġ// model Cluster . clear () ĊĠĠĠĠĠĠĠ Ġ// ĠRest Action Builder . get Models From Swagger ( swagger , Ġmodel Cluster ) ĊĊĠĠĠĠĠĠĠ Ġinit Ad Hoc Initial Individual s () ĊĊĠĠĠĠĠĠĠ Ġlog . debug (" Done Ġinitializing Ġ{}", ĠRest Sampler :: class . simple Name ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġsetup Authentication ( info Dto : ĠS ut Info Dto ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġinfo Dto . info For Authentication Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġinfo . forEach Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i . name Ġ== Ġnull Ġ|| Ġi . name . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Missing Ġname Ġin Ġauthentication Ġinfo ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheaders : ĠMutable List < Authentication Header > Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġi . headers . forEach Ġloop @{ Ġh Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġh . name ?. trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġh . value ?. trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name Ġ== Ġnull Ġ|| Ġvalue Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Invalid Ġheader Ġin Ġ${ i . name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders . add ( Authentication Header ( name , Ġvalue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcookie Login Ġ= Ġif ( i . cookie Login Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCookie Login . from Dto ( i . cookie Login ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauth Ġ= ĠAuthentication Info ( i . name . trim (), Ġheaders , Ġcookie Login ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthentic ations . add ( auth ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcan Insert Into ( tableName : ĠString ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// TODO Ġmight Ġneed Ġto Ġrefactor / remove Ġonce Ġwe Ġdeal Ġwith ĠVIEW s ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsql Insert Builder ?. is Table ( tableName ) Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsample Sql Insertion ( tableName : ĠString , Ġcolumns : ĠSet < String >): ĠList < Db Action > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġactions Ġ= Ġsql Insert Builder ?. create Sql Insertion Action ( tableName , Ġcolumns ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" No ĠDB Ġschema Ġis Ġavailable ") ĊĊĠĠĠĠĠĠĠ ĠDb Action Utils . random ize Db Action Gen es ( actions , Ġrandom ness ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġactions ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsample At Random (): ĠRest Individual Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġactions Ġ= Ġmutable ListOf < Rest Action >() ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġrandom ness . nextInt ( 1 , Ġconfig . max Test Size ) ĊĊĠĠĠĠĠĠĠ Ġ// used Objects . clear () ĊĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġn ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactions . add ( sample Random Action ( 0 . 0 5 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġobj Ind Ġ= Ġ ĠRest Individual ( actions , ĠSample Type . RANDOM , Ġmutable ListOf () // , Ġused Objects . copy () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġif ( config . enable Track Evalu ated Individual Ġ|| Ġconfig . enable Track Individual ) Ġthis Ġelse Ġnull , Ġif ( config . enable Track Individual ) Ġmutable ListOf () Ġelse Ġnull ) ĊĠĠĠĠĠĠĠ Ġ// used Objects . clear () ĊĠĠĠĠĠĠĠ Ġreturn Ġobj Ind ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhen Ġgenes Ġare Ġcreated , Ġthose Ġare Ġnot Ġnecessarily Ġinitialized . ĊĠĠĠĠ Ġ* ĠThe Ġreason Ġis Ġthat Ġsome Ġgenes Ġmight Ġdepend Ġon Ġother Ġgenes Ġ( eg ., Ġforeign Ġkeys Ġin ĠSQL ). ĊĠĠĠĠ Ġ* ĠSo , Ġonce Ġall Ġgenes Ġare Ġcreated , Ġwe Ġforce Ġtheir Ġinitialization , Ġwhich Ġwill Ġalso Ġrandomize Ġtheir Ġvalues . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrandomize Action Gen es ( action : ĠAction , Ġprob abil istic : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġaction . see Gen es (). forEach Ġ{ Ġit . random ize ( random ness , Ġfalse ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġthe Ġcurrent Ġschema Ġdefinition , Ġcreate Ġa Ġrandom Ġaction Ġamong Ġthe Ġavailable Ġones . ĊĠĠĠĠ Ġ* ĠAll Ġthe Ġgenes Ġin Ġsuch Ġaction Ġwill Ġhave Ġtheir Ġvalues Ġinitialized Ġat Ġrandom , Ġbut Ġstill Ġwithin ĊĠĠĠĠ Ġ* Ġtheir Ġgiven Ġconstraints Ġ( if Ġany , Ġe . g ., Ġa Ġday Ġnumber Ġbeing Ġbetween Ġ 1 Ġand Ġ 1 2 ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġno Auth P Ġthe Ġprobability Ġof Ġhaving Ġan ĠHTTP Ġcall Ġwithout Ġany Ġauthentication Ġheader . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsample Random Action ( no Auth P : ĠDouble ): ĠRest Action Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġrandom ness . choose ( action Cluster ). copy () Ġas ĠRest Action ĊĠĠĠĠĠĠĠ Ġrandomize Action Gen es ( action ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( action Ġis ĠRest Call Action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction . auth Ġ= ĠgetRandom Auth ( no Auth P ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġaction ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsample Random Call Action ( no Auth P : ĠDouble ): ĠRest Call Action Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġrandom ness . choose ( action Cluster . filter Ġ{ Ġa Ġ-> Ġa . value Ġis ĠRest Call Action Ġ}). copy () Ġas ĠRest Call Action ĊĠĠĠĠĠĠĠ Ġrandomize Action Gen es ( action ) ĊĠĠĠĠĠĠĠ Ġaction . auth Ġ= ĠgetRandom Auth ( no Auth P ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġaction ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun ĠgetRandom Auth ( no Auth P : ĠDouble ): ĠAuthentication Info Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( auth entic ations . isEmpty () Ġ|| Ġrandom ness . next Boolean ( no Auth P )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNo Auth () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġthere Ġis Ġauth , Ġshould Ġhave Ġhigh Ġprobability Ġof Ġusing Ġone , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// as Ġwithout Ġauth Ġwe Ġwould Ġdo Ġlittle . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrandom ness . choose ( auth entic ations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsmart Sample (): ĠRest Individual Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAt Ġthe Ġbeginning , Ġsample Ġfrom Ġthis Ġset , Ġuntil Ġit Ġis Ġempty ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġif Ġ(! ad Hoc Initial Individual s . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġad Hoc Initial Individual s . remove At ( ad Hoc Initial Individual s . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// used Objects . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrandomize Action Gen es ( action , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobj Ind Ġ= ĠRest Individual ( mutable ListOf ( action ), ĠSample Type . SM ART , Ġmutable ListOf () // , Ġused Objects . copy () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġif ( config . enable Track Evalu ated Individual Ġ|| Ġconfig . enable Track Individual ) Ġthis Ġelse Ġnull , Ġif ( config . enable Track Individual ) Ġmutable ListOf () Ġelse Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// used Objects . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobj Ind ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( config . max Test Size Ġ<= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHere Ġwe Ġwould Ġhave Ġsequences Ġof Ġendpoint Ġcalls Ġthat Ġare ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsomehow Ġlinked Ġto Ġeach Ġother , Ġeg Ġa ĠDELETE Ġon Ġa Ġresource ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreated Ġwith Ġa ĠPOST . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIf Ġcan Ġhave Ġonly Ġone Ġcall , Ġthen Ġjust Ġgo Ġrandom ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsample At Random () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= Ġmutable ListOf < Rest Action >() ĊĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġsample Random Call Action ( 0 . 0 ) ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTODO : Ġeach Ġof Ġthese Ġ" smart " Ġtests Ġcould Ġend Ġwith Ġa ĠGET , Ġto Ġmake ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthe Ġtest Ġeasier Ġto Ġread Ġand Ġverify Ġthe Ġresults Ġ( eg Ġside - effects Ġof ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDELETE / PUT / PATCH Ġoperations ). ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBut Ġdoing Ġthat Ġas Ġpart Ġof Ġthe Ġtests Ġcould Ġbe Ġin efficient Ġ( ie Ġa Ġlot ĊĠĠĠĠĠĠĠĠĠĠĠ Ġof ĠGET Ġcalls ). ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMaybe Ġthat Ġshould Ġbe Ġdone Ġas Ġpart Ġof Ġan Ġ" assertion Ġgeneration " Ġphase ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( which Ġwould Ġalso Ġbe Ġuseful Ġfor Ġcreating Ġchecks Ġon Ġreturned ĠJSON s ) ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠ Ġval Ġsample Type Ġ= Ġwhen Ġ( action . verb ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Verb . GET Ġ-> Ġhandle Smart Get ( action , Ġtest ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Verb . POST Ġ-> Ġhandle Smart Post ( action , Ġtest ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Verb . PUT Ġ-> Ġhandle Smart Put ( action , Ġtest ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Verb . DELETE Ġ-> Ġhandle Smart Delete ( action , Ġtest ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Verb . PATCH Ġ-> Ġhandle Smart Patch ( action , Ġtest ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠSample Type . RANDOM ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! test . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobj Ind Ġ= ĠRest Individual ( test , Ġsample Type , Ġmutable ListOf () // , Ġused Objects . copy () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġif ( config . enable Track Evalu ated Individual Ġ|| Ġconfig . enable Track Individual ) Ġthis Ġelse Ġnull , Ġif ( config . enable Track Individual ) Ġmutable ListOf () Ġelse Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// used Objects . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobj Ind ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// used Objects . clear () ĊĠĠĠĠĠĠĠ Ġreturn Ġsample At Random () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhas Special Init (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ! ad Hoc Initial Individual s . isEmpty () Ġ&& Ġconfig . prob Of Smart Sampling Ġ> Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreset Special Init () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Ad Hoc Initial Individual s () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Smart Post ( post : ĠRest Call Action , Ġtest : ĠMutable List < Rest Action >): ĠSample Type Ġ{ ĊĊĠĠĠĠĠĠĠ ĠLazy . assert { post . verb Ġ== ĠHttp Verb . POST } ĊĊĠĠĠĠĠĠĠ Ġ// as ĠPOST Ġis Ġused Ġin Ġall Ġthe Ġothers , Ġmaybe Ġhere Ġwe Ġdo Ġnot Ġreally Ġneed Ġto Ġhandle Ġit Ġspec ially ? ĊĠĠĠĠĠĠĠ Ġtest . add ( post ) ĊĠĠĠĠĠĠĠ Ġreturn ĠSample Type . SM ART ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Smart Delete ( delete : ĠRest Call Action , Ġtest : ĠMutable List < Rest Action >): ĠSample Type Ġ{ ĊĊĠĠĠĠĠĠĠ ĠLazy . assert { delete . verb Ġ== ĠHttp Verb . DELETE } ĊĊĠĠĠĠĠĠĠ Ġcreate Write Operation After AP ost ( delete , Ġtest ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSample Type . SM ART ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Smart Patch ( patch : ĠRest Call Action , Ġtest : ĠMutable List < Rest Action >): ĠSample Type Ġ{ ĊĊĠĠĠĠĠĠĠ ĠLazy . assert { patch . verb Ġ== ĠHttp Verb . PATCH } ĊĊĠĠĠĠĠĠĠ Ġcreate Write Operation After AP ost ( patch , Ġtest ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSample Type . SM ART ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Smart Put ( put : ĠRest Call Action , Ġtest : ĠMutable List < Rest Action >): ĠSample Type Ġ{ ĊĊĠĠĠĠĠĠĠ ĠLazy . assert { put . verb Ġ== ĠHttp Verb . PUT } ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA ĠPUT Ġmight Ġbe Ġused Ġto Ġupdate Ġan Ġexisting Ġresource , Ġor Ġto Ġcreate Ġa Ġnew Ġone ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġif Ġ( random ness . next Boolean ( 0 . 2 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Ġlow Ġprob ., Ġlet 's Ġjust Ġtry Ġthe ĠPUT Ġon Ġits Ġown . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRe call Ġwe Ġalready Ġadd Ġsingle Ġcalls Ġon Ġeach Ġendpoint Ġat Ġinitialization ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest . add ( put ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSample Type . SM ART ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcreate Write Operation After AP ost ( put , Ġtest ) ĊĠĠĠĠĠĠĠ Ġreturn ĠSample Type . SM ART ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠĠĠ ĠOnly Ġfor ĠPUT , ĠDELETE , ĠP ATCH ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcreate Write Operation After AP ost ( write : ĠRest Call Action , Ġtest : ĠMutable List < Rest Action >) Ġ{ ĊĊĠĠĠĠĠĠĠ ĠLazy . assert { write . verb Ġ== ĠHttp Verb . PUT Ġ|| Ġwrite . verb Ġ== ĠHttp Verb . DELETE Ġ|| Ġwrite . verb Ġ== ĠHttp Verb . PATCH } ĊĊĠĠĠĠĠĠĠ Ġtest . add ( write ) ĊĊĠĠĠĠĠĠĠ Ġ// Need Ġto Ġfind Ġa ĠPOST Ġon Ġa Ġparent Ġcollection Ġresource ĊĠĠĠĠĠĠĠ Ġcreate Resources For ( write , Ġtest ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( write . verb Ġ== ĠHttp Verb . PATCH Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . max Test Size Ġ>= Ġtest . size Ġ+ Ġ 1 Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrandom ness . next Boolean ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAs ĠP ATCH Ġis Ġnot Ġide mpot ent Ġ( in Ġcontrast Ġto ĠPUT ), Ġit Ġcan Ġmake Ġsense Ġto Ġtest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtwo Ġpatches Ġin Ġsequence ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecond Patch Ġ= Ġcreate Action For ( write , Ġwrite ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest . add ( second Patch ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Patch . location Id Ġ= Ġwrite . location Id ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest . forEach Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevent Path Param Mutation ( t Ġas ĠRest Call Action ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Smart Get ( get : ĠRest Call Action , Ġtest : ĠMutable List < Rest Action >): ĠSample Type Ġ{ ĊĊĠĠĠĠĠĠĠ ĠLazy . assert { get . verb Ġ== ĠHttp Verb . GET } ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠ ĠA Ġtypical Ġcase Ġis Ġsomething Ġlike ĊĊĠĠĠĠĠĠĠĠĠĠ ĠPOST Ġ/ elements ĊĠĠĠĠĠĠĠĠĠĠ ĠGET Ġ Ġ/ elements /{ id } ĊĊĠĠĠĠĠĠĠĠĠĠ ĠPro blems Ġis Ġthat Ġthe Ġ{ id } Ġmight Ġnot Ġbe Ġknown Ġbefore hand , ĊĠĠĠĠĠĠĠĠĠĠ Ġeg Ġit Ġwould Ġbe Ġthe Ġresult Ġof Ġcalling ĠPOST Ġfirst , Ġwhere Ġthe ĊĠĠĠĠĠĠĠĠĠĠ Ġpath Ġwould Ġbe Ġin Ġthe Ġreturned ĠLocation Ġheader . ĊĊĠĠĠĠĠĠĠĠĠĠ ĠHowever , Ġwe Ġmight Ġeven Ġencounter Ġcases Ġlike : ĊĊĠĠĠĠĠĠĠĠĠĠ ĠPOST Ġ/ elements /{ id } ĊĠĠĠĠĠĠĠĠĠĠ ĠGET Ġ Ġ/ elements /{ id } ĊĊĠĠĠĠĠĠĠĠĠĠ Ġwhich Ġis Ġpossible , Ġalthough Ġbit Ġweird , Ġas Ġin Ġsuch Ġcase Ġit ĊĠĠĠĠĠĠĠĠĠĠ Ġwould Ġbe Ġbetter Ġto Ġhave Ġa ĠPUT Ġinstead Ġof Ġa ĠPOST . ĊĊĠĠĠĠĠĠĠĠĠĠ ĠNote : Ġwe Ġprefer Ġa ĠPOST Ġto Ġcreate Ġa Ġresource , Ġas Ġthat Ġis Ġthe ĊĠĠĠĠĠĠĠĠĠĠ Ġmost Ġcommon Ġcase , Ġand Ġnot Ġall ĠPUT s Ġallow Ġcreation ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠ Ġtest . add ( get ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcreated Ġ= Ġcreate Resources For ( get , Ġtest ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! created ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠA ĠGET Ġwith Ġno ĠPOST Ġin Ġany Ġancestor . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThis Ġcould Ġhappen Ġif Ġthe ĠAPI Ġis Ġ" read - only ". ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO : ĠIn Ġsuch Ġcase , Ġwould Ġreally Ġneed Ġto Ġhandle Ġthings Ġlike ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirect Ġcreation Ġof Ġdata Ġin Ġthe ĠDB Ġ( for Ġexample ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// only Ġlock Ġpath Ġparams Ġif Ġit Ġis Ġnot Ġa Ġsingle ĠGET ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest . forEach Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevent Path Param Mutation ( t Ġas ĠRest Call Action ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( created Ġ&& Ġ! get . path . is Last Element A Parameter ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Post Ġ= Ġtest [ test . size Ġ- Ġ 2 ] Ġas ĠRest Call Action ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLazy . assert { last Post . verb Ġ== ĠHttp Verb . POST } ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġavailable Ġ= Ġconfig . max Test Size Ġ- Ġtest . size ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Post . path . is Equivalent ( get . path ) Ġ&& Ġavailable Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThe Ġendpoint Ġmight Ġrepresent Ġa Ġcollection , Ġie Ġwe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan Ġbe Ġin Ġthe Ġcase : ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPOST Ġ/ api / elements ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGET Ġ Ġ/ api / elements ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTherefore , Ġto Ġproperly Ġtest Ġthe ĠGET , Ġwe Ġmight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġneed Ġto Ġbe Ġable Ġto Ġcreate Ġmany Ġelements . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . trace (" Creating ĠPOST s Ġon Ġcollection Ġbefore Ġa ĠGET ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk Ġ= Ġ 1 Ġ+ Ġrandom ness . nextInt ( available ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġk ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcreate Ġ= Ġcreate Action For ( last Post , Ġget ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevent Path Param Mutation ( create ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate . location Id Ġ= Ġlast Post . location Id ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// add Ġjust Ġbefore Ġthe Ġlast ĠGET ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest . add ( test . size Ġ- Ġ 1 , Ġcreate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSample Type . SM ART _ GET _ COLLECTION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSample Type . SM ART ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġcreate Resources For ( target : ĠRest Call Action , Ġtest : ĠMutable List < Rest Action >) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( test . size Ġ>= Ġconfig . max Test Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= Ġchoose Closest Ancestor ( target , ĠlistOf ( Http Verb . POST )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġpost Ġ= Ġcreate Action For ( template , Ġtarget ) ĊĊĠĠĠĠĠĠĠ Ġtest . add ( 0 , Ġpost ) ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCheck Ġif ĠPOST Ġdepends Ġitself Ġon Ġthe Ġcreation Ġof ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsome Ġintermediate Ġresource ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġif Ġ( post . path . has Variable Path Parameters () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(! post . path . is Last Element A Parameter ()) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost . path . get Variable Names (). size Ġ>= Ġ 2 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Created Ġ= Ġcreate Resources For ( post , Ġtest ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! dependency Created ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOnce Ġthe ĠPOST Ġis Ġfully Ġinitialized , Ġneed Ġto Ġfix ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlinks Ġwith Ġtarget ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġif Ġ(! post . path . is Equivalent ( target . path )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeg ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPOST Ġ/ x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGET Ġ Ġ/ x /{ id } ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost . save Location Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget . location Id Ġ= Ġpost . path . last Element () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeg ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPOST Ġ/ x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPOST Ġ/ x /{ id }/ y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGET Ġ Ġ/ x /{ id }/ y ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// not Ġgoing Ġto Ġsave Ġthe Ġposition Ġof Ġlast ĠPOST , Ġas Ġsame Ġas Ġtarget ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost . save Location Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġtarget Ġ( eg ĠGET ) Ġneeds Ġto Ġuse Ġthe Ġlocation Ġof Ġfirst ĠPOST , Ġor Ġmore Ġcorrectly ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġsame Ġlocation Ġused Ġfor Ġthe Ġlast ĠPOST Ġ( in Ġcase Ġthere Ġis Ġa Ġdeeper Ġchain ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget . location Id Ġ= Ġpost . location Id ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprevent Path Param Mutation ( action : ĠRest Call Action ) Ġ{ ĊĠĠĠĠĠĠĠ Ġaction . parameters . forEach Ġ{ Ġp Ġ-> Ġif Ġ( p Ġis ĠPath Param ) Ġp . prevent Mutation () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Action For ( template : ĠRest Call Action , Ġtarget : ĠRest Call Action ): ĠRest Call Action Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġtemplate . copy () Ġas ĠRest Call Action ĊĠĠĠĠĠĠĠ Ġrandomize Action Gen es ( res ) ĊĠĠĠĠĠĠĠ Ġres . auth Ġ= Ġtarget . auth ĊĠĠĠĠĠĠĠ Ġres . bind To Same Path Resolution ( target ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġres ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMake Ġsure Ġthat Ġwhat Ġreturned Ġis Ġdifferent Ġfrom Ġthe Ġtarget . ĊĠĠĠĠ Ġ* ĠThis Ġcan Ġbe Ġa Ġstrict Ġancestor Ġ( short er Ġpath ), Ġor Ġsame ĊĠĠĠĠ Ġ* Ġendpoint Ġbut Ġwith Ġdifferent ĠHTTP Ġverb . ĊĠĠĠĠ Ġ* ĠA mong Ġthe Ġdifferent Ġan cestors , Ġreturn Ġone Ġof Ġthe Ġlongest ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġchoose Closest Ancestor ( target : ĠRest Call Action , Ġver bs : ĠList < Http Verb >): ĠRest Call Action ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġothers Ġ= Ġsame Or Ancestor Endpoints ( target . path ) ĊĠĠĠĠĠĠĠ Ġothers Ġ= Ġhas With Ver bs ( others , Ġver bs ). filter Ġ{ Ġt Ġ-> Ġt . getName () Ġ!= Ġtarget . getName () Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( others . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġchoose Lon gest Path ( others ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġall Ġancestor Ġ( same Ġpath Ġprefix ) Ġendpoints Ġthat Ġdo Ġat Ġleast Ġone ĊĠĠĠĠ Ġ* Ġof Ġthe Ġspecified Ġoperations ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsame Or Ancestor Endpoints ( path : ĠRest Path ): ĠList < Rest Call Action > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġaction Cluster . values . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġa Ġ-> Ġa Ġis ĠRest Call Action Ġ&& Ġa . path . is Ancestor Of ( path ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġa Ġ-> Ġa Ġas ĠRest Call Action Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġchoose Lon gest Path ( actions : ĠList < Rest Call Action >): ĠRest Call Action Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( actions . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Cannot Ġchoose Ġfrom Ġan Ġempty Ġcollection ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmax Ġ= Ġactions . as Sequence (). map Ġ{ Ġa Ġ-> Ġa . path . levels () Ġ}. max () !! ĊĠĠĠĠĠĠĠ Ġval Ġcandidates Ġ= Ġactions . filter Ġ{ Ġa Ġ-> Ġa . path . levels () Ġ== Ġmax Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrandom ness . choose ( candidates ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhas With Ver bs ( actions : ĠList < Rest Call Action >, Ġver bs : ĠList < Http Verb >): ĠList < Rest Call Action > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġactions . filter Ġ{ Ġa Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġver bs . contains ( a . verb ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġinit Ad Hoc Initial Individual s () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġad Hoc Initial Individual s . clear () ĊĊĠĠĠĠĠĠĠ Ġ// init Ġfirst Ġsampling Ġwith Ġ 1 - action Ġcall Ġper Ġendpoint , Ġfor Ġall Ġauth s ĊĊĠĠĠĠĠĠĠ Ġcreate Single Call On Each Endpoint ( No Auth ()) ĊĊĠĠĠĠĠĠĠ Ġauthentic ations . forEach Ġ{ Ġauth Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Single Call On Each Endpoint ( auth ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Single Call On Each Endpoint ( auth : ĠAuthentication Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġaction Cluster . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġa Ġ-> Ġa . value Ġis ĠRest Call Action Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġa Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopy Ġ= Ġa . value . copy () Ġas ĠRest Call Action ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy . auth Ġ= Ġauth ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrandomize Action Gen es ( copy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġad Hoc Initial Individual s . add ( copy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Open API (): ĠOpenAPI { ĊĠĠĠĠĠĠĠ Ġreturn Ġswagger ĊĠĠĠ Ġ} Ċ Ċ }