package Ġnet . cord a . core . internal Ċ Ċ import Ġco . parallel universe . fib ers . Suspend able Ċ import Ġnet . cord a . core . crypto . Secure Hash Ċ import Ġnet . cord a . core . flows .* Ċ import Ġnet . cord a . core . identity . C ord a X 5 0 0 Name Ċ import Ġnet . cord a . core . identity . Party Ċ import Ġnet . cord a . core . transactions . Signed Transaction Ċ import Ġnet . cord a . core . utilities . get OrThrow Ċ import Ġnet . cord a . core . utilities . sequence Ċ import Ġnet . cord a . node . internal . Started Node Ċ import Ġnet . cord a . testing . contracts . Dummy Contract Ċ import Ġnet . cord a . testing . core . single Identity Ċ import Ġnet . cord a . testing . node . internal . Internal Mock Network Ċ import Ġnet . cord a . testing . node . internal . Internal Mock Network . Mock Node Ċ import Ġnet . cord a . testing . node . internal . start Flow Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . InputStream Ċ import Ġjava . util . jar . Jar Entry Ċ import Ġjava . util . jar . Jar OutputStream Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assert Fails With Ċ import Ġkotlin . test . assertNotNull Ċ import Ġkotlin . test . assertNull Ċ Ċ // ĠDOC START Ġ 3 Ċ class ĠResolve Transactions Flow Test Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmock Net : ĠInternal Mock Network ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnot ary Node : ĠStarted Node < Mock Node > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġme ga Cor p Node : ĠStarted Node < Mock Node > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmini Cor p Node : ĠStarted Node < Mock Node > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġme ga Cor p : ĠParty ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmini Cor p : ĠParty ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnot ary : ĠParty ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Net Ġ= ĠInternal Mock Network ( cord app Packages Ġ= ĠlistOf (" net . cord a . testing . contracts ")) ĊĠĠĠĠĠĠĠ Ġnot ary Node Ġ= Ġmock Net . default Not ary Node ĊĠĠĠĠĠĠĠ Ġme ga Cor p Node Ġ= Ġmock Net . create Party Node ( C ord a X 5 0 0 Name (" Me ga Cor p ", Ġ" L ondon ", Ġ" GB ")) ĊĠĠĠĠĠĠĠ Ġmini Cor p Node Ġ= Ġmock Net . create Party Node ( C ord a X 5 0 0 Name (" Mini Cor p ", Ġ" L ondon ", Ġ" GB ")) ĊĠĠĠĠĠĠĠ Ġme ga Cor p Node . register Initi ated Flow ( Test Response Flow :: class . java ) ĊĠĠĠĠĠĠĠ Ġmini Cor p Node . register Initi ated Flow ( Test Response Flow :: class . java ) ĊĠĠĠĠĠĠĠ Ġnot ary Ġ= Ġmock Net . default Not ary Identity ĊĠĠĠĠĠĠĠ Ġme ga Cor p Ġ= Ġme ga Cor p Node . info . single Identity () ĊĠĠĠĠĠĠĠ Ġmini Cor p Ġ= Ġmini Cor p Node . info . single Identity () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Net . stop Nodes () ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠDOC END Ġ 3 ĊĊĠĠĠ Ġ// ĠDOC START Ġ 1 ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` resolve Ġfrom Ġtwo Ġhashes `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( st x 1 , Ġst x 2 ) Ġ= Ġmake Transactions () ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠTest Flow ( set Of ( st x 2 . id ), Ġme ga Cor p ) ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġmini Cor p Node . services . start Flow ( p ) ĊĠĠĠĠĠĠĠ Ġmock Net . run Network () ĊĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġfuture . result Future . get OrThrow () ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( st x 1 . id , Ġst x 2 . id ), Ġresults . map Ġ{ Ġit . id Ġ}) ĊĠĠĠĠĠĠĠ Ġmini Cor p Node . database . transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( st x 1 , Ġmini Cor p Node . services . validated Transactions . getTransaction ( st x 1 . id )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( st x 2 , Ġmini Cor p Node . services . validated Transactions . getTransaction ( st x 2 . id )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠDOC END Ġ 1 ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` dependency Ġwith Ġan Ġerror `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġst x Ġ= Ġmake Transactions ( sign First TX Ġ= Ġfalse ). second ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠTest Flow ( set Of ( st x . id ), Ġme ga Cor p ) ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġmini Cor p Node . services . start Flow ( p ) ĊĠĠĠĠĠĠĠ Ġmock Net . run Network () ĊĠĠĠĠĠĠĠ Ġassert Fails With ( Signed Transaction . Signatures Missing Exception :: class ) Ġ{ Ġfuture . result Future . get OrThrow () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` resolve Ġfrom Ġa Ġsigned Ġtransaction `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( st x 1 , Ġst x 2 ) Ġ= Ġmake Transactions () ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠTest Flow ( st x 2 , Ġme ga Cor p ) ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġmini Cor p Node . services . start Flow ( p ) ĊĠĠĠĠĠĠĠ Ġmock Net . run Network () ĊĠĠĠĠĠĠĠ Ġfuture . result Future . get OrThrow () ĊĠĠĠĠĠĠĠ Ġmini Cor p Node . database . transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( st x 1 , Ġmini Cor p Node . services . validated Transactions . getTransaction ( st x 1 . id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBut Ġst x 2 Ġwasn 't Ġinserted , Ġjust Ġst x 1 . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( mini Cor p Node . services . validated Transactions . getTransaction ( st x 2 . id )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` den ial Ġof Ġservice Ġcheck `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠChain Ġlots Ġof Ġtx ns Ġtogether . ĊĠĠĠĠĠĠĠ Ġval Ġst x 2 Ġ= Ġmake Transactions (). second ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġ 5 0 ĊĠĠĠĠĠĠĠ Ġvar Ġcursor Ġ= Ġst x 2 ĊĠĠĠĠĠĠĠ Ġrepeat ( count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠDummy Contract . move ( cursor . tx . out Ref ( 0 ), Ġmini Cor p ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst x Ġ= Ġme ga Cor p Node . services . sign Initial Transaction ( builder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġme ga Cor p Node . database . transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġme ga Cor p Node . services . record Transactions ( st x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġst x ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠTest Flow ( set Of ( cursor . id ), Ġme ga Cor p , Ġ 4 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġmini Cor p Node . services . start Flow ( p ) ĊĠĠĠĠĠĠĠ Ġmock Net . run Network () ĊĠĠĠĠĠĠĠ Ġassert Fails With < Resolve Transactions Flow . Ex cess ively Large Transaction Graph > Ġ{ Ġfuture . result Future . get OrThrow () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` triangle Ġof Ġtransactions Ġresolves Ġfine `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġst x 1 Ġ= Ġmake Transactions (). first ĊĊĠĠĠĠĠĠĠ Ġval Ġst x 2 Ġ= ĠDummy Contract . move ( st x 1 . tx . out Ref ( 0 ), Ġmini Cor p ). let Ġ{ Ġbuilder Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp tx Ġ= Ġme ga Cor p Node . services . sign Initial Transaction ( builder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot ary Node . services . add Signature ( pt x , Ġnot ary . own ing Key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġst x 3 Ġ= ĠDummy Contract . move ( listOf ( st x 1 . tx . out Ref ( 0 ), Ġst x 2 . tx . out Ref ( 0 )), Ġmini Cor p ). let Ġ{ Ġbuilder Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp tx Ġ= Ġme ga Cor p Node . services . sign Initial Transaction ( builder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot ary Node . services . add Signature ( pt x , Ġnot ary . own ing Key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġme ga Cor p Node . database . transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġme ga Cor p Node . services . record Transactions ( st x 2 , Ġst x 3 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠTest Flow ( set Of ( st x 3 . id ), Ġme ga Cor p ) ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġmini Cor p Node . services . start Flow ( p ) ĊĠĠĠĠĠĠĠ Ġmock Net . run Network () ĊĠĠĠĠĠĠĠ Ġfuture . result Future . get OrThrow () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġattachment () Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġmake Jar (): ĠInputStream Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbs Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjar Ġ= ĠJar OutputStream ( bs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjar . put Next Entry ( Jar Entry (" TEST ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjar . write (" Some Ġtest Ġfile ". toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjar . close Entry () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjar . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbs . toByteArray (). sequence (). open () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġthis Ġoperation Ġshould Ġnot Ġrequire Ġan Ġexplicit Ġtransaction ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġme ga Cor p Node . database . transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġme ga Cor p Node . services . attachments . import Attachment ( make Jar ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġst x 2 Ġ= Ġmake Transactions ( with Attachment Ġ= Ġid ). second ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠTest Flow ( st x 2 , Ġme ga Cor p ) ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġmini Cor p Node . services . start Flow ( p ) ĊĠĠĠĠĠĠĠ Ġmock Net . run Network () ĊĠĠĠĠĠĠĠ Ġfuture . result Future . get OrThrow () ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġthis Ġoperation Ġshould Ġnot Ġrequire Ġan Ġexplicit Ġtransaction ĊĠĠĠĠĠĠĠ Ġmini Cor p Node . database . transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( mini Cor p Node . services . attachments . open Attachment ( id )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠDOC START Ġ 2 ĊĠĠĠ Ġprivate Ġfun Ġmake Transactions ( sign First TX : ĠBoolean Ġ= Ġtrue , Ġwith Attachment : ĠSecure Hash ? Ġ= Ġnull ): ĠPair < Signed Transaction , ĠSigned Transaction > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġa Ġchain Ġof Ġcust ody Ġof Ġdummy Ġstates Ġand Ġinsert Ġinto Ġnode ĠA . ĊĠĠĠĠĠĠĠ Ġval Ġdummy 1 : ĠSigned Transaction Ġ= ĠDummy Contract . generate Initial ( 0 , Ġnot ary , Ġme ga Cor p . ref ( 1 )). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( with Attachment Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . add Attachment ( with Attachment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( sign First TX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp tx Ġ= Ġme ga Cor p Node . services . sign Initial Transaction ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot ary Node . services . add Signature ( pt x , Ġnot ary . own ing Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot ary Node . services . sign Initial Transaction ( it , Ġnot ary . own ing Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdummy 2 : ĠSigned Transaction Ġ= ĠDummy Contract . move ( dummy 1 . tx . out Ref ( 0 ), Ġmini Cor p ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp tx Ġ= Ġme ga Cor p Node . services . sign Initial Transaction ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot ary Node . services . add Signature ( pt x , Ġnot ary . own ing Key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġme ga Cor p Node . database . transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġme ga Cor p Node . services . record Transactions ( dummy 1 , Ġdummy 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( dummy 1 , Ġdummy 2 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠDOC END Ġ 2 ĊĊĠĠĠ Ġ@ Initi ating Flow ĊĠĠĠ Ġprivate Ġclass ĠTest Flow ( val Ġother Side : ĠParty , Ġprivate Ġval Ġresolve Transactions Flow Factory : Ġ( Flow Session ) Ġ-> ĠResolve Transactions Flow , Ġprivate Ġval Ġtx Count Limit : ĠInt ? Ġ= Ġnull ) Ġ: ĠFlow Logic < List < Signed Transaction >>() Ġ{ ĊĠĠĠĠĠĠĠ Ġconstructor ( tx Hashes : ĠSet < Secure Hash >, Ġother Side : ĠParty , Ġtx Count Limit : ĠInt ? Ġ= Ġnull ) Ġ: Ġthis ( other Side , Ġ{ ĠResolve Transactions Flow ( tx Hashes , Ġit ) Ġ}, Ġtx Count Limit Ġ= Ġtx Count Limit ) ĊĠĠĠĠĠĠĠ Ġconstructor ( st x : ĠSigned Transaction , Ġother Side : ĠParty ) Ġ: Ġthis ( other Side , Ġ{ ĠResolve Transactions Flow ( st x , Ġit ) Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ@ Suspend able ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠList < Signed Transaction > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsession Ġ= Ġinitiate Flow ( other Side ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresolve Transactions Flow Ġ= Ġresolve Transactions Flow Factory ( session ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx Count Limit ?. let Ġ{ Ġresolve Transactions Flow . transaction Count Limit Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsub Flow ( resolve Transactions Flow ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Initi ated By ( Test Flow :: class ) ĊĠĠĠ Ġprivate Ġclass ĠTest Response Flow ( val Ġother Side Session : ĠFlow Session ) Ġ: ĠFlow Logic < Void ?> () Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suspend able ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall () Ġ= Ġsub Flow ( TestData V ending Flow ( other Side Session )) ĊĠĠĠ Ġ} Ċ } Ċ