mirror of https://github.com/hyperledger/besu
IBFT message payload tests (#404)
Signed-off-by: Adrian Sutton <adrian.sutton@consensys.net>pull/2/head
parent
498b23bd00
commit
b6b711876b
@ -0,0 +1,50 @@ |
||||
/* |
||||
* Copyright 2018 ConsenSys AG. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
||||
* specific language governing permissions and limitations under the License. |
||||
*/ |
||||
package tech.pegasys.pantheon.consensus.ibft.ibftmessagedata; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
||||
import tech.pegasys.pantheon.consensus.ibft.ConsensusRoundIdentifier; |
||||
import tech.pegasys.pantheon.consensus.ibft.ibftmessage.IbftV2; |
||||
import tech.pegasys.pantheon.crypto.SECP256K1.Signature; |
||||
import tech.pegasys.pantheon.ethereum.core.Hash; |
||||
import tech.pegasys.pantheon.ethereum.rlp.BytesValueRLPOutput; |
||||
import tech.pegasys.pantheon.ethereum.rlp.RLP; |
||||
import tech.pegasys.pantheon.ethereum.rlp.RLPInput; |
||||
|
||||
import java.math.BigInteger; |
||||
|
||||
import org.junit.Test; |
||||
|
||||
public class CommitPayloadTest { |
||||
private static final ConsensusRoundIdentifier ROUND_IDENTIFIER = |
||||
new ConsensusRoundIdentifier(0x1234567890ABCDEFL, 0xFEDCBA98); |
||||
|
||||
@Test |
||||
public void roundTripRlp() { |
||||
final Signature signature = Signature.create(BigInteger.ONE, BigInteger.TEN, (byte) 0); |
||||
final Hash hash = Hash.fromHexStringLenient("0x8523ba6e7c5f59ae87"); |
||||
|
||||
final CommitPayload expectedCommitPayload = |
||||
new CommitPayload(ROUND_IDENTIFIER, hash, signature); |
||||
final BytesValueRLPOutput rlpOut = new BytesValueRLPOutput(); |
||||
expectedCommitPayload.writeTo(rlpOut); |
||||
|
||||
final RLPInput rlpInput = RLP.input(rlpOut.encoded()); |
||||
final CommitPayload commitPayload = CommitPayload.readFrom(rlpInput); |
||||
assertThat(commitPayload.getRoundIdentifier()).isEqualTo(ROUND_IDENTIFIER); |
||||
assertThat(commitPayload.getCommitSeal()).isEqualTo(signature); |
||||
assertThat(commitPayload.getDigest()).isEqualTo(hash); |
||||
assertThat(commitPayload.getMessageType()).isEqualTo(IbftV2.COMMIT); |
||||
} |
||||
} |
@ -0,0 +1,93 @@ |
||||
/* |
||||
* Copyright 2018 ConsenSys AG. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
||||
* specific language governing permissions and limitations under the License. |
||||
*/ |
||||
package tech.pegasys.pantheon.consensus.ibft.ibftmessagedata; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
||||
import tech.pegasys.pantheon.consensus.ibft.ConsensusRoundIdentifier; |
||||
import tech.pegasys.pantheon.consensus.ibft.TestHelpers; |
||||
import tech.pegasys.pantheon.consensus.ibft.ibftmessage.IbftV2; |
||||
import tech.pegasys.pantheon.crypto.SECP256K1.Signature; |
||||
import tech.pegasys.pantheon.ethereum.core.Block; |
||||
import tech.pegasys.pantheon.ethereum.core.Hash; |
||||
import tech.pegasys.pantheon.ethereum.rlp.BytesValueRLPOutput; |
||||
import tech.pegasys.pantheon.ethereum.rlp.RLP; |
||||
import tech.pegasys.pantheon.ethereum.rlp.RLPInput; |
||||
|
||||
import java.math.BigInteger; |
||||
import java.util.Collections; |
||||
import java.util.Optional; |
||||
|
||||
import org.assertj.core.util.Lists; |
||||
import org.junit.Test; |
||||
|
||||
public class NewRoundPayloadTest { |
||||
private static final ConsensusRoundIdentifier ROUND_IDENTIFIER = |
||||
new ConsensusRoundIdentifier(0x1234567890ABCDEFL, 0xFEDCBA98); |
||||
|
||||
@Test |
||||
public void roundTripRlpWithNoRoundChangePayloads() { |
||||
final Block block = TestHelpers.createProposalBlock(); |
||||
final ProposalPayload proposalPayload = new ProposalPayload(ROUND_IDENTIFIER, block); |
||||
final Signature signature = Signature.create(BigInteger.ONE, BigInteger.TEN, (byte) 0); |
||||
final SignedData<ProposalPayload> proposalPayloadSignedData = |
||||
SignedData.from(proposalPayload, signature); |
||||
|
||||
final RoundChangeCertificate roundChangeCertificate = |
||||
new RoundChangeCertificate(Collections.emptyList()); |
||||
final NewRoundPayload expectedNewRoundPayload = |
||||
new NewRoundPayload(ROUND_IDENTIFIER, roundChangeCertificate, proposalPayloadSignedData); |
||||
final BytesValueRLPOutput rlpOut = new BytesValueRLPOutput(); |
||||
expectedNewRoundPayload.writeTo(rlpOut); |
||||
|
||||
final RLPInput rlpInput = RLP.input(rlpOut.encoded()); |
||||
final NewRoundPayload newRoundPayload = NewRoundPayload.readFrom(rlpInput); |
||||
assertThat(newRoundPayload.getProposalPayload()).isEqualTo(proposalPayloadSignedData); |
||||
assertThat(newRoundPayload.getRoundChangeCertificate()).isEqualTo(roundChangeCertificate); |
||||
assertThat(newRoundPayload.getRoundChangeIdentifier()).isEqualTo(ROUND_IDENTIFIER); |
||||
assertThat(newRoundPayload.getMessageType()).isEqualTo(IbftV2.NEW_ROUND); |
||||
} |
||||
|
||||
@Test |
||||
public void roundTripRlpWithRoundChangePayloads() { |
||||
final Block block = TestHelpers.createProposalBlock(); |
||||
final ProposalPayload proposalPayload = new ProposalPayload(ROUND_IDENTIFIER, block); |
||||
final Signature signature = Signature.create(BigInteger.ONE, BigInteger.TEN, (byte) 0); |
||||
final SignedData<ProposalPayload> signedProposal = SignedData.from(proposalPayload, signature); |
||||
|
||||
final PreparePayload preparePayload = |
||||
new PreparePayload(ROUND_IDENTIFIER, Hash.fromHexStringLenient("0x8523ba6e7c5f59ae87")); |
||||
final SignedData<PreparePayload> signedPrepare = SignedData.from(preparePayload, signature); |
||||
final PreparedCertificate preparedCert = |
||||
new PreparedCertificate(signedProposal, Lists.newArrayList(signedPrepare)); |
||||
|
||||
final RoundChangePayload roundChangePayload = |
||||
new RoundChangePayload(ROUND_IDENTIFIER, Optional.of(preparedCert)); |
||||
SignedData<RoundChangePayload> signedRoundChange = |
||||
SignedData.from(roundChangePayload, signature); |
||||
|
||||
final RoundChangeCertificate roundChangeCertificate = |
||||
new RoundChangeCertificate(Lists.list(signedRoundChange)); |
||||
final NewRoundPayload expectedNewRoundPayload = |
||||
new NewRoundPayload(ROUND_IDENTIFIER, roundChangeCertificate, signedProposal); |
||||
final BytesValueRLPOutput rlpOut = new BytesValueRLPOutput(); |
||||
expectedNewRoundPayload.writeTo(rlpOut); |
||||
|
||||
final RLPInput rlpInput = RLP.input(rlpOut.encoded()); |
||||
final NewRoundPayload newRoundPayload = NewRoundPayload.readFrom(rlpInput); |
||||
assertThat(newRoundPayload.getProposalPayload()).isEqualTo(signedProposal); |
||||
assertThat(newRoundPayload.getRoundChangeCertificate()).isEqualTo(roundChangeCertificate); |
||||
assertThat(newRoundPayload.getRoundChangeIdentifier()).isEqualTo(ROUND_IDENTIFIER); |
||||
assertThat(newRoundPayload.getMessageType()).isEqualTo(IbftV2.NEW_ROUND); |
||||
} |
||||
} |
@ -0,0 +1,48 @@ |
||||
/* |
||||
* Copyright 2018 ConsenSys AG. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
||||
* specific language governing permissions and limitations under the License. |
||||
*/ |
||||
package tech.pegasys.pantheon.consensus.ibft.ibftmessagedata; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
||||
import tech.pegasys.pantheon.consensus.ibft.ConsensusRoundIdentifier; |
||||
import tech.pegasys.pantheon.consensus.ibft.ibftmessage.IbftV2; |
||||
import tech.pegasys.pantheon.ethereum.core.Hash; |
||||
import tech.pegasys.pantheon.ethereum.rlp.BytesValueRLPOutput; |
||||
import tech.pegasys.pantheon.ethereum.rlp.RLP; |
||||
import tech.pegasys.pantheon.ethereum.rlp.RLPInput; |
||||
import tech.pegasys.pantheon.util.bytes.BytesValue; |
||||
|
||||
import org.junit.Test; |
||||
|
||||
public class PreparePayloadTest { |
||||
|
||||
@Test |
||||
public void roundTripRlp() { |
||||
final Hash digest = Hash.hash(BytesValue.of(1)); |
||||
final ConsensusRoundIdentifier expectedRoundIdentifier = new ConsensusRoundIdentifier(1, 1); |
||||
final PreparePayload preparePayload = new PreparePayload(expectedRoundIdentifier, digest); |
||||
final BytesValueRLPOutput rlpOutput = new BytesValueRLPOutput(); |
||||
preparePayload.writeTo(rlpOutput); |
||||
|
||||
final RLPInput rlpInput = RLP.input(rlpOutput.encoded()); |
||||
final PreparePayload actualPreparePayload = PreparePayload.readFrom(rlpInput); |
||||
|
||||
final ConsensusRoundIdentifier actualConsensusRoundIdentifier = |
||||
actualPreparePayload.getRoundIdentifier(); |
||||
final Hash actualDigest = actualPreparePayload.getDigest(); |
||||
assertThat(actualConsensusRoundIdentifier) |
||||
.isEqualToComparingFieldByField(expectedRoundIdentifier); |
||||
assertThat(actualDigest).isEqualTo(digest); |
||||
assertThat(actualPreparePayload.getMessageType()).isEqualTo(IbftV2.PREPARE); |
||||
} |
||||
} |
@ -0,0 +1,82 @@ |
||||
/* |
||||
* Copyright 2018 ConsenSys AG. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
||||
* specific language governing permissions and limitations under the License. |
||||
*/ |
||||
package tech.pegasys.pantheon.consensus.ibft.ibftmessagedata; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
||||
import tech.pegasys.pantheon.consensus.ibft.ConsensusRoundIdentifier; |
||||
import tech.pegasys.pantheon.consensus.ibft.TestHelpers; |
||||
import tech.pegasys.pantheon.crypto.SECP256K1.Signature; |
||||
import tech.pegasys.pantheon.ethereum.core.Block; |
||||
import tech.pegasys.pantheon.ethereum.core.Hash; |
||||
import tech.pegasys.pantheon.ethereum.rlp.BytesValueRLPOutput; |
||||
import tech.pegasys.pantheon.ethereum.rlp.RLP; |
||||
import tech.pegasys.pantheon.ethereum.rlp.RLPInput; |
||||
|
||||
import java.math.BigInteger; |
||||
import java.util.Collection; |
||||
import java.util.Collections; |
||||
|
||||
import org.assertj.core.util.Lists; |
||||
import org.junit.Test; |
||||
|
||||
public class PreparedCertificateTest { |
||||
private static final ConsensusRoundIdentifier ROUND_IDENTIFIER = |
||||
new ConsensusRoundIdentifier(0x1234567890ABCDEFL, 0xFEDCBA98); |
||||
|
||||
@Test |
||||
public void roundTripRlpWithNoPreparePayloads() { |
||||
final SignedData<ProposalPayload> signedProposalPayload = signedProposal(); |
||||
final Collection<SignedData<PreparePayload>> preparePayloads = Collections.emptyList(); |
||||
|
||||
final PreparedCertificate preparedCert = |
||||
new PreparedCertificate(signedProposalPayload, preparePayloads); |
||||
final BytesValueRLPOutput rlpOut = new BytesValueRLPOutput(); |
||||
preparedCert.writeTo(rlpOut); |
||||
|
||||
final RLPInput rlpInput = RLP.input(rlpOut.encoded()); |
||||
PreparedCertificate actualPreparedCert = PreparedCertificate.readFrom(rlpInput); |
||||
assertThat(actualPreparedCert.getPreparePayloads()) |
||||
.isEqualTo(preparedCert.getPreparePayloads()); |
||||
assertThat(actualPreparedCert.getProposalPayload()) |
||||
.isEqualTo(preparedCert.getProposalPayload()); |
||||
} |
||||
|
||||
@Test |
||||
public void roundTripRlpWithPreparePayload() { |
||||
final SignedData<ProposalPayload> signedProposalPayload = signedProposal(); |
||||
final PreparePayload preparePayload = |
||||
new PreparePayload(ROUND_IDENTIFIER, Hash.fromHexStringLenient("0x8523ba6e7c5f59ae87")); |
||||
final Signature signature = Signature.create(BigInteger.ONE, BigInteger.TEN, (byte) 0); |
||||
final SignedData<PreparePayload> signedPrepare = SignedData.from(preparePayload, signature); |
||||
|
||||
final PreparedCertificate preparedCert = |
||||
new PreparedCertificate(signedProposalPayload, Lists.newArrayList(signedPrepare)); |
||||
final BytesValueRLPOutput rlpOut = new BytesValueRLPOutput(); |
||||
preparedCert.writeTo(rlpOut); |
||||
|
||||
final RLPInput rlpInput = RLP.input(rlpOut.encoded()); |
||||
PreparedCertificate actualPreparedCert = PreparedCertificate.readFrom(rlpInput); |
||||
assertThat(actualPreparedCert.getPreparePayloads()) |
||||
.isEqualTo(preparedCert.getPreparePayloads()); |
||||
assertThat(actualPreparedCert.getProposalPayload()) |
||||
.isEqualTo(preparedCert.getProposalPayload()); |
||||
} |
||||
|
||||
private SignedData<ProposalPayload> signedProposal() { |
||||
final Block block = TestHelpers.createProposalBlock(); |
||||
final ProposalPayload proposalPayload = new ProposalPayload(ROUND_IDENTIFIER, block); |
||||
final Signature signature = Signature.create(BigInteger.ONE, BigInteger.TEN, (byte) 0); |
||||
return SignedData.from(proposalPayload, signature); |
||||
} |
||||
} |
@ -0,0 +1,44 @@ |
||||
/* |
||||
* Copyright 2018 ConsenSys AG. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
||||
* specific language governing permissions and limitations under the License. |
||||
*/ |
||||
package tech.pegasys.pantheon.consensus.ibft.ibftmessagedata; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
||||
import tech.pegasys.pantheon.consensus.ibft.ConsensusRoundIdentifier; |
||||
import tech.pegasys.pantheon.consensus.ibft.TestHelpers; |
||||
import tech.pegasys.pantheon.consensus.ibft.ibftmessage.IbftV2; |
||||
import tech.pegasys.pantheon.ethereum.core.Block; |
||||
import tech.pegasys.pantheon.ethereum.rlp.BytesValueRLPOutput; |
||||
import tech.pegasys.pantheon.ethereum.rlp.RLP; |
||||
import tech.pegasys.pantheon.ethereum.rlp.RLPInput; |
||||
|
||||
import org.junit.Test; |
||||
|
||||
public class ProposalPayloadTest { |
||||
private static final ConsensusRoundIdentifier ROUND_IDENTIFIER = |
||||
new ConsensusRoundIdentifier(0x1234567890ABCDEFL, 0xFEDCBA98); |
||||
|
||||
@Test |
||||
public void roundTripRlp() { |
||||
final Block block = TestHelpers.createProposalBlock(); |
||||
final ProposalPayload expectedProposalPayload = new ProposalPayload(ROUND_IDENTIFIER, block); |
||||
final BytesValueRLPOutput rlpOut = new BytesValueRLPOutput(); |
||||
expectedProposalPayload.writeTo(rlpOut); |
||||
|
||||
final RLPInput rlpInput = RLP.input(rlpOut.encoded()); |
||||
final ProposalPayload proposalPayload = ProposalPayload.readFrom(rlpInput); |
||||
assertThat(proposalPayload.getRoundIdentifier()).isEqualTo(ROUND_IDENTIFIER); |
||||
assertThat(proposalPayload.getBlock()).isEqualTo(block); |
||||
assertThat(proposalPayload.getMessageType()).isEqualTo(IbftV2.PROPOSAL); |
||||
} |
||||
} |
@ -0,0 +1,79 @@ |
||||
/* |
||||
* Copyright 2018 ConsenSys AG. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
||||
* specific language governing permissions and limitations under the License. |
||||
*/ |
||||
package tech.pegasys.pantheon.consensus.ibft.ibftmessagedata; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
||||
import tech.pegasys.pantheon.consensus.ibft.ConsensusRoundIdentifier; |
||||
import tech.pegasys.pantheon.consensus.ibft.TestHelpers; |
||||
import tech.pegasys.pantheon.consensus.ibft.ibftmessage.IbftV2; |
||||
import tech.pegasys.pantheon.crypto.SECP256K1.Signature; |
||||
import tech.pegasys.pantheon.ethereum.core.Block; |
||||
import tech.pegasys.pantheon.ethereum.core.Hash; |
||||
import tech.pegasys.pantheon.ethereum.rlp.BytesValueRLPOutput; |
||||
import tech.pegasys.pantheon.ethereum.rlp.RLP; |
||||
import tech.pegasys.pantheon.ethereum.rlp.RLPInput; |
||||
|
||||
import java.math.BigInteger; |
||||
import java.util.Optional; |
||||
|
||||
import org.assertj.core.util.Lists; |
||||
import org.junit.Test; |
||||
|
||||
public class RoundChangeCertificateTest { |
||||
private static final ConsensusRoundIdentifier ROUND_IDENTIFIER = |
||||
new ConsensusRoundIdentifier(0x1234567890ABCDEFL, 0xFEDCBA98); |
||||
|
||||
@Test |
||||
public void rlpRoundTripWithNoPreparedCertificate() { |
||||
final RoundChangePayload roundChangePayload = |
||||
new RoundChangePayload(ROUND_IDENTIFIER, Optional.empty()); |
||||
final BytesValueRLPOutput rlpOut = new BytesValueRLPOutput(); |
||||
roundChangePayload.writeTo(rlpOut); |
||||
|
||||
final RLPInput rlpInput = RLP.input(rlpOut.encoded()); |
||||
RoundChangePayload actualRoundChangePayload = RoundChangePayload.readFrom(rlpInput); |
||||
|
||||
assertThat(actualRoundChangePayload.getPreparedCertificate()).isEqualTo(Optional.empty()); |
||||
assertThat(actualRoundChangePayload.getRoundChangeIdentifier()).isEqualTo(ROUND_IDENTIFIER); |
||||
assertThat(actualRoundChangePayload.getMessageType()).isEqualTo(IbftV2.ROUND_CHANGE); |
||||
} |
||||
|
||||
@Test |
||||
public void rlpRoundTripWithPreparedCertificate() { |
||||
final Block block = TestHelpers.createProposalBlock(); |
||||
final ProposalPayload proposalPayload = new ProposalPayload(ROUND_IDENTIFIER, block); |
||||
final Signature signature = Signature.create(BigInteger.ONE, BigInteger.TEN, (byte) 0); |
||||
SignedData<ProposalPayload> signedProposal = SignedData.from(proposalPayload, signature); |
||||
|
||||
final PreparePayload preparePayload = |
||||
new PreparePayload(ROUND_IDENTIFIER, Hash.fromHexStringLenient("0x8523ba6e7c5f59ae87")); |
||||
final SignedData<PreparePayload> signedPrepare = SignedData.from(preparePayload, signature); |
||||
|
||||
final PreparedCertificate preparedCert = |
||||
new PreparedCertificate(signedProposal, Lists.newArrayList(signedPrepare)); |
||||
|
||||
final RoundChangePayload roundChangePayload = |
||||
new RoundChangePayload(ROUND_IDENTIFIER, Optional.of(preparedCert)); |
||||
final BytesValueRLPOutput rlpOut = new BytesValueRLPOutput(); |
||||
roundChangePayload.writeTo(rlpOut); |
||||
|
||||
final RLPInput rlpInput = RLP.input(rlpOut.encoded()); |
||||
RoundChangePayload actualRoundChangePayload = RoundChangePayload.readFrom(rlpInput); |
||||
|
||||
assertThat(actualRoundChangePayload.getPreparedCertificate()) |
||||
.isEqualTo(Optional.of(preparedCert)); |
||||
assertThat(actualRoundChangePayload.getRoundChangeIdentifier()).isEqualTo(ROUND_IDENTIFIER); |
||||
assertThat(actualRoundChangePayload.getMessageType()).isEqualTo(IbftV2.ROUND_CHANGE); |
||||
} |
||||
} |
@ -0,0 +1,103 @@ |
||||
/* |
||||
* Copyright 2018 ConsenSys AG. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
||||
* specific language governing permissions and limitations under the License. |
||||
*/ |
||||
package tech.pegasys.pantheon.consensus.ibft.ibftmessagedata; |
||||
|
||||
import static java.util.Optional.empty; |
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
||||
import tech.pegasys.pantheon.consensus.ibft.ConsensusRoundIdentifier; |
||||
import tech.pegasys.pantheon.consensus.ibft.TestHelpers; |
||||
import tech.pegasys.pantheon.consensus.ibft.ibftmessage.IbftV2; |
||||
import tech.pegasys.pantheon.crypto.SECP256K1.Signature; |
||||
import tech.pegasys.pantheon.ethereum.core.Block; |
||||
import tech.pegasys.pantheon.ethereum.core.Hash; |
||||
import tech.pegasys.pantheon.ethereum.rlp.BytesValueRLPOutput; |
||||
import tech.pegasys.pantheon.ethereum.rlp.RLP; |
||||
import tech.pegasys.pantheon.ethereum.rlp.RLPInput; |
||||
|
||||
import java.math.BigInteger; |
||||
import java.util.Collections; |
||||
import java.util.Optional; |
||||
|
||||
import org.assertj.core.util.Lists; |
||||
import org.junit.Test; |
||||
|
||||
public class RoundChangePayloadTest { |
||||
private static final ConsensusRoundIdentifier ROUND_IDENTIFIER = |
||||
new ConsensusRoundIdentifier(0x1234567890ABCDEFL, 0xFEDCBA98); |
||||
private static final Signature SIGNATURE = |
||||
Signature.create(BigInteger.ONE, BigInteger.TEN, (byte) 0); |
||||
|
||||
@Test |
||||
public void roundTripRlpWithNoPreparedCertificate() { |
||||
final RoundChangePayload roundChangePayload = new RoundChangePayload(ROUND_IDENTIFIER, empty()); |
||||
final BytesValueRLPOutput rlpOut = new BytesValueRLPOutput(); |
||||
roundChangePayload.writeTo(rlpOut); |
||||
|
||||
final RLPInput rlpInput = RLP.input(rlpOut.encoded()); |
||||
RoundChangePayload actualRoundChangePayload = RoundChangePayload.readFrom(rlpInput); |
||||
assertThat(actualRoundChangePayload.getRoundChangeIdentifier()).isEqualTo(ROUND_IDENTIFIER); |
||||
assertThat(actualRoundChangePayload.getPreparedCertificate()).isEqualTo(Optional.empty()); |
||||
assertThat(actualRoundChangePayload.getMessageType()).isEqualTo(IbftV2.ROUND_CHANGE); |
||||
} |
||||
|
||||
@Test |
||||
public void roundTripRlpWithEmptyPreparedCertificate() { |
||||
final SignedData<ProposalPayload> signedProposal = signedProposal(); |
||||
|
||||
final PreparedCertificate preparedCertificate = |
||||
new PreparedCertificate(signedProposal, Collections.emptyList()); |
||||
|
||||
final RoundChangePayload roundChangePayload = |
||||
new RoundChangePayload(ROUND_IDENTIFIER, Optional.of(preparedCertificate)); |
||||
final BytesValueRLPOutput rlpOut = new BytesValueRLPOutput(); |
||||
roundChangePayload.writeTo(rlpOut); |
||||
|
||||
final RLPInput rlpInput = RLP.input(rlpOut.encoded()); |
||||
RoundChangePayload actualRoundChangePayload = RoundChangePayload.readFrom(rlpInput); |
||||
assertThat(actualRoundChangePayload.getRoundChangeIdentifier()).isEqualTo(ROUND_IDENTIFIER); |
||||
assertThat(actualRoundChangePayload.getPreparedCertificate()) |
||||
.isEqualTo(Optional.of(preparedCertificate)); |
||||
assertThat(actualRoundChangePayload.getMessageType()).isEqualTo(IbftV2.ROUND_CHANGE); |
||||
} |
||||
|
||||
@Test |
||||
public void roundTripRlpWithPreparedCertificate() { |
||||
final SignedData<ProposalPayload> signedProposal = signedProposal(); |
||||
|
||||
final PreparePayload preparePayload = |
||||
new PreparePayload(ROUND_IDENTIFIER, Hash.fromHexStringLenient("0x8523ba6e7c5f59ae87")); |
||||
final SignedData<PreparePayload> signedPrepare = SignedData.from(preparePayload, SIGNATURE); |
||||
final PreparedCertificate preparedCert = |
||||
new PreparedCertificate(signedProposal, Lists.newArrayList(signedPrepare)); |
||||
|
||||
final RoundChangePayload roundChangePayload = |
||||
new RoundChangePayload(ROUND_IDENTIFIER, Optional.of(preparedCert)); |
||||
final BytesValueRLPOutput rlpOut = new BytesValueRLPOutput(); |
||||
roundChangePayload.writeTo(rlpOut); |
||||
|
||||
final RLPInput rlpInput = RLP.input(rlpOut.encoded()); |
||||
RoundChangePayload actualRoundChangePayload = RoundChangePayload.readFrom(rlpInput); |
||||
assertThat(actualRoundChangePayload.getRoundChangeIdentifier()).isEqualTo(ROUND_IDENTIFIER); |
||||
assertThat(actualRoundChangePayload.getPreparedCertificate()) |
||||
.isEqualTo(Optional.of(preparedCert)); |
||||
assertThat(actualRoundChangePayload.getMessageType()).isEqualTo(IbftV2.ROUND_CHANGE); |
||||
} |
||||
|
||||
private SignedData<ProposalPayload> signedProposal() { |
||||
final Block block = TestHelpers.createProposalBlock(); |
||||
final ProposalPayload proposalPayload = new ProposalPayload(ROUND_IDENTIFIER, block); |
||||
final Signature signature = Signature.create(BigInteger.ONE, BigInteger.TEN, (byte) 0); |
||||
return SignedData.from(proposalPayload, signature); |
||||
} |
||||
} |
Loading…
Reference in new issue