66import static org .junit .jupiter .api .Assertions .assertNull ;
77import static org .junit .jupiter .api .Assertions .assertSame ;
88import static org .junit .jupiter .api .Assertions .assertThrows ;
9+ import static org .junit .jupiter .api .Assertions .assertDoesNotThrow ;
910import static org .junit .jupiter .api .Assertions .assertTrue ;
1011import static org .mockito .Mockito .any ;
1112import static org .mockito .Mockito .anyInt ;
3940import co .rsk .net .NodeBlockProcessor ;
4041import co .rsk .peg .BridgeUtils ;
4142import co .rsk .peg .Federation ;
43+ import co .rsk .peg .FederationMember ;
4244import co .rsk .peg .btcLockSender .BtcLockSender ;
4345import co .rsk .peg .btcLockSender .BtcLockSender .TxSenderAddressType ;
4446import co .rsk .peg .btcLockSender .BtcLockSenderProvider ;
4749import co .rsk .peg .pegininstructions .PeginInstructionsProvider ;
4850import com .google .common .collect .Lists ;
4951import java .io .IOException ;
52+ import java .nio .charset .StandardCharsets ;
5053import java .util .ArrayList ;
5154import java .util .Arrays ;
5255import java .util .Collections ;
7578import org .bitcoinj .store .BlockStoreException ;
7679import org .ethereum .config .blockchain .upgrades .ActivationConfig ;
7780import org .ethereum .config .blockchain .upgrades .ConsensusRule ;
81+ import org .ethereum .crypto .HashUtil ;
7882import org .junit .jupiter .api .BeforeEach ;
7983import org .junit .jupiter .api .Test ;
8084import org .spongycastle .util .encoders .Hex ;
@@ -89,6 +93,7 @@ class BtcToRskClientTest {
8993 private ActivationConfig activationConfig ;
9094 private BridgeConstants bridgeRegTestConstants ;
9195 private Federation genesisFederation ;
96+ private FederationMember fakeMember ;
9297 private BtcToRskClientBuilder btcToRskClientBuilder ;
9398
9499 @ BeforeEach
@@ -99,9 +104,50 @@ void setup() throws PeginInstructionsException, IOException {
99104
100105 bridgeRegTestConstants = BridgeRegTestConstants .getInstance ();
101106 genesisFederation = bridgeRegTestConstants .getGenesisFederation ();
107+ fakeMember = FederationMember .getFederationMemberFromKey (
108+ BtcECKey .fromPrivate (
109+ HashUtil .keccak256 ("00" .getBytes (StandardCharsets .UTF_8 ))
110+ )
111+ );
102112 btcToRskClientBuilder = new BtcToRskClientBuilder ();
103113 }
104114
115+ @ Test
116+ void start_withExistingFederationMember_doesntThrowError () throws Exception {
117+ BitcoinWrapper bw = new SimpleBitcoinWrapper ();
118+ SimpleFederatorSupport fh = new SimpleFederatorSupport ();
119+
120+ FederationMember fedMember = genesisFederation .getMembers ().get (0 );
121+ fh .setMember (fedMember );
122+ BtcToRskClient client = createClientWithMocks (bw , fh );
123+ assertDoesNotThrow (() -> client .start (genesisFederation ));
124+ }
125+
126+ @ Test
127+ void start_withNoFederationMember_doesntThrowError () throws Exception {
128+ BitcoinWrapper bw = new SimpleBitcoinWrapper ();
129+ SimpleFederatorSupport fh = new SimpleFederatorSupport ();
130+
131+ fh .setMember (fakeMember );
132+ BtcToRskClient client = createClientWithMocks (bw , fh );
133+ assertDoesNotThrow (() -> client .start (genesisFederation ));
134+ }
135+
136+ @ Test
137+ void start_withFederationMember_withoutMemberPkIndex_throwsError () throws Exception {
138+ BitcoinWrapper bw = new SimpleBitcoinWrapper ();
139+ SimpleFederatorSupport fh = new SimpleFederatorSupport ();
140+ Federation federation = mock (Federation .class );
141+ FederationMember fedMember = genesisFederation .getMembers ().get (0 );
142+
143+ fh .setMember (fedMember );
144+ when (federation .isMember (fedMember )).thenReturn (true );
145+ when (federation .getBtcPublicKeyIndex (any ())).thenReturn (Optional .empty ());
146+
147+ BtcToRskClient client = createClientWithMocksCustomFederation (bw , fh , federation );
148+ assertThrows (IllegalStateException .class , () -> client .start (federation ));
149+ }
150+
105151 @ Test
106152 void getNoTransactions () {
107153 BtcToRskClient client = new BtcToRskClient ();
@@ -148,6 +194,25 @@ private BtcToRskClient createClientWithMocks(
148194 .build ();
149195 }
150196
197+ private BtcToRskClient createClientWithMocksCustomFederation (
198+ BitcoinWrapper bitcoinWrapper ,
199+ FederatorSupport federatorSupport ,
200+ Federation federation ) throws Exception {
201+
202+ BtcLockSenderProvider btcLockSenderProvider = mockBtcLockSenderProvider (TxSenderAddressType .P2PKH );
203+ int amountOfHeadersToSend = 100 ;
204+
205+ return btcToRskClientBuilder
206+ .withActivationConfig (activationConfig )
207+ .withBitcoinWrapper (bitcoinWrapper )
208+ .withFederatorSupport (federatorSupport )
209+ .withBridgeConstants (bridgeRegTestConstants )
210+ .withBtcLockSenderProvider (btcLockSenderProvider )
211+ .withFederation (federation )
212+ .withAmountOfHeadersToSend (amountOfHeadersToSend )
213+ .build ();
214+ }
215+
151216 private BtcToRskClient createClientWithMocksCustomStorageFiles (
152217 BitcoinWrapper bw ,
153218 FederatorSupport fs ,
@@ -446,8 +511,11 @@ void onBlock_including_segwit_tx_registers_coinbase() throws Exception {
446511 ActivationConfig mockedActivationConfig = mock (ActivationConfig .class );
447512 when (mockedActivationConfig .isActive (eq (ConsensusRule .RSKIP143 ), anyLong ())).thenReturn (true );
448513
514+ FederatorSupport federatorSupport = mock (FederatorSupport .class );
515+ when (federatorSupport .getFederationMember ()).thenReturn (fakeMember );
516+
449517 BtcToRskClient client = spy (buildWithFactoryAndSetup (
450- mock ( FederatorSupport . class ) ,
518+ federatorSupport ,
451519 mock (NodeBlockProcessor .class ),
452520 mockedActivationConfig ,
453521 mock (BitcoinWrapperImpl .class ),
@@ -1683,6 +1751,8 @@ void updateTransaction_with_release_before_rskip143() throws Exception {
16831751 bitcoinWrapper .setBlocks (blocks );
16841752
16851753 SimpleFederatorSupport federatorSupport = new SimpleFederatorSupport ();
1754+ // set a fake member to federatorSupport to recreate a not-null runner
1755+ federatorSupport .setMember (fakeMember );
16861756
16871757 BtcToRskClient client = buildWithFactoryAndSetup (
16881758 federatorSupport ,
@@ -2164,8 +2234,11 @@ void updateBridgeBtcCoinbaseTransactions_when_coinbase_map_has_readyToBeInformed
21642234 BtcToRskClientFileStorage btcToRskClientFileStorageMock = mock (BtcToRskClientFileStorage .class );
21652235 when (btcToRskClientFileStorageMock .read (any ())).thenReturn (new BtcToRskClientFileReadResult (true , btcToRskClientFileData ));
21662236
2237+ FederatorSupport federatorSupport = mock (FederatorSupport .class );
2238+ when (federatorSupport .getFederationMember ()).thenReturn (fakeMember );
2239+
21672240 BtcToRskClient client = buildWithFactoryAndSetup (
2168- mock ( FederatorSupport . class ) ,
2241+ federatorSupport ,
21692242 mock (NodeBlockProcessor .class ),
21702243 activations ,
21712244 mock (BitcoinWrapperImpl .class ),
@@ -2201,6 +2274,7 @@ void updateBridgeBtcCoinbaseTransactions_when_coinbase_map_has_readyToBeInformed
22012274 FederatorSupport federatorSupport = mock (FederatorSupport .class );
22022275 // mocking that the coinbase was already informed
22032276 when (federatorSupport .hasBlockCoinbaseInformed (any ())).thenReturn (true );
2277+ when (federatorSupport .getFederationMember ()).thenReturn (fakeMember );
22042278
22052279 BtcToRskClient client = buildWithFactoryAndSetup (
22062280 federatorSupport ,
@@ -2243,6 +2317,7 @@ void updateBridgeBtcCoinbaseTransactions_when_coinbase_map_has_readyToBeInformed
22432317 FederatorSupport federatorSupport = mock (FederatorSupport .class );
22442318 // Mocking the Bridge to indicate the coinbase was not informed, and then it was
22452319 when (federatorSupport .hasBlockCoinbaseInformed (any ())).thenReturn (false , true );
2320+ when (federatorSupport .getFederationMember ()).thenReturn (fakeMember );
22462321
22472322 BtcToRskClient client = buildWithFactoryAndSetup (
22482323 federatorSupport ,
@@ -2288,6 +2363,7 @@ void updateBridgeBtcCoinbaseTransactions_not_removing_from_storage_until_confirm
22882363 FederatorSupport federatorSupport = mock (FederatorSupport .class );
22892364 // mocking that the coinbase was not informed
22902365 when (federatorSupport .hasBlockCoinbaseInformed (any ())).thenReturn (false );
2366+ when (federatorSupport .getFederationMember ()).thenReturn (fakeMember );
22912367
22922368 BtcToRskClient client = buildWithFactoryAndSetup (
22932369 federatorSupport ,
@@ -2328,6 +2404,7 @@ void updateBridge_when_does_not_hasBetterBlockToSync_updates_headers_coinbase_tr
23282404
23292405 FederatorSupport federatorSupport = mock (FederatorSupport .class );
23302406 when (federatorSupport .getBtcBestBlockChainHeight ()).thenReturn (1 );
2407+ when (federatorSupport .getFederationMember ()).thenReturn (fakeMember );
23312408
23322409 BitcoinWrapper bitcoinWrapper = mock (BitcoinWrapper .class );
23332410 when (bitcoinWrapper .getBestChainHeight ()).thenReturn (1 );
@@ -2366,6 +2443,7 @@ void updateBridgeBtcTransactions_tx_with_witness_already_informed() throws Excep
23662443 when (federatorSupport .getBtcBestBlockChainHeight ()).thenReturn (1 );
23672444 when (federatorSupport .isBtcTxHashAlreadyProcessed (peginTx .getTxId ())).thenReturn (true );
23682445 when (federatorSupport .getBtcTxHashProcessedHeight (peginTx .getTxId ())).thenReturn (1L );
2446+ when (federatorSupport .getFederationMember ()).thenReturn (fakeMember );
23692447
23702448 BitcoinWrapper bitcoinWrapper = mock (BitcoinWrapper .class );
23712449 when (bitcoinWrapper .getBestChainHeight ()).thenReturn (1 );
0 commit comments