package Ġcom . ep am . drill . e 2 e Ċ Ċ import Ġcom . ep am . drill . admin . api . routes .* Ċ import Ġcom . ep am . drill . admin . api . agent .* Ċ import Ġcom . ep am . drill . admin . api . plugin .* Ċ import Ġcom . ep am . drill . admin . common .* Ċ import Ġcom . ep am . drill . admin . common . serialization .* Ċ import Ġcom . ep am . drill . admin . endpoints .* Ċ import Ġcom . ep am . drill . admin . service group .* Ċ import Ġcom . ep am . drill . testdata .* Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . server . testing .* Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . channels .* Ċ import Ġjava . util . concurrent .* Ċ import Ġkotlin . coroutines .* Ċ import Ġkotlin . time .* ĊĊ Ċ abstract Ġclass ĠE 2 E Test Ġ: ĠAdmin Test () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġagents Ġ= ĠConcurrent HashMap < Agent Key , ĠAgent Struct >() ĊĊĠĠĠ Ġfun Ġcreate Simple App With UI Connection ( ĊĠĠĠĠĠĠĠ Ġui Stream Debug : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġagent Stream Debug : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġtimeout : ĠDuration Ġ= Ġ 7 . seconds , ĊĠĠĠĠĠĠĠ Ġblock : Ġsuspend Ġ() Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcoroutine Exception : ĠThrowable ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠSuper visor Job () ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠCor outine ExceptionHandler Ġ{ Ġ_, Ġexception Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Exception Ġ= Ġexception ĊĠĠĠĠĠĠĠ Ġ} Ġ+ Ġcontext ĊĠĠĠĠĠĠĠ Ġrun Blocking ( handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimeout Job Ġ= Ġcreate Timeout Job ( timeout , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Config Ġ= ĠApp Config ( project Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest App Ġ= Ġapp Config . test App ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Application ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment Ġ= Ġcreate Test Environment Ġ{ Ġparent Coroutine Context Ġ= Ġcontext Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Ġ= Ġ{ Ġdispatcher Ġ= ĠDispatch ers . IO Ġ+ Ġcontext Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest App ( application , Ġssl Port ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Engine Ġ= ĠAsync Test App Engine ( handler , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore Manager Ġ= Ġapp Config . store Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommon Store Ġ= Ġapp Config . common Store ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglob Token Ġ= Ġrequest Token () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// create Ġthe Ġ' drill - admin - socket ' Ġwebsocket Ġconnection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle WebSocket Conversation ("/ ws / drill - admin - socket ? token =${ glob Token }") Ġ{ Ġui Incoming , Ġut Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġut . send ( ui Message ( Subscribe ("/ agents "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui Incoming . receive () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġglob Ġ= ĠChannel < Group ed Agents Dto >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġglob Launch Ġ= Ġapplication . launch ( handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwatcher ?. invoke ( async Engine , Ġglob ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcs Ġ= Ġmutable Map Of < String , ĠAdmin Ui Channels >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġagents . map Ġ{ Ġ(_, Ġxx ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( ag , Ġstart Cl b , Ġconnect , Ġth ens ) Ġ= Ġxx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġui Ġ= ĠAdmin Ui Channels () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcs [ ag . id ] Ġ= Ġui ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Cl b () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġui E Ġ= ĠU IE VENT LOOP ( cs , Ġui Stream Debug , Ġglob ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( ui E ) Ġ{ Ġapplication . queued ( app Config . ws Topic , Ġui Incoming ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// create Ġthe Ġ'/ agent / attach ' Ġwebsocket Ġconnection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġut . send ( ui Message ( Subscribe ("/ agents /${ ag . id } "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġut . send ( ui Message ( Subscribe ("/ agents /${ ag . id }/ builds "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . get Agent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . get Build s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle WebSocket Conversation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ agent / attach ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġws Request Required Params ( ag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġinp , Ġout Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglob . receive () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapply Ġ= ĠAgent ( application , Ġag . id , Ġinp , Ġout , Ġagent Stream Debug ). apply Ġ{ Ġqueued () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Engine , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( glob Launch . isActive ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġth ens . forEach Ġ{ Ġ( ain , Ġit ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglob . receive () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . get Agent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . get Build s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle WebSocket Conversation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ agent / attach ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġws Request Required Params ( ain ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġinp , Ġout Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapply Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAgent ( application , Ġa in . id , Ġinp , Ġout , Ġagent Stream Debug ). apply Ġ{ Ġqueued () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Engine , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( glob Launch . isActive ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ Ġit . join () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglob Launch . join () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimeout Job . cancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( coroutine Exception Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġcoroutine Exception !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconnect Agent ( ĊĠĠĠĠĠĠĠ Ġag s : ĠAgent Wrap , ĊĠĠĠĠĠĠĠ Ġstart Cl b : Ġsuspend Ġ() Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠĠĠĠĠ Ġbl : Ġsuspend ĠAsync Test App Engine .( Admin Ui Channels , ĠAgent ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠE 2 E Test Ġ{ ĊĠĠĠĠĠĠĠ Ġagents [ Agent Key ( ags . id , Ġag s . instanceId )] Ġ= ĠAgent Struct ( ags , Ġstart Cl b , Ġbl , Ġmutable ListOf ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġreconnect ( ĊĠĠĠĠĠĠĠ Ġag s : ĠAgent Wrap , ĊĠĠĠĠĠĠĠ Ġbl : Ġsuspend ĠAsync Test App Engine .( Admin Ui Channels , ĠAgent ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠE 2 E Test Ġ{ ĊĠĠĠĠĠĠĠ Ġagents [ Agent Key ( ags . id , Ġag s . instanceId )] ?. reconnect s ?. add ( ags Ġto Ġbl ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠAsync Test App Engine . add Plugin ( ĊĠĠĠĠĠĠĠ Ġagent Id : ĠString , ĊĠĠĠĠĠĠĠ Ġpayload : ĠPlugin Id , ĊĠĠĠĠĠĠĠ Ġtoken : ĠString Ġ= Ġglob Token , ĊĠĠĠĠĠĠĠ Ġresult Block : Ġsuspend Ġ( HttpStatusCode ?, ĠString ?) Ġ-> ĠUnit Ġ= Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠ Ġ) Ġ= ĊĠĠĠĠĠĠĠ Ġcall Async ( context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( engine ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . Post , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Api Uri ( agent Api Ġ{ ĠApi Root . Agents . Plugins ( it , Ġagent Id ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( HttpHeaders . Authorization , Ġ" Bearer Ġ$ token ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( HttpHeaders . ContentType , ĠContentType . Application . Json . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Body ( Plugin Id . serializer () Ġstringify Ġpayload ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. apply Ġ{ Ġresult Block ( response . status (), Ġresponse . content ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠAsync Test App Engine . unregister ( ĊĠĠĠĠĠĠĠ Ġagent Id : ĠString , ĊĠĠĠĠĠĠĠ Ġtoken : ĠString Ġ= Ġglob Token , ĊĠĠĠĠĠĠĠ Ġresult Block : Ġsuspend Ġ( HttpStatusCode ?, ĠString ?) Ġ-> ĠUnit Ġ= Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠ Ġ) Ġ= ĊĠĠĠĠĠĠĠ Ġcall Async ( context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( engine ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . Delete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Api Uri ( agent Api Ġ{ ĠApi Root . Agents . Agent ( it , Ġagent Id ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( HttpHeaders . Authorization , Ġ" Bearer Ġ$ token ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. apply Ġ{ Ġresult Block ( response . status (), Ġresponse . content ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠAsync Test App Engine . un Load Plugin ( ĊĠĠĠĠĠĠĠ Ġagent Id : ĠString , ĊĠĠĠĠĠĠĠ Ġpayload : ĠPlugin Id , ĊĠĠĠĠĠĠĠ Ġtoken : ĠString Ġ= Ġglob Token , ĊĠĠĠĠĠĠĠ Ġresult Block : Ġsuspend Ġ( HttpStatusCode ?, ĠString ?) Ġ-> ĠUnit Ġ= Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcall Async ( context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( engine ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . Delete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Api Uri ( agent Api Ġ{ ĠApi Root . Agents . Plugin ( it , Ġagent Id , Ġpayload . plugin Id ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( HttpHeaders . Authorization , Ġ" Bearer Ġ$ token ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. apply Ġ{ Ġresult Block ( response . status (), Ġresponse . content ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠAsync Test App Engine . toggle Plugin ( ĊĠĠĠĠĠĠĠ Ġagent Id : ĠString , ĊĠĠĠĠĠĠĠ Ġplugin Id : ĠPlugin Id , ĊĠĠĠĠĠĠĠ Ġtoken : ĠString Ġ= Ġglob Token , ĊĠĠĠĠĠĠĠ Ġresult Block : Ġsuspend Ġ( HttpStatusCode ?, ĠString ?) Ġ-> ĠUnit Ġ= Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcall Async ( context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( engine ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . Post , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Api Uri ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Root (). let ( Api Root :: Agents ). let Ġ{ ĠApi Root . Agents . Toggle Plugin ( it , Ġagent Id , Ġplugin Id . plugin Id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( HttpHeaders . Authorization , Ġ" Bearer Ġ$ token ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. apply Ġ{ Ġresult Block ( response . status (), Ġresponse . content ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠAsync Test App Engine . toggle Agent ( ĊĠĠĠĠĠĠĠ Ġagent Id : ĠString , ĊĠĠĠĠĠĠĠ Ġtoken : ĠString Ġ= Ġglob Token , ĊĠĠĠĠĠĠĠ Ġresult Block : Ġsuspend Ġ( HttpStatusCode ?, ĠString ?) Ġ-> ĠUnit Ġ= Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcall Async ( context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( engine ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . Post , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Api Uri ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Root (). let ( Api Root :: Agents ). let Ġ{ ĠApi Root . Agents . Toggle Agent ( it , Ġagent Id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( HttpHeaders . Authorization , Ġ" Bearer Ġ$ token ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. apply Ġ{ Ġresult Block ( response . status (), Ġresponse . content ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠAsync Test App Engine . change Packages ( ĊĠĠĠĠĠĠĠ Ġagent Id : ĠString , ĊĠĠĠĠĠĠĠ Ġtoken : ĠString Ġ= Ġglob Token , ĊĠĠĠĠĠĠĠ Ġpayload : ĠSystem Settings Dto , ĊĠĠĠĠĠĠĠ Ġresult Block : Ġsuspend Ġ( HttpStatusCode ?, ĠString ?) Ġ-> ĠUnit Ġ= Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠ Ġ) Ġ= Ġcall Async ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( engine ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . Put , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Api Uri ( agent Api Ġ{ ĠApi Root . Agents . System Settings ( it , Ġagent Id ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( HttpHeaders . Authorization , Ġ" Bearer Ġ$ token ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( HttpHeaders . ContentType , ĠContentType . Application . Json . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Body ( System Settings Dto . serializer () Ġstringify Ġpayload ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. apply Ġ{ Ġresult Block ( response . status (), Ġresponse . content ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ data Ġclass ĠAsync Test App Engine ( val Ġcontext : ĠCor outine Context , Ġval Ġengine : ĠTest Application Engine ) Ċ Ċ data Ġclass ĠAgent Key ( val Ġid : ĠString , Ġval Ġinstance Id : ĠString ) Ċ data Ġclass ĠAgent Struct ( ĊĠĠĠ Ġval Ġag Wrap : ĠAgent Wrap , ĊĠĠĠ Ġval Ġstart Cl b : Ġsuspend Ġ() Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠ Ġval Ġcl bs : Ġsuspend ĠAsync Test App Engine .( Admin Ui Channels , ĠAgent ) Ġ-> ĠUnit , ĊĠĠĠ Ġval Ġreconnect s : ĠMutable List < Pair < Agent Wrap , Ġsuspend ĠAsync Test App Engine .( Admin Ui Channels , ĠAgent ) Ġ-> ĠUnit >> Ċ ) Ċ Ċ data Ġclass ĠAgent Wrap ( ĊĠĠĠ Ġval Ġid : ĠString , ĊĠĠĠ Ġval Ġinstance Id : ĠString Ġ= Ġid Ġ+ Ġ" 1 ", ĊĠĠĠ Ġval Ġbuild Version : ĠString Ġ= Ġ" 0 . 1 . 0 ", ĊĠĠĠ Ġval Ġservice GroupId : ĠString Ġ= Ġ"", ĊĠĠĠ Ġval Ġneed Sync : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġval Ġagent Type : ĠAgent Type Ġ= ĠAgent Type . JAVA Ċ ) Ċ