From 2c1dded83f87af7beaa84d7122c57414b4ca6a2b Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Sun, 6 Oct 2019 09:07:52 +1100 Subject: [PATCH] Round trip testing of state trie account values (#31) Signed-off-by: Peter Robinson --- .../worldstate/StateTrieAccountValueTest.java | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 ethereum/core/src/test/java/org/hyperledger/besu/ethereum/worldstate/StateTrieAccountValueTest.java diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/worldstate/StateTrieAccountValueTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/worldstate/StateTrieAccountValueTest.java new file mode 100644 index 0000000000..45ca4245c0 --- /dev/null +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/worldstate/StateTrieAccountValueTest.java @@ -0,0 +1,84 @@ +/* + * Copyright 2019 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. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.worldstate; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.hyperledger.besu.ethereum.core.Hash; +import org.hyperledger.besu.ethereum.core.Wei; +import org.hyperledger.besu.ethereum.rlp.RLP; +import org.hyperledger.besu.ethereum.rlp.RLPInput; +import org.hyperledger.besu.util.bytes.BytesValue; + +import org.junit.Test; + +public class StateTrieAccountValueTest { + + @Test + public void roundTripMainNetAccountValueVersionZero() { + final long nonce = 0; + final Wei balance = Wei.ZERO; + // Have the storageRoot and codeHash as different values to ensure the encode / decode + // doesn't cross the values over. + final Hash storageRoot = Hash.EMPTY_TRIE_HASH; + final Hash codeHash = Hash.EMPTY_LIST_HASH; + final int version = 0; + + roundTripMainNetAccountValue(nonce, balance, storageRoot, codeHash, version); + } + + @Test + public void roundTripMainNetAccountValueVersionNotZero() { + final long nonce = 0; + final Wei balance = Wei.ZERO; + final Hash storageRoot = Hash.EMPTY_TRIE_HASH; + final Hash codeHash = Hash.EMPTY_LIST_HASH; + final int version = 1; + + roundTripMainNetAccountValue(nonce, balance, storageRoot, codeHash, version); + } + + @Test + public void roundTripMainNetAccountValueMax() { + final long nonce = (Long.MAX_VALUE >> 1); + final Wei balance = + Wei.fromHexString("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); + final Hash storageRoot = Hash.EMPTY_TRIE_HASH; + final Hash codeHash = Hash.EMPTY_LIST_HASH; + final int version = Integer.MAX_VALUE; + + roundTripMainNetAccountValue(nonce, balance, storageRoot, codeHash, version); + } + + private void roundTripMainNetAccountValue( + final long nonce, + final Wei balance, + final Hash storageRoot, + final Hash codeHash, + final int version) { + + StateTrieAccountValue accountValue = + new StateTrieAccountValue(nonce, balance, storageRoot, codeHash, version); + BytesValue encoded = RLP.encode(accountValue::writeTo); + final RLPInput in = RLP.input(encoded); + StateTrieAccountValue roundTripAccountValue = StateTrieAccountValue.readFrom(in); + + assertThat(nonce).isEqualTo(roundTripAccountValue.getNonce()); + assertThat(balance).isEqualTo(roundTripAccountValue.getBalance()); + assertThat(storageRoot).isEqualTo(roundTripAccountValue.getStorageRoot()); + assertThat(codeHash).isEqualTo(roundTripAccountValue.getCodeHash()); + assertThat(version).isEqualTo(roundTripAccountValue.getVersion()); + } +}