/** Ċ Copyright Ġ 2 0 1 9 ĠBar D ĠSoftware Ġs . r . o Ċ Ċ Licensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ you Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ You Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ċ http :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Unless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ distributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ WITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ See Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ limitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . b ard software . p ape eria . backend Ċ Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . Assertions . assertNot Equals Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . io . String Writer Ċ Ċ /** Ċ Ġ* Ġ@ author Ġd bar as he v @ b ard software . com Ċ Ġ*/ Ċ class ĠExecute Stage Test Ġ{ ĊĠ Ġ@ Test ĊĠ Ġfun Ġ` command Ġcompletes Ġsuccessfully `() Ġ{ ĊĠĠĠ Ġval Ġtmp Dir Ġ= Ġcreate TempDir () ĊĠĠĠ Ġval Ġexecute Stage Ġ= ĠExecute Stage () ĊĠĠĠ Ġval Ġexecute Task Ġ= ĠExecute Task ( tmp Dir . to Path (), ĠlistOf (" echo ", Ġ" Hello ĠWorld ")) ĊĠĠĠ Ġval Ġchannel Ġ= ĠChannel < Long >() ĊĠĠĠ Ġval Ġout Writer Ġ= ĠString Writer () ĊĠĠĠ Ġval Ġout Ġ= ĠJo ined Output ( PrintWriter ( out Writer )) ĊĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠ Ġexecute Stage . process ( execute Task , Ġchannel , Ġout ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠ ĠassertEquals ( 0 , Ġchannel . receive ()) ĊĠĠĠĠĠ Ġ// Ġstdout Ġand Ġstderr Ġare Ġprocessed Ġasynchronously , Ġso Ġwe Ġneed Ġto Ġwait Ġuntil Ġthey Ġare Ġdone ĊĠĠĠĠĠ Ġout . onClose (). get () ĊĠĠĠĠĠ ĠassertEquals (" Hello ĠWorld \ n ", Ġout Writer . toString ()) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` command Ġfails `() Ġ{ ĊĠĠĠ Ġval Ġtmp Dir Ġ= Ġcreate TempDir () ĊĠĠĠ Ġval Ġexecute Stage Ġ= ĠExecute Stage () ĊĠĠĠ Ġval Ġexecute Task Ġ= ĠExecute Task ( tmp Dir . to Path (), ĠlistOf (" false ")) ĊĠĠĠ Ġval Ġchannel Ġ= ĠChannel < Long >() ĊĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠ Ġexecute Stage . process ( execute Task , Ġchannel , ĠConsole Output ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠ Ġassert Not Equals ( 0 , Ġchannel . receive ()) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` read Ġmixed Ġoutput `() Ġ{ ĊĠĠĠ Ġval Ġtmp Dir Ġ= Ġcreate TempDir () ĊĠĠĠ Ġval Ġexecute Stage Ġ= ĠExecute Stage () ĊĠĠĠ Ġ// ĠThis Ġcommand Ġprints Ġone Ġline Ġto Ġstdout Ġand Ġone Ġline Ġto Ġstderr ĊĠĠĠ Ġval Ġexecute Task Ġ= ĠExecute Task ( tmp Dir . to Path (), ĠlistOf (" bash ", Ġ"- c ", Ġ" echo Ġ' Good ĠWorld ' Ġ&& Ġecho Ġ' Bad ĠWorld ' Ġ 1 >& 2 Ġ&& Ġfalse ")) ĊĠĠĠ Ġval Ġchannel Ġ= ĠChannel < Long >() ĊĠĠĠ Ġval Ġout Writer Ġ= ĠString Writer () ĊĠĠĠ Ġval Ġout Ġ= ĠJo ined Output ( PrintWriter ( out Writer )) ĊĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠ Ġexecute Stage . process ( execute Task , Ġchannel , Ġout ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠ Ġassert Not Equals ( 0 , Ġchannel . receive ()) ĊĠĠĠĠĠ Ġ// Ġstdout Ġand Ġstderr Ġare Ġprocessed Ġasynchronously , Ġso Ġwe Ġneed Ġto Ġwait Ġuntil Ġthey Ġare Ġdone ĊĠĠĠĠĠ Ġout . onClose (). get () ĊĠĠĠĠĠ Ġ// ĠMore over , Ġtheir Ġlines Ġcome Ġnot Ġnecessarily Ġin Ġthe Ġsame Ġorder ĊĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠ Ġset Of (" Good ĠWorld ", Ġ" Bad ĠWorld "), ĊĠĠĠĠĠĠĠĠĠ Ġout Writer . toString (). split ("\ n "). filter Ġ{ Ġit Ġ!= Ġ"" Ġ}. map Ġ{ Ġit . trim () Ġ}. toSet () ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ