package Ġcom . example . flow Ċ Ċ import Ġcom . example . model . BL Ċ import Ġcom . example . model . Order Ċ import Ġcom . example . state . BL State Ċ import Ġcom . example . state . Order State Ċ import Ġnet . cord a . core . contracts . Transaction Verification Exception Ċ import Ġnet . cord a . core . crypto . common Name Ċ import Ġnet . cord a . core . get OrThrow Ċ import Ġnet . cord a . core . node . services . linear Head s OfType Ċ import Ġnet . cord a . core . node . services . un consumed States Ċ import Ġnet . cord a . testing . node . Mock Network Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġjava . time . Instant Ċ import Ġjava . util .* Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assert Fails With Ċ Ċ class ĠBL Flow Tests Ġ{ ĊĠĠĠ Ġlateinit Ġvar Ġnet : ĠMock Network ĊĠĠĠ Ġlateinit Ġvar Ġa : ĠMock Network . Mock Node ĊĠĠĠ Ġlateinit Ġvar Ġb : ĠMock Network . Mock Node ĊĠĠĠ Ġlateinit Ġvar Ġc : ĠMock Network . Mock Node ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġnet Ġ= ĠMock Network () ĊĠĠĠĠĠĠĠ Ġval Ġnodes Ġ= Ġnet . create Some Nodes ( 3 ) ĊĠĠĠĠĠĠĠ Ġa Ġ= Ġnodes . party Nodes [ 0 ] ĊĠĠĠĠĠĠĠ Ġb Ġ= Ġnodes . party Nodes [ 1 ] ĊĠĠĠĠĠĠĠ Ġc Ġ= Ġnodes . party Nodes [ 2 ] ĊĠĠĠĠĠĠĠ Ġ// ĠFor Ġreal Ġnodes Ġthis Ġhappens Ġautomatically , Ġbut Ġwe Ġhave Ġto Ġmanually Ġregister Ġthe Ġflow Ġfor Ġtests ĊĠĠĠĠĠĠĠ Ġnodes . party Nodes . forEach Ġ{ Ġit . register Initi ated Flow ( Example Flow . Accept or :: class . java ) Ġ} ĊĠĠĠĠĠĠĠ Ġnodes . party Nodes . forEach Ġ{ Ġit . register Initi ated Flow ( Create Order Flow . Accept or :: class . java ) Ġ} ĊĠĠĠĠĠĠĠ Ġnet . run Network () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ Ġnet . stop Nodes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` flow Ġreject s Ġinvalid ĠBL s `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠBL State ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBL ("", "" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . info . legal Identity ) ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= ĠExample Flow . Init iator ( state , Ġb . info . legal Identity ) ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġa . services . start Flow ( flow ). result Future ĊĠĠĠĠĠĠĠ Ġnet . run Network () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe ĠBL Contract Ġspecifies Ġthat Ġbl 's Ġexporter Ġand Ġimporter bank Ġcannot Ġbe Ġthe Ġsame . ĊĠĠĠĠĠĠĠ Ġassert Fails With < Transaction Verification Exception > Ġ{ future . get OrThrow ()} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` flow Ġreject s Ġinvalid ĠBL Ġstates `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠBL State ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBL ("", "" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . info . legal Identity ) ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= ĠExample Flow . Init iator ( state , Ġb . info . legal Identity ) ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġa . services . start Flow ( flow ). result Future ĊĠĠĠĠĠĠĠ Ġnet . run Network () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe ĠBL Contract Ġspecifies Ġthat Ġan Ġbl 's Ġexporter Ġand Ġcounter Party Ġcannot Ġbe Ġthe Ġsame . ĊĠĠĠĠĠĠĠ Ġassert Fails With < Transaction Verification Exception > Ġ{ future . get OrThrow ()} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Signed Transaction Ġreturned Ġby Ġthe Ġflow Ġis Ġsigned Ġby Ġthe Ġexporter `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠBL State ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBL (" BL 0 0 0 1 "," abc Ġ 1 0 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . info . legal Identity ) ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= ĠExample Flow . Init iator ( state , Ġb . info . legal Identity ) ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġa . services . start Flow ( flow ). result Future ĊĠĠĠĠĠĠĠ Ġnet . run Network () ĊĊĠĠĠĠĠĠĠ Ġval Ġsigned Tx Ġ= Ġfuture . get OrThrow () ĊĠĠĠĠĠĠĠ Ġsigned Tx . verify Signatures Except ( a . services . legal Identity Key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Signed Transaction Ġreturned Ġby Ġthe Ġflow Ġis Ġsigned Ġby Ġthe Ġshipping Ġcompany `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠBL State ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBL ("", "" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . info . legal Identity ) ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= ĠExample Flow . Init iator ( state , Ġb . info . legal Identity ) ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġa . services . start Flow ( flow ). result Future ĊĠĠĠĠĠĠĠ Ġnet . run Network () ĊĊĠĠĠĠĠĠĠ Ġval Ġsigned Tx Ġ= Ġfuture . get OrThrow () ĊĠĠĠĠĠĠĠ Ġsigned Tx . verify Signatures Except ( b . services . legal Identity Key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` flow Ġrecords Ġa Ġtransaction Ġin Ġboth Ġparties ' Ġvault s `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠBL State ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBL ("", "" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . info . legal Identity ) ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= ĠExample Flow . Init iator ( state , Ġb . info . legal Identity ) ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġa . services . start Flow ( flow ). result Future ĊĠĠĠĠĠĠĠ Ġnet . run Network () ĊĠĠĠĠĠĠĠ Ġval Ġsigned Tx Ġ= Ġfuture . get OrThrow () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġcheck Ġthe Ġrecorded Ġtransaction Ġin Ġboth Ġvault s . ĊĠĠĠĠĠĠĠ Ġfor Ġ( node Ġin ĠlistOf ( a , Ġb )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( signed Tx , Ġnode . services . validated Transactions . getTransaction ( signed Tx . id )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠ Ġfun Ġbalance ( node : ĠMock Network . Mock Node ): ĠLong Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . database . transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstates Ġ= Ġnode . services .. un consumed States < Order State >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbalance Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstates . forEach Ġ{ Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbalance Ġ+= Ġstate . state . data . amount . quantity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbalance . to Long () Ġ/ Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġfun Ġprint Orders ( node : ĠMock Network . Mock Node ){ ĊĠĠĠĠĠĠĠ Ġnode . database . transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorders Ġ= Ġnode . services . vault Service . linear Head s OfType < Order State >(). values . map Ġ{ Ġit . state . data Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorders . sorted By Ġ{ Ġit . date Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorders . forEach Ġ{ Ġprintln (" S eller : Ġ${ it . seller . name . common Name }, ĠBu yer : Ġ${ it . buyer . name . common Name }, ĠAmount : Ġ${ it . order . total Amount }, ĠRef : Ġ${ it . order . reference Number }, ĠDate : Ġ${ it . date }") Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` order Ġflow Ġrecords Ġa Ġtransaction Ġin Ġthe Ġledger Ġof Ġsell er Ġand Ġbuy er ` (){ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠOrder State ( Order (" a 0 1 ", 1 9 0 . 5 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInstant . now () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= ĠCreate Order Flow . Init iator ( state , b . info . legal Identity ) ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġa . services . start Flow ( flow ). result Future ĊĠĠĠĠĠĠĠ Ġnet . run Network () ĊĠĠĠĠĠĠĠ Ġval Ġsigned Tx Ġ= Ġfuture . get OrThrow () ĊĊĠĠĠĠĠĠĠ Ġprintln (" ====== A ==== ==" ) ĊĠĠĠĠĠĠĠ Ġprint Orders ( a ) ĊĊĠĠĠĠĠĠĠ Ġprintln (" ====== B ==== ==" ) ĊĠĠĠĠĠĠĠ Ġprint Orders ( b ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( node Ġin ĠlistOf ( a , b )){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( signed Tx , node . services . validated Transactions . getTransaction ( signed Tx . id )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` re corded Ġtransaction Ġhas Ġno Ġinputs Ġand Ġa Ġsingle Ġoutput , Ġthe Ġinput ĠBL `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput State Ġ= ĠBL State ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBL ("", "" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . info . legal Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . info . legal Identity ) ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= ĠExample Flow . Init iator ( input State , Ġb . info . legal Identity ) ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġa . services . start Flow ( flow ). result Future ĊĠĠĠĠĠĠĠ Ġnet . run Network () ĊĠĠĠĠĠĠĠ Ġval Ġsigned Tx Ġ= Ġfuture . get OrThrow () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġcheck Ġthe Ġrecorded Ġtransaction Ġin Ġboth Ġvault s . ĊĠĠĠĠĠĠĠ Ġfor Ġ( node Ġin ĠlistOf ( a , Ġb )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecorded Tx Ġ= Ġnode . services . validated Transactions . getTransaction ( signed Tx . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Outputs Ġ= Ġrecorded Tx !!. tx . outputs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( tx Outputs . size Ġ== Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecorded State Ġ= Ġtx Outputs [ 0 ]. data Ġas ĠBL State ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . bl , Ġinput State . bl ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . exporter , Ġinput State . exporter ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . shipping Company , Ġinput State . shipping Company ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . importer Bank , Ġinput State . importer Bank ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . owner , Ġinput State . owner ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }