Skip to content

Commit

Permalink
feat(peg): add get svp spend tx waiting for signatures logic and unit…
Browse files Browse the repository at this point in the history
… tests
  • Loading branch information
apancorb committed Sep 13, 2024
1 parent 4dc5705 commit 879eaff
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ private static byte[][] serializeRskTxWaitingForSignaturesEntry(
public static Map.Entry<Keccak256, BtcTransaction> deserializeRskTxWaitingForSignatures(
byte[] data, NetworkParameters networkParameters, boolean noInputsTxs) {
if (data == null || data.length == 0) {
return new AbstractMap.SimpleEntry<>(null, null);
return null;
}

RLPList rlpList = (RLPList) RLP.decode2(data).get(0);
Expand Down
16 changes: 16 additions & 0 deletions rskj-core/src/main/java/co/rsk/peg/BridgeStorageProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -584,6 +584,22 @@ public Optional<Sha256Hash> getSvpSpendTxHashUnsigned() {
return Optional.ofNullable(svpSpendTxHashUnsigned);
}

public Optional<Map.Entry<Keccak256, BtcTransaction>> getSvpSpendTxWaitingForSignatures() {
if (!activations.isActive(RSKIP419)) {
return Optional.empty();
}

if (svpSpendTxWaitingForSignatures != null) {
return Optional.of(svpSpendTxWaitingForSignatures);
}

svpSpendTxWaitingForSignatures = safeGetFromRepository(
SVP_SPEND_TX_WAITING_FOR_SIGNATURES.getKey(),
data -> BridgeSerializationUtils.deserializeRskTxWaitingForSignatures(data, networkParameters, false));

return Optional.ofNullable(svpSpendTxWaitingForSignatures);
}

public void setSvpFundTxHashUnsigned(Sha256Hash hash) {
this.svpFundTxHashUnsigned = hash;
this.isSvpFundTxHashUnsignedSet = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,9 +124,7 @@ void deserializeRskTxWaitingForSignatures_whenInvalidData_shouldReturnEmptyResul
BridgeSerializationUtils.deserializeRskTxWaitingForSignatures(data, NETWORK_PARAMETERS, false);

// Assert
assertNotNull(result);
assertNull(result.getKey());
assertNull(result.getValue());
assertNull(result);
}

@Test
Expand Down
89 changes: 79 additions & 10 deletions rskj-core/src/test/java/co/rsk/peg/BridgeStorageProviderTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -845,6 +845,8 @@ class SvpSpendTxWaitingForSignaturesTests {
private final Keccak256 rskTxHash = PegTestUtils.createHash3(1);
private final BtcTransaction svpSpendTx = new BtcTransaction(mainnetBtcParams);
private final String svpSpendTxWaitingForSignaturesField = "svpSpendTxWaitingForSignatures";
private final Map.Entry<Keccak256, BtcTransaction> svpSpendTxWaitingForSignatures =
new AbstractMap.SimpleEntry<>(rskTxHash, svpSpendTx);
private Repository repository;
private BridgeStorageProvider bridgeStorageProvider;

Expand Down Expand Up @@ -872,9 +874,9 @@ void saveSvpSpendTxWaitingForSignatures_preLovell700_shouldNotSaveInStorage() {
@Test
void saveSvpSpendTxWaitingForSignatures_postLovell700AndEmptyEntry_shouldThrowIllegalArgumentException() {
// Arrange
Map.Entry<Keccak256, BtcTransaction> svpSpendTxWaitingForSignatures =
Map.Entry<Keccak256, BtcTransaction> emptySvpSpendTxWaitingForSignatures =
new AbstractMap.SimpleEntry<>(null, null);
TestUtils.setInternalState(bridgeStorageProvider, svpSpendTxWaitingForSignaturesField, svpSpendTxWaitingForSignatures);
TestUtils.setInternalState(bridgeStorageProvider, svpSpendTxWaitingForSignaturesField, emptySvpSpendTxWaitingForSignatures);

// Act
assertThrows(IllegalArgumentException.class, () -> bridgeStorageProvider.save());
Expand All @@ -888,9 +890,9 @@ void saveSvpSpendTxWaitingForSignatures_postLovell700AndEmptyEntry_shouldThrowIl
@Test
void saveSvpSpendTxWaitingForSignatures_postLovell700AndNullKeyInEntry_shouldThrowIllegalArgumentException() {
// Arrange
Map.Entry<Keccak256, BtcTransaction> svpSpendTxWaitingForSignatures =
Map.Entry<Keccak256, BtcTransaction> emptySvpSpendTxWaitingForSignatures =
new AbstractMap.SimpleEntry<>(null, svpSpendTx);
TestUtils.setInternalState(bridgeStorageProvider, svpSpendTxWaitingForSignaturesField, svpSpendTxWaitingForSignatures);
TestUtils.setInternalState(bridgeStorageProvider, svpSpendTxWaitingForSignaturesField, emptySvpSpendTxWaitingForSignatures);

// Act
assertThrows(IllegalArgumentException.class, () -> bridgeStorageProvider.save());
Expand All @@ -904,9 +906,9 @@ void saveSvpSpendTxWaitingForSignatures_postLovell700AndNullKeyInEntry_shouldThr
@Test
void saveSvpSpendTxWaitingForSignatures_postLovell700AndNullValueInEntry_shouldThrowIllegalArgumentException() {
// Arrange
Map.Entry<Keccak256, BtcTransaction> svpSpendTxWaitingForSignatures =
Map.Entry<Keccak256, BtcTransaction> emptySvpSpendTxWaitingForSignatures =
new AbstractMap.SimpleEntry<>(rskTxHash, null);
TestUtils.setInternalState(bridgeStorageProvider, svpSpendTxWaitingForSignaturesField, svpSpendTxWaitingForSignatures);
TestUtils.setInternalState(bridgeStorageProvider, svpSpendTxWaitingForSignaturesField, emptySvpSpendTxWaitingForSignatures);

// Act
assertThrows(IllegalArgumentException.class, () -> bridgeStorageProvider.save());
Expand All @@ -920,8 +922,6 @@ void saveSvpSpendTxWaitingForSignatures_postLovell700AndNullValueInEntry_shouldT
@Test
void saveSvpSpendTxWaitingForSignatures_postLovell700_shouldSaveInStorage() {
// Arrange
Map.Entry<Keccak256, BtcTransaction> svpSpendTxWaitingForSignatures =
new AbstractMap.SimpleEntry<>(rskTxHash, svpSpendTx);
TestUtils.setInternalState(bridgeStorageProvider, svpSpendTxWaitingForSignaturesField, svpSpendTxWaitingForSignatures);

// Act
Expand All @@ -938,8 +938,6 @@ void saveSvpSpendTxWaitingForSignatures_postLovell700_shouldSaveInStorage() {
@Test
void saveSvpSpendTxWaitingForSignatures_postLovell700AndNullSvpSpendTxWaitingForSignatures_shouldSaveInStorage() {
// Initially setting a valid entry in storage
Map.Entry<Keccak256, BtcTransaction> svpSpendTxWaitingForSignatures =
new AbstractMap.SimpleEntry<>(rskTxHash, svpSpendTx);
TestUtils.setInternalState(bridgeStorageProvider, svpSpendTxWaitingForSignaturesField, svpSpendTxWaitingForSignatures);
bridgeStorageProvider.save();

Expand All @@ -952,6 +950,77 @@ void saveSvpSpendTxWaitingForSignatures_postLovell700AndNullSvpSpendTxWaitingFor
repository.getStorageBytes(bridgeAddress, SVP_SPEND_TX_WAITING_FOR_SIGNATURES.getKey());
assertNull(actualSvpSpendTxWaitingForSignatures);
}

@Test
void getSvpSpendTxWaitingForSignatures_preLovell700_shouldReturnEmpty() {
// Arrange
ActivationConfig.ForBlock arrowheadActivations = ActivationConfigsForTest.arrowhead631().forBlock(0L);
bridgeStorageProvider = createBridgeStorageProvider(repository, mainnetBtcParams, arrowheadActivations);

// Manually setting the value in storage to then assert that pre fork the method doesn't access the storage
repository.addStorageBytes(
bridgeAddress,
SVP_SPEND_TX_WAITING_FOR_SIGNATURES.getKey(),
BridgeSerializationUtils.serializeRskTxWaitingForSignatures(svpSpendTxWaitingForSignatures));

// Act
Optional<Map.Entry<Keccak256, BtcTransaction>> actualSvpSpendTxWaitingForSignatures =
bridgeStorageProvider.getSvpSpendTxWaitingForSignatures();

// Assert
assertEquals(Optional.empty(), actualSvpSpendTxWaitingForSignatures);
}

@Test
void getSvpSpendTxWaitingForSignatures_whenThereIsNoSvpSpendTxWaitingForSignaturesSaved_shouldReturnEmpty() {
Optional<Map.Entry<Keccak256, BtcTransaction>> actualSvpSpendTxWaitingForSignatures =
bridgeStorageProvider.getSvpSpendTxWaitingForSignatures();
assertEquals(Optional.empty(), actualSvpSpendTxWaitingForSignatures);
}

@Test
void getSvpSpendTxWaitingForSignatures_whenEntryCachedButNotSavedToStorage_shouldReturnTheHash() {
// Arrange
TestUtils.setInternalState(bridgeStorageProvider, svpSpendTxWaitingForSignaturesField, svpSpendTxWaitingForSignatures);

// Act
Optional<Map.Entry<Keccak256, BtcTransaction>> actualSvpSpendTxWaitingForSignatures =
bridgeStorageProvider.getSvpSpendTxWaitingForSignatures();

// Assert
assertTrue(actualSvpSpendTxWaitingForSignatures.isPresent());
assertEquals(svpSpendTxWaitingForSignatures, actualSvpSpendTxWaitingForSignatures.get());
}

@Test
void getSvpSpendTxWaitingForSignatures_whenEntryDirectlySavedInStorage_shouldReturnTheEntry() {
// Arrange
repository.addStorageBytes(
bridgeAddress,
SVP_SPEND_TX_WAITING_FOR_SIGNATURES.getKey(),
BridgeSerializationUtils.serializeRskTxWaitingForSignatures(svpSpendTxWaitingForSignatures));

// Act
Optional<Map.Entry<Keccak256, BtcTransaction>> actualSvpSpendTxWaitingForSignatures =
bridgeStorageProvider.getSvpSpendTxWaitingForSignatures();

// Assert
assertTrue(actualSvpSpendTxWaitingForSignatures.isPresent());
assertEquals(svpSpendTxWaitingForSignatures, actualSvpSpendTxWaitingForSignatures.get());
}

@Test
void getSvpSpendTxWaitingForSignatures_whenEntryIsNullInStorage_shouldReturnEmpty() {
// Arrange
repository.addStorageBytes(bridgeAddress, SVP_SPEND_TX_WAITING_FOR_SIGNATURES.getKey(), null);

// Act
Optional<Map.Entry<Keccak256, BtcTransaction>> actualSvpSpendTxWaitingForSignatures =
bridgeStorageProvider.getSvpSpendTxWaitingForSignatures();

// Assert
assertEquals(Optional.empty(), actualSvpSpendTxWaitingForSignatures);
}
}

@Test
Expand Down

0 comments on commit 879eaff

Please sign in to comment.