package Ġar cs . core . allocator Ċ Ċ import Ġar cs . core . common . Arc Id Ċ import Ġar cs . core . common . Id Ċ import Ġar cs . core . data . Annotation Ċ import Ġar cs . core . data . Capabilities Ċ import Ġar cs . core . data . Capability . Share able Ċ import Ġar cs . core . data . Cre atable Storage Key Ċ import Ġar cs . core . data . EntityType Ċ import Ġar cs . core . data . Plan Ċ import Ġar cs . core . host .* Ċ import Ġar cs . core . storage . Capabilities Resolver Ċ import Ġar cs . core . storage . api . Driver And Key Configurator Ċ import Ġar cs . core . storage . driver . Ram Disk Ċ import Ġar cs . core . storage . driver . Ram Disk Driver Provider Ċ import Ġar cs . core . storage . driver . Volatile Driver Provider Ċ import Ġar cs . core . testutil . assert Sus pending Throws Ċ import Ġar cs . core . util . Log Ċ import Ġar cs . core . util . plus Ċ import Ġar cs . core . util . testutil . Log Rule Ċ import Ġar cs . core . util . traverse Ċ import Ġar cs . jvm . host . Explicit Host Registry Ċ import Ġar cs . jvm . host . Jvm Scheduler Provider Ċ import Ġar cs . jvm . util . testutil . Fake Time Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġkotlinx . coroutines . Comp letable Deferred Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . junit . runners . JUnit 4 Ċ import Ġjava . lang . IllegalArgumentException Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . coroutines . Empty Coroutine Context Ċ Ċ @ RunWith ( JUnit 4 :: class ) Ċ @ Opt In ( Experimental Cor outines Api :: class ) Ċ open Ġclass ĠAllocator TestBase Ġ{ ĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġval Ġlog Ġ= ĠLog Rule ( Log . Level . Warning ) ĊĊĠĠĠ Ġprivate Ġval Ġscheduler Provider Ġ= ĠJ vm Scheduler Provider ( Empty Coroutine Context ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRecipe Ġhand Ġtranslated Ġfrom Ġ' person . arcs ' ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġallocator : ĠAllocator ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġhost Registry : ĠHost Registry ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġwrite Person Particle : ĠPlan . Particle ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġread Person Particle : ĠPlan . Particle ĊĊĠĠĠ Ġprotected Ġval Ġperson Schema Ġ= ĠRead Person _ Person . SCHEMA ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġreading External Host : ĠTesting Host ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġwriting External Host : ĠTesting Host ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpure Host : ĠTesting Jvm Prod Host ĊĊĠĠĠ Ġprivate Ġclass ĠWriting Host Ġ: ĠTesting Host ( ĊĠĠĠĠĠĠĠ ĠJ vm Scheduler Provider ( Empty Coroutine Context ), ĊĠĠĠĠĠĠĠ Ġ:: Write Person . to Registration () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġclass ĠReading Host Ġ: ĠTesting Host ( ĊĠĠĠĠĠĠĠ ĠJ vm Scheduler Provider ( Empty Coroutine Context ), ĊĠĠĠĠĠĠĠ Ġ:: Read Person . to Registration () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĠReturn Ġthe Ġ[ Arc Host ] Ġthat Ġcontains Ġ[ Read Person ]. Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġreading Host (): ĠTesting Host Ġ= ĠReading Host () ĊĊĠĠĠ Ġ/** ĠReturn Ġthe Ġ[ Arc Host ] Ġthat Ġcontains Ġ[ Write Person ]. Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġwriting Host (): ĠTesting Host Ġ= ĠWriting Host () ĊĊĠĠĠ Ġ/** ĠReturn Ġthe Ġ[ Arc Host ] Ġthat Ġcontains Ġall Ġis ol atable Ġ[ Particle ] s . Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġpure Host () Ġ= ĠTesting Jvm Prod Host ( scheduler Provider ) ĊĊĠĠĠ Ġopen Ġval Ġstorage Capability Ġ= ĠCap abilities ( Share able ( true )) ĊĊĠĠĠ Ġopen Ġfun Ġrun Allocator Test ( ĊĠĠĠĠĠĠĠ Ġcoroutine Context : ĠCor outine Context Ġ= ĠEmpty Coroutine Context , ĊĠĠĠĠĠĠĠ Ġtest Body : Ġsuspend ĠCor outine Scope . () Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ= Ġrun Blocking ( coroutine Context ) Ġ{ Ġtest Body () Ġ} ĊĊĠĠĠ Ġopen Ġsuspend Ġfun Ġhost Registry (): ĠHost Registry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġregistry Ġ= ĠExplicit Host Registry () ĊĠĠĠĠĠĠĠ Ġregistry . register Host ( reading External Host ) ĊĠĠĠĠĠĠĠ Ġregistry . register Host ( writing External Host ) ĊĠĠĠĠĠĠĠ Ġregistry . register Host ( pure Host ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġregistry ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġopen Ġfun ĠsetUp () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ ĠRam Disk . clear () ĊĠĠĠĠĠĠĠ ĠDriver And Key Configurator . configure Key Parsers () ĊĠĠĠĠĠĠĠ ĠRam Disk Driver Provider () ĊĊĠĠĠĠĠĠĠ Ġreading External Host Ġ= Ġreading Host () ĊĠĠĠĠĠĠĠ Ġwriting External Host Ġ= Ġwriting Host () ĊĠĠĠĠĠĠĠ Ġpure Host Ġ= Ġpure Host () ĊĊĠĠĠĠĠĠĠ Ġhost Registry Ġ= Ġhost Registry () ĊĠĠĠĠĠĠĠ Ġallocator Ġ= ĠAllocator . create ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost Registry , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntity Handle Manager ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ= ĠFake Time (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscheduler Ġ= Ġscheduler Provider (" allocator ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġread Person Particle Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NotNull ( Person Plan . particles . find Ġ{ Ġit . particle Name Ġ== Ġ" Read Person " Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No ĠRead Person Ġparticle Ġin ĠPerson Plan " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwrite Person Particle Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NotNull ( Person Plan . particles . find Ġ{ Ġit . particle Name Ġ== Ġ" Write Person " Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No ĠWrite Person Ġparticle Ġin ĠPerson Plan " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreading External Host . setup () ĊĠĠĠĠĠĠĠ Ġpure Host . setup () ĊĠĠĠĠĠĠĠ Ġwriting External Host . setup () ĊĠĠĠĠĠĠĠ ĠWrite Person . throws Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġassert All Status ( ĊĠĠĠĠĠĠĠ Ġarc : ĠArc , ĊĠĠĠĠĠĠĠ Ġarc State : ĠArc State ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( arc . partitions . isNotEmpty ()) Ġ{ Ġ" No Ġpartitions Ġfor Ġ${ arc . id } "} ĊĠĠĠĠĠĠĠ Ġarc . partitions . forEach Ġ{ Ġpartition Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhost Id Ġ= Ġpartition . arc Host ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost Id . contains (" Reading ") Ġ-> Ġreading External Host . lookup Arc Host Status ( partition ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost Id . contains (" Prod ") Ġ-> Ġpure Host . lookup Arc Host Status ( partition ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost Id . contains (" Writing ") Ġ-> Ġwriting External Host . lookup Arc Host Status ( partition ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unknown Ġ${ partition . arc Host }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( status ). isEqualTo ( arc State ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTests Ġthat Ġthe ĠRecipe Ġis Ġproperly Ġpartition ed Ġso Ġthat Ġ[ Reading Host ] Ġcontains Ġonly ĊĠĠĠĠ Ġ* Ġ[ Read Person ] Ġwith Ġassociated Ġhandles Ġand Ġconnections , Ġand Ġ[ Writing Host ] Ġcontains Ġonly ĊĠĠĠĠ Ġ* Ġ[ Write Person ] Ġwith Ġassociated Ġhandles Ġand Ġconnections . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġopen Ġfun Ġallocator _ compute Partitions () Ġ= Ġrun Allocator Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarc Ġ= Ġallocator . start Arc For Plan ( Person Plan ). waitFor Start () ĊĊĠĠĠĠĠĠĠ Ġval Ġreading Host Ġ= Ġrequire NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost Registry . available Arc Hosts (). first Ġ{ Ġit . host Id . contains (" Reading ") Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġwriting Host Ġ= Ġrequire NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost Registry . available Arc Hosts (). first Ġ{ Ġit . host Id . contains (" Writing ") Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġprod Host Ġ= Ġrequire NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost Registry . available Arc Hosts (). first Ġ{ Ġit . host Id . contains (" Prod ") Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġall Storage Key Lens Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlan . Particle . handles Lens . traverse () Ġ+ ĠPlan . Handle Connection . storage Key Lens ĊĊĠĠĠĠĠĠĠ Ġ// Ġfetch Ġthe Ġallocator Ġreplaced Ġkey ĊĠĠĠĠĠĠĠ Ġval Ġread Person Key Ġ= Ġfind Partition For ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarc . partitions , Ġ" Read Person " ĊĠĠĠĠĠĠĠ Ġ). particles [ 0 ]. handles [" person "] ?. storage Key !! ĊĊĠĠĠĠĠĠĠ Ġval Ġwrite Person Key Ġ= Ġfind Partition For ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarc . partitions , Ġ" Write Person " ĊĠĠĠĠĠĠĠ Ġ). particles [ 0 ]. handles [" person "] ?. storage Key !! ĊĊĠĠĠĠĠĠĠ Ġval Ġpure Partition Ġ= Ġfind Partition For ( arc . partitions , Ġ" Pure Person ") ĊĊĠĠĠĠĠĠĠ Ġval Ġstorage Key Lens Ġ= ĠPlan . Handle Connection . storage Key Lens ĊĊĠĠĠĠĠĠĠ ĠassertThat ( arc . partitions ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlan . Partition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarc . id . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreading Host . host Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreplace Ġthe ĠCre atable Keys Ġwith Ġthe Ġallocated Ġkeys ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( all Storage Key Lens . mod ( read Person Particle ) Ġ{ Ġread Person Key Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlan . Partition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarc . id . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprod Host . host Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreplace Ġthe ĠCre atable Keys Ġwith Ġthe Ġallocated Ġkeys ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Plan . Particle . handles Lens . mod ( pure Partition . particles [ 0 ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" input Person " Ġto Ġstorage Key Lens . mod ( it [" input Person "] !! ) Ġ{ Ġwrite Person Key Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" output Person " Ġto Ġstorage Key Lens . mod ( it [" output Person "] !! ) Ġ{ Ġread Person Key Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlan . Partition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarc . id . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriting Host . host Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreplace Ġthe ĠCre atable Keys Ġwith Ġthe Ġallocated Ġkeys ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( all Storage Key Lens . mod ( write Person Particle ) Ġ{ Ġwrite Person Key Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġopen Ġfun Ġallocator _ verify Storage Keys Created () Ġ= Ġrun Allocator Test Ġ{ ĊĠĠĠĠĠĠĠ ĠPerson Plan . particles . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . handles . forEach Ġ{ Ġ(_, Ġconnection ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( connection . storage Key ). isInstanceOf ( Cre atable Storage Key :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog (" Plan Ġhandles Ġare Ġusing Ġcorrect Ġstorage Ġkeys ") ĊĠĠĠĠĠĠĠ Ġval Ġarc Ġ= Ġallocator . start Arc For Plan ( Person Plan ). waitFor Start () ĊĊĠĠĠĠĠĠĠ Ġlog (" Arc Ġstarted .") ĊĠĠĠĠĠĠĠ Ġarc . partitions . flatMap Ġ{ Ġit . particles Ġ}. forEach Ġ{ Ġparticle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparticle . handles . forEach Ġ{ Ġ(_, Ġconnection ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( connection . storage Key ). isNot InstanceOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCre atable Storage Key :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog (" Particle Ġhandles Ġare Ġusing Ġcorrect Ġstorage Ġkey Ġtypes ") ĊĠĠĠĠĠĠĠ Ġval Ġread Partition Ġ= Ġfind Partition For ( arc . partitions , Ġ" Read Person ") ĊĠĠĠĠĠĠĠ Ġval Ġpure Partition Ġ= Ġfind Partition For ( arc . partitions , Ġ" Pure Person ") ĊĠĠĠĠĠĠĠ Ġval Ġwrite Partition Ġ= Ġfind Partition For ( arc . partitions , Ġ" Write Person ") ĊĊĠĠĠĠĠĠĠ ĠassertThat ( read Partition . particles [ 0 ]. handles [" person "] ?. storage Key ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpure Partition . particles [ 0 ]. handles [" output Person "] ?. storage Key ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( write Partition . particles [ 0 ]. handles [" person "] ?. storage Key ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpure Partition . particles [ 0 ]. handles [" input Person "] ?. storage Key ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( pure Partition . particles [ 0 ]. handles [" input Person "] ?. storage Key ). isNot EqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpure Partition . particles [ 0 ]. handles [" output Person "] ?. storage Key ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Partition For ( ĊĠĠĠĠĠĠĠ Ġpartitions : ĠList < Plan . Partition >, ĊĠĠĠĠĠĠĠ Ġparticle Name : ĠString ĊĠĠĠ Ġ) Ġ= Ġpartitions . find Ġ{ Ġpartition Ġ-> ĊĠĠĠĠĠĠĠ Ġpartition . particles . any Ġ{ Ġit . particle Name Ġ== Ġparticle Name Ġ} ĊĠĠĠ Ġ} !! ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġopen Ġfun Ġallocator _ verify Storage Keys Not Over written () Ġ= Ġrun Allocator Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Generator Ġ= ĠId . Generator . new Session () ĊĠĠĠĠĠĠĠ Ġval Ġtest Arc Id Ġ= Ġid Generator . new Arc Id (" Test ") ĊĠĠĠĠĠĠĠ ĠVol atile Driver Provider ( test Arc Id ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresolver Ġ= ĠCap abilities Resolver ( Capabilities Resolver . Options ( test Arc Id )) ĊĠĠĠĠĠĠĠ Ġval Ġinput Person Ġ= Ġresolver . create Storage Key ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCap abilities . from Annotation ( Annotation . create Capability (" t ied To Arc ")), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntityType ( person Schema ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" input Person " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġoutput Person Ġ= Ġresolver . create Storage Key ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCap abilities . from Annotation ( Annotation . create Capability (" t ied To Arc ")), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntityType ( person Schema ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" output Person " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġall Storage Key Lens Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlan . particle Lens . traverse () Ġ+ ĠPlan . Particle . handles Lens . traverse () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlan . Handle Connection . storage Key Lens ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Plan Ġ= Ġall Storage Key Lens . mod ( Person Plan ) Ġ{ Ġstorage Key Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Key Ġas ĠCre atable Storage Key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( storage Key . name From Manifest ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" input Person " Ġ-> Ġinput Person ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" output Person " Ġ-> Ġoutput Person ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġstorage Key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġarc Ġ= Ġallocator . start Arc For Plan ( test Plan ). waitFor Start () ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Keys Ġ= ĠlistOf ( input Person , Ġoutput Person ) ĊĊĠĠĠĠĠĠĠ Ġarc . partitions . flatMap Ġ{ Ġit . particles Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparticle Ġ-> Ġparticle . handles . forEach Ġ{ Ġ(_, Ġconnection ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( connection . storage Key ). isIn ( test Keys ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġopen Ġfun Ġallocator _ verify Arc Host Start Called () Ġ= Ġrun Allocator Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarc Ġ= Ġallocator . start Arc For Plan ( Person Plan ). waitFor Start () ĊĊĠĠĠĠĠĠĠ Ġval Ġreading Host Ġ= Ġrequire NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost Registry . available Arc Hosts (). first Ġ{ Ġit . host Id . contains (" Reading ") Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġwriting Host Ġ= Ġrequire NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost Registry . available Arc Hosts (). first Ġ{ Ġit . host Id . contains (" Writing ") Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġprod Host Ġ= Ġrequire NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost Registry . available Arc Hosts (). first Ġ{ Ġit . host Id . contains (" Prod ") Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġarc . partitions . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhost Ġ= Ġallocator . lookup Arc Host ( it . arc Host ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( host . host Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreading Host . host Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( reading External Host . started ). contains Exactly ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriting Host . host Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( writing External Host . started ). contains Exactly ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprod Host . host Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( pure Host . started ). contains Exactly ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġallocator _ verify Unknown Particle Throws () Ġ= Ġrun Allocator Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparticle Lens Ġ= ĠPlan . particle Lens . traverse () ĊĊĠĠĠĠĠĠĠ Ġval Ġplan Ġ= Ġparticle Lens . mod ( Person Plan ) Ġ{ Ġparticle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparticle . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparticle Name Ġ= Ġ" Unknown Ġ${ particle . particle Name }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Ġ= Ġ" unknown .${ particle . location }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġassert Sus pending Throws ( Particle NotFoundException :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġallocator . start Arc For Plan ( plan ). waitFor Start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġopen Ġfun Ġallocator _ can Start Arc In Two External Hosts () Ġ= Ġrun Allocator Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarc Ġ= Ġallocator . start Arc For Plan ( Person Plan ) ĊĠĠĠĠĠĠĠ Ġval Ġarc Id Ġ= Ġarc . id ĊĊĠĠĠĠĠĠĠ Ġarc . waitFor Start () ĊĊĠĠĠĠĠĠĠ ĠassertThat ( reading External Host . started . size ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( writing External Host . started . size ). isEqualTo ( 1 ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( arc . partitions ). contains ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreading External Host . started . first () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( arc . partitions ). contains ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriting External Host . started . first () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġreading Context Ġ= Ġrequire NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreading External Host . arc Host Context ( arc Id . toString ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġwriting Context Ġ= Ġrequire NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriting External Host . arc Host Context ( arc Id . toString ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġassert All Status ( arc , ĠArc State . Running ) ĊĊĠĠĠĠĠĠĠ Ġval Ġread Person Context Ġ= Ġrequire NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreading Context . particles [ read Person Particle . particle Name ] ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġwrite Person Context Ġ= Ġrequire NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriting Context . particles [ write Person Particle . particle Name ] ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( read Person Context . particle State ). isEqualTo ( Particle State . Running ) ĊĠĠĠĠĠĠĠ ĠassertThat ( write Person Context . particle State ). isEqualTo ( Particle State . Running ) ĊĊĠĠĠĠĠĠĠ Ġwrite Person Context . particle . let Ġ{ Ġparticle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparticle Ġas ĠWrite Person ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparticle . await () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( particle . first Start Called ). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( particle . w rote ). isTrue () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġread Person Context . particle . let Ġ{ Ġparticle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparticle Ġas ĠRead Person ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparticle . await () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( particle . first Start Called ). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( particle . name ). isEqualTo (" Hello ĠJohn ĠW ick ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġopen Ġfun Ġallocator _ can Stop Arc In Two External Hosts () Ġ= Ġrun Allocator Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarc Ġ= Ġallocator . start Arc For Plan ( Person Plan ). waitFor Start () ĊĊĠĠĠĠĠĠĠ Ġval Ġreading Context Ġ= Ġrequire NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreading External Host . arc Host Context ( arc . id . toString ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġwriting Context Ġ= Ġrequire NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriting External Host . arc Host Context ( arc . id . toString ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġassert All Status ( arc , ĠArc State . Running ) ĊĊĠĠĠĠĠĠĠ Ġarc . stop () ĊĠĠĠĠĠĠĠ Ġarc . waitFor Stop () ĊĊĠĠĠĠĠĠĠ Ġassert All Status ( arc , ĠArc State . Stopped ) ĊĊĠĠĠĠĠĠĠ Ġval Ġread Person Context Ġ= Ġrequire NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreading Context . particles [ read Person Particle . particle Name ] ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġwrite Person Context Ġ= Ġrequire NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriting Context . particles [ write Person Particle . particle Name ] ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( read Person Context . particle State ). isEqualTo ( Particle State . Stopped ) ĊĠĠĠĠĠĠĠ ĠassertThat ( write Person Context . particle State ). isEqualTo ( Particle State . Stopped ) ĊĊĠĠĠĠĠĠĠ ĠassertThat (( write Person Context . particle Ġas ĠWrite Person ). shutdown Called ). isTrue () ĊĠĠĠĠĠĠĠ ĠassertThat (( read Person Context . particle Ġas ĠRead Person ). shutdown Called ). isTrue () ĊĊĠĠĠĠĠĠĠ ĠassertThat ( reading External Host . is Idle ). isTrue () ĊĠĠĠĠĠĠĠ ĠassertThat ( writing External Host . is Idle ). isTrue () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġopen Ġfun Ġallocator _ restart Arc In Two External Hosts () Ġ= Ġrun Allocator Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarc Ġ= Ġallocator . start Arc For Plan ( Person Plan ) ĊĠĠĠĠĠĠĠ Ġval Ġarc Id Ġ= Ġarc . waitFor Start (). id ĊĊĠĠĠĠĠĠĠ Ġassert All Status ( arc , ĠArc State . Running ) ĊĊĠĠĠĠĠĠĠ Ġarc . stop () ĊĠĠĠĠĠĠĠ Ġarc . waitFor Stop () ĊĊĠĠĠĠĠĠĠ Ġassert All Status ( arc , ĠArc State . Stopped ) ĊĊĠĠĠĠĠĠĠ Ġval Ġarc 2 Ġ= Ġallocator . start Arc For Plan ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlan ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPerson Plan . particles , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Annotation . create Arc Id ( arc Id . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġarc 2 . waitFor Start () ĊĊĠĠĠĠĠĠĠ Ġval Ġreading Context After Ġ= Ġrequire NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreading External Host . arc Host Context ( arc Id . toString ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġwriting Context After Ġ= Ġrequire NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriting External Host . arc Host Context ( arc Id . toString ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġassert All Status ( arc , ĠArc State . Running ) ĊĊĠĠĠĠĠĠĠ Ġval Ġread Person Context Ġ= Ġrequire NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreading Context After . particles [ read Person Particle . particle Name ] ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġwrite Person Context Ġ= Ġrequire NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriting Context After . particles [ write Person Particle . particle Name ] ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( read Person Context . particle State ). isEqualTo ( Particle State . Running ) ĊĠĠĠĠĠĠĠ ĠassertThat ( write Person Context . particle State ). isEqualTo ( Particle State . Running ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġon First Start () Ġnot Ġcalled Ġa Ġsecond Ġtime ĊĠĠĠĠĠĠĠ ĠassertThat (( write Person Context . particle Ġas ĠWrite Person ). first Start Called ). isFalse () ĊĠĠĠĠĠĠĠ ĠassertThat (( read Person Context . particle Ġas ĠRead Person ). first Start Called ). isFalse () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġopen Ġfun Ġallocator _ start From One Allocator And Stop In Another () Ġ= Ġrun Allocator Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarc Ġ= Ġallocator . start Arc For Plan ( Person Plan ). waitFor Start () ĊĊĠĠĠĠĠĠĠ Ġval Ġreading Context Ġ= Ġrequire NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreading External Host . arc Host Context ( arc . id . toString ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġwriting Context Ġ= Ġrequire NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriting External Host . arc Host Context ( arc . id . toString ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġassert All Status ( arc , ĠArc State . Running ) ĊĊĠĠĠĠĠĠĠ Ġval Ġallocator 2 Ġ= ĠAllocator . create ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost Registry , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntity Handle Manager ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ= ĠFake Time (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscheduler Ġ= Ġscheduler Provider (" allocator 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġallocator 2 . stop Arc ( arc . id ) ĊĠĠĠĠĠĠĠ Ġarc . waitFor Stop () ĊĊĠĠĠĠĠĠĠ ĠassertThat ( reading Context . arc State ). isEqualTo ( Arc State . Stopped ) ĊĠĠĠĠĠĠĠ ĠassertThat ( writing Context . arc State ). isEqualTo ( Arc State . Stopped ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġopen Ġfun Ġallocator _ does nt Create Arc s On Duplicate Start Arc () Ġ= Ġrun Allocator Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarc Ġ= Ġallocator . start Arc For Plan ( Person Plan ). waitFor Start () ĊĊĠĠĠĠĠĠĠ Ġassert All Status ( arc , ĠArc State . Running ) ĊĊĠĠĠĠĠĠĠ Ġreading External Host . stop Arc ( reading External Host . started . first ()) ĊĠĠĠĠĠĠĠ Ġpure Host . stop Arc ( pure Host . started . first ()) ĊĠĠĠĠĠĠĠ Ġwriting External Host . stop Arc ( writing External Host . started . first ()) ĊĊĠĠĠĠĠĠĠ Ġarc . waitFor Stop () ĊĠĠĠĠĠĠĠ Ġassert All Status ( arc , ĠArc State . Stopped ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġer ases Ġthe Ġinternally Ġheld - in - memory - cache ĠArc Host Ġstate Ġsim ulating Ġa Ġcrash ĊĠĠĠĠĠĠĠ Ġreading External Host . setup () ĊĠĠĠĠĠĠĠ Ġpure Host . setup () ĊĠĠĠĠĠĠĠ Ġwriting External Host . setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġarc 2 Ġ= Ġallocator . start Arc For Plan ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlan ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPerson Plan . particles , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Annotation . create Arc Id ( arc . id . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġarc 2 . waitFor Stop () ĊĠĠĠĠĠĠĠ ĠassertThat ( arc . arc State ). isEqualTo ( Arc State . Stopped ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġopen Ġfun Ġallocator _ start Arc _ particle Exception _ isError State () Ġ= Ġrun Allocator Test Ġ{ ĊĠĠĠĠĠĠĠ ĠWrite Person . throws Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġdeferred Ġ= ĠComp letable Deferred < Boolean >() ĊĠĠĠĠĠĠĠ Ġval Ġarc Ġ= Ġallocator . start Arc For Plan ( Person Plan ) ĊĠĠĠĠĠĠĠ Ġarc . onError Ġ{ Ġdeferred . complete ( true ) Ġ} ĊĠĠĠĠĠĠĠ Ġdeferred . await () ĊĠĠĠĠĠĠĠ ĠassertThat ( writing External Host . arc Host Context ( arc . id . toString ()) ?. arc State ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArc State . Error ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġopen Ġfun Ġallocator _ start Arc _ particle Exception _ fails WaitFor Start () Ġ= Ġrun Allocator Test Ġ{ ĊĠĠĠĠĠĠĠ ĠWrite Person . throws Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġarc Ġ= Ġallocator . start Arc For Plan ( Person Plan ) ĊĊĠĠĠĠĠĠĠ Ġassert Sus pending Throws ( Arc . Arc ErrorException :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarc . waitFor Start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ