package Ġar cs . core . storage Ċ Ċ import Ġar cs . core . cr dt . Cr dt Data Ċ import Ġar cs . core . cr dt . Cr dt Operation Ċ import Ġar cs . core . util . Tagged Log Ċ import Ġkotlinx . coroutines . Comp letable Job Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ Ċ /** Ċ Ġ* Ġ[ Store Endpoint Fake ] Ġexists Ġto Ġcapture Ġcalls Ġmade Ġto Ġ[ Store ] Ġfor Ġunit Ġtests . ĠThis Ġis Ġneeded Ċ Ġ* Ġbecause ĠGoogle 3 's ĠMockito Ġis Ġincompatible Ġwith Ġsuspend Ġfunctions . Ċ Ġ*/ Ċ @ Suppress (" EXPERIMENT AL _ API _ USAGE ") Ċ class ĠStore Endpoint Fake < Data Ġ: ĠCr dt Data , ĠOp Ġ: ĠCr dt Operation , ĠT > Ġ: ĊĠĠĠ ĠStorage Communication Endpoint < Data , ĠOp , ĠT > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠTag ged Log Ġ{ Ġ" Store Endpoint Fake " Ġ} ĊĠĠĠ Ġprivate Ġvar Ġproxy Messages Ġ= Ġempty List < Proxy Message < Data , ĠOp , ĠT >>() ĊĠĠĠ Ġprivate Ġval Ġtarget Mutex Ġ= ĠMutex () ĊĠĠĠ Ġprivate Ġvar Ġtarget : ĠTarget < Data , ĠOp , ĠT >? Ġ= Ġnull ĊĠĠĠ Ġvar Ġclosed Ġ= Ġfalse ĊĊĠĠĠ Ġ// ĠTests Ġcan Ġchange Ġthis Ġfield Ġto Ġalter Ġthe Ġvalue Ġreturned Ġby Ġ` on Proxy Message `. ĊĠĠĠ Ġvar Ġon Proxy Message Return Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġidle () Ġ= ĠUnit ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġon Proxy Message ( message : ĠProxy Message < Data , ĠOp , ĠT >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtarget Mutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy Messages Ġ= Ġproxy Messages Ġ+ Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" on Proxy Message ($ message ) Ġ- Ġcurrent Ġvalue : Ġ$ proxy Messages " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġthis . target Ġ?: Ġreturn @ with Lock ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target . messages . endsWith ( proxy Messages )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget . job . complete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġon Proxy Message Return ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġget Proxy Messages () Ġ: ĠList < Proxy Message < Data , ĠOp , ĠT >> Ġ= Ġtarget Mutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠ Ġproxy Messages ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġclear Proxy Messages () Ġ= Ġtarget Mutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" clear Proxy Messages ()" Ġ} ĊĠĠĠĠĠĠĠ Ġproxy Messages Ġ= Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun ĠwaitFor ( var arg Ġmessages : ĠProxy Message < Data , ĠOp , ĠT >) Ġ{ ĊĠĠĠĠĠĠĠ Ġtarget Mutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage List Ġ= Ġmessages . toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( proxy Messages . endsWith ( message List )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" waitFor ($ message List ) Ġ- Ġfound Ġa Ġmatch Ġin Ġcurrent Ġvalue : Ġ$ proxy Messages " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Lock ĠJob (). also Ġ{ Ġit . complete () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Ġ= ĠJob () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" waitFor ($ message List ) Ġ- Ġwaiting Ġfor Ġa Ġmatch , Ġcurrent Ġvalue : Ġ$ proxy Messages " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Ġ= ĠTarget ( message List , Ġjob ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob ĊĠĠĠĠĠĠĠ Ġ}. join () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġclosed Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠTarget < Data Ġ: ĠCr dt Data , ĠOp Ġ: ĠCr dt Operation , ĠT >( ĊĠĠĠĠĠĠĠ Ġval Ġmessages : ĠList < Proxy Message < Data , ĠOp , ĠT >>, ĊĠĠĠĠĠĠĠ Ġval Ġjob : ĠComp letable Job ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠAny > ĠList < T > ?. endsWith ( other : ĠList < T >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ== Ġnull ) Ġreturn Ġother . isEmpty () ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ< Ġother . size ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġtail Ġ= Ġsub List ( size Ġ- Ġother . size , Ġsize ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtail Ġ== Ġother ĊĠĠĠ Ġ} Ċ } Ċ