package Ġnet . cord a . node . driver Ċ Ċ import Ġnet . cord a . core . div Ċ import Ġnet . cord a . core . get OrThrow Ċ import Ġnet . cord a . core . list Ċ import Ġnet . cord a . core . node . NodeInfo Ċ import Ġnet . cord a . core . node . services . Service Info Ċ import Ġnet . cord a . core . read Lines Ċ import Ġnet . cord a . node . LOG S _ DIRECTORY _ NAME Ċ import Ġnet . cord a . node . services . api . Reg ulator Service Ċ import Ġnet . cord a . node . services . transactions . Simple Not ary Service Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġnet . cord a . node api . Art emis Messaging Component Ċ import Ġorg . junit . Test Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . Scheduled ExecutorService Ċ Ċ class ĠDriver Tests Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠexecutorService : ĠScheduled ExecutorService Ġ= ĠExec utors . new Scheduled ThreadPool ( 2 ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġnode Must Be Up ( node Info : ĠNode Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhost And Port Ġ= ĠArt emis Messaging Component . to Host And Port ( node Info . address ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġthe Ġport Ġis Ġbound ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Must Be Bound ( executor Service , Ġhost And Port ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġnode Must Be Down ( node Info : ĠNode Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhost And Port Ġ= ĠArt emis Messaging Component . to Host And Port ( node Info . address ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġthe Ġport Ġis Ġbound ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Must Not Be Bound ( executor Service , Ġhost And Port ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` simple Ġnode Ġstartup Ġand Ġshutdown `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( not ary , Ġreg ulator ) Ġ= Ġdriver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnot ary Ġ= Ġstart Node (" Test Not ary ", Ġset Of ( Service Info ( Simple Not ary Service . type ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreg ulator Ġ= Ġstart Node (" Reg ulator ", Ġset Of ( Service Info ( Reg ulator Service . type ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Must Be Up ( not ary . get OrThrow (). node Info ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Must Be Up ( reg ulator . get OrThrow (). node Info ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( not ary . get OrThrow (), Ġreg ulator . get OrThrow ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnode Must Be Down ( not ary . node Info ) ĊĠĠĠĠĠĠĠ Ġnode Must Be Down ( reg ulator . node Info ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` starting Ġnode Ġwith Ġno Ġservices `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġno Service Ġ= Ġdriver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno Service Ġ= Ġstart Node (" No Service ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Must Be Up ( no Service . get OrThrow (). node Info ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġno Service . get OrThrow () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnode Must Be Down ( no Service . node Info ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` random Ġfree Ġport Ġallocation `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Handle Ġ= Ġdriver ( port Allocation Ġ= ĠPort Allocation . Random Free ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Info Ġ= Ġstart Node (" No Service ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Must Be Up ( node Info . get OrThrow (). node Info ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Info . get OrThrow () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnode Must Be Down ( node Handle . node Info ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` debug Ġmode Ġenables Ġdebug Ġlogging Ġlevel `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġwe 're Ġusing Ġthe Ġlog 4 j 2 Ġconfig Ġwhich Ġwrites Ġto Ġthe Ġlog Ġfile ĊĠĠĠĠĠĠĠ Ġval Ġlog ConfigFile Ġ= ĠPaths . get (" .. ", Ġ" config ", Ġ" dev ", Ġ" log 4 j 2 . xml "). to AbsolutePath () ĊĠĠĠĠĠĠĠ ĠassertThat ( log ConfigFile ). is Regular File () ĊĠĠĠĠĠĠĠ Ġdriver ( isDebug Ġ= Ġtrue , Ġsystem Properties Ġ= Ġmap Of (" log 4 j . configuration File " Ġto Ġlog ConfigFile . toString ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Directory Ġ= Ġstart Node (" Alice "). get OrThrow (). configuration . base Directory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlog File Ġ= Ġ( base Directory Ġ/ ĠLOG S _ DIRECTORY _ NAME ). list Ġ{ Ġit . sorted (). findFirst (). get () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdebug Lines Present Ġ= Ġlog File . read Lines Ġ{ Ġlines Ġ-> Ġlines . any Match Ġ{ Ġline Ġ-> Ġline . startsWith ("[ DEBUG ]") Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( debug Lines Present ). isTrue () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ