/** Ċ Ġ* Ġ" Common s ĠClause " ĠLicense ĠCondition Ġv 1 . 0 Ċ Ġ* Ċ Ġ* ĠThe ĠSoftware Ġis Ġprovided Ġto Ġyou Ġby Ġthe ĠLic ensor Ġunder Ġthe ĠLicense , Ġas Ġdefined Ċ Ġ* Ġbelow , Ġsubject Ġto Ġthe Ġfollowing Ġcondition . Ċ Ġ* Ċ Ġ* ĠWithout Ġlimiting Ġother Ġconditions Ġin Ġthe ĠLicense , Ġthe Ġgrant Ġof Ġrights Ġunder Ġthe Ċ Ġ* ĠLicense Ġwill Ġnot Ġinclude , Ġand Ġthe ĠLicense Ġdoes Ġnot Ġgrant Ġto Ġyou , Ġthe Ġright Ġto Ċ Ġ* ĠS ell Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠFor Ġpurposes Ġof Ġthe Ġfore going , ĠâĢľ Sell âĢĿ Ġmeans Ġpract icing Ġany Ġor Ġall Ġof Ġthe Ġrights Ċ Ġ* Ġgranted Ġto Ġyou Ġunder Ġthe ĠLicense Ġto Ġprovide Ġto Ġthird Ġparties , Ġfor Ġa Ġfee Ġor Ċ Ġ* Ġother Ġconsideration Ġ( including Ġwithout Ġlimitation Ġfees Ġfor Ġhosting Ġor Ċ Ġ* Ġconsult ing / Ġsupport Ġservices Ġrelated Ġto Ġthe ĠSoftware ), Ġa Ġproduct Ġor Ġservice Ċ Ġ* Ġwhose Ġvalue Ġder ives , Ġentirely Ġor Ġsubstant ially , Ġfrom Ġthe Ġfunctionality Ġof Ġthe Ċ Ġ* ĠSoftware . ĠAny Ġlicense Ġnotice Ġor Ġat tribution Ġrequired Ġby Ġthe ĠLicense Ġmust Ġalso Ċ Ġ* Ġinclude Ġthis ĠCommons ĠClause ĠLicense ĠCondition Ġnotice . Ċ Ġ* Ċ Ġ* ĠSoftware : ĠInf init ic Ċ Ġ* Ċ Ġ* ĠLicense : ĠMIT ĠLicense Ġ( https :// opensource . org / licenses / MIT ) Ċ Ġ* Ċ Ġ* ĠLic ensor : Ġinf init ic . io Ċ Ġ*/ Ċ Ċ @ file : Suppress (" unused ") Ċ Ċ package Ġio . inf init ic . tasks . executor Ċ Ċ import Ġio . inf init ic . clients . Inf init ic Client Ċ import Ġio . inf init ic . common . clients . Send To Client Ċ import Ġio . inf init ic . common . clients . messages . Client Message Ċ import Ġio . inf init ic . common . data . Client Name Ċ import Ġio . inf init ic . common . data . Millis Duration Ċ import Ġio . inf init ic . common . data . ReturnValue Ċ import Ġio . inf init ic . common . data . methods . MethodName Ċ import Ġio . inf init ic . common . data . methods . Method Parameter Types Ċ import Ġio . inf init ic . common . data . methods . Method Parameters Ċ import Ġio . inf init ic . common . tasks . data . TaskId Ċ import Ġio . inf init ic . common . tasks . data . Task Meta Ċ import Ġio . inf init ic . common . tasks . data . Task Name Ċ import Ġio . inf init ic . common . tasks . data . Task Retry Index Ċ import Ġio . inf init ic . common . tasks . data . Task Retry Sequence Ċ import Ġio . inf init ic . common . tasks . data . Task ReturnValue Ċ import Ġio . inf init ic . common . tasks . data . Task Tag Ċ import Ġio . inf init ic . common . tasks . exec utors . Send To Task Executor After Ċ import Ġio . inf init ic . common . tasks . exec utors . errors . Worker Error Ċ import Ġio . inf init ic . common . tasks . exec utors . messages . Execute Task Ċ import Ġio . inf init ic . common . tasks . exec utors . messages . Task Executor Message Ċ import Ġio . inf init ic . common . tasks . tags . Send To Task Tag Ċ import Ġio . inf init ic . common . tasks . tags . messages . Remove Tag From Task Ċ import Ġio . inf init ic . common . tasks . tags . messages . Task Tag Message Ċ import Ġio . inf init ic . common . workflows . data . method Runs . Method Run Id Ċ import Ġio . inf init ic . common . workflows . data . workflows . Workflow Id Ċ import Ġio . inf init ic . common . workflows . data . workflows . Workflow Name Ċ import Ġio . inf init ic . common . workflows . engine . Send To Workflow Engine Ċ import Ġio . inf init ic . common . workflows . engine . messages . Workflow Engine Message Ċ import Ġio . inf init ic . exceptions . tasks . Class NotFoundException Ċ import Ġio . inf init ic . exceptions . tasks . Max Run Duration Exception Ċ import Ġio . inf init ic . exceptions . tasks . No Method Found With Parameter Count Exception Ċ import Ġio . inf init ic . exceptions . tasks . No Method Found With Parameter Types Exception Ċ import Ġio . inf init ic . exceptions . tasks . Too Many Methods Found With Parameter Count Exception Ċ import Ġio . inf init ic . tasks . Task Options Ċ import Ġio . inf init ic . tasks . executor . register . Worker Register Impl Ċ import Ġio . inf init ic . tasks . executor . samples . Sample Task Impl Ċ import Ġio . inf init ic . tasks . executor . samples . Sample Task With Bug gy Retry Ċ import Ġio . inf init ic . tasks . executor . samples . Sample Task WithContext Ċ import Ġio . inf init ic . tasks . executor . samples . Sample Task With Retry Ċ import Ġio . inf init ic . tasks . executor . samples . Sample Task WithTimeout Ċ import Ġio . kot est . core . spec . style . String Spec Ċ import Ġio . kot est . matchers . shouldBe Ċ import Ġio . mock k . Capt uring Slot Ċ import Ġio . mock k . Runs Ċ import Ġio . mock k . co Every Ċ import Ġio . mock k . just Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . slot Ċ import Ġkotlinx . coroutines . coroutine Scope Ċ import Ġjava . time . Duration Ċ import Ġjava . util . concurrent . Copy On Write ArrayList Ċ import Ġkotlin . reflect . K Class Ċ import Ġio . inf init ic . common . clients . messages . Task Completed Ġas ĠTask Completed Client Ċ import Ġio . inf init ic . common . clients . messages . Task Failed Ġas ĠTask Failed Client Ċ import Ġio . inf init ic . common . workflows . engine . messages . Task Completed Ġas ĠTask Completed Workflow Ċ import Ġio . inf init ic . common . workflows . engine . messages . Task Failed Ġas ĠTask Failed Workflow Ċ Ċ private Ġval Ġclient Name Ġ= ĠClient Name (" client Task Executor Tests ") Ċ Ċ class ĠTask Executor Tests Ġ: ĠString Spec ({ ĊĠĠĠ Ġval Ġafter Ġ= Ġslot < Millis Duration >() ĊĠĠĠ Ġval Ġtask Executor Message Ġ= Ġslot < Task Executor Message >() ĊĠĠĠ Ġval Ġtask Tag Messages Ġ= ĠCopy On Write ArrayList < Task Tag Message >() Ġ// Ġmult ith reading Ġupdate ĊĠĠĠ Ġval Ġclient Message Ġ= Ġslot < Client Message >() ĊĠĠĠ Ġval Ġworkflow Engine Message Ġ= Ġslot < Workflow Engine Message >() ĊĠĠĠ Ġval Ġworker Register Ġ= ĠWorker Register Impl () ĊĠĠĠ Ġval Ġmock Client Factory Ġ= Ġmock k < ()-> ĠInf init ic Client >() ĊĠĠĠ Ġval Ġtask Executor Ġ= ĠTask Executor ( ĊĠĠĠĠĠĠĠ Ġclient Name , ĊĠĠĠĠĠĠĠ Ġworker Register , ĊĠĠĠĠĠĠĠ Ġmock Send To Task Executor ( task Executor Message , Ġafter ), ĊĠĠĠĠĠĠĠ Ġmock Send To Task Tag ( task Tag Messages ), ĊĠĠĠĠĠĠĠ Ġmock Send To Workflow Engine ( workflow Engine Message ), ĊĠĠĠĠĠĠĠ Ġmock Send To Client ( client Message ), ĊĠĠĠĠĠĠĠ Ġmock Client Factory ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// Ġensure Ġslots Ġare Ġe mpt ied Ġbetween Ġeach Ġtest ĊĠĠĠ Ġbefore Test Ġ{ ĊĠĠĠĠĠĠĠ Ġafter . clear () ĊĠĠĠĠĠĠĠ Ġtask Executor Message . clear () ĊĠĠĠĠĠĠĠ Ġtask Tag Messages . clear () ĊĠĠĠĠĠĠĠ Ġworkflow Engine Message . clear () ĊĠĠĠĠĠĠĠ Ġclient Message . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Task Ġexecuted Ġwithout Ġwaiting Ġclient Ġneither Ġworkflow Ġshould Ġnot Ġsend Ġmessage " Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Executor . register Task (" task ") Ġ{ ĠSample Task Impl () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠarrayOf ( 3 , Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= ĠlistOf ( Int :: class . java . name , ĠInt :: class . java . name ) ĊĠĠĠĠĠĠĠ Ġ// Ġwith ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġget Execute Task (" handle ", Ġinput , Ġtypes ). copy ( client Waiting Ġ= Ġfalse , Ġworkflow Id Ġ= Ġnull ) ĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ Ġtask Executor . handle ( msg ) Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġtask Executor Message . is Capt ured ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġclient Message . is Capt ured ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġworkflow Engine Message . is Capt ured ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġtask Tag Messages . size ĠshouldBe Ġ 2 ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 0 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" foo ") ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 1 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" bar ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Task Ġexecuted Ġwith Ġwaiting Ġclient Ġshould Ġsend Ġmessage Ġto Ġit " Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Executor . register Task (" task ") Ġ{ ĠSample Task Impl () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠarrayOf ( 3 , Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= ĠlistOf ( Int :: class . java . name , ĠInt :: class . java . name ) ĊĠĠĠĠĠĠĠ Ġ// Ġwith ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġget Execute Task (" handle ", Ġinput , Ġtypes ). copy ( workflow Id Ġ= Ġnull ) ĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ Ġtask Executor . handle ( msg ) Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġtask Executor Message . is Capt ured ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġclient Message . captured ĠshouldBe Ġget Task Completed Client ( msg , Ġ 9 ) ĊĠĠĠĠĠĠĠ Ġworkflow Engine Message . is Capt ured ĠshouldBe Ġfalse ĊĊĠĠĠĠĠĠĠ Ġtask Tag Messages . size ĠshouldBe Ġ 2 ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 0 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" foo ") ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 1 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" bar ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Task Ġexecuted Ġwith Ġworkflow Ġshould Ġsend Ġmessage Ġto Ġit " Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Executor . register Task (" task ") Ġ{ ĠSample Task Impl () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠarrayOf ( 3 , Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= ĠlistOf ( Int :: class . java . name , ĠInt :: class . java . name ) ĊĠĠĠĠĠĠĠ Ġ// Ġwith ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġget Execute Task (" handle ", Ġinput , Ġtypes ). copy ( client Waiting Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ Ġtask Executor . handle ( msg ) Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġtask Executor Message . is Capt ured ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġclient Message . is Capt ured ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġworkflow Engine Message . captured ĠshouldBe Ġget Task Completed Workflow ( msg , Ġ 9 ) ĊĠĠĠĠĠĠĠ Ġtask Tag Messages . size ĠshouldBe Ġ 2 ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 0 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" foo ") ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 1 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" bar ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Task Ġexecuted Ġwith Ġwaiting Ġclient Ġand Ġworkflow Ġshould Ġsend Ġmessage Ġto Ġthem " Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Executor . register Task (" task ") Ġ{ ĠSample Task Impl () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠarrayOf ( 3 , Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= ĠlistOf ( Int :: class . java . name , ĠInt :: class . java . name ) ĊĠĠĠĠĠĠĠ Ġ// Ġwith ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġget Execute Task (" handle ", Ġinput , Ġtypes ) ĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ Ġtask Executor . handle ( msg ) Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġtask Executor Message . is Capt ured ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġclient Message . captured ĠshouldBe Ġget Task Completed Client ( msg , Ġ 9 ) ĊĠĠĠĠĠĠĠ Ġworkflow Engine Message . captured ĠshouldBe Ġget Task Completed Workflow ( msg , Ġ 9 ) ĊĠĠĠĠĠĠĠ Ġtask Tag Messages . size ĠshouldBe Ġ 2 ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 0 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" foo ") ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 1 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" bar ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Should Ġbe Ġable Ġto Ġrun Ġan Ġexplicit Ġmethod Ġwith Ġ 2 Ġparameters " Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Executor . register Task (" task ") Ġ{ ĠSample Task Impl () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠarrayOf ( 3 , Ġ" 3 ") ĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= ĠlistOf ( Int :: class . java . name , ĠString :: class . java . name ) ĊĠĠĠĠĠĠĠ Ġ// Ġwith ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġget Execute Task (" other ", Ġinput , Ġtypes ) ĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ Ġtask Executor . handle ( msg ) Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġtask Executor Message . is Capt ured ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġclient Message . captured ĠshouldBe Ġget Task Completed Client ( msg , Ġ" 9 ") ĊĠĠĠĠĠĠĠ Ġworkflow Engine Message . captured ĠshouldBe Ġget Task Completed Workflow ( msg , Ġ" 9 ") ĊĠĠĠĠĠĠĠ Ġtask Tag Messages . size ĠshouldBe Ġ 2 ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 0 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" foo ") ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 1 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" bar ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Should Ġbe Ġable Ġto Ġrun Ġan Ġexplicit Ġmethod Ġwith Ġ 2 Ġparameters Ġwithout Ġparameter Types " Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Executor . register Task (" task ") Ġ{ ĠSample Task Impl () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠarrayOf ( 4 , Ġ" 3 ") ĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġget Execute Task (" other ", Ġinput , Ġtypes ) ĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ Ġtask Executor . handle ( msg ) Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġtask Executor Message . is Capt ured ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġclient Message . captured ĠshouldBe Ġget Task Completed Client ( msg , Ġ" 1 2 ") ĊĠĠĠĠĠĠĠ Ġworkflow Engine Message . captured ĠshouldBe Ġget Task Completed Workflow ( msg , Ġ" 1 2 ") ĊĠĠĠĠĠĠĠ Ġtask Tag Messages . size ĠshouldBe Ġ 2 ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 0 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" foo ") ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 1 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" bar ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Should Ġthrow ĠClass NotFoundException Ġwhen Ġtrying Ġto Ġprocess Ġan Ġunknown Ġtask " Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Executor . unregister Task (" task ") ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠarrayOf ( 2 , Ġ" 3 ") ĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= ĠlistOf ( Int :: class . java . name , ĠString :: class . java . name ) ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġget Execute Task (" unknown ", Ġinput , Ġtypes ) ĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ Ġtask Executor . handle ( msg ) Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġtask Executor Message . is Capt ured ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġcheck ClientException ( client Message , Ġmsg , ĠClass NotFoundException :: class ) ĊĠĠĠĠĠĠĠ Ġcheck Workflow Exception ( workflow Engine Message , Ġmsg , ĠClass NotFoundException :: class ) ĊĠĠĠĠĠĠĠ Ġtask Tag Messages . size ĠshouldBe Ġ 2 ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 0 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" foo ") ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 1 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" bar ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Should Ġthrow ĠNo Method Found With Parameter Types Ġwhen Ġtrying Ġto Ġprocess Ġan Ġunknown Ġmethod " Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Executor . register Task (" task ") Ġ{ ĠSample Task Impl () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠarrayOf ( 2 , Ġ" 3 ") ĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= ĠlistOf ( Int :: class . java . name , ĠString :: class . java . name ) ĊĠĠĠĠĠĠĠ Ġ// Ġwith ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġget Execute Task (" unknown ", Ġinput , Ġtypes ) ĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ Ġtask Executor . handle ( msg ) Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġtask Executor Message . is Capt ured ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġcheck ClientException ( client Message , Ġmsg , ĠNo Method Found With Parameter Types Exception :: class ) ĊĠĠĠĠĠĠĠ Ġcheck Workflow Exception ( workflow Engine Message , Ġmsg , ĠNo Method Found With Parameter Types Exception :: class ) ĊĠĠĠĠĠĠĠ Ġtask Tag Messages . size ĠshouldBe Ġ 2 ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 0 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" foo ") ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 1 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" bar ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Should Ġthrow ĠNo Method Found With Parameter Count Ġwhen Ġtrying Ġto Ġprocess Ġan Ġunknown Ġmethod Ġwithout Ġparameter Types " Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Executor . register Task (" task ") Ġ{ ĠSample Task Impl () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠarrayOf ( 2 , Ġ" 3 ") ĊĠĠĠĠĠĠĠ Ġ// Ġwith ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġget Execute Task (" unknown ", Ġinput , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ Ġtask Executor . handle ( msg ) Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġtask Executor Message . is Capt ured ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġcheck ClientException ( client Message , Ġmsg , ĠNo Method Found With Parameter Count Exception :: class ) ĊĠĠĠĠĠĠĠ Ġcheck Workflow Exception ( workflow Engine Message , Ġmsg , ĠNo Method Found With Parameter Count Exception :: class ) ĊĠĠĠĠĠĠĠ Ġtask Tag Messages . size ĠshouldBe Ġ 2 ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 0 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" foo ") ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 1 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" bar ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Should Ġthrow ĠToo Many Methods Found With Parameter Count Ġwhen Ġtrying Ġto Ġprocess Ġan Ġunknown Ġmethod Ġwithout Ġparameter Types " Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Executor . register Task (" task ") Ġ{ ĠSample Task Impl () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠarrayOf ( 2 , Ġ" 3 ") ĊĠĠĠĠĠĠĠ Ġ// Ġwith ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġget Execute Task (" handle ", Ġinput , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ Ġtask Executor . handle ( msg ) Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġtask Executor Message . is Capt ured ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġcheck ClientException ( client Message , Ġmsg , ĠToo Many Methods Found With Parameter Count Exception :: class ) ĊĠĠĠĠĠĠĠ Ġcheck Workflow Exception ( workflow Engine Message , Ġmsg , ĠToo Many Methods Found With Parameter Count Exception :: class ) ĊĠĠĠĠĠĠĠ Ġtask Tag Messages . size ĠshouldBe Ġ 2 ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 0 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" foo ") ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 1 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" bar ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Should Ġretry Ġwith Ġcorrect Ġexception " Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Executor . register Task (" task ") Ġ{ ĠSample Task With Retry () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠarrayOf ( 2 , Ġ" 3 ") ĊĠĠĠĠĠĠĠ Ġ// Ġwith ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġget Execute Task (" handle ", Ġinput , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ Ġtask Executor . handle ( msg ) Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġafter . captured ĠshouldBe ĠM illis Duration ( 3 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġexecute Task Ġ= Ġtask Executor Message . captured Ġas ĠExecute Task ĊĠĠĠĠĠĠĠ Ġexecute Task ĠshouldBe Ġmsg . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask Retry Index Ġ= Ġmsg . task Retry Index Ġ+ Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Error Ġ= ĠWorker Error . from ( client Name , ĠIllegalStateException ()). copy ( stack Trace ToString Ġ= Ġexecute Task . last Error !!. stack Trace ToString ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġclient Message . is Capt ured ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġworkflow Engine Message . is Capt ured ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġtask Tag Messages . size ĠshouldBe Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Should Ġthrow Ġwhen Ġget Retry Delay Ġthrow Ġan Ġexception " Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Executor . register Task (" task ") Ġ{ ĠSample Task With Bug gy Retry () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠarrayOf ( 2 , Ġ" 3 ") ĊĠĠĠĠĠĠĠ Ġ// Ġwith ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġget Execute Task (" handle ", Ġinput , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ Ġtask Executor . handle ( msg ) Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġtask Executor Message . is Capt ured ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġcheck ClientException ( client Message , Ġmsg , ĠIllegalArgumentException :: class ) ĊĠĠĠĠĠĠĠ Ġcheck Workflow Exception ( workflow Engine Message , Ġmsg , ĠIllegalArgumentException :: class ) ĊĠĠĠĠĠĠĠ Ġtask Tag Messages . size ĠshouldBe Ġ 2 ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 0 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" foo ") ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 1 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" bar ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Should Ġbe Ġable Ġto Ġaccess Ġcontext Ġfrom Ġtask " Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Executor . register Task (" task ") Ġ{ ĠSample Task WithContext () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠarrayOf ( 2 , Ġ" 3 ") ĊĠĠĠĠĠĠĠ Ġ// Ġwith ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġget Execute Task (" handle ", Ġinput , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ Ġtask Executor . handle ( msg ) Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġtask Executor Message . is Capt ured ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġclient Message . captured ĠshouldBe Ġget Task Completed Client ( msg , Ġ" 7 2 ") ĊĠĠĠĠĠĠĠ Ġworkflow Engine Message . captured ĠshouldBe Ġget Task Completed Workflow ( msg , Ġ" 7 2 ") ĊĠĠĠĠĠĠĠ Ġtask Tag Messages . size ĠshouldBe Ġ 2 ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 0 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" foo ") ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 1 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" bar ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Should Ġthrow ĠProcessing Timeout Ġif Ġprocessing Ġtime Ġis Ġtoo Ġlong " Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Executor . register Task (" task ") Ġ{ ĠSample Task WithTimeout () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠarrayOf ( 2 , Ġ" 3 ") ĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= ĠlistOf ( Int :: class . java . name , ĠString :: class . java . name ) ĊĠĠĠĠĠĠĠ Ġ// Ġwith ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġget Execute Task (" handle ", Ġinput , Ġtypes ) ĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ Ġtask Executor . handle ( msg ) Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġtask Executor Message . is Capt ured ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġcheck ClientException ( client Message , Ġmsg , ĠMax Run Duration Exception :: class ) ĊĠĠĠĠĠĠĠ Ġcheck Workflow Exception ( workflow Engine Message , Ġmsg , ĠMax Run Duration Exception :: class ) ĊĠĠĠĠĠĠĠ Ġtask Tag Messages . size ĠshouldBe Ġ 2 ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 0 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" foo ") ĊĠĠĠĠĠĠĠ Ġtask Tag Messages [ 1 ] ĠshouldBe Ġget Remove Tag ( msg , Ġ" bar ") ĊĠĠĠ Ġ} Ċ }) Ċ Ċ private Ġfun Ġmock Send To Task Executor ( message : ĠCapt uring Slot < Task Executor Message >, Ġdelay : ĠCapt uring Slot < Millis Duration >): ĠSend To Task Executor After Ġ{ ĊĠĠĠ Ġval Ġsend To Task Executor After Ġ= Ġmock k < Send To Task Executor After >() ĊĠĠĠ Ġco Every Ġ{ Ġsend To Task Executor After ( capture ( message ), Ġcapture ( delay )) Ġ} Ġjust ĠRuns ĊĊĠĠĠ Ġreturn Ġsend To Task Executor After Ċ } Ċ Ċ private Ġfun Ġmock Send To Task Tag ( message : ĠCopy On Write ArrayList < Task Tag Message >): ĠSend To Task Tag Ġ{ ĊĠĠĠ Ġval Ġsend To Task Tag Ġ= Ġmock k < Send To Task Tag >() ĊĠĠĠ Ġco Every Ġ{ Ġsend To Task Tag ( capture ( message )) Ġ} Ġjust ĠRuns ĊĊĠĠĠ Ġreturn Ġsend To Task Tag Ċ } Ċ Ċ private Ġfun Ġmock Send To Client ( message : ĠCapt uring Slot < Client Message >): ĠSend To Client Ġ{ ĊĠĠĠ Ġval Ġsend To Client Ġ= Ġmock k < Send To Client >() ĊĠĠĠ Ġco Every Ġ{ Ġsend To Client ( capture ( message )) Ġ} Ġjust ĠRuns ĊĊĠĠĠ Ġreturn Ġsend To Client Ċ } Ċ Ċ private Ġfun Ġmock Send To Workflow Engine ( message : ĠCapt uring Slot < Workflow Engine Message >): ĠSend To Workflow Engine Ġ{ ĊĠĠĠ Ġval Ġsend To Workflow Engine Ġ= Ġmock k < Send To Workflow Engine >() ĊĠĠĠ Ġco Every Ġ{ Ġsend To Workflow Engine ( capture ( message )) Ġ} Ġjust ĠRuns ĊĊĠĠĠ Ġreturn Ġsend To Workflow Engine Ċ } Ċ Ċ private Ġfun Ġget Task Completed Client ( msg : ĠExecute Task , ĠreturnValue : ĠAny ?) Ġ= ĠTask Completed Client ( ĊĠĠĠ Ġrecipient Name Ġ= Ġmsg . emitter Name , ĊĠĠĠ ĠtaskId Ġ= Ġmsg . taskId , ĊĠĠĠ Ġtask ReturnValue Ġ= ĠReturn Value . from ( returnValue ), ĊĠĠĠ Ġtask Meta Ġ= Ġmsg . task Meta , ĊĠĠĠ Ġemitter Name Ġ= Ġclient Name Ċ ) Ċ Ċ private Ġfun Ġget Task Completed Workflow ( msg : ĠExecute Task , ĠreturnValue : ĠAny ?) Ġ= ĠTask Completed Workflow ( ĊĠĠĠ Ġworkflow Name Ġ= Ġmsg . workflow Name !! , ĊĠĠĠ Ġworkflow Id Ġ= Ġmsg . workflow Id !! , ĊĠĠĠ Ġmethod Run Id Ġ= Ġmsg . method Run Id !! , ĊĠĠĠ Ġtask ReturnValue Ġ= ĠTask ReturnValue ( msg . taskId , Ġmsg . task Name , Ġmsg . task Meta , ĠReturn Value . from ( returnValue )), ĊĠĠĠ Ġemitter Name Ġ= Ġclient Name Ċ ) Ċ Ċ private Ġfun Ġget Execute Task ( method : ĠString , Ġinput : ĠArray < out ĠAny ? >, Ġtypes : ĠList < String > ?) Ġ= ĠExecute Task ( ĊĠĠĠ Ġclient Waiting Ġ= Ġtrue , ĊĠĠĠ Ġtask Name Ġ= ĠTask Name (" task "), ĊĠĠĠ ĠtaskId Ġ= ĠTask Id (), ĊĠĠĠ Ġworkflow Id Ġ= ĠWorkflow Id (), ĊĠĠĠ Ġworkflow Name Ġ= ĠWorkflow Name (" workflow Name "), ĊĠĠĠ Ġmethod Run Id Ġ= ĠMethod Run Id (), ĊĠĠĠ Ġtask Retry Sequence Ġ= ĠTask Retry Sequence ( 1 2 ), ĊĠĠĠ Ġtask Retry Index Ġ= ĠTask Retry Index ( 7 ), ĊĠĠĠ Ġlast Error Ġ= Ġnull , ĊĠĠĠ ĠmethodName Ġ= ĠMethod Name ( method ), ĊĠĠĠ Ġmethod Parameter Types Ġ= Ġtypes ?. let Ġ{ ĠMethod Parameter Types ( it ) Ġ}, ĊĠĠĠ Ġmethod Parameters Ġ= ĠMethod Parameters . from (* input ), ĊĠĠĠ Ġtask Options Ġ= ĠTask Options ( max Run Duration Ġ= ĠDuration . of Millis ( 2 0 0 )), ĊĠĠĠ Ġtask Tags Ġ= Ġset Of ( Task Tag (" foo "), ĠTask Tag (" bar ")), ĊĠĠĠ Ġtask Meta Ġ= ĠTask Meta (), ĊĠĠĠ Ġemitter Name Ġ= Ġclient Name Ċ ) Ċ Ċ private Ġfun Ġcheck ClientException ( client Message : ĠCapt uring Slot < Client Message >, Ġmsg : ĠExecute Task , Ġexception : ĠK Class < out ĠException >) Ġ= ĊĠĠĠ Ġwith ( client Message . captured Ġas ĠTask Failed Client ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrecipient Name ĠshouldBe Ġmsg . emitter Name ĊĠĠĠĠĠĠĠ Ġemitter Name ĠshouldBe Ġclient Name ĊĠĠĠĠĠĠĠ ĠtaskId ĠshouldBe Ġmsg . taskId ĊĠĠĠĠĠĠĠ Ġwith ( cause ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworker Name ĠshouldBe Ġclient Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname ĠshouldBe Ġexception . java . name ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ private Ġfun Ġcheck Workflow Exception ( workflow Message : ĠCapt uring Slot < Workflow Engine Message >, Ġmsg : ĠExecute Task , Ġexception : ĠK Class < out ĠException >) Ġ= ĊĠĠĠ Ġwith ( workflow Message . captured Ġas ĠTask Failed Workflow ) Ġ{ ĊĠĠĠĠĠĠĠ Ġemitter Name ĠshouldBe Ġclient Name ĊĠĠĠĠĠĠĠ Ġworkflow Id ĠshouldBe Ġmsg . workflow Id ĊĠĠĠĠĠĠĠ Ġworkflow Name ĠshouldBe Ġmsg . workflow Name ĊĠĠĠĠĠĠĠ Ġmethod Run Id ĠshouldBe Ġmsg . method Run Id ĊĠĠĠĠĠĠĠ Ġwith ( failed Task Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask Name ĠshouldBe Ġmsg . task Name ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtaskId ĠshouldBe Ġmsg . taskId ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmethodName ĠshouldBe Ġmsg . methodName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( cause ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworker Name ĠshouldBe Ġclient Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname ĠshouldBe Ġexception . java . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdeferred Error ĠshouldBe Ġnull ĊĠĠĠ Ġ} Ċ Ċ private Ġfun Ġget Remove Tag ( message : ĠExecute Task , Ġtag : ĠString ) Ġ= ĠRemove Tag From Task ( ĊĠĠĠ ĠtaskId Ġ= Ġmessage . taskId , ĊĠĠĠ Ġtask Name Ġ= Ġmessage . task Name , ĊĠĠĠ Ġtask Tag Ġ= ĠTask Tag ( tag ), ĊĠĠĠ Ġemitter Name Ġ= Ġclient Name Ċ ) Ċ