package Ġcom . go j uno . sw ar mer Ċ Ċ import Ġcom . go j uno . command er . android . A db Device Ċ import Ġcom . go j uno . command er . android . adb Ċ import Ġcom . go j uno . command er . os . Notification Ċ import Ġcom . n ha ar man . mockito _ kotlin . any Ċ import Ġcom . n ha ar man . mockito _ kotlin . argument Captor Ċ import Ġcom . n ha ar man . mockito _ kotlin . mock Ċ import Ġcom . n ha ar man . mockito _ kotlin . verify Ċ import Ġcom . n ha ar man . mockito _ kotlin . wh enever Ċ import Ġorg . jetbrains . spe k . api . Spe k Ċ import Ġorg . jetbrains . spe k . api . dsl . describe Ċ import Ġorg . jetbrains . spe k . api . dsl . it Ċ import Ġrx . Comp letable Ċ import Ġrx . Observable Ċ import Ġrx . Single Ċ import Ġjava . io . File Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠE mul ators Spec Ġ: ĠSpe k ({ ĊĊĠĠĠ Ġval ĠA DB _ DEVICES Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA db Device (" id 1 ", Ġonline Ġ= Ġtrue ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA db Device (" id 2 ", Ġonline Ġ= Ġtrue ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA db Device (" id 3 ", Ġonline Ġ= Ġtrue ) ĊĠĠĠ Ġ) ĊĊĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommands . Stop (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommands . Stop ( timeout Seconds Ġ= Ġ 1 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommands . Stop ( timeout Seconds Ġ= Ġ 0 ) ĊĠĠĠ Ġ). forEach Ġ{ Ġcommand Ġ-> ĊĠĠĠĠĠĠĠ Ġdescribe (" emulator Ġstop Ġcalled Ġwith Ġtimeout Ġ${ command . timeout Seconds }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnected E mul ators Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠSingle . just ( AD B _ DEVICES ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Process Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock <( List < String >, ĠPair < Int , ĠTimeUnit > ?) Ġ-> ĠComp letable >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( invoke ( any (), Ġany ())). thenReturn ( Comp letable . complete ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠbeforeEach Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop All E mul ators ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnected E mul ators Ġ= Ġconnected E mul ators , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomplet able Process Ġ= Ġstart Process ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠA DB _ DEVICES . forEach Ġ{ Ġdevice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġcall Ġstop Ġcommand Ġfor Ġemulator Ġ${ device . id }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( start Process ). invoke ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( adb , Ġ"- s ", Ġdevice . id , Ġ" emu ", Ġ" kill "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . timeout Seconds Ġto ĠTimeUnit . SECONDS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠSTART _ COMMAND S Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommands . Start ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemulator Name Ġ= Ġ" emulator _ 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpak age Ġ= Ġ" system - images ; android - 2 5 ; google _ apis ; x 8 6 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid Ab i Ġ= Ġ" google _ apis / x 8 6 _ 6 4 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath To Config Ini Ġ= Ġ" config . ini ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemulator Start Options Ġ= ĠlistOf ("-- no - window "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemulator Start Timeout Seconds Ġ= Ġ 4 5 L , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġredirect Output To Ġ= Ġ" output - dir ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverbose Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeep Output On Exit Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommands . Start ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemulator Name Ġ= Ġ" emulator _ 2 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpak age Ġ= Ġ" system - images ; android - 2 5 ; google _ apis ; x 8 6 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid Ab i Ġ= Ġ" google _ apis / x 8 6 _ 6 4 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath To Config Ini Ġ= Ġ" config 2 . ini ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemulator Start Options Ġ= ĠlistOf ("-- no - window "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemulator Start Timeout Seconds Ġ= Ġ 4 5 L , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġredirect Output To Ġ= Ġ" output - dir ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverbose Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommands . Start ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemulator Name Ġ= Ġ" emulator _ 3 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpak age Ġ= Ġ" system - images ; android - 2 5 ; google _ apis ; x 8 6 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid Ab i Ġ= Ġ" google _ apis / x 8 6 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath To Config Ini Ġ= Ġ" config 3 . ini ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemulator Start Options Ġ= ĠlistOf ("-- no - window Ġ-- some Ġoption "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemulator Start Timeout Seconds Ġ= Ġ 6 0 L , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverbose Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeep Output On Exit Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval ĠE MUL ATOR _ PORTS Ġ= ĠPair ( 1 2 , Ġ 3 4 ) ĊĊĠĠĠ Ġdescribe (" start Ġem ulators Ġcommand Ġcalled ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconnected A db Devices Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠObservable . just ( empty Set < A db Device >()) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠoutputFile Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ("") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprocess Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock < Process >() ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcreate Av d Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock <( Commands . Start ) Ġ-> ĠObservable < Unit >> (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( invoke ( any ())). thenReturn ( Observable . just ( Unit )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġapply Config Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock <( Commands . Start ) Ġ-> ĠObservable < Unit >> (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( invoke ( any ())). thenReturn ( Observable . just ( Unit )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġemulator Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock <( Commands . Start ) Ġ-> ĠString >(). apply Ġ{ Ġwhenever ( invoke ( any ())). thenReturn ("/ path / to / emulator / binary ") Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstart E mul ators Process Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock <( List < String >, ĠCommands . Start ) Ġ-> ĠObservable < Notification >> (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( invoke ( any (), Ġany ())). thenReturn ( Observable . just ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification . Start ( process , ĠoutputFile ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification . Exit ( outputFile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠwaitFor Em ulator To Start Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand Captor Ġ= Ġargument Captor < Commands . Start >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock <( Commands . Start , Ġ() Ġ-> ĠObservable < Set < A db Device >>, ĠObservable < Notification >, ĠPair < Int , ĠInt >) Ġ-> ĠObservable < Em ulator >> (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( invoke ( command Captor . capture (), Ġany (), Ġany (), Ġany ())). then Answer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEm ulator (" emulator -${ EM UL ATOR _ PORTS . first }", Ġcommand Captor . first Value . emulator Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠwaitFor Em ulator To Finish Boot Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġemulator Captor Ġ= Ġargument Captor < Em ulator >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock <( Em ulator , ĠCommands . Start ) Ġ-> ĠObservable < Em ulator >> (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( invoke ( emulator Captor . capture (), Ġany ())). then Answer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( emulator Captor . first Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfind Available Ports For New Em ulator Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock < () Ġ-> ĠObservable < Pair < Int , ĠInt >>> (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( invoke ()). thenReturn ( Observable . just ( EM UL ATOR _ PORTS )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠbeforeEach Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart E mul ators ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargs Ġ= ĠSTART _ COMMAND S , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnected A db Devices Ġ= Ġconnected A db Devices , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Av d Ġ= Ġcreate Av d , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply Config Ġ= Ġapply Config , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemulator Ġ= Ġemulator , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Em ulator Process Ġ= Ġstart E mul ators Process , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwaitFor Em ulator To Start Ġ= ĠwaitFor Em ulator To Start , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Available Ports For New Em ulator Ġ= Ġfind Available Ports For New Em ulator , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwaitFor Em ulator To Finish Boot Ġ= ĠwaitFor Em ulator To Finish Boot ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠSTART _ COMMAND S . forEach Ġ{ Ġcommand Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġstart Ġem ulators ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( start E mul ators Process ). invoke ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ bin / sh ", Ġ"- c ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ emulator ( command )} Ġ${ if Ġ( command . verbose ) Ġ"- verbose " Ġelse Ġ"" } Ġ- av d Ġ${ command . emulator Name } Ġ- ports Ġ${ EM UL ATOR _ PORTS . first }, ${ EM UL ATOR _ PORTS . second } Ġ${ command . emulator Start Options . join ToString (" Ġ" )} Ġ& " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ })