mirror of https://github.com/hyperledger/besu
IBFT message payload tests (#404)
parent
a4c50e54a6
commit
4bfb381b34
@ -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