/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠGoogle ĠLLC . Ċ Ġ* Ċ Ġ* ĠThis Ġcode Ġmay Ġonly Ġbe Ġused Ġunder Ġthe ĠBSD Ġstyle Ġlicense Ġfound Ġat Ċ Ġ* Ġhttp :// polymer . github . io / LICENSE . txt Ċ Ġ* Ċ Ġ* ĠCode Ġdistributed Ġby ĠGoogle Ġas Ġpart Ġof Ġthis Ġproject Ġis Ġalso Ġsubject Ġto Ġan Ġadditional ĠIP Ġrights Ċ Ġ* Ġgrant Ġfound Ġat Ċ Ġ* Ġhttp :// polymer . github . io / PAT ENTS . txt Ċ Ġ*/ Ċ Ċ package Ġar cs . android . storage . service Ċ Ċ import Ġandroidx . test . core . app . Application Provider Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġar cs . android . storage . database . Android Sqlite Database Manager Ċ import Ġar cs . core . common . Arc Id Ċ import Ġar cs . core . data . Capability . T tl Ċ import Ġar cs . core . data . Collection Type Ċ import Ġar cs . core . data . EntityType Ċ import Ġar cs . core . data . Handle Mode Ċ import Ġar cs . core . data . Schema Registry Ċ import Ġar cs . core . data . Singleton Type Ċ import Ġar cs . core . entity . Dummy Entity Ċ import Ġar cs . core . entity . Handle Spec Ċ import Ġar cs . core . entity . Inline Dummy Entity Ċ import Ġar cs . core . entity . ReadWrite Collection Handle Ċ import Ġar cs . core . entity . ReadWrite Singleton Handle Ċ import Ġar cs . core . entity . await Ready Ċ import Ġar cs . core . host . Entity Handle Manager Ċ import Ġar cs . core . storage . Direct Storage Endpoint Manager Ċ import Ġar cs . core . storage . Driver Factory Ċ import Ġar cs . core . storage . Storage Key Ċ import Ġar cs . core . storage . Store Manager Ċ import Ġar cs . core . storage . Store Write Back Ċ import Ġar cs . core . storage . api . Driver And Key Configurator Ċ import Ġar cs . core . storage . driver . Ram Disk Ċ import Ġar cs . core . storage . keys . Database Storage Key Ċ import Ġar cs . core . storage . keys . Ram Disk Storage Key Ċ import Ġar cs . core . storage . keys . Volatile Storage Key Ċ import Ġar cs . core . storage . reference mode . Reference Mode Storage Key Ċ import Ġar cs . core . storage . testutil . Write Back ForTesting Ċ import Ġar cs . core . testutil . handles . dispatch Fetch All Ċ import Ġar cs . core . testutil . handles . dispatch Store Ċ import Ġar cs . core . util . testutil . Log Rule Ċ import Ġar cs . jvm . host . Jvm Scheduler Provider Ċ import Ġar cs . jvm . util . testutil . Fake Time Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġkotlin . coroutines . Empty Coroutine Context Ċ import Ġkotlin . coroutines . coroutine Context Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ Ċ /** ĠTests Ġfor Ġ[ Storage Service Manager ]. Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ", Ġ" EXPERIMENT AL _ API _ USAGE ") Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ class ĠStorage Service End ToEnd Test Ġ{ ĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġval Ġlog Ġ= ĠLog Rule () ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġbuild Manager () Ġ= ĊĠĠĠĠĠĠĠ ĠStorage Service Manager ( coroutine Context , ĠConcurrent HashMap ()) ĊĠĠĠ Ġprivate Ġval Ġtime Ġ= ĠFake Time () ĊĠĠĠ Ġprivate Ġval Ġscheduler Ġ= ĠJ vm Scheduler Provider ( Empty Coroutine Context ). invoke (" test ") ĊĠĠĠ Ġprivate Ġval Ġram disk Key Ġ= ĠReference Mode Storage Key ( ĊĠĠĠĠĠĠĠ Ġbacking Key Ġ= ĠRam Disk Storage Key (" back ing "), ĊĠĠĠĠĠĠĠ Ġstorage Key Ġ= ĠRam Disk Storage Key (" container ") ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġarc Id Ġ= ĠArc Id . new For Test (" foo ") ĊĠĠĠ Ġprivate Ġval Ġvolatile Key Ġ= ĠReference Mode Storage Key ( ĊĠĠĠĠĠĠĠ Ġbacking Key Ġ= ĠVol atile Storage Key ( arc Id , Ġ" back ing "), ĊĠĠĠĠĠĠĠ Ġstorage Key Ġ= ĠVol atile Storage Key ( arc Id , Ġ" container ") ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġdatabase Key Ġ= ĠReference Mode Storage Key ( ĊĠĠĠĠĠĠĠ Ġbacking Key Ġ= ĠDatabase Storage Key . Persistent (" back ing ", ĠDummy Entity . SCHEMA _ HASH ), ĊĠĠĠĠĠĠĠ Ġstorage Key Ġ= ĠDatabase Storage Key . Persistent (" container ", ĠDummy Entity . SCHEMA _ HASH ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdatabase Manager : ĠAndroid Sqlite Database Manager ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ ĠStore Write Back . write Back Factory Override Ġ= ĠWrite Back ForTesting ĊĠĠĠĠĠĠĠ Ġdatabase Manager Ġ= ĠAndroid Sqlite Database Manager ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Provider . getApplicationContext () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠDriver And Key Configurator . configure ( database Manager ) ĊĊĠĠĠĠĠĠĠ ĠSchema Registry . register ( Dummy Entity . SCHEMA ) ĊĠĠĠĠĠĠĠ ĠSchema Registry . register ( Inline Dummy Entity . SCHEMA ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ ĠWrite Back ForTesting . clear () ĊĠĠĠĠĠĠĠ Ġscheduler . cancel () ĊĠĠĠĠĠĠĠ ĠRam Disk . clear () ĊĠĠĠĠĠĠĠ ĠDriver Factory . clear Regist rations () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwrite Then Read _ null In lines _ in Collection _ on Database () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandle Ġ= Ġcreate Collection Handle ( database Key ) ĊĠĠĠĠĠĠĠ Ġval Ġentity Ġ= Ġempty Entity For Test () ĊĊĠĠĠĠĠĠĠ Ġhandle . dispatch Store ( entity ) ĊĊĠĠĠĠĠĠĠ Ġval Ġhandle 2 Ġ= Ġcreate Collection Handle ( database Key ) ĊĠĠĠĠĠĠĠ ĠassertThat ( handle 2 . dispatch Fetch All ()). contains Exactly ( entity ) ĊĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwrite Then Read _ inline Data _ in Collection _ on Database () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandle Ġ= Ġcreate Collection Handle ( database Key ) ĊĠĠĠĠĠĠĠ Ġval Ġentity Ġ= Ġentity For Test () ĊĊĠĠĠĠĠĠĠ Ġhandle . dispatch Store ( entity ) ĊĊĠĠĠĠĠĠĠ Ġdatabase Manager . run G arbage Collection () ĊĠĠĠĠĠĠĠ Ġdatabase Manager . run G arbage Collection () ĊĊĠĠĠĠĠĠĠ Ġval Ġhandle 2 Ġ= Ġcreate Collection Handle ( database Key ) ĊĠĠĠĠĠĠĠ ĠassertThat ( handle 2 . dispatch Fetch All ()). contains Exactly ( entity ) ĊĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwrite Then Read _ inline Data _ in Collection _ on Database _ with Expiry () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandle Ġ= Ġcreate Collection Handle ( database Key , ĠT tl . Hours ( 1 )) ĊĠĠĠĠĠĠĠ Ġval Ġentity Ġ= Ġentity For Test () ĊĠĠĠĠĠĠĠ Ġval Ġentity 2 Ġ= Ġentity For Test () ĊĊĠĠĠĠĠĠĠ Ġtime . millis Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġhandle . dispatch Store ( entity ) ĊĠĠĠĠĠĠĠ Ġtime . millis Ġ= Ġ 1 L ĊĠĠĠĠĠĠĠ Ġhandle . dispatch Store ( entity 2 ) ĊĊĠĠĠĠĠĠĠ Ġdatabase Manager . remove Expired Entities () ĊĊĠĠĠĠĠĠĠ Ġval Ġhandle 2 Ġ= Ġcreate Collection Handle ( database Key ) ĊĠĠĠĠĠĠĠ Ġtime . millis Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ ĠassertThat ( handle 2 . dispatch Fetch All ()). contains Exactly ( entity ) ĊĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwrite Then Read _ inline Data _ in Collection _ on Database _ with GC () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandle Ġ= Ġcreate Collection Handle ( database Key ) ĊĠĠĠĠĠĠĠ Ġval Ġentity Ġ= Ġentity For Test () ĊĊĠĠĠĠĠĠĠ Ġhandle . dispatch Store ( entity ) ĊĊĠĠĠĠĠĠĠ Ġdatabase Manager . run G arbage Collection () ĊĠĠĠĠĠĠĠ Ġdatabase Manager . run G arbage Collection () ĊĊĠĠĠĠĠĠĠ Ġval Ġhandle 2 Ġ= Ġcreate Collection Handle ( database Key ) ĊĠĠĠĠĠĠĠ ĠassertThat ( handle 2 . dispatch Fetch All ()). contains Exactly ( entity ) ĊĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwrite Then Read _ inline Data _ in Collection _ on Ram disk () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandle Ġ= Ġcreate Collection Handle ( ram disk Key ) ĊĠĠĠĠĠĠĠ Ġval Ġentity Ġ= Ġentity For Test () ĊĊĠĠĠĠĠĠĠ Ġhandle . dispatch Store ( entity ) ĊĊĠĠĠĠĠĠĠ Ġval Ġhandle 2 Ġ= Ġcreate Collection Handle ( ram disk Key ) ĊĠĠĠĠĠĠĠ ĠassertThat ( handle 2 . dispatch Fetch All ()). contains Exactly ( entity ) ĊĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwrite Then Read _ inline Data _ in Collection _ on Volatile () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandle Ġ= Ġcreate Collection Handle ( volatile Key ) ĊĠĠĠĠĠĠĠ Ġval Ġentity Ġ= Ġentity For Test () ĊĊĠĠĠĠĠĠĠ Ġhandle . dispatch Store ( entity ) ĊĊĠĠĠĠĠĠĠ Ġval Ġhandle 2 Ġ= Ġcreate Collection Handle ( volatile Key ) ĊĠĠĠĠĠĠĠ ĠassertThat ( handle 2 . dispatch Fetch All ()). contains Exactly ( entity ) ĊĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġempty Entity For Test () Ġ= ĠDummy Entity () ĊĊĠĠĠ Ġprivate Ġfun Ġentity For Test () Ġ= ĠDummy Entity (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġinline Entity Ġ= ĠInline Dummy Entity (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ" inline " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinline List Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInline Dummy Entity (). apply Ġ{ Ġtext Ġ= Ġ" 1 " Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInline Dummy Entity (). apply Ġ{ Ġtext Ġ= Ġ" 2 " Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInline Dummy Entity (). apply Ġ{ Ġtext Ġ= Ġ" 3 " Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġin lines Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInline Dummy Entity (). apply Ġ{ Ġtext Ġ= Ġ" C 1 " Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInline Dummy Entity (). apply Ġ{ Ġtext Ġ= Ġ" C 2 " Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInline Dummy Entity (). apply Ġ{ Ġtext Ġ= Ġ" C 3 " Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcreate Singleton Handle ( storage Key : ĠStorage Key ) Ġ= ĊĠĠĠĠĠĠĠ Ġ// ĠCreates Ġa Ġnew Ġhandle Ġmanager Ġeach Ġtime , Ġto Ġsimulate Ġar cs Ġstop / start Ġbehavior . ĊĠĠĠĠĠĠĠ ĠEntity Handle Manager ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ= Ġtime , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscheduler Ġ= Ġscheduler , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Endpoint Manager Ġ= ĠDirect Storage Endpoint Manager ( Store Manager ()) ĊĠĠĠĠĠĠĠ Ġ). create Handle ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHandle Spec ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" name ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHandle Mode . ReadWrite , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSingleton Type ( EntityType ( Dummy Entity . SCHEMA )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDummy Entity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Key ĊĠĠĠĠĠĠĠ Ġ). await Ready () Ġas ĠRead Write Singleton Handle < Dummy Entity > ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcreate Collection Handle ( ĊĠĠĠĠĠĠĠ Ġstorage Key : ĠStorage Key , ĊĠĠĠĠĠĠĠ Ġexpiry : ĠT tl Ġ= ĠT tl . Infinite () ĊĠĠĠ Ġ) Ġ= ĠEntity Handle Manager ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ= Ġtime , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscheduler Ġ= Ġscheduler , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Endpoint Manager Ġ= ĠDirect Storage Endpoint Manager ( Store Manager ()) ĊĠĠĠĠĠĠĠ Ġ). create Handle ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHandle Spec ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" name ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHandle Mode . ReadWrite , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCollection Type ( EntityType ( Dummy Entity . SCHEMA )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDummy Entity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Key , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpiry ĊĠĠĠĠĠĠĠ Ġ). await Ready () Ġas ĠRead Write Collection Handle < Dummy Entity > Ċ } Ċ