package Ġcom . ste ves ol ty s . seed vault . transport . backup Ċ Ċ import Ġandroid . app . backup . Backup Transport . TRANSPORT _ ERROR Ċ import Ġandroid . app . backup . Backup Transport . TRANSPORT _ OK Ċ import Ġandroid . app . backup . Backup Transport . TRANSPORT _ PACKAGE _ RE JECT ED Ċ import Ġandroid . app . backup . Backup Transport . TRANSPORT _ QUOT A _ EX CE EDED Ċ import Ġandroid . content . pm . Package Info Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Parcel FileDescriptor Ċ import Ġandroidx . document file . provider . Document File Ċ import Ġcom . ste ves ol ty s . seed vault . Backup Notification Manager Ċ import Ġcom . ste ves ol ty s . seed vault . MAGIC _ PACKAGE _ MANAGER Ċ import Ġcom . ste ves ol ty s . seed vault . getRandom String Ċ import Ġcom . ste ves ol ty s . seed vault . metadata . Package Metadata Ċ import Ġcom . ste ves ol ty s . seed vault . metadata . Package State . NOT _ ALLOWED Ċ import Ġcom . ste ves ol ty s . seed vault . metadata . Package State . NO _ DATA Ċ import Ġcom . ste ves ol ty s . seed vault . metadata . Package State . QUOT A _ EX CE EDED Ċ import Ġcom . ste ves ol ty s . seed vault . metadata . Package State . UNKNOWN _ ERROR Ċ import Ġcom . ste ves ol ty s . seed vault . settings . Storage Ċ import Ġio . mock k . Runs Ċ import Ġio . mock k . every Ċ import Ġio . mock k . just Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . verify Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . Assertions . assertFalse Ċ import Ġorg . junit . jupiter . api . Assertions . assert Throws Ċ import Ġorg . junit . jupiter . api . Assertions . assertTrue Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġjava . io . IOException Ċ import Ġjava . io . OutputStream Ċ import Ġkotlin . random . Random Ċ Ċ internal Ġclass ĠBackup Coordinator Test Ġ: ĠBackup Test () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġplugin Ġ= Ġmock k < Backup Plugin >() ĊĠĠĠ Ġprivate Ġval Ġkv Ġ= Ġmock k < KV Backup >() ĊĠĠĠ Ġprivate Ġval Ġfull Ġ= Ġmock k < Full Backup >() ĊĠĠĠ Ġprivate Ġval Ġapk Backup Ġ= Ġmock k < A pk Backup >() ĊĠĠĠ Ġprivate Ġval Ġpackage Service : ĠPackage Service Ġ= Ġmock k () ĊĠĠĠ Ġprivate Ġval Ġnotification Manager Ġ= Ġmock k < Backup Notification Manager >() ĊĊĠĠĠ Ġprivate Ġval Ġbackup Ġ= ĠBackup Coordinator ( context , Ġplugin , Ġkv , Ġfull , Ġapk Backup , Ġclock , Ġpackage Service , Ġmetadata Manager , Ġsettings Manager , Ġnotification Manager ) ĊĊĠĠĠ Ġprivate Ġval Ġmetadata OutputStream Ġ= Ġmock k < OutputStream >() ĊĠĠĠ Ġprivate Ġval ĠfileDescriptor : ĠParcel FileDescriptor Ġ= Ġmock k () ĊĠĠĠ Ġprivate Ġval Ġpackage Metadata : ĠPackage Metadata Ġ= Ġmock k () ĊĠĠĠ Ġprivate Ġval Ġstorage Ġ= ĠStorage ( Uri . EMPTY , ĠgetRandom String (), Ġfalse ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` device Ġinitialization Ġsucceeds Ġand Ġdeleg ates Ġto Ġplugin `() Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġclock . time () Ġ} Ġreturns Ġtoken ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġplugin . initialize Device ( token ) Ġ} Ġreturns Ġtrue Ġ// ĠTODO Ġtest Ġwhen Ġfalse ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġplugin . getMetadata OutputStream () Ġ} Ġreturns Ġmetadata OutputStream ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmetadata Manager . on Device Initialization ( token , Ġmetadata OutputStream ) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġkv . has State () Ġ} Ġreturns Ġfalse ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . has State () Ġ} Ġreturns Ġfalse ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , Ġbackup . initialize Device ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , Ġbackup . finish Backup ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` device Ġinitialization Ġdoes Ġno - op Ġwhen Ġalready Ġinitialized `() Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġclock . time () Ġ} Ġreturns Ġtoken ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġplugin . initialize Device ( token ) Ġ} Ġreturns Ġfalse ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġkv . has State () Ġ} Ġreturns Ġfalse ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . has State () Ġ} Ġreturns Ġfalse ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , Ġbackup . initialize Device ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , Ġbackup . finish Backup ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` error Ġnotification Ġwhen Ġdevice Ġinitialization Ġfails `() Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġclock . time () Ġ} Ġreturns Ġtoken ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġplugin . initialize Device ( token ) Ġ} Ġthrows ĠIOException () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsettings Manager . get Storage () Ġ} Ġreturns Ġstorage ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġnotification Manager . on Backup Error () Ġ} Ġjust ĠRuns ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ ERROR , Ġbackup . initialize Device ()) ĊĊĠĠĠĠĠĠĠ Ġ// Ġfinish Ġwill Ġonly Ġbe Ġcalled Ġwhen ĠTRAN SP ORT _ OK Ġis Ġreturned , Ġso Ġit Ġshould Ġthrow ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġkv . has State () Ġ} Ġreturns Ġfalse ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . has State () Ġ} Ġreturns Ġfalse ĊĠĠĠĠĠĠĠ ĠassertThrows ( IllegalStateException :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackup . finish Backup () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` no Ġerror Ġnotification Ġwhen Ġdevice Ġinitialization Ġfails Ġon Ġun plug ged ĠUSB Ġstorage `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstorage Ġ= Ġmock k < Storage >() ĊĠĠĠĠĠĠĠ Ġval Ġdocument File Ġ= Ġmock k < Document File >() ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġclock . time () Ġ} Ġreturns Ġtoken ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġplugin . initialize Device ( token ) Ġ} Ġthrows ĠIOException () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsettings Manager . get Storage () Ġ} Ġreturns Ġstorage ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġstorage . is Usb Ġ} Ġreturns Ġtrue ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġstorage . getDocument File ( context ) Ġ} Ġreturns Ġdocument File ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdocument File . isDirectory Ġ} Ġreturns Ġfalse ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ ERROR , Ġbackup . initialize Device ()) ĊĊĠĠĠĠĠĠĠ Ġ// Ġfinish Ġwill Ġonly Ġbe Ġcalled Ġwhen ĠTRAN SP ORT _ OK Ġis Ġreturned , Ġso Ġit Ġshould Ġthrow ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġkv . has State () Ġ} Ġreturns Ġfalse ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . has State () Ġ} Ġreturns Ġfalse ĊĠĠĠĠĠĠĠ ĠassertThrows ( IllegalStateException :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackup . finish Backup () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` get Backup Quota () Ġdeleg ates Ġto Ġright Ġplugin `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Full Backup Ġ= ĠRandom . next Boolean () ĊĠĠĠĠĠĠĠ Ġval Ġquota Ġ= ĠRandom . next Long () ĊĊĠĠĠĠĠĠĠ Ġexpect A pk Backup And Metadata Write () ĊĠĠĠĠĠĠĠ Ġif Ġ( is Full Backup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . get Quota () Ġ} Ġreturns Ġquota ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġkv . get Quota () Ġ} Ġreturns Ġquota ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( quota , Ġbackup . get Backup Quota ( package Info . packageName , Ġis Full Backup )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` is App El igible For Backup () Ġexemp ts Ġplugin Ġprovider Ġand Ġblack listed Ġapps `() Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings Manager . is Backup Enabled ( package Info . packageName ) ĊĠĠĠĠĠĠĠ Ġ} Ġreturns Ġtrue Ġand Then Ġfalse Ġand Then Ġtrue ĊĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplugin . provider PackageName ĊĠĠĠĠĠĠĠ Ġ} Ġreturns Ġpackage Info . packageName Ġand Then Ġ" new . package " Ġand Then Ġ" new . package " ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( backup . is App El igible For Backup ( package Info , Ġtrue )) ĊĠĠĠĠĠĠĠ ĠassertFalse ( backup . is App El igible For Backup ( package Info , Ġtrue )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( backup . is App El igible For Backup ( package Info , Ġtrue )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` clear ing ĠK V Ġbackup Ġdata Ġthrows `() Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġkv . clear Backup Data ( package Info ) Ġ} Ġthrows ĠIOException () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ ERROR , Ġbackup . clear Backup Data ( package Info )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` clear ing Ġfull Ġbackup Ġdata Ġthrows `() Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġkv . clear Backup Data ( package Info ) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . clear Backup Data ( package Info ) Ġ} Ġthrows ĠIOException () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ ERROR , Ġbackup . clear Backup Data ( package Info )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` clear ing Ġbackup Ġdata Ġsucceeds `() Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġkv . clear Backup Data ( package Info ) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . clear Backup Data ( package Info ) Ġ} Ġjust ĠRuns ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , Ġbackup . clear Backup Data ( package Info )) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġkv . has State () Ġ} Ġreturns Ġfalse ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . has State () Ġ} Ġreturns Ġfalse ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , Ġbackup . finish Backup ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` finish Ġbackup Ġdeleg ates Ġto ĠK V Ġplugin Ġif Ġit Ġhas Ġstate `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠRandom . nextInt () ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġkv . has State () Ġ} Ġreturns Ġtrue ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . has State () Ġ} Ġreturns Ġfalse ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġkv . getCurrent Package () Ġ} Ġreturns Ġpackage Info ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġplugin . getMetadata OutputStream () Ġ} Ġreturns Ġmetadata OutputStream ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmetadata Manager . on Package Back ed Up ( package Info , Ġmetadata OutputStream ) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġkv . finish Backup () Ġ} Ġreturns Ġresult ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( result , Ġbackup . finish Backup ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` finish Ġbackup Ġdeleg ates Ġto Ġfull Ġplugin Ġif Ġit Ġhas Ġstate `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠRandom . nextInt () ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġkv . has State () Ġ} Ġreturns Ġfalse ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . has State () Ġ} Ġreturns Ġtrue ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . getCurrent Package () Ġ} Ġreturns Ġpackage Info ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġplugin . getMetadata OutputStream () Ġ} Ġreturns Ġmetadata OutputStream ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmetadata Manager . on Package Back ed Up ( package Info , Ġmetadata OutputStream ) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . finish Backup () Ġ} Ġreturns Ġresult ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( result , Ġbackup . finish Backup ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` metadata Ġdoes Ġnot Ġget Ġupdated Ġwhen Ġno ĠA PK Ġwas Ġbacked Ġup `() Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . perform Full Backup ( package Info , ĠfileDescriptor , Ġ 0 ) Ġ} Ġreturns ĠTRAN SP ORT _ OK ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġapk Backup . backup A pk If Ne cessary ( package Info , ĠUNKNOWN _ ERROR , Ġany ()) Ġ} Ġreturns Ġnull ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , Ġbackup . perform Full Backup ( package Info , ĠfileDescriptor , Ġ 0 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` app Ġexceed ing Ġquota Ġgets Ġcancelled Ġand Ġreason Ġwritten Ġto Ġmetadata `() Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . perform Full Backup ( package Info , ĠfileDescriptor , Ġ 0 ) Ġ} Ġreturns ĠTRAN SP ORT _ OK ĊĠĠĠĠĠĠĠ Ġexpect A pk Backup And Metadata Write () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . get Quota () Ġ} Ġreturns ĠDEFAULT _ QUOT A _ FULL _ BACKUP ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . check Full Backup Size ( DEFAULT _ QUOT A _ FULL _ BACKUP Ġ+ Ġ 1 ) Ġ} Ġreturns ĠTRAN SP ORT _ QUOT A _ EX CE EDED ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . getCurrent Package () Ġ} Ġreturns Ġpackage Info ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmetadata Manager . on Package Backup Error ( package Info , ĠQU OTA _ EX CE EDED , Ġmetadata OutputStream ) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . cancel Full Backup () Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsettings Manager . get Storage () Ġ} Ġreturns Ġstorage ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackup . perform Full Backup ( package Info , ĠfileDescriptor , Ġ 0 )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( DEFAULT _ QUOT A _ FULL _ BACKUP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackup . get Backup Quota ( package Info . packageName , Ġtrue )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ QUOT A _ EX CE EDED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackup . check Full Backup Size ( DEFAULT _ QUOT A _ FULL _ BACKUP Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġbackup . cancel Full Backup () ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 L , Ġbackup . request Full Backup Time ()) ĊĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata Manager . on Package Backup Error ( package Info , ĠQU OTA _ EX CE EDED , Ġmetadata OutputStream ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` app Ġwith Ġno Ġdata Ġgets Ġcancelled Ġand Ġreason Ġwritten Ġto Ġmetadata `() Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . perform Full Backup ( package Info , ĠfileDescriptor , Ġ 0 ) Ġ} Ġreturns ĠTRAN SP ORT _ OK ĊĠĠĠĠĠĠĠ Ġexpect A pk Backup And Metadata Write () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . get Quota () Ġ} Ġreturns ĠDEFAULT _ QUOT A _ FULL _ BACKUP ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . check Full Backup Size ( 0 ) Ġ} Ġreturns ĠTRAN SP ORT _ PACKAGE _ RE JECT ED ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . getCurrent Package () Ġ} Ġreturns Ġpackage Info ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmetadata Manager . on Package Backup Error ( package Info , ĠNO _ DATA , Ġmetadata OutputStream ) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfull . cancel Full Backup () Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsettings Manager . get Storage () Ġ} Ġreturns Ġstorage ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackup . perform Full Backup ( package Info , ĠfileDescriptor , Ġ 0 )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( DEFAULT _ QUOT A _ FULL _ BACKUP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackup . get Backup Quota ( package Info . packageName , Ġtrue )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ PACKAGE _ RE JECT ED , Ġbackup . check Full Backup Size ( 0 )) ĊĠĠĠĠĠĠĠ Ġbackup . cancel Full Backup () ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 L , Ġbackup . request Full Backup Time ()) ĊĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata Manager . on Package Backup Error ( package Info , ĠNO _ DATA , Ġmetadata OutputStream ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` not Ġallowed Ġapps Ġget Ġtheir ĠA PK s Ġbacked Ġup Ġduring Ġ@ pm @ Ġbackup `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpackage Info Ġ= ĠPackage Info (). apply Ġ{ ĠpackageName Ġ= ĠMAG IC _ PACKAGE _ MANAGER Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnot Allowed Packages Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Info (). apply Ġ{ ĠpackageName Ġ= Ġ" org . example . 1 " Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Info (). apply Ġ{ ĠpackageName Ġ= Ġ" org . example . 2 " Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġpackage Metadata : ĠPackage Metadata Ġ= Ġmock k () ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsettings Manager . get Storage () Ġ} Ġreturns Ġstorage Ġ Ġ// Ġto Ġcheck Ġfor Ġremov able Ġstorage ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġpackage Service . not Allowed Packages Ġ} Ġreturns Ġnot Allowed Packages ĊĠĠĠĠĠĠĠ Ġ// Ġno Ġbackup Ġneeded ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġapk Backup . backup A pk If Ne cessary ( not Allowed Packages [ 0 ], ĠNOT _ ALLOWED , Ġany ()) Ġ} Ġreturns Ġnull ĊĠĠĠĠĠĠĠ Ġ// Ġwas Ġbacked Ġup , Ġget Ġnew Ġpackage Metadata ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġapk Backup . backup A pk If Ne cessary ( not Allowed Packages [ 1 ], ĠNOT _ ALLOWED , Ġany ()) Ġ} Ġreturns Ġpackage Metadata ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġplugin . getMetadata OutputStream () Ġ} Ġreturns Ġmetadata OutputStream ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmetadata Manager . on A pk Back ed Up ( not Allowed Packages [ 1 ], Ġpackage Metadata , Ġmetadata OutputStream ) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġ// Ġdo Ġactual Ġ@ pm @ Ġbackup ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġkv . perform Backup ( package Info , ĠfileDescriptor , Ġ 0 ) Ġ} Ġreturns ĠTRAN SP ORT _ OK ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackup . perform Incremental Backup ( package Info , ĠfileDescriptor , Ġ 0 )) ĊĊĠĠĠĠĠĠĠ Ġverify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapk Backup . backup A pk If Ne cessary ( not Allowed Packages [ 0 ], ĠNOT _ ALLOWED , Ġany ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapk Backup . backup A pk If Ne cessary ( not Allowed Packages [ 1 ], ĠNOT _ ALLOWED , Ġany ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexpect A pk Backup And Metadata Write () Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġapk Backup . backup A pk If Ne cessary ( any (), ĠUNKNOWN _ ERROR , Ġany ()) Ġ} Ġreturns Ġpackage Metadata ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġplugin . getMetadata OutputStream () Ġ} Ġreturns Ġmetadata OutputStream ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmetadata Manager . on A pk Back ed Up ( any (), Ġpackage Metadata , Ġmetadata OutputStream ) Ġ} Ġjust ĠRuns ĊĠĠĠ Ġ} Ċ Ċ } Ċ