package Ġcom . av ito . android . test . report Ċ Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġandroidx . test . espress o . Esp ress o Exception Ċ import Ġcom . av ito . android . test . report . incident . App Crash Incident Presenter Ċ import Ġcom . av ito . android . test . report . incident . Fallback Incident Presenter Ċ import Ġcom . av ito . android . test . report . incident . Incident Chain Factory Ċ import Ġcom . av ito . android . test . report . incident . Request Incident Presenter Ċ import Ġcom . av ito . android . test . report . incident . Resource Incident Presenter Ċ import Ġcom . av ito . android . test . report . incident . ResourceManager Incident Presenter Ċ import Ġcom . av ito . android . test . report . incident . TestCase Incident Presenter Ċ import Ġcom . av ito . android . test . report . listener . Precondition Lifecycle Listener Ċ import Ġcom . av ito . android . test . report . listener . Precondition Lifecycle Notifier Ċ import Ġcom . av ito . android . test . report . listener . Step Lifecycle Listener Ċ import Ġcom . av ito . android . test . report . listener . Step Lifecycle Notifier Ċ import Ġcom . av ito . android . test . report . listener . Test Lifecycle Listener Ċ import Ġcom . av ito . android . test . report . listener . Test Lifecycle Notifier Ċ import Ġcom . av ito . android . test . report . model . Step Result Ċ import Ġcom . av ito . android . test . report . model . Test Metadata Ċ import Ġcom . av ito . android . test . report . screenshot . Screenshot Capt urer Impl Ċ import Ġcom . av ito . android . test . report . screenshot . Screenshot Uploader Ċ import Ġcom . av ito . android . test . report . screenshot . Screenshot Uploader Impl Ċ import Ġcom . av ito . android . test . report . transport . Transport Ċ import Ġcom . av ito . android . test . report . troubleshooting . Tro uble sh ooter Ċ import Ġcom . av ito . android . util . format StackTrace Ċ import Ġcom . av ito . file storage . Future Value Ċ import Ġcom . av ito . file storage . Remote Storage Ċ import Ġcom . av ito . logger . LoggerFactory Ċ import Ġcom . av ito . logger . create Ċ import Ġcom . av ito . report . model . Entry Ċ import Ġcom . av ito . report . model . Incident Ċ import Ġcom . av ito . time . Time Provider Ċ import Ġjava . io . File Ċ Ċ /** Ċ Ġ* ĠAssume Ġno Ġparalle liz ation Ċ Ġ* ĠAssume Ġsingle Ġtest Ġper Ġobject Ċ Ġ* Ċ Ġ* Ġ@ param Ġon Device Cache Directory ĠÐ´Ð»Ñı ĠÐ² ÑģÑı ÐºÐ¸ Ñħ ĠÑģÐº ÑĢ Ð¸Ð½ ÑĪ Ð¾ÑĤ Ð¾Ð² , ĠÐ²Ð¸Ð´ Ðµ Ð¾ , ĠÐ» Ð¾Ð³ Ð¾Ð² Ċ Ġ*/ Ċ class ĠReport Implementation ( ĊĠĠĠ Ġon Device Cache Directory : ĠLazy < File >, ĊĠĠĠ Ġprivate Ġval Ġlogger Factory : ĠLoggerFactory , ĊĠĠĠ Ġprivate Ġval Ġtransport : ĠList < Transport >, ĊĠĠĠ Ġprivate Ġval Ġremote Storage : ĠRemote Storage , ĊĠĠĠ Ġprivate Ġval Ġscreenshot Uploader : ĠScreen shot Uploader Ġ= ĠScreen shot Uploader Impl ( ĊĠĠĠĠĠĠĠ Ġscreenshot Capt urer Ġ= ĠScreen shot Capt urer Impl ( on Device Cache Directory ), ĊĠĠĠĠĠĠĠ Ġremote Storage Ġ= Ġremote Storage , ĊĠĠĠĠĠĠĠ Ġlogger Factory Ġ= Ġlogger Factory ĊĠĠĠ Ġ), ĊĠĠĠ Ġprivate Ġval Ġtime Provider : ĠTime Provider , ĊĠĠĠ Ġprivate Ġval Ġtrouble sh ooter : ĠTro uble sh ooter Ġ= ĠTro uble sh ooter . Impl Ċ ) Ġ: ĠReport , ĊĠĠĠ ĠStep Lifecycle Listener Ġby ĠStep Lifecycle Notifier , ĊĠĠĠ ĠTest Lifecycle Listener Ġby ĠTest Lifecycle Notifier , ĊĠĠĠ ĠPre condition Lifecycle Listener Ġby ĠPre condition Lifecycle Notifier Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= Ġlogger Factory . create < Report >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEnt ries Ġthat Ġoccurred Ġbefore Ġfirst Ġstep / pre condition ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġearly Entries Ġ= Ġmutable ListOf < Entry >() ĊĠĠĠ Ġprivate Ġval Ġearly F utures Upload s Ġ= Ġmutable ListOf < Future Value < Remote Storage . Result >>() ĊĊĠĠĠ Ġprivate Ġval Ġincident Future Upload s Ġ= Ġmutable ListOf < Future Value < Remote Storage . Result >>() ĊĊĠĠĠ Ġprivate Ġvar Ġstate : ĠReport State Ġ= ĠReport State . Nothing ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġval Ġcurrent State : ĠReport State ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstate ĊĊĠĠĠ Ġoverride Ġval Ġis First Step Or Precondition : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstate . is First Step Or Precondition ĊĊĠĠĠ Ġoverride Ġval Ġis Written : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcurrent State Ġis ĠReport State . Written ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġinit TestCase ( test Metadata : ĠTest Metadata ) Ġ= Ġmethod Execution Tracing (" init TestCase ") Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck State Is < Report State . Nothing >() ĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠReport State . Initialized . Not Started ( test Metadata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġstart TestCase (): ĠUnit Ġ= Ġmethod Execution Tracing (" start TestCase ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent State Ġ= Ġget Cast ed State < Report State . Initialized . Not Started >() ĊĊĠĠĠĠĠĠĠ Ġval Ġstarted Ġ= ĠReport State . Initialized . Started ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Metadata Ġ= Ġcurrent State . test Metadata , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Step Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġincident Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep Number Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre condition Number Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartTime Ġ= Ġtime Provider . now InSeconds () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġstate Ġ= Ġstarted ĊĠĠĠĠĠĠĠ Ġbefore Test Start ( started ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġupdate TestCase ( update : ĠReport State . Initialized . Started . () Ġ-> ĠUnit ): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġmethod Execution Tracing (" update TestCase ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent State Ġ= Ġget Cast ed State < Report State . Initialized . Started >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Test Update ( currentState ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( currentState ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter Test Update ( currentState ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġregister Incident ( ĊĠĠĠĠĠĠĠ Ġexception : ĠThrowable , ĊĠĠĠĠĠĠĠ Ġscreenshot : ĠFuture Value < Remote Storage . Result > ?, ĊĠĠĠ Ġ) Ġ= Ġmethod Execution Tracing (" register Incident ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent State Ġ= Ġget Cast ed State < Report State . Initialized >() ĊĊĠĠĠĠĠĠĠ Ġif Ġ( currentState . incident Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( screenshot Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincident Future Upload s . add ( screenshot ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġexception . determine Incident Type () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchain Factory Ġ= Ġcreate Incident Chain Factory () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġincident ToAdd Ġ= ĠInc ident ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchain Ġ= Ġchain Factory . to Chain ( exception ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= Ġtime Provider . now InSeconds (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry List Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace Ġ= Ġexception . format StackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Tro ubleshooting Entries () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State . incident Ġ= Ġincident ToAdd ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter Incident ( incident ToAdd ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Fail Ġto Ġregister Ġincident . ĠInc ident Ġalready Ġexist ", Ġexception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Incident Chain Factory () Ġ= ĠInc ident Chain Factory . Impl ( ĊĠĠĠĠĠĠĠ Ġcustom View Present ers Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTestCase Incident Presenter (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRequest Incident Presenter (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResource Incident Presenter (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResourceManager Incident Presenter (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp Crash Incident Presenter () ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġfallback Presenter Ġ= ĠF allback Incident Presenter () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġadd Tro ubleshooting Entries () Ġ{ ĊĠĠĠĠĠĠĠ Ġtrouble sh ooter . tro ubleshoot To ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġreport TestCase (): ĠReport State . Initialized . Started Ġ= ĊĠĠĠĠĠĠĠ Ġmethod Execution Tracing (" report TestCase ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstarted State Ġ= Ġget Cast ed State < Report State . Initialized . Started >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstarted State . endTime Ġ= Ġtime Provider . now InSeconds () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Test Stop ( started State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Failed Ġwhile Ġafter Test Stop Ġwere Ġexecuting ", Ġt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġearly Entries . addAll ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġearly F utures Upload s . get Initialized Entries () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstarted State . wait Upload s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstarted State . add Early Entries ( early Entries ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstarted State . sort Step Entries () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstarted State . incident ?. append Future Entries () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstarted State . write TestCase () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstarted State ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġstart Precondition ( step : ĠStep Result ): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġmethod Execution Tracing (" start Precondition ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent State Ġ= Ġget Cast ed State < Report State . Initialized . Started >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Step Ġ= Ġcurrent State . current Step ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( current Step Ġ== Ġnull Ġ|| Ġcurrent Step . is Synt hetic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Can 't Ġstart Ġpre condition Ġ\" ${ step . title }\" Ġwhen Ġanother Ġone Ġexists : Ġ\" ${ current Step ?. title }\" ." Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Preconditions Ġinside Ġsteps Ġare Ġnot Ġsupported ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State . current Step Ġ= Ġstep ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep . timestamp Ġ= Ġtime Provider . now InSeconds () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep . number Ġ= Ġcurrent State . pre condition Number ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Precondition Start ( step ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġstop Precondition (): ĠUnit Ġ= Ġmethod Execution Tracing (" stop Precondition ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent State Ġ= Ġget Cast ed State < Report State . Initialized . Started >() ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Step Ġ= Ġrequire NotNull ( currentState . current Step ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Can 't Ġstop Ġpre condition Ġbecause Ġit Ġisn 't Ġstarted " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent State . pre condition Step List . add ( current Step ) ĊĠĠĠĠĠĠĠ Ġafter Precondition Stop ( current Step ) ĊĠĠĠĠĠĠĠ Ġcurrent State . current Step Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġstart Step ( step : ĠStep Result ): ĠUnit Ġ= Ġmethod Execution Tracing (" start Step ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent State Ġ= Ġget Cast ed State < Report State . Initialized . Started >() ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Step Ġ= Ġcurrent State . current Step ĊĠĠĠĠĠĠĠ Ġrequire ( current Step Ġ== Ġnull Ġ|| Ġcurrent Step . is Synt hetic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Can 't Ġstart Ġstep Ġ\" ${ step . title }\" Ġwhen Ġanother Ġone Ġexists : Ġ\" ${ current Step ?. title }\" . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Nested Ġsteps Ġare Ġnot Ġsupported ." ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent State . current Step Ġ= Ġstep ĊĠĠĠĠĠĠĠ Ġstep . timestamp Ġ= Ġtime Provider . now InSeconds () ĊĠĠĠĠĠĠĠ Ġstep . number Ġ= Ġcurrent State . step Number ++ ĊĠĠĠĠĠĠĠ Ġbefore Step Start ( step ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġstop Step (): ĠUnit Ġ= Ġmethod Execution Tracing (" stop Step ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent State Ġ= Ġget Cast ed State < Report State . Initialized . Started >() ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Step Ġ= Ġrequire NotNull ( currentState . current Step ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Can 't Ġstop Ġstep Ġbecause Ġit Ġisn 't Ġstarted " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent State . testCase Step List . add ( current Step ) ĊĠĠĠĠĠĠĠ Ġafter Step Stop ( current Step ) ĊĠĠĠĠĠĠĠ Ġcurrent State . current Step Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Step ( update : ĠStep Result . () Ġ-> ĠUnit ): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġmethod Execution Tracing (" update Step ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent State Ġ= Ġget Cast ed State < Report State . Initialized . Started >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Step Ġ= Ġrequire NotNull ( currentState . current Step ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Couldn 't Ġupdate Ġstep Ġbecause Ġit Ġhasn 't Ġstarted Ġyet " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Step Update ( current Step ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Step . update () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter Step Update ( current Step ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġmake Screenshot ( comment : ĠString ): ĠFuture Value < Remote Storage . Result >? Ġ= ĊĠĠĠĠĠĠĠ Ġmethod Execution Tracing (" stop Step ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscreenshot Future Ġ= Ġscreenshot Uploader . make And Upload Screenshot ( comment ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( screenshot Future Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Step Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfuture Upload s . add ( screenshot Future ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Failed Ġto Ġupdate Ġstep Ġwith Ġcaptured Ġscreenshot ", Ġt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ method Execution Tracing Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreenshot Future ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġadd Html ( label : ĠString , Ġcontent : ĠString , Ġwrap Html : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwrapped Content IfNeeded Ġ= Ġif Ġ( wrap Html ) Ġwrap In Html ( content ) Ġelse Ġcontent ĊĠĠĠĠĠĠĠ Ġval Ġhtml Ġ= Ġremote Storage . upload ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload Request Ġ= ĠRemote Storage . Request . Content Request . Html ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġwrapped Content IfNeeded , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomment Ġ= Ġlabel ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġstarted Ġ= Ġget Cast ed State OrNull < Report State . Initialized . Started >() ĊĠĠĠĠĠĠĠ Ġval Ġfuture Upload s Ġ= Ġstarted ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . current Step Or Synt hetic () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . future Upload s Ġ?: Ġearly F utures Upload s ĊĠĠĠĠĠĠĠ Ġfuture Upload s . add ( html ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġadd Text ( label : ĠString , Ġtext : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtxt Ġ= Ġremote Storage . upload ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload Request Ġ= ĠRemote Storage . Request . Content Request . Plain Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġtext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomment Ġ= Ġlabel ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġstarted Ġ= Ġget Cast ed State OrNull < Report State . Initialized . Started >() ĊĠĠĠĠĠĠĠ Ġval Ġfuture Upload s Ġ= Ġstarted ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . current Step Or Synt hetic () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . future Upload s Ġ?: Ġearly F utures Upload s ĊĠĠĠĠĠĠĠ Ġfuture Upload s . add ( txt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġadd Comment ( comment : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Entry ( Entry . Comment ( comment , Ġtime Provider . now InSeconds ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġadd Assertion ( assertion Message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Entry ( Entry . Check ( assertion Message , Ġtime Provider . now InSeconds ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Entry ( entry : ĠEntry ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstarted Ġ= Ġget Cast ed State OrNull < Report State . Initialized . Started >() ĊĠĠĠĠĠĠĠ Ġval Ġentries List Ġ= Ġstarted ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . current Step Or Synt hetic () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . entry List Ġ?: Ġearly Entries ĊĠĠĠĠĠĠĠ Ġentries List . add ( entry ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠReport State . Initialized . Started . current Step Or Synt hetic () Ġ= ĊĠĠĠĠĠĠĠ ĠgetCurrent Step OrCreate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStep Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Synt hetic Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= Ġtime Provider . now InSeconds (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnumber Ġ= Ġstep Number ++, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" Out Ġof Ġstep " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠThrowable . determine Incident Type (): ĠInc ident . Type Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAssertionError , Ġis ĠE sp ress o Exception Ġ-> ĠInc ident . Type . ASSERT ION _ FAILED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcause ?. determine Incident Type () Ġ?: ĠInc ident . Type . INFR A STRUCTURE _ ERROR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠReport State > Ġcheck State Is () Ġ= Ġget Cast ed State < T >() ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠReport State > Ġget Cast ed State OrNull (): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( val Ġ_ state Ġ= Ġstate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT Ġ-> Ġ_ state ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠReport State > Ġget Cast ed State (): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Cast ed State OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Invalid Ġstate . ĠExpected Ġ${ T :: class . java } Ġactual Ġ$ state ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠStep Result . append Future Entries (): ĠStep Result Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( future Upload s . isEmpty ()) Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġreturn Ġcopy ( entry List Ġ= Ġ( entry List Ġ+ Ġfuture Upload s . get Initialized Entries ()). to Mutable List ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠInc ident . append Future Entries (): ĠInc ident Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( incident Future Upload s . isEmpty ()) Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġreturn Ġcopy ( entry List Ġ= Ġentry List Ġ+ Ġincident Future Upload s . get Initialized Entries ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < Future Value < Remote Storage . Result >> . get Initialized Entries (): ĠList < Entry > Ġ= ĊĠĠĠĠĠĠĠ Ġas Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map ( Future Value < Remote Storage . Result >:: get ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRemote Storage . Result . Error Ġ-> ĠEntry . Comment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" FAILED Ġto Ġadd : Ġ${ it . comment }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime InSeconds Ġ= Ġit . time InSeconds ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRemote Storage . Result . Success Ġ-> ĠEntry . File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment Ġ= Ġit . comment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Address Ġ= Ġit . url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime InSeconds Ġ= Ġit . time InSeconds , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfileType Ġ= Ġwhen Ġ( it . upload Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRemote Storage . Request . File Request . Image Ġ-> ĠEntry . File . Type . img _ png ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRemote Storage . Request . File Request . Video Ġ-> ĠEntry . File . Type . video ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRemote Storage . Request . Content Request . Html Ġ-> ĠEntry . File . Type . html ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRemote Storage . Request . Content Request . Plain Text Ġ-> ĠEntry . File . Type . plain _ text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRemote Storage . Request . Content Request . Any Content Ġ-> ĠEntry . File . Type . plain _ text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĊĠĠĠ Ġprivate Ġfun ĠReport State . Initialized . Started . write TestCase () Ġ= ĊĠĠĠĠĠĠĠ Ġmethod Execution Tracing (" write TestCase ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Test Write ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransport . forEach Ġ{ Ġit . send ( this ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠReport State . Written ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠScreenshots / Http Static Ġare Ġsynchronous , Ġbut Ġuploading Ġruns Ġon Ġbackground Ġthread ĊĠĠĠĠ Ġ* ĠWe Ġhave Ġto Ġwait Ġupload Ġcompletion Ġbefore Ġsending Ġreport Ġpackages ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠReport State . Initialized . Started . wait Upload s () Ġ{ ĊĠĠĠĠĠĠĠ ĠtestCase Step List Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtestCase Step List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . append Future Entries () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġpre condition Step List Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre condition Step List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . append Future Entries () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Mutable List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrap In Html ( content : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ""" <! DOCTYPE Ġhtml > Ċ < html > Ċ < head > Ċ < meta Ġcharset =" utf - 8 " Ġ/> Ċ </ head > Ċ < body > Ċ < pre > Ċ $ content Ċ </ pre > Ċ </ body > Ċ </ html > """. trim Indent () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġmethod Execution Tracing ( name : ĠString , Ġaction : Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" Method : Ġ$ name Ġexecution Ġstarted ") ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġaction () ĊĠĠĠĠĠĠĠ Ġlogger . debug (" Method : Ġ$ name Ġexecution Ġcompleted ") ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ } Ċ