package Ġnet . cord a . node Ċ Ċ import Ġnet . cord a . contracts . asset . Cash Ċ import Ġnet . cord a . core . contracts .* Ċ import Ġnet . cord a . core . flows . StateMachine Run Id Ċ import Ġnet . cord a . core . node . services . Service Info Ċ import Ġnet . cord a . core . node . services . Vault Ċ import Ġnet . cord a . core . serialization . Opaque Bytes Ċ import Ġnet . cord a . core . transactions . Signed Transaction Ċ import Ġnet . cord a . flows . Cash Command Ċ import Ġnet . cord a . flows . Cash Flow Ċ import Ġnet . cord a . node . internal . C ord a RP CO ps Impl Ċ import Ġnet . cord a . node . services . User Ċ import Ġnet . cord a . node . services . messaging . CURRENT _ RPC _ USER Ċ import Ġnet . cord a . node . services . messaging . Permission Exception Ċ import Ġnet . cord a . node . services . messaging . StateMachine Update Ċ import Ġnet . cord a . node . services . messaging . start Flow Ċ import Ġnet . cord a . node . services . network . Network Map Service Ċ import Ġnet . cord a . node . services . start Flow Permission Ċ import Ġnet . cord a . node . services . transactions . Simple Not ary Service Ċ import Ġnet . cord a . node . utilities . database Transaction Ċ import Ġnet . cord a . testing . expect Ċ import Ġnet . cord a . testing . expect Events Ċ import Ġnet . cord a . testing . node . Mock Network Ċ import Ġnet . cord a . testing . node . Mock Network . Mock Node Ċ import Ġnet . cord a . testing . sequence Ċ import Ġorg . assertj . core . api . Assertions . assertThat Exception OfType Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġrx . Observable Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertFalse Ċ Ċ class ĠC ord a RP CO ps Impl Test Ġ{ ĊĊĠĠĠ Ġlateinit Ġvar Ġnetwork : ĠMock Network ĊĠĠĠ Ġlateinit Ġvar Ġalice Node : ĠMock Node ĊĠĠĠ Ġlateinit Ġvar Ġnot ary Node : ĠMock Node ĊĠĠĠ Ġlateinit Ġvar Ġrpc : ĠC ord a RP CO ps Impl ĊĠĠĠ Ġlateinit Ġvar Ġstate Machine Updates : ĠObservable < StateMachine Update > ĊĠĠĠ Ġlateinit Ġvar Ġtransactions : ĠObservable < Signed Transaction > ĊĠĠĠ Ġlateinit Ġvar Ġvault Updates : ĠObservable < Vault . Update > ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġnetwork Ġ= ĠMock Network () ĊĠĠĠĠĠĠĠ Ġval Ġnetwork Map Ġ= Ġnetwork . createNode ( advert ised Services Ġ= ĠService Info ( Network Map Service . type )) ĊĠĠĠĠĠĠĠ Ġalice Node Ġ= Ġnetwork . createNode ( network Map Address Ġ= Ġnetwork Map . info . address ) ĊĠĠĠĠĠĠĠ Ġnot ary Node Ġ= Ġnetwork . createNode ( advert ised Services Ġ= ĠService Info ( Simple Not ary Service . type ), Ġnetwork Map Address Ġ= Ġnetwork Map . info . address ) ĊĠĠĠĠĠĠĠ Ġrpc Ġ= ĠC ord a RP CO ps Impl ( alice Node . services , Ġalice Node . sm m , Ġalice Node . database ) ĊĠĠĠĠĠĠĠ ĠCURRENT _ RPC _ USER . set ( User (" user ", Ġ" pwd ", Ġpermissions Ġ= Ġset Of ( start Flow Permission < Cash Flow >() ))) ĊĊĠĠĠĠĠĠĠ Ġstate Machine Updates Ġ= Ġrpc . state Machines And Updates (). second ĊĠĠĠĠĠĠĠ Ġtransactions Ġ= Ġrpc . verified Transactions (). second ĊĠĠĠĠĠĠĠ Ġvault Updates Ġ= Ġrpc . vault And Updates (). second ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` cash Ġissue Ġaccepted `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquantity Ġ= Ġ 1 0 0 0 L ĊĠĠĠĠĠĠĠ Ġval Ġref Ġ= ĠO pa que Bytes ( ByteArray ( 1 ) Ġ{ Ġ 1 Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthe Ġmonitoring Ġservice Ġwallet Ġis Ġempty ĊĠĠĠĠĠĠĠ Ġdatabase Transaction ( alice Node . database ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( alice Node . services . vault Service . current Vault . states . iterator (). hasNext ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTell Ġthe Ġmonitoring Ġservice Ġnode Ġto Ġissue Ġsome Ġcash ĊĠĠĠĠĠĠĠ Ġval Ġrecipient Ġ= Ġalice Node . info . legal Identity ĊĠĠĠĠĠĠĠ Ġval Ġout Event Ġ= ĠCash Command . Issue Cash ( Amount ( quantity , ĠG BP ), Ġref , Ġrecipient , Ġnot ary Node . info . not ary Identity ) ĊĠĠĠĠĠĠĠ Ġrpc . start Flow (:: Cash Flow , Ġout Event ) ĊĠĠĠĠĠĠĠ Ġnetwork . run Network () ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected State Ġ= ĠCash . State ( Amount ( quantity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIss ued ( alice Node . info . legal Identity . ref ( ref ), ĠG BP )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipient . own ing Key ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġissue Sm Id : ĠState Machine Run Id ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġstate Machine Updates . expect Events Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsequence ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠISS UE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Ġ{ Ġadd : ĠState Machine Update . Added Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġissue Sm Id Ġ= Ġadd . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Ġ{ Ġremove : ĠState Machine Update . Removed Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( remove . id Ġ== Ġissue Sm Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtransactions . expect Events Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Ġ{ Ġtx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected State , Ġtx . tx . outputs . single (). data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvault Updates . expect Events Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Ġ{ Ġupdate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġupdate . pro duced . single (). state . data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected State , Ġactual ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` issue Ġand Ġmove `() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġrpc . start Flow (:: Cash Flow , ĠCash Command . Issue Cash ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġamount Ġ= ĠAmount ( 1 0 0 , ĠUSD ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġissue Ref Ġ= ĠO pa que Bytes ( ByteArray ( 1 , Ġ{ Ġ 1 Ġ})), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipient Ġ= Ġalice Node . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot ary Ġ= Ġnot ary Node . info . not ary Identity ĊĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠ Ġnetwork . run Network () ĊĊĠĠĠĠĠĠĠ Ġrpc . start Flow (:: Cash Flow , ĠCash Command . Pay Cash ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġamount Ġ= ĠAmount ( 1 0 0 , ĠIss ued ( Party And Reference ( alice Node . info . legal Identity , ĠO pa que Bytes ( ByteArray ( 1 , Ġ{ Ġ 1 Ġ})) ), ĠUSD )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipient Ġ= Ġalice Node . info . legal Identity ĊĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠ Ġnetwork . run Network () ĊĊĠĠĠĠĠĠĠ Ġvar Ġissue Sm Id : ĠState Machine Run Id ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġmove Sm Id : ĠState Machine Run Id ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġstate Machine Updates . expect Events Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsequence ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠISS UE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Ġ{ Ġadd : ĠState Machine Update . Added Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġissue Sm Id Ġ= Ġadd . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Ġ{ Ġremove : ĠState Machine Update . Removed Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( remove . id Ġ== Ġissue Sm Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMOVE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Ġ{ Ġadd : ĠState Machine Update . Added Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Sm Id Ġ= Ġadd . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Ġ{ Ġremove : ĠState Machine Update . Removed Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( remove . id Ġ== Ġmove Sm Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtransactions . expect Events Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsequence ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠISS UE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Ġ{ Ġtx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( tx . tx . inputs . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( tx . tx . outputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsignature Pub Keys Ġ= Ġtx . sigs . map Ġ{ Ġit . by Ġ}. toSet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly ĠAlice Ġsigned ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalice Key Ġ= Ġalice Node . info . legal Identity . own ing Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( signature Pub Keys . size Ġ<= Ġalice Key . keys . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( alice Key . is Ful filled By ( signature Pub Keys )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMOVE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Ġ{ Ġtx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( tx . tx . inputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( tx . tx . outputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsignature Pub Keys Ġ= Ġtx . sigs . map Ġ{ Ġit . by Ġ}. toSet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAlice Ġand ĠNot ary Ġsigned ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( alice Node . info . legal Identity . own ing Key . is Ful filled By ( signature Pub Keys )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( not ary Node . info . not ary Identity . own ing Key . is Ful filled By ( signature Pub Keys )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvault Updates . expect Events Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsequence ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠISS UE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Ġ{ Ġupdate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( update . consumed . size Ġ== Ġ 0 ) Ġ{ Ġupdate . consumed . size Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( update . pro duced . size Ġ== Ġ 1 ) Ġ{ Ġupdate . pro duced . size Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMOVE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Ġ{ Ġupdate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( update . consumed . size Ġ== Ġ 1 ) Ġ{ Ġupdate . consumed . size Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( update . pro duced . size Ġ== Ġ 1 ) Ġ{ Ġupdate . pro duced . size Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` cash Ġcommand Ġby Ġuser Ġnot Ġpermission ed Ġfor Ġcash `() Ġ{ ĊĠĠĠĠĠĠĠ ĠCURRENT _ RPC _ USER . set ( User (" user ", Ġ" pwd ", Ġpermissions Ġ= Ġempty Set ())) ĊĠĠĠĠĠĠĠ ĠassertThat Exception OfType ( Permission Exception :: class . java ). is Thrown By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrpc . start Flow (:: Cash Flow , ĠCash Command . Issue Cash ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġamount Ġ= ĠAmount ( 1 0 0 , ĠUSD ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġissue Ref Ġ= ĠO pa que Bytes ( ByteArray ( 1 , Ġ{ Ġ 1 Ġ})), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipient Ġ= Ġalice Node . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot ary Ġ= Ġnot ary Node . info . not ary Identity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ