package Ġeu . j rie . jetbrains . kotlin s hel lex t ension . shell . pip ing Ċ Ċ import Ġeu . j rie . jetbrains . kotlin s hel lex t ension . processes . process . Process State Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . delay Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . Assertions . assertNot Equals Ċ import Ġorg . junit . jupiter . api . Test Ċ Ċ @ Experimental Cor outines Api Ċ class ĠP ip ing Synchron izing IntegrationTest Ġ: ĠP ip ing Base IntegrationTest () Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġsus pending Ġexecute Ġpipeline `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġval Ġstates After Execution Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġshell Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpipeline Ġ= Ġpipeline Ġ{ Ġ" echo Ġabc ". process () Ġpipe Ġ" grep Ġabc ". process () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . processes . forEach Ġ{ Ġstates After Execution . add ( it . pcb . state . name ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġstates After Execution . forEach Ġ{ ĠassertEquals ( Process State . TERMIN ATED . name , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġdetach Ġpipeline `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġval Ġstates After Detach Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġshell Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlambda Ġ= Ġcontext Lambda Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( 5 0 ) Ġ{ Ġctx . stdout . send ( packet ("$ it \ n ")) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpipeline Ġ= Ġdetach Ġ{ Ġlambda Ġpipe Ġ" grep Ġ 2 9 ". process () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . processes . forEach Ġ{ Ġstates After Detach . add ( it . pcb . state . name ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġstates After Detach . forEach Ġ{ Ġassert Not Equals ( Process State . TERMIN ATED . name , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġawait Ġpipeline `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġval Ġstates After Detach Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġval Ġstates After Await Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġshell Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlambda Ġ= Ġcontext Lambda Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( 1 5 0 ) Ġ{ Ġctx . stdout . send ( packet ("$ it \ n ")) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpipeline Ġ= Ġdetach Ġ{ Ġlambda Ġpipe Ġ" grep Ġ 9 9 ". process () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . processes . forEach Ġ{ Ġstates After Detach . add ( it . pcb . state . name ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . join () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . processes . forEach Ġ{ Ġstates After Await . add ( it . pcb . state . name ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġstates After Detach . forEach Ġ{ Ġassert Not Equals ( Process State . TERMIN ATED . name , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġstates After Await . forEach Ġ{ ĠassertEquals ( Process State . TERMIN ATED . name , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġkill Ġpipeline `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġval Ġstates After Detach Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġval Ġstates After Kill Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġshell Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlambda Ġ= Ġcontext Lambda Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( 1 5 0 ) Ġ{ Ġctx . stdout . send ( packet ("$ it \ n ")) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpipeline Ġ= Ġdetach Ġ{ Ġlambda Ġpipe Ġ" grep Ġ 9 9 ". process () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . processes . forEach Ġ{ Ġstates After Detach . add ( it . pcb . state . name ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . kill () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . processes . forEach Ġ{ Ġstates After Kill . add ( it . pcb . state . name ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġstates After Detach . forEach Ġ{ Ġassert Not Equals ( Process State . TERMIN ATED . name , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġstates After Kill . forEach Ġ{ ĠassertEquals ( Process State . TERMIN ATED . name , Ġit ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ