package Ġcom . av ito . runner . listener Ċ Ċ import Ġcom . av ito . android . Result Ċ import Ġcom . av ito . logger . LoggerFactory Ċ import Ġcom . av ito . logger . create Ċ import Ġcom . av ito . runner . model . TestCase Run Ċ import Ġcom . av ito . runner . model . TestCase Run . Result . Failed Ċ import Ġcom . av ito . runner . model . TestCase Run . Result . Failed . Infrastructure Error Ċ import Ġcom . av ito . runner . model . TestCase Run . Result . Ignored Ċ import Ġcom . av ito . runner . model . TestCase Run . Result . Passed Ċ import Ġcom . av ito . runner . model . TestResult Ċ import Ġcom . av ito . runner . service . listener . Test Listener Ċ import Ġcom . av ito . runner . service . worker . device . Device Ċ import Ġcom . av ito . runner . service . worker . device . adb . Pull Validator Ċ import Ġcom . av ito . test . model . TestCase Ċ import Ġcom . av ito . utils . delete Re cursively Ċ import Ġjava . io . File Ċ import Ġkotlin . io . path . Experimental Path Api Ċ import Ġkotlin . io . path . create Temp Directory Ċ Ċ internal Ġclass ĠArtifact s Test Listener ( ĊĠĠĠ Ġprivate Ġval Ġlifecycle Listener : ĠTest Lifecycle Listener , ĊĠĠĠ Ġprivate Ġval Ġoutput Directory : ĠFile , ĊĠĠĠ Ġprivate Ġval Ġsave Test Artifact sTo Outputs : ĠBoolean , ĊĠĠĠ Ġprivate Ġval Ġfetch Log cat For Incomplete Tests : ĠBoolean , ĊĠĠĠ Ġprivate Ġval Ġreport Artifacts Pull Validator : ĠPull Validator , ĊĠĠĠ Ġlogger Factory : ĠLoggerFactory , Ċ ) Ġ: ĠTest Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= Ġlogger Factory . create < Artifacts Test Listener >() ĊĊĠĠĠ Ġoverride Ġfun Ġstarted ( ĊĠĠĠĠĠĠĠ Ġdevice : ĠDevice , ĊĠĠĠĠĠĠĠ Ġtarget Package : ĠString , ĊĠĠĠĠĠĠĠ Ġtest : ĠTestCase , ĊĠĠĠĠĠĠĠ Ġexecution Number : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlifecycle Listener . started ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Ġ= Ġtest , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdeviceId Ġ= Ġdevice . coordinate . serial . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecution Number Ġ= Ġexecution Number ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental Path Api ĊĠĠĠ Ġoverride Ġfun Ġfinished ( ĊĠĠĠĠĠĠĠ Ġdevice : ĠDevice , ĊĠĠĠĠĠĠĠ Ġtest : ĠTestCase , ĊĠĠĠĠĠĠĠ Ġtarget Package : ĠString , ĊĠĠĠĠĠĠĠ Ġresult : ĠTestCase Run . Result , ĊĠĠĠĠĠĠĠ Ġduration Milliseconds : ĠLong , ĊĠĠĠĠĠĠĠ Ġexecution Number : ĠInt , ĊĠĠĠĠĠĠĠ Ġtest Artifacts Dir : ĠResult < File > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemp Directory Ġ= Ġif Ġ( save Test Artifact sTo Outputs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( output Directory , Ġ" test - artifacts "). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent File . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( mkdir ()) Ġ{ Ġ" can 't Ġmkdir Ġ$ this " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Path () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Temp Directory () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlogger . info (" Pull ing Ġartifacts Ġto Ġ$ temp Directory ") ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Result Ġ= Ġwhen Ġ( result ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠP assed , Ġis ĠFailed . In Run Ġ-> Ġtest Artifacts Dir . flatMap Ġ{ Ġdir Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice . pull Dir ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Dir Ġ= Ġdir . to Path (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost Dir Ġ= Ġtemp Directory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidator Ġ= Ġreport Artifacts Pull Validator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. fold ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess Ġ= Ġ{ Ġdir Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest Result . Complete ( dir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure Ġ= Ġ{ Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Incomplete Test ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠInfrastructure Error . Fail On Pull ing Artifacts ( throwable ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Ġ= Ġdevice , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Directory Ġ= Ġtemp Directory . to File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInfrastructure Error Ġ-> Ġhandle Incomplete Test ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġresult , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Ġ= Ġdevice , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Directory Ġ= Ġtemp Directory . to File () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠIgnore d Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest Result . Incomplete ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInfrastructure Error . Unexpected ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIllegalStateException (" Instrumentation Ġexecuted ĠIgnore d Ġtest ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat Ġ= ĠResult . Failure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRuntimeException (" Log cat Ġis Ġnot Ġneeded Ġfor Ġignored Ġtest Ġcase ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlifecycle Listener . finished ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġtest Result , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Ġ= Ġtest , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecution Number Ġ= Ġexecution Number , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! save Test Artifact sTo Outputs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Directory . delete Re cursively (). on Failure Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Can 't Ġclear Ġtemp Ġdirectory : Ġ$ temp Directory ", Ġerror ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Incomplete Test ( ĊĠĠĠĠĠĠĠ Ġresult : ĠInfrastructure Error , ĊĠĠĠĠĠĠĠ Ġdevice : ĠDevice , ĊĠĠĠĠĠĠĠ Ġtemp Directory : ĠFile ĊĠĠĠ Ġ): ĠTest Result . Incomplete Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTest Result . Incomplete ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfra Error Ġ= Ġresult , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat Ġ= Ġif Ġ( fetch Log cat For Incomplete Tests ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlog cat Result Ġ= Ġdevice . log cat ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( save Test Artifact sTo Outputs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat Result . on Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( temp Directory , Ġ" log cat . txt "). write Text ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat Result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . Failure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRuntimeException (" fetch Log cat For Incomplete Tests Ġis Ġdisabled Ġin Ġconfig ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ