/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 1 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . android . tools . ut p . plugins . host . coverage . com . android . tools . ut p . plugins . host . coverage Ċ Ċ import Ġcom . android . test utils . Mockito Kt . arg That Ċ import Ġcom . android . test utils . Mockito Kt . eq Ċ import Ġcom . android . test utils . Mockito Kt . mock Ċ import Ġcom . android . tools . ut p . plugins . host . coverage . Android Test Coverage Plugin Ċ import Ġcom . android . tools . ut p . plugins . host . coverage . proto . Android Test Coverage Config Proto . Android Test Coverage Config Ċ import Ġcom . google . protobuf . Any Ċ import Ġcom . google . testing . platform . api . config . Proto Config Ċ import Ġcom . google . testing . platform . api . device . Command Result Ċ import Ġcom . google . testing . platform . api . device . Device Ċ import Ġcom . google . testing . platform . api . device . Device Controller Ċ import Ġcom . google . testing . platform . proto . api . core . Extension Proto Ċ import Ġcom . google . testing . platform . proto . api . core . Test Artifact Proto . Artifact Ċ import Ġcom . google . testing . platform . proto . api . core . TestResult Proto . TestResult Ċ import Ġcom . google . testing . platform . proto . api . core . TestSuite Result Proto . TestSuite Result Ċ import Ġcom . google . testing . platform . runtime . android . device . Android Device Properties Ċ import Ġjava . util . function . Supplier Ċ import Ġjava . util . logging . Logger Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . junit . runners . JUnit 4 Ċ import Ġorg . mockito . Argument Matchers . any List Ċ import Ġorg . mockito . Argument Matchers . nullable Ċ import Ġorg . mockito . Mock Ċ import Ġorg . mockito . Mockito .` when ` Ċ import Ġorg . mockito . Mockito . at Least Once Ċ import Ġorg . mockito . Mockito . in Order Ċ import Ġorg . mockito . Mockito . verify Ċ import Ġorg . mockito . Mockito . verify No More Interactions Ċ import Ġorg . mockito . junit . Mockito JUnit Ċ import Ġorg . mockito . junit . Mockito Rule Ċ import Ġorg . mockito . quality . Strict ness Ċ Ċ /** Ċ Ġ* ĠUnit Ġtests Ġfor Ġ[ Android Test Coverage Plugin ] Ċ Ġ*/ Ċ @ RunWith ( JUnit 4 :: class ) Ċ class ĠAndroid Test Coverage Plugin Test Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTEST ED _ APP Ġ= Ġ" com . example . application " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTEST _ STORAGE _ SERVICE _ OUTPUT _ DIR Ġ= Ġ"/ sd card / goog let est / internal _ use /" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ get : Rule Ġvar Ġmock ito JUnit Rule : ĠMockito Rule Ġ= ĊĠĠĠĠĠĠĠ ĠMockito JUnit . rule (). strict ness ( Strict ness . STRICT _ ST UB S ) ĊĊĠĠĠ Ġ@ Mock Ġprivate Ġlateinit Ġvar Ġmock Device Controller : ĠDevice Controller ĊĠĠĠ Ġ@ Mock Ġprivate Ġlateinit Ġvar Ġmock Logger : ĠLogger ĊĊĠĠĠ Ġprivate Ġvar Ġcommand Result : ĠCommand Result Ġ= ĠCommand Result ( 0 , ĠlistOf ()) ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp Mocks () Ġ{ ĊĠĠĠĠĠĠĠ Ġ` when `( mock Device Controller . execute ( any List (), Ġnullable ( Long :: class . java ))). then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Result ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinstall Test Storage Service () Ġ{ ĊĠĠĠĠĠĠĠ Ġ` when `( mock Device Controller . execute ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( listOf (" shell ", Ġ" pm ", Ġ" list ", Ġ" packages ", Ġ" android x . test . services ")), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnullable ( Long :: class . java )) ĊĠĠĠĠĠĠĠ Ġ). thenReturn ( Command Result ( 0 , ĠlistOf (" package : android x . test . services "))) ĊĊĠĠĠĠĠĠĠ Ġval Ġmock Device Ġ= Ġmock < Device >() ĊĠĠĠĠĠĠĠ Ġ` when `( mock Device . properties ). thenReturn ( Android Device Properties ( device Api Level Ġ= Ġ" 3 0 ")) ĊĠĠĠĠĠĠĠ Ġ` when `( mock Device Controller . getDevice ()). thenReturn ( mock Device ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Android Test Coverage Plugin ( config : ĠAndroid Test Coverage Config ) ĊĠĠĠĠĠĠĠ Ġ: ĠAndroid Test Coverage Plugin Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpacked Config Ġ= ĠAny . pack ( config ) ĊĠĠĠĠĠĠĠ Ġval Ġproto Config Ġ= Ġobject : ĠProto Config Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġconfig Proto : ĠAny ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġpacked Config ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġconfig Resource : ĠExtension Proto . Config Resource ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠAndroid Test Coverage Plugin ( mock Logger ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" UUID " ĊĠĠĠĠĠĠĠ Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure ( proto Config ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun Android Test Coverage Plugin ( ĊĠĠĠĠĠĠĠ Ġconfig Func : ĠAndroid Test Coverage Config . Builder . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠAndroid Test Coverage Config . newBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Func ( this ) ĊĠĠĠĠĠĠĠ Ġ}. build () ĊĠĠĠĠĠĠĠ Ġcreate Android Test Coverage Plugin ( config ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbefore All ( mock Device Controller ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠbeforeEach ( null , Ġmock Device Controller ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠafterEach ( TestResult . getDefaultInstance (), Ġmock Device Controller ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter All ( TestSuite Result . getDefaultInstance (), Ġmock Device Controller ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Test Artifact ( ĊĠĠĠĠĠĠĠ ĠfilePath On Device : ĠString , ĠfilePath On Host : ĠString ): ĠArtifact Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠArtifact . newBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path Builder . path Ġ= ĠfilePath On Host ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Path Builder . path Ġ= ĠfilePath On Device ĊĠĠĠĠĠĠĠ Ġ}. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrun With Single Coverage File () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcoverage File Ġ= Ġ"/ data / data /${ TEST ED _ APP }/ coverage . ec " ĊĠĠĠĠĠĠĠ Ġval Ġtmp Dir Ġ= Ġ"/ data / local / tmp / UUID - coverage _ data " ĊĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġ" coverage Output Dir / device Name /" ĊĊĠĠĠĠĠĠĠ Ġrun Android Test Coverage Plugin () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun As PackageName Ġ= ĠTEST ED _ APP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Coverage File Ġ= Ġcoverage File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Directory On Host Ġ= Ġoutput Dir ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġin Order ( mock Device Controller ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" run - as ", ĠTEST ED _ APP , Ġ" rm Ġ- f Ġ\" ${ coverage File }\ "" )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" mkdir Ġ- p Ġ\" ${ tmp Dir } \"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" run - as ", ĠTEST ED _ APP , Ġ" cat Ġ\" ${ coverage File }\" Ġ> Ġ\" ${ tmp Dir }/ coverage . ec \"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). pull ( create Test Artifact ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ tmp Dir }/ coverage . ec ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ output Dir }/ coverage . ec ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" rm Ġ- rf Ġ\" ${ tmp Dir } \"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify No More Interactions () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( mock Logger ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrun With Single Coverage File And Test Storage Service () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcoverage File Ġ= Ġ"/ data / data /${ TEST ED _ APP }/ coverage . ec " ĊĠĠĠĠĠĠĠ Ġval Ġtmp Dir Ġ= Ġ"/ data / local / tmp / UUID - coverage _ data " ĊĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġ" coverage Output Dir / device Name /" ĊĊĠĠĠĠĠĠĠ Ġinstall Test Storage Service () ĊĊĠĠĠĠĠĠĠ Ġrun Android Test Coverage Plugin () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun As PackageName Ġ= ĠTEST ED _ APP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Coverage File Ġ= Ġcoverage File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Directory On Host Ġ= Ġoutput Dir ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġin Order ( mock Device Controller ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" run - as ", ĠTEST ED _ APP , Ġ" rm Ġ- f Ġ\" ${ coverage File }\ "" )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" app ops Ġset Ġandroidx . test . services ĠMAN AGE _ EXTERNAL _ STORAGE Ġallow " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" mkdir Ġ- p Ġ\" ${ tmp Dir } \"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" cat Ġ\" ${ TEST _ STORAGE _ SERVICE _ OUTPUT _ DIR }/${ coverage File }\" Ġ> Ġ\" ${ tmp Dir }/ coverage . ec \"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). pull ( create Test Artifact ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ tmp Dir }/ coverage . ec ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ output Dir }/ coverage . ec ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" rm Ġ- rf Ġ\" ${ tmp Dir } \"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify No More Interactions () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( mock Logger ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrun With Multiple Coverage Files In Directory () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcoverage Dir Ġ= Ġ"/ data / data /${ TEST ED _ APP }/ " ĊĠĠĠĠĠĠĠ Ġval Ġtmp Dir Ġ= Ġ"/ data / local / tmp / UUID - coverage _ data " ĊĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġ" coverage Output Dir / device Name /" ĊĊĠĠĠĠĠĠĠ Ġ` when `( mock Device Controller . execute ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" run - as ", ĠTEST ED _ APP , Ġ" ls Ġ\" ${ coverage Dir }\" ")), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnullable ( Long :: class . java ) ĊĠĠĠĠĠĠĠ Ġ )). thenReturn ( Command Result ( 0 , ĠlistOf (" coverage 1 . ec ", Ġ" coverage 2 . ec ", Ġ" non _ cov _ file "))) ĊĊĠĠĠĠĠĠĠ Ġrun Android Test Coverage Plugin () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun As PackageName Ġ= ĠTEST ED _ APP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmultiple Coverage Files In Directory Ġ= Ġcoverage Dir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Directory On Host Ġ= Ġoutput Dir ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġin Order ( mock Device Controller ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" run - as ", ĠTEST ED _ APP , Ġ" rm Ġ- rf Ġ\" ${ coverage Dir }\ "" )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" run - as ", ĠTEST ED _ APP , Ġ" mkdir Ġ- p Ġ\" ${ coverage Dir }\ "" )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" mkdir Ġ- p Ġ\" ${ tmp Dir } \"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" run - as ", ĠTEST ED _ APP , Ġ" ls Ġ\" ${ coverage Dir }\ "" )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" run - as ", ĠTEST ED _ APP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" cat Ġ\" ${ coverage Dir }/ coverage $ i . ec \" Ġ> Ġ\" ${ tmp Dir }/ coverage $ i . ec \"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). pull ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Test Artifact ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ tmp Dir }/ coverage $ i . ec ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ output Dir }/ coverage $ i . ec " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" rm Ġ- rf Ġ\" ${ tmp Dir } \"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify No More Interactions () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( mock Logger ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrun With Multiple Coverage Files In Directory And Storage Service () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcoverage Dir Ġ= Ġ"/ data / data /${ TEST ED _ APP }/ " ĊĠĠĠĠĠĠĠ Ġval Ġtmp Dir Ġ= Ġ"/ data / local / tmp / UUID - coverage _ data " ĊĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġ" coverage Output Dir / device Name /" ĊĊĠĠĠĠĠĠĠ Ġinstall Test Storage Service () ĊĊĠĠĠĠĠĠĠ Ġ` when `( mock Device Controller . execute ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ls Ġ\" ${ TEST _ STORAGE _ SERVICE _ OUTPUT _ DIR }/${ coverage Dir }\" ")), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnullable ( Long :: class . java ) ĊĠĠĠĠĠĠĠ Ġ )). thenReturn ( Command Result ( 0 , ĠlistOf (" coverage 1 . ec ", Ġ" coverage 2 . ec ", Ġ" non _ cov _ file "))) ĊĊĠĠĠĠĠĠĠ Ġrun Android Test Coverage Plugin () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun As PackageName Ġ= ĠTEST ED _ APP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmultiple Coverage Files In Directory Ġ= Ġcoverage Dir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Directory On Host Ġ= Ġoutput Dir ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġin Order ( mock Device Controller ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" run - as ", ĠTEST ED _ APP , Ġ" rm Ġ- rf Ġ\" ${ coverage Dir }\ "" )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" run - as ", ĠTEST ED _ APP , Ġ" mkdir Ġ- p Ġ\" ${ coverage Dir }\ "" )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" app ops Ġset Ġandroidx . test . services ĠMAN AGE _ EXTERNAL _ STORAGE Ġallow " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" mkdir Ġ- p Ġ\" ${ tmp Dir } \"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ls Ġ\" ${ TEST _ STORAGE _ SERVICE _ OUTPUT _ DIR }/${ coverage Dir }\ "" )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" cat Ġ\" ${ TEST _ STORAGE _ SERVICE _ OUTPUT _ DIR }/${ coverage Dir }/ coverage $ i . ec \"" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ> Ġ\" ${ tmp Dir }/ coverage $ i . ec \"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). pull ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Test Artifact ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ tmp Dir }/ coverage $ i . ec ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ output Dir }/ coverage $ i . ec " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock Device Controller ). execute ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" shell ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" rm Ġ- rf Ġ\" ${ tmp Dir } \"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify No More Interactions () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( mock Logger ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcommand Failed () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcoverage File Ġ= Ġ"/ data / data /${ TEST ED _ APP }/ coverage . ec " ĊĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġ" coverage Output Dir / device Name /" ĊĊĠĠĠĠĠĠĠ Ġcommand Result Ġ= ĠCommand Result (- 1 , ĠlistOf ()) ĊĊĠĠĠĠĠĠĠ Ġrun Android Test Coverage Plugin () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun As PackageName Ġ= ĠTEST ED _ APP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Coverage File Ġ= Ġcoverage File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Directory On Host Ġ= Ġoutput Dir ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġverify ( mock Logger , Ġat Least Once ()). warning ( arg That < Supplier < String >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . get (). contains (" Shell Ġcommand Ġfailed Ġ(- 1 )") ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ