package Ġf tl . run . model Ċ Ċ import Ġcom . google . api . services . testing . model . Environment Ċ import Ġcom . google . api . services . testing . model . Test Details Ċ import Ġcom . google . api . services . testing . model . Test Execution Ċ import Ġcom . google . api . services . testing . model . Test Matrix Ċ import Ġf tl . util . Matrix State Ċ import Ġf tl . util . Stop Watch Ċ import Ġf tl . util . Stop Watch Matrix Ċ Ċ class ĠRunning Device ( private Ġval Ġstop watch : ĠStop Watch , Ġval Ġid : ĠString ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġlast State Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar Ġlast Error Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar Ġprogress Ġ= ĠlistOf < String >() ĊĠĠĠ Ġprivate Ġvar Ġlast Progress Len Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġcomplete Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġfun Ġdevice ( test Execution : ĠTest Execution ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġenv : ĠEnvironment ? Ġ= Ġtest Execution . environment ĊĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= Ġenv ?. android Device ?. android Model Id Ġ?: Ġenv ?. ios Device ?. ios Model Id ĊĠĠĠĠĠĠĠ Ġval Ġdevice Version Ġ= Ġenv ?. android Device ?. android Version Id Ġ?: Ġenv ?. ios Device ?. ios Version Id ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ device -$ device Version " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpoll ( matrix : ĠTest Matrix ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtest Execution Ġ= Ġmatrix . test Execution s . single Ġ{ Ġit . id Ġ== Ġid Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġwatch Ġ= ĠStop Watch Matrix ( stop watch , Ġ"${ test Execution . matrix Id } Ġ${ device ( test Execution )} ") ĊĠĠĠĠĠĠĠ Ġval Ġdetails : ĠTest Details ? Ġ= Ġtest Execution . test Details ĊĊĠĠĠĠĠĠĠ Ġif Ġ( details Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠError Ġmessage Ġis Ġnever Ġreset . ĠTrack Ġlast Ġerror Ġto Ġonly Ġprint Ġnew Ġmessages . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠerrorMessage Ġ= Ġdetails . errorMessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ!= Ġlast Error ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote : ĠAfter Ġan Ġerror Ġ( infrastructure Ġfailure ), ĠF TL Ġwill Ġretry Ġ 3 x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Error Ġ= ĠerrorMessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwatch . puts (" Error : Ġ$ last Error ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= Ġdetails . progress Messages Ġ?: Ġprogress ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġnum - fl aky - test - attempts Ġrestart s Ġprogress Ġarray Ġat Ġsize Ġ 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( last Progress Len Ġ> Ġprogress . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Progress Len Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠProgress Ġcontains Ġall Ġmessages . Ġonly Ġprint Ġnew Ġupdates ĊĠĠĠĠĠĠĠ Ġfor Ġ( msg Ġin Ġprogress . list Iterator ( last Progress Len )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwatch . puts ( msg ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlast Progress Len Ġ= Ġprogress . size ĊĊĠĠĠĠĠĠĠ Ġif Ġ( test Execution . state Ġ!= Ġlast State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast State Ġ= Ġtest Execution . state ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwatch . puts ( last State ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Matrix State . completed ( test Execution . state )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomplete Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠRunning Devices ( stop watch : ĠStop Watch , Ġtest Execution s : ĠList < Test Execution >) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdevices Ġ= Ġtest Execution s . map Ġ{ ĠRunning Device ( stop watch , Ġit . id ) Ġ} ĊĊĠĠĠ Ġfun Ġall Running (): ĠList < Running Device > Ġ= Ġdevices . filter Ġ{ Ġit . complete . not () Ġ} ĊĊĠĠĠ Ġfun Ġall Complete (): ĠBoolean Ġ= Ġdevices . all Ġ{ Ġit . complete Ġ} Ċ } Ċ