/** Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠThe ĠT ari ĠProject Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ċ Ġ* Ġwithout Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ċ Ġ* Ġfollowing Ġconditions Ġare Ġmet : Ċ Ġ* Ċ Ġ* Ċ Ġ* Ġ 1 . ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ġnotice , Ċ Ġ* Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ Ġ* Ċ Ġ* Ċ Ġ* Ġ 2 . ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ċ Ġ* Ġcopyright Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ġin Ġthe Ċ Ġ* Ġdocumentation Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ġdistribution . Ċ Ġ* Ċ Ġ* Ċ Ġ* Ġ 3 . ĠNeither Ġthe Ġname Ġof Ġthe Ġcopyright Ġholder Ġnor Ġthe Ġnames Ġof Ċ Ġ* Ġits Ġcontributors Ġmay Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts Ċ Ġ* Ġderived Ġfrom Ġthis Ġsoftware Ġwithout Ġspecific Ġprior Ġwritten Ġpermission . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND Ċ Ġ* ĠCONTRIBUTORS Ġ" AS ĠIS " ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , Ċ Ġ* ĠINCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠTHE ĠIMPLIED ĠWARRANTIES Ċ Ġ* ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠARE Ċ Ġ* ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT ĠHOLDER ĠOR Ċ Ġ* ĠCONTRIBUTORS ĠBE ĠLIABLE ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , Ċ Ġ* ĠSPECIAL , ĠEXEMPLARY , ĠOR ĠCONSEQUENTIAL ĠDAMAGES Ġ( INCLUDING , ĠBUT Ċ Ġ* ĠNOT ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; Ċ Ġ* ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS ĠINTERRUPTION ) Ċ Ġ* ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN Ċ Ġ* ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ġ( INCLUDING ĠNEGLIGENCE Ċ Ġ* ĠOR ĠOTHERWISE ) ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE ĠOF ĠTHIS Ċ Ġ* ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ package Ġcom . t ari . android . wallet Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . test . core . app . Application Provider Ċ import Ġcom . or h ano but . logger . Logger Ċ import Ġcom . t ari . android . wallet . ffi .* Ċ import Ġcom . t ari . android . wallet . model .* Ċ import Ġcom . t ari . android . wallet . util . Constants Ċ import Ġio . mock k . every Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . slot Ċ import Ġio . mock k . verify Ċ import Ġorg . junit .* Ċ import Ġorg . junit . Assert .* Ċ import Ġjava . io . File Ċ import Ġjava . math . BigInteger Ċ Ċ class ĠF FI Wallet Tests Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġwallet : ĠF FI Wallet ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlistener : ĠTest Listener ĊĠĠĠ Ġprivate Ġval Ġwallet DirPath Ġ= ĊĠĠĠĠĠĠĠ ĠApplication Provider . getApplicationContext < Context >(). files Dir . absolute Path ĊĊĠĠĠ Ġprivate Ġfun Ġclean () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclean Ġ= ĠFF ITest Util . clear Test Files ( wallet DirPath ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! clean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Test Ġfiles Ġcould Ġnot Ġcleared .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġclean Ġany Ġexisting Ġwallet Ġdata ĊĠĠĠĠĠĠĠ Ġclean () ĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġmemory Ġtransport ĊĠĠĠĠĠĠĠ Ġval Ġtransport Ġ= ĠFF IT r ansport Type () ĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġcom ms Ġconfig ĊĠĠĠĠĠĠĠ Ġval Ġcom ms Config Ġ= ĠFF IC om ms Config ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransport . getAddress (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransport , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFF ITest Util . WAL LET _ DB _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwallet DirPath , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . Wallet . discovery Timeout Sec ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġlog File Ġ= ĠFile ( wallet DirPath , Ġ" test _ log . log ") ĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġwallet Ġinstance ĊĠĠĠĠĠĠĠ Ġwallet Ġ= ĠF FI Wallet ( com ms Config , Ġlog File . absolute Path ) ĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġlistener ĊĠĠĠĠĠĠĠ Ġlistener Ġ= ĠTest Listener () ĊĠĠĠĠĠĠĠ Ġwallet . listener Ġ= Ġlistener ĊĠĠĠĠĠĠĠ Ġcom ms Config . destroy () ĊĠĠĠĠĠĠĠ Ġtransport . destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun Ġteardown () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdestroy Ġwallet ĊĠĠĠĠĠĠĠ Ġwallet . listener Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġwallet . destroy () ĊĠĠĠĠĠĠĠ Ġ// Ġclean Ġwallet Ġfolder ĊĠĠĠĠĠĠĠ Ġclean () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġvalid Instance With Valid PublicKey Was Created () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Not Equals ( nullptr , Ġwallet . pointer ) ĊĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= Ġwallet . get PublicKey () ĊĠĠĠĠĠĠĠ Ġassert Not Equals ( nullptr , ĠpublicKey . pointer ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFF ITest Util . PUBLIC _ KEY _ HEX _ STRING . length , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠpublicKey . toString (). length ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsigned Message Verification Was Successful () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ" Hello " ĊĠĠĠĠĠĠĠ Ġval Ġsignature Ġ= Ġwallet . sign Message ( message ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( wallet . verify Message Signature ( wallet . get PublicKey (), Ġmessage , Ġsignature )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Contacts () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontact Count Ġ= Ġ 1 2 7 ĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġcontacts ĊĠĠĠĠĠĠĠ Ġrepeat ( contact Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontact PrivateKey Ġ= ĠF FI PrivateKey . generate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontact PublicKey Ġ= ĠF FI PublicKey ( contact PrivateKey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontact Ġ= ĠF FI Contact ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFF ITest Util . generate Random Al phanumeric String ( 1 6 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontact PublicKey ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwallet . add Update Contact ( contact ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontact PrivateKey . destroy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontact PublicKey . destroy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontact . destroy () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġtest Ġget Ġcontacts ĊĠĠĠĠĠĠĠ Ġvar Ġcontacts Ġ= Ġwallet . get Contacts () ĊĠĠĠĠĠĠĠ ĠassertEquals ( contact Count , Ġcontacts . getLength ()) ĊĠĠĠĠĠĠĠ Ġ// Ġtest Ġupdate Ġalias ĊĠĠĠĠĠĠĠ Ġval Ġlast Contact Old Ġ= Ġcontacts . get At ( contact Count Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Contact Old PublicKey Ġ= Ġlast Contact Old . get PublicKey () ĊĠĠĠĠĠĠĠ Ġval Ġnew Alias Ġ= ĠFF ITest Util . generate Random Al phanumeric String ( 7 ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Contact New Ġ= ĠF FI Contact ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Alias , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Contact Old PublicKey ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġlast Contact Old PublicKey . destroy () ĊĠĠĠĠĠĠĠ Ġwallet . add Update Contact ( last Contact New ) ĊĠĠĠĠĠĠĠ Ġlast Contact Old . destroy () ĊĠĠĠĠĠĠĠ Ġlast Contact New . destroy () ĊĠĠĠĠĠĠĠ Ġcontacts . destroy () ĊĠĠĠĠĠĠĠ Ġ// Ġre - fetch Ġcontacts ĊĠĠĠĠĠĠĠ Ġcontacts Ġ= Ġwallet . get Contacts () ĊĠĠĠĠĠĠĠ Ġval Ġlast Contact Updated Ġ= Ġcontacts . get At ( contact Count Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Alias , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Contact Updated . get Alias () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġtest Ġremove ĊĠĠĠĠĠĠĠ Ġwallet . remove Contact ( last Contact Updated ) ĊĠĠĠĠĠĠĠ Ġlast Contact Updated . destroy () ĊĠĠĠĠĠĠĠ Ġcontacts . destroy () ĊĠĠĠĠĠĠĠ Ġcontacts Ġ= Ġwallet . get Contacts () ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontact Count Ġ- Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontacts . getLength () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcontacts . destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Partial Backup () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoriginal File Ġ= ĠFile ( wallet DirPath , ĠFF ITest Util . WAL LET _ DB _ NAME _ WITH _ EXTENSION ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( original File . exists ()) ĊĠĠĠĠĠĠĠ Ġval Ġbackup Dir Ġ= ĠFile ( wallet DirPath , Ġ" backup ") ĊĠĠĠĠĠĠĠ Ġbackup Dir . mkdir () ĊĠĠĠĠĠĠĠ Ġval Ġbackup File Ġ= ĠFile ( backup Dir , Ġ" backup file . sqlite 3 ") ĊĠĠĠĠĠĠĠ ĠF FI Util . do Partial Backup ( original File . absolute Path , Ġbackup File . absolute Path ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( backup File . exists ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Seed Words () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġseed Words Ġ= Ġwallet . get Seed Words () ĊĠĠĠĠĠĠĠ ĠassertTrue ( seed Words . getLength () Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( seed Words . get At ( 0 ). isNotEmpty ()) ĊĠĠĠĠĠĠĠ Ġseed Words . destroy () ĊĠĠĠĠĠĠĠ ĠassertEquals ( nullptr , Ġseed Words . pointer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Emoji Set () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġemoji Set Ġ= ĠF FI Emoji Set () ĊĠĠĠĠĠĠĠ ĠassertTrue ( emoji Set . getLength () Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġemoji Ġ= Ġemoji Set . get At ( 0 ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( emoji . toString (). isNotEmpty ()) ĊĠĠĠĠĠĠĠ Ġemoji . destroy () ĊĠĠĠĠĠĠĠ Ġemoji Set . destroy () ĊĠĠĠĠĠĠĠ ĠassertEquals ( nullptr , Ġemoji Set . pointer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Base Node Functions () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbase Node PublicKey Ġ= ĠF FI PublicKey ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHex String (" 0 6 e 9 8 e 9 c 5 eb 5 2 bd 5 0 4 8 3 6 e dec 1 8 7 8 ec cf 1 2 eb 9 f 2 6 a 5 fe 5 ec 0 e 2 7 9 4 2 3 1 5 6 e 6 5 7 a ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġbase Node Address Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ on ion 3 / b sm u of 2 cn 4 y 2 ys z 2 5 3 gz svg 3 s 7 2 fc gh 4 f 3 q cm 3 hdl x dt c we 6 al 2 dic yd : 1 8 1 4 1 " ĊĊĠĠĠĠĠĠĠ Ġval Ġmock Listener Ġ= Ġmock k < FF I Wallet Listener >( relax ed Ġ= Ġtrue , Ġrelax Unit Fun Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ids Ġ= Ġmutable ListOf < BigInteger >() ĊĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Listener . on Base Node Sync Complete ( capture ( response Ids ), Ġany ()) ĊĠĠĠĠĠĠĠ Ġ} Ġanswers Ġ{ Ġ} ĊĠĠĠĠĠĠĠ Ġwallet . listener Ġ= Ġmock Listener ĊĠĠĠĠĠĠĠ Ġwallet . add Base Node Peer ( base Node PublicKey , Ġbase Node Address ) ĊĠĠĠĠĠĠĠ Ġbase Node PublicKey . destroy () ĊĠĠĠĠĠĠĠ Ġval ĠrequestId Ġ= Ġwallet . sync With Base Node () ĊĠĠĠĠĠĠĠ ĠassertTrue ( requestId Ġ> ĠBigInteger (" 0 ")) ĊĠĠĠĠĠĠĠ ĠThread . sleep ( 5 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmock Listener . on Base Node Sync Complete ( requestId , Ġany ()) Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue ( response Ids . contains ( requestId )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Receive Tx Flow () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmock Listener Ġ= Ġmock k < FF I Wallet Listener >( relax ed Ġ= Ġtrue , Ġrelax Unit Fun Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġreceived Tx Slot Ġ= Ġslot < Pending Inbound Tx >() ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Listener . on Tx Received ( capture ( received Tx Slot )) Ġ} Ġanswers Ġ{ Ġ} ĊĠĠĠĠĠĠĠ Ġwallet . listener Ġ= Ġmock Listener ĊĠĠĠĠĠĠĠ Ġ// Ġreceive Ġtx ĊĠĠĠĠĠĠĠ ĠassertTrue ( wallet . test Receive Tx ()) ĊĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmock Listener . on Tx Received ( any ()) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpending Inbound Tx Ġ= Ġreceived Tx Slot . captured ĊĠĠĠĠĠĠĠ Ġval Ġpending Inbound T xs FF I Ġ= Ġwallet . get Pending Inbound T xs () ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġpending Inbound T xs FF I . getLength ()) ĊĠĠĠĠĠĠĠ Ġval Ġpending Inbound T xFF I Ġ= Ġpending Inbound T xs FF I . get At ( 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Inbound Tx . id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Inbound T xFF I . getId () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTx Status . PENDING , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Inbound Tx . status ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġpending Inbound T xs FF I . destroy () ĊĠĠĠĠĠĠĠ Ġ// Ġtest Ġget Ġpending Ġinbound Ġtx Ġby Ġid ĊĠĠĠĠĠĠĠ Ġval Ġpending Inbound Tx ById FF I Ġ= Ġwallet . get Pending Inbound Tx ById ( pending Inbound Tx . id ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Inbound Tx . id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Inbound Tx ById FF I . getId () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġpending Inbound Tx ById FF I . destroy () ĊĊĠĠĠĠĠĠĠ Ġ// Ġtest Ġfinalize ĊĠĠĠĠĠĠĠ Ġval Ġfinal ized Tx Slot Ġ= Ġslot < Pending Inbound Tx >() ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Listener . on Tx Final ized ( capture ( final ized Tx Slot )) Ġ} Ġanswers Ġ{ Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue ( wallet . test Finalize Received Tx ( pending Inbound T xFF I )) ĊĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmock Listener . on Tx Final ized ( any ()) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfinal ized Tx Ġ= Ġfinal ized Tx Slot . captured ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Inbound Tx . id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal ized Tx . id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTx Status . COMPLETED , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal ized Tx . status ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġpending Inbound T xFF I . destroy () ĊĊĠĠĠĠĠĠĠ Ġ// Ġtest Ġbroadcast ĊĠĠĠĠĠĠĠ Ġval Ġbroadcast Tx Slot Ġ= Ġslot < Pending Inbound Tx >() ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Listener . on Inbound Tx Broadcast ( capture ( broadcast Tx Slot )) Ġ} Ġanswers Ġ{ Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue ( wallet . test Broadcast Tx ( pending Inbound Tx . id )) ĊĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmock Listener . on Inbound Tx Broadcast ( any ()) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbroadcast Tx Ġ= Ġbroadcast Tx Slot . captured ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Inbound Tx . id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbroadcast Tx . id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġtest Ġwallet Ġpending Ġinbound Ġbalance ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Inbound Tx . amount . value , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwallet . get Pending Inbound Balance () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġtest Ġmine Ġtx ĊĠĠĠĠĠĠĠ Ġval Ġm ined Tx Slot Ġ= Ġslot < Completed Tx >() ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Listener . on Tx M ined ( capture ( min ed Tx Slot )) Ġ} Ġanswers Ġ{ Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue ( wallet . test Mine Tx ( pending Inbound Tx . id )) ĊĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmock Listener . on Tx M ined ( any ()) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġm ined Tx Ġ= Ġm ined Tx Slot . captured ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Inbound Tx . id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm ined Tx . id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTx Status . MIN ED , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm ined Tx . status ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġget Ġcompleted Ġt xs ĊĠĠĠĠĠĠĠ Ġval Ġcompleted T xs FF I Ġ= Ġwallet . get Completed T xs () ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcompleted T xs FF I . getLength ()) ĊĠĠĠĠĠĠĠ Ġval Ġcompleted T xFF I Ġ= Ġcompleted T xs FF I . get At ( 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Inbound Tx . id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompleted T xFF I . getId () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcompleted T xFF I . destroy () ĊĠĠĠĠĠĠĠ Ġcompleted T xs FF I . destroy () ĊĠĠĠĠĠĠĠ Ġ// Ġtest Ġget Ġby Ġid ĊĠĠĠĠĠĠĠ Ġval Ġm ined Tx ById FF I Ġ= Ġwallet . get Completed Tx ById ( pending Inbound Tx . id ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Inbound Tx . id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm ined Tx ById FF I . getId () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġm ined Tx ById FF I . destroy () ĊĠĠĠĠĠĠĠ Ġ// Ġavailable Ġbalance ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Inbound Tx . amount . value , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwallet . get Available Balance () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Cancel Complete And Broadcast AndGet ById s () Ġ{ ĊĠĠĠĠĠĠĠ ĠLogger . i (" Will Ġgenerate Ġtest Ġdata .") ĊĠĠĠĠĠĠĠ ĠassertTrue ( wallet . generate TestData ( wallet DirPath )) ĊĠĠĠĠĠĠĠ ĠLogger . i (" Test Ġdata Ġgeneration Ġcompleted .") ĊĠĠĠĠĠĠĠ Ġval Ġmock Listener Ġ= Ġmock k < FF I Wallet Listener >( relax ed Ġ= Ġtrue , Ġrelax Unit Fun Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġwallet . listener Ġ= Ġmock Listener ĊĊĠĠĠĠĠĠĠ Ġ// Ġget Ġa Ġpending Ġtx Ġto Ġcancel Ġ- ĊĠĠĠĠĠĠĠ Ġ// Ġthere 's Ġno Ġpending Ġoutbound Ġtx Ġin Ġthe Ġgenerated Ġtest Ġdata , Ġso Ġpick Ġan Ġincoming Ġtx ĊĠĠĠĠĠĠĠ ĠassertTrue ( wallet . test Receive Tx ()) ĊĠĠĠĠĠĠĠ Ġval Ġpending Inbound T xs FF I Ġ= Ġwallet . get Pending Inbound T xs () ĊĠĠĠĠĠĠĠ Ġvar Ġpending Inbound T xFF I : ĠF FI Pending Inbound Tx ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġpending Inbound T xs FF I . getLength ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Inbound T xFF I Ġ= Ġpending Inbound T xs FF I . get At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pending Inbound T xFF I . getStatus () Ġ== ĠFF IT x Status . PENDING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Inbound T xFF I . destroy () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpending Inbound T xs FF I . destroy () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( pending Inbound T xFF I ) ĊĠĠĠĠĠĠĠ Ġ// Ġcancel Ġtx ĊĠĠĠĠĠĠĠ Ġval Ġcancelled Tx Slot Ġ= Ġslot < Cancelled Tx >() ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Listener . on Tx Cancelled ( capture ( cancelled Tx Slot )) Ġ} Ġanswers Ġ{ Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue ( wallet . cancel Pending Tx ( pending Inbound T xFF I !!. getId ())) ĊĠĠĠĠĠĠĠ Ġpending Inbound T xFF I . destroy () ĊĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmock Listener . on Tx Cancelled ( any ()) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcancelled Tx Ġ= Ġcancelled Tx Slot . captured ĊĠĠĠĠĠĠĠ Ġval Ġcancelled T xs FF I Ġ= Ġwallet . get Cancelled T xs () ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcancelled T xs FF I . getLength ()) ĊĠĠĠĠĠĠĠ Ġval Ġcancelled T xFF I Ġ= Ġcancelled T xs FF I . get At ( 0 ) ĊĠĠĠĠĠĠĠ Ġcancelled T xs FF I . destroy () ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancelled Tx . id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancelled T xFF I . getId () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcancelled T xFF I . destroy () ĊĠĠĠĠĠĠĠ Ġ// Ġget Ġby Ġid ĊĠĠĠĠĠĠĠ Ġval Ġcancelled Tx ById FF I Ġ= Ġwallet . get Cancelled Tx ById ( cancelled Tx . id ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancelled Tx . id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancelled Tx ById FF I . getId () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcancelled Tx ById FF I . destroy () ĊĊĠĠĠĠĠĠĠ Ġ// Ġpick Ġa Ġcompleted Ġoutbound Ġtx ĊĠĠĠĠĠĠĠ Ġval Ġpending Outbound T xs FF I Ġ= Ġwallet . get Pending Outbound T xs () ĊĠĠĠĠĠĠĠ Ġvar Ġpending Outbound T xFF I : ĠF FI Pending Outbound Tx ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġpending Outbound T xs FF I . getLength ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Outbound T xFF I Ġ= Ġpending Outbound T xs FF I . get At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pending Outbound T xFF I . getStatus () Ġ== ĠFF IT x Status . COMPLETED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Outbound T xFF I . destroy () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertNotNull ( pending Outbound T xFF I ) ĊĠĠĠĠĠĠĠ Ġ// Ġbroadcast Ġtx ĊĠĠĠĠĠĠĠ Ġval Ġbroadcast Tx Slot Ġ= Ġslot < Pending Outbound Tx >() ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Listener . on Outbound Tx Broadcast ( capture ( broadcast Tx Slot )) Ġ} Ġanswers Ġ{ Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue ( wallet . test Broadcast Tx ( pending Outbound T xFF I !!. getId ())) ĊĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmock Listener . on Outbound Tx Broadcast ( any ()) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbroadcast Tx Ġ= Ġbroadcast Tx Slot . captured ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTx Status . BRO ADCAST , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbroadcast Tx . status ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġpending Outbound T xFF I . destroy () ĊĊĠĠĠĠĠĠĠ Ġ// Ġmine Ġtx ĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġpending Outbound T xs FF I . getLength ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Outbound T xFF I Ġ= Ġpending Outbound T xs FF I . get At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pending Outbound T xFF I . getStatus () Ġ== ĠFF IT x Status . COMPLETED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Outbound T xFF I . destroy () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpending Outbound T xs FF I . destroy () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( pending Outbound T xFF I ) ĊĠĠĠĠĠĠĠ Ġval Ġm ined Tx Slot Ġ= Ġslot < Completed Tx >() ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Listener . on Tx M ined ( capture ( min ed Tx Slot )) Ġ} Ġanswers Ġ{ Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue ( wallet . test Mine Tx ( pending Outbound T xFF I !!. getId ())) ĊĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġpending Outbound T xFF I . destroy () ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmock Listener . on Tx M ined ( any ()) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġm ined Tx Ġ= Ġm ined Tx Slot . captured ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTx Status . MIN ED , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm ined Tx . status ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġget Ġm ined Ġtx Ġby Ġid ĊĠĠĠĠĠĠĠ Ġval Ġm ined T xFF I Ġ= Ġwallet . get Completed Tx ById ( min ed Tx . id ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm ined Tx . id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm ined T xFF I . getId () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġm ined T xFF I . destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNo Ġreturn Ġvalues Ġfrom Ġthe Ġfunctions , Ġjust Ġtesting Ġfor Ġno Ġexceptions . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Power Modes () Ġ{ ĊĠĠĠĠĠĠĠ Ġwallet . set Power Mode Low () ĊĠĠĠĠĠĠĠ ĠThread . sleep ( 2 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġwallet . set Power Mode Normal () ĊĠĠĠĠĠĠĠ ĠThread . sleep ( 2 0 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠTest Listener Ġ: ĠF FI Wallet Listener Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġreceived T xs Ġ= Ġmutable ListOf < Pending Inbound Tx >() ĊĠĠĠĠĠĠĠ Ġval Ġfinal ized T xs Ġ= Ġmutable ListOf < Pending Inbound Tx >() ĊĠĠĠĠĠĠĠ Ġval Ġm ined T xs Ġ= Ġmutable ListOf < Completed Tx >() ĊĠĠĠĠĠĠĠ Ġval Ġreply Received T xs Ġ= Ġmutable ListOf < Pending Outbound Tx >() ĊĠĠĠĠĠĠĠ Ġval Ġcancelled T xs Ġ= Ġmutable ListOf < Cancelled Tx >() ĊĠĠĠĠĠĠĠ Ġval Ġinbound Broadcast T xs Ġ= Ġmutable ListOf < Pending Inbound Tx >() ĊĠĠĠĠĠĠĠ Ġval Ġoutbound Broadcast T xs Ġ= Ġmutable ListOf < Pending Outbound Tx >() ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Base Node Sync Complete ( requestId : ĠBigInteger , Ġsuccess : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Base ĠNode ĠSync ĠComplete Ġ:: Ġrequest Ġid Ġ% s Ġsuccess Ġ% s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠrequestId . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tx Received ( pending Inbound Tx : ĠPending Inbound Tx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i (" Tx ĠReceived Ġ:: Ġpending Ġinbound Ġtx Ġid Ġ% s ", Ġpending Inbound Tx . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceived T xs . add ( pending Inbound Tx ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tx Reply Received ( pending Outbound Tx : ĠPending Outbound Tx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Tx ĠReply ĠReceived Ġ:: Ġpending Ġoutbound Ġtx Ġid Ġ% s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending Outbound Tx . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreply Received T xs . add ( pending Outbound Tx ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tx Final ized ( pending Inbound Tx : ĠPending Inbound Tx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Tx ĠFinal ized Ġ:: Ġpending Ġinbound Ġtx Ġid : Ġ% s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending Inbound Tx . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal ized T xs . add ( pending Inbound Tx ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Inbound Tx Broadcast ( pending Inbound Tx : ĠPending Inbound Tx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Inbound Ġtx ĠBroadcast Ġ:: Ġpending Ġinbound Ġtx Ġid Ġ% s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending Inbound Tx . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinbound Broadcast T xs . add ( pending Inbound Tx ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Outbound Tx Broadcast ( pending Outbound Tx : ĠPending Outbound Tx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Outbound Ġtx ĠBroadcast Ġ:: Ġpending Ġoutbound Ġtx Ġid Ġ% s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending Outbound Tx . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutbound Broadcast T xs . add ( pending Outbound Tx ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tx M ined ( completed Tx : ĠCompleted Tx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i (" Tx ĠM ined Ġ:: Ġcompleted Ġtx Ġid : Ġ% s ", Ġcompleted Tx . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm ined T xs . add ( completed Tx ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tx Cancelled ( cancelled Tx : ĠCancel led Tx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i (" Tx ĠCancel led Ġ:: Ġcancelled Ġtx Ġid : Ġ% s ", Ġcancelled Tx . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancelled T xs . add ( cancelled Tx ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Direct Send Result ( tx Id : ĠBigInteger , Ġsuccess : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i (" Direct Ġsend Ġ:: Ġtx Ġid Ġ% s Ġsuccess Ġ% s ", Ġtx Id , Ġsuccess ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Store And Forward Send Result ( tx Id : ĠBigInteger , Ġsuccess : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Store Ġand Ġforward Ġ:: Ġtx Ġid Ġ% s Ġsuccess Ġ% s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Store And Forward Messages Received () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i (" Store Ġand Ġforward Ġmessages Ġreceived .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ } Ċ