// ĠCopyright Ġ 2 0 2 0 ĠThe ĠCross - Media ĠMeasurement ĠAuthors Ċ // Ċ // Ġ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 Ġorg . wf an et . measurement . integration . g cloud Ċ Ċ import Ġcom . google . cloud . storage . contrib . nio . testing . LocalStorage Helper Ċ import Ġjava . time . Duration Ċ import Ġorg . junit . runner . Description Ċ import Ġorg . junit . runners . model . Statement Ċ import Ġorg . wf an et . measurement . common . identity . Random Id Generator Ċ import Ġorg . wf an et . measurement . common . testing . Provider Rule Ċ import Ġorg . wf an et . measurement . common . testing . chain Rules Se quent ially Ċ import Ġorg . wf an et . measurement . du ch y . daemon . mill . Crypto Key Set Ċ import Ġorg . wf an et . measurement . du ch y . db . computation . Computation Protocol Stage Details Ċ import Ġorg . wf an et . measurement . du ch y . db . computation . Computation Protocol Stages Ċ import Ġorg . wf an et . measurement . du ch y . db . computation . Computation Protocol Stages Enum Helper Ċ import Ġorg . wf an et . measurement . du ch y . db . computation . Computation Types Ċ import Ġorg . wf an et . measurement . du ch y . db . computation . Comp ut ations Database Ċ import Ġorg . wf an et . measurement . du ch y . db . computation . Comp ut ations Database Reader Ċ import Ġorg . wf an et . measurement . du ch y . db . computation . Comp ut ations Database Trans actor Ċ import Ġorg . wf an et . measurement . du ch y . db . metric value . Metric Value Database Ċ import Ġorg . wf an et . measurement . du ch y . deploy . g cloud . spanner . Sp anner Metric Value Database Ċ import Ġorg . wf an et . measurement . du ch y . deploy . g cloud . spanner . computation . Computation Mut ations Ċ import Ġorg . wf an et . measurement . du ch y . deploy . g cloud . spanner . computation . G cp Sp anner Comp ut ations Database Reader Ċ import Ġorg . wf an et . measurement . du ch y . deploy . g cloud . spanner . computation . G cp Sp anner Comp ut ations Database Trans actor Ċ import Ġorg . wf an et . measurement . du ch y . deploy . g cloud . spanner . testing . COMP UT ATIONS _ SCHEMA Ċ import Ġorg . wf an et . measurement . du ch y . deploy . g cloud . spanner . testing . METRIC _ VALUES _ SCHEMA Ċ import Ġorg . wf an et . measurement . du ch y . testing . DU CH Y _ IDS Ċ import Ġorg . wf an et . measurement . du ch y . testing . DU CH Y _ PUBLIC _ KEYS Ċ import Ġorg . wf an et . measurement . du ch y . testing . DU CH Y _ SECRET _ KEYS Ċ import Ġorg . wf an et . measurement . g cloud . g cs . G cs Storage Client Ċ import Ġorg . wf an et . measurement . g cloud . spanner . Async Database Client Ċ import Ġorg . wf an et . measurement . g cloud . spanner . testing . Sp anner Em ulator Database Rule Ċ import Ġorg . wf an et . measurement . integration . common . In Process D uch y Ċ import Ġorg . wf an et . measurement . internal . du ch y . Computation Details Ċ import Ġorg . wf an et . measurement . internal . du ch y . Computation Stage Ċ import Ġorg . wf an et . measurement . internal . du ch y . Computation Stage Details Ċ import Ġorg . wf an et . measurement . internal . du ch y . Computation TypeEnum . Computation Type Ċ import Ġorg . wf an et . measurement . internal . du ch y . El G amal KeyPair Ċ import Ġorg . wf an et . measurement . storage . Storage Client Ċ Ċ private Ġtype alias ĠComput ations Db Ġ= ĊĠ ĠComput ations Database Trans actor < ĊĠĠĠ ĠComp utation Type , ĠComp utation Stage , ĠComp utation Stage Details , ĠComp utation Details > Ċ Ċ class ĠD uch y Dependency Provider Rule ( du ch y Ids : ĠIterable < String >) Ġ: ĊĠ ĠProvider Rule <( String ) Ġ-> ĠIn Process D uch y . D uch y Dependencies > Ġ{ ĊĠ Ġoverride Ġval Ġvalue : Ġ( String ) Ġ-> ĠIn Process D uch y . D uch y Dependencies Ġ= Ġthis :: build D uch y Dependencies ĊĊĠ Ġprivate Ġval Ġmetric Value Database Rules Ġ= ĊĠĠĠ Ġd uch y Ids . map Ġ{ Ġit Ġto ĠSp anner Em ulator Database Rule ( METRIC _ VALUES _ SCHEMA ) Ġ}. toMap () ĊĊĠ Ġprivate Ġval Ġcomput ations Database Rules Ġ= ĊĠĠĠ Ġd uch y Ids . map Ġ{ Ġit Ġto ĠSp anner Em ulator Database Rule ( COMP UT ATIONS _ SCHEMA ) Ġ}. toMap () ĊĊĠ Ġoverride Ġfun Ġapply ( base : ĠStatement , Ġdescription : ĠDescription ): ĠStatement Ġ{ ĊĠĠĠ Ġval Ġrules Ġ= Ġmetric Value Database Rules . values Ġ+ Ġcomput ations Database Rules . values ĊĠĠĠ Ġreturn Ġchain Rules Se quent ially ( rules ). apply ( base , Ġdescription ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġbuild D uch y Dependencies ( du ch y Id : ĠString ): ĠIn Process D uch y . D uch y Dependencies Ġ{ ĊĠĠĠ Ġval Ġmetric Value Database Ġ= ĊĠĠĠĠĠ Ġmetric Value Database Rules [ du ch y Id ] ĊĠĠĠĠĠĠĠ Ġ?: Ġerror (" Missing ĠMetric Value ĠSp anner Ġdatabase Ġfor Ġd uch y Ġ$ du ch y Id ") ĊĠĠĠ Ġval Ġcomput ations Database Ġ= ĊĠĠĠĠĠ Ġcomput ations Database Rules [ du ch y Id ] ĊĠĠĠĠĠĠĠ Ġ?: Ġerror (" Missing ĠComput ations ĠSp anner Ġdatabase Ġfor Ġd uch y Ġ$ du ch y Id ") ĊĊĠĠĠ Ġreturn ĠIn Process D uch y . D uch y Dependencies ( ĊĠĠĠĠĠ Ġbuild Comp ut ations Db ( du ch y Id , Ġcomput ations Database . database Client ), ĊĠĠĠĠĠ Ġbuild Metric Value Db ( metric Value Database . database Client ), ĊĠĠĠĠĠ Ġbuild Storage Client ( du ch y Id ), ĊĠĠĠĠĠ ĠD UCH Y _ PUBLIC _ KEYS , ĊĠĠĠĠĠ Ġbuild Crypto Key Set ( du ch y Id ) ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġbuild Comp ut ations Db ( ĊĠĠĠ Ġd uch y Id : ĠString , ĊĠĠĠ Ġcomput ations Database Client : ĠAsync Database Client ĊĠ Ġ): ĠComput ations Database Ġ{ ĊĠĠĠ Ġval Ġother D uch y Names Ġ= Ġ( DU CH Y _ IDS . toSet () Ġ- Ġd uch y Id ). toList () ĊĠĠĠ Ġval Ġprotocol Stage Enum Helper Ġ= ĠComp utation Protocol Stages ĊĠĠĠ Ġval Ġstage Details Ġ= ĠComp utation Protocol Stage Details ( other D uch y Names ) ĊĠĠĠ Ġval ĠreadOnly Db Ġ= ĊĠĠĠĠĠ ĠG cp Sp anner Comp ut ations Database Reader ( comp ut ations Database Client , Ġprotocol Stage Enum Helper ) ĊĠĠĠ Ġval Ġcomput ations Db : ĠComput ations Db Ġ= ĊĠĠĠĠĠ ĠG cp Sp anner Comp ut ations Database Trans actor ( ĊĠĠĠĠĠĠĠ Ġdatabase Client Ġ= Ġcomput ations Database Client , ĊĠĠĠĠĠĠĠ Ġcomputation Mut ations Ġ= ĊĠĠĠĠĠĠĠĠĠ ĠComp utation Mut ations ( Computation Types , Ġprotocol Stage Enum Helper , Ġstage Details ), ĊĠĠĠĠĠĠĠ Ġlock Duration Ġ= ĠDuration . of Seconds ( 1 ) ĊĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġreturn Ġobject Ġ: ĊĠĠĠĠĠ ĠComput ations Database , ĊĠĠĠĠĠ ĠComput ations Database Reader Ġby ĠreadOnly Db , ĊĠĠĠĠĠ ĠComput ations Db Ġby Ġcomput ations Db , ĊĠĠĠĠĠ ĠComp utation Protocol Stages Enum Helper < ĊĠĠĠĠĠĠĠ ĠComp utation Type , ĠComp utation Stage > Ġby Ġprotocol Stage Enum Helper Ġ{} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġbuild Metric Value Db ( database Client : ĠAsync Database Client ): ĠMetric Value Database Ġ{ ĊĠĠĠ Ġreturn ĠSp anner Metric Value Database ( database Client , ĠRandom Id Generator ()) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġbuild Storage Client ( du ch y Id : ĠString ): ĠStorage Client Ġ{ ĊĠĠĠ Ġreturn ĠG cs Storage Client ( LocalStorage Helper . getOptions (). service , Ġ" bucket -$ du ch y Id ") ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġbuild Crypto Key Set ( du ch y Id : ĠString ): ĠCrypto Key Set Ġ{ ĊĠĠĠ Ġval Ġlatest D uch y Public Keys Ġ= ĠD UCH Y _ PUBLIC _ KEYS . latest ĊĠĠĠ Ġreturn ĠCrypto Key Set ( ĊĠĠĠĠĠ Ġown Public And Private Keys Ġ= ĊĠĠĠĠĠĠĠ ĠEl G amal KeyPair . newBuilder () ĊĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠpublicKey Ġ= Ġlatest D uch y Public Keys . getValue ( du ch y Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecret Key Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcheckNotNull ( DU CH Y _ SECRET _ KEYS [ du ch y Id ]) Ġ{ Ġ" Secret Ġkey Ġnot Ġfound Ġfor Ġ$ du ch y Id " Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. build (), ĊĠĠĠĠĠ Ġall D uch y Public Keys Ġ= Ġlatest D uch y Public Keys . map Values Ġ{ Ġit . value Ġ}, ĊĠĠĠĠĠ Ġclient PublicKey Ġ= Ġlatest D uch y Public Keys . combined PublicKey , ĊĠĠĠĠĠ Ġcurve Id Ġ= Ġlatest D uch y Public Keys . curve Id ĊĠĠĠ Ġ) ĊĠ Ġ} Ċ } Ċ