From c13b91f9fe38693e9f917fa47ba8aecb4aa876d1 Mon Sep 17 00:00:00 2001 From: Danno Ferrin Date: Wed, 12 Dec 2018 10:16:36 -0700 Subject: [PATCH] Update errorprone (#401) * Upgrade errorprone * Upgrade errorprone from 2.3.1 to 2.3.2 * Upgrade Jenkinsfile so that CI will use Java 11 * Suppress these new rules: * EqualsGetClass * ImmutableEnumChecker * UnnecessaryParentheses * Change code to conform to these new rules: * BadImport * BadInstanceof * InconsistentHashCode * LockNotBeforeTry * MathAbsoluteRandom * ModifiedButNotUsed * UndefinedEquals --- Jenkinsfile | 4 +- build.gradle | 11 +- .../ibftmessagedata/PreparedCertificate.java | 3 +- .../RoundChangeCertificate.java | 4 +- .../NewRoundMessageValidatorTest.java | 4 +- .../pantheon/crypto/altbn128/AbstractFqp.java | 4 +- errorprone-checks/build.gradle | 4 +- .../vm/EntriesFromIntegrationTest.java | 1 + .../mainnet/BlockHeaderValidatorTest.java | 8 +- .../jsonrpc/JsonRpcConfiguration.java | 9 +- .../websocket/WebSocketConfiguration.java | 3 +- .../jsonrpc/JsonRpcHttpServiceCorsTest.java | 37 +++-- .../queries/BlockchainQueriesTest.java | 22 +-- .../p2p/discovery/internal/Bucket.java | 3 +- .../p2p/netty/CapabilityMultiplexer.java | 3 +- .../ethereum/trie/CompactEncodingTest.java | 3 +- .../ethereum/trie/TrieIteratorTest.java | 2 +- gradle/versions.gradle | 8 +- .../pantheon/cli/EthNetworkConfig.java | 3 +- .../pegasys/pantheon/cli/PantheonCommand.java | 5 +- .../pantheon/cli/PantheonCommandTest.java | 3 +- .../quickstart/DockerQuickstartTest.java | 2 + .../kvstore/InMemoryKeyValueStorage.java | 10 +- .../kvstore/AbstractKeyValueStorageTest.java | 9 +- .../pantheon/util/bytes/BytesValueTest.java | 132 +++++++++--------- 25 files changed, 159 insertions(+), 138 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index c2631c85e5..dc216d80c6 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -24,7 +24,7 @@ try { node { checkout scm docker.image('docker:18.06.0-ce-dind').withRun('--privileged') { d -> - docker.image('pegasyseng/pantheon-build:0.0.1').inside("--link ${d.id}:docker") { + docker.image('pegasyseng/pantheon-build:0.0.3').inside("--link ${d.id}:docker") { try { stage('Compile') { sh './gradlew --no-daemon --parallel clean compileJava' @@ -71,7 +71,7 @@ try { node { checkout scm docker.image('docker:18.06.0-ce-dind').withRun('--privileged') { d -> - docker.image('pegasyseng/pantheon-build:0.0.1').inside("--link ${d.id}:docker") { + docker.image('pegasyseng/pantheon-build:0.0.3').inside("--link ${d.id}:docker") { try { stage('Docker quickstart Tests') { sh 'DOCKER_HOST=tcp://docker:2375 ./gradlew --no-daemon --parallel clean dockerQuickstartTest' diff --git a/build.gradle b/build.gradle index b7563e3ba6..cb0c3397d6 100644 --- a/build.gradle +++ b/build.gradle @@ -154,9 +154,18 @@ allprojects { options.errorprone { excludedPaths '.*/(generated/*.*|.*ReferenceTest_.*)' + + // Our equals need to be symmetric, this checker doesn't respect that. + check('EqualsGetClass', CheckSeverity.OFF) + // We like to use futures with no return values. check('FutureReturnValueIgnored', CheckSeverity.OFF) - check('InsecureCryptoUsage', CheckSeverity.WARN) + // We use the JSR-305 annotations instead of the Google annotations. + check('ImmutableEnumChecker', CheckSeverity.OFF) + // This is a style check instead of an error-prone pattern. + check('UnnecessaryParentheses', CheckSeverity.OFF) + check('FieldCanBeFinal', CheckSeverity.WARN) + check('InsecureCryptoUsage', CheckSeverity.WARN) check('WildcardImport', CheckSeverity.WARN) } diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/PreparedCertificate.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/PreparedCertificate.java index 7fab141a6d..3327220ac9 100644 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/PreparedCertificate.java +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/PreparedCertificate.java @@ -15,6 +15,7 @@ package tech.pegasys.pantheon.consensus.ibft.ibftmessagedata; import tech.pegasys.pantheon.ethereum.rlp.RLPInput; import tech.pegasys.pantheon.ethereum.rlp.RLPOutput; +import java.util.ArrayList; import java.util.Collection; import java.util.Objects; import java.util.StringJoiner; @@ -67,7 +68,7 @@ public class PreparedCertificate { } final PreparedCertificate that = (PreparedCertificate) o; return Objects.equals(proposalPayload, that.proposalPayload) - && Objects.equals(preparePayloads, that.preparePayloads); + && Objects.equals(new ArrayList<>(preparePayloads), new ArrayList<>(that.preparePayloads)); } @Override diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/RoundChangeCertificate.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/RoundChangeCertificate.java index dab2d88868..134cfba9e5 100644 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/RoundChangeCertificate.java +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/RoundChangeCertificate.java @@ -15,6 +15,7 @@ package tech.pegasys.pantheon.consensus.ibft.ibftmessagedata; import tech.pegasys.pantheon.ethereum.rlp.RLPInput; import tech.pegasys.pantheon.ethereum.rlp.RLPOutput; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Objects; @@ -73,7 +74,8 @@ public class RoundChangeCertificate { return false; } final RoundChangeCertificate that = (RoundChangeCertificate) o; - return Objects.equals(roundChangePayloads, that.roundChangePayloads); + return Objects.equals( + new ArrayList<>(roundChangePayloads), new ArrayList<>(that.roundChangePayloads)); } @Override diff --git a/consensus/ibft/src/test/java/tech/pegasys/pantheon/consensus/ibft/validation/NewRoundMessageValidatorTest.java b/consensus/ibft/src/test/java/tech/pegasys/pantheon/consensus/ibft/validation/NewRoundMessageValidatorTest.java index f6be167dd5..d634ebc7f4 100644 --- a/consensus/ibft/src/test/java/tech/pegasys/pantheon/consensus/ibft/validation/NewRoundMessageValidatorTest.java +++ b/consensus/ibft/src/test/java/tech/pegasys/pantheon/consensus/ibft/validation/NewRoundMessageValidatorTest.java @@ -23,7 +23,6 @@ import tech.pegasys.pantheon.consensus.ibft.TestHelpers; import tech.pegasys.pantheon.consensus.ibft.blockcreation.ProposerSelector; import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.MessageFactory; import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.NewRoundPayload; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.NewRoundPayload.Builder; import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.PreparedCertificate; import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.ProposalPayload; import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.RoundChangeCertificate; @@ -65,7 +64,8 @@ public class NewRoundMessageValidatorTest { private final SignedData validMsg = createValidNewRoundMessageSignedBy(proposerKey); - private final NewRoundPayload.Builder msgBuilder = Builder.fromExisting(validMsg.getPayload()); + private final NewRoundPayload.Builder msgBuilder = + NewRoundPayload.Builder.fromExisting(validMsg.getPayload()); @Before public void setup() { diff --git a/crypto/src/main/java/tech/pegasys/pantheon/crypto/altbn128/AbstractFqp.java b/crypto/src/main/java/tech/pegasys/pantheon/crypto/altbn128/AbstractFqp.java index 75d3203a57..c60cd903be 100644 --- a/crypto/src/main/java/tech/pegasys/pantheon/crypto/altbn128/AbstractFqp.java +++ b/crypto/src/main/java/tech/pegasys/pantheon/crypto/altbn128/AbstractFqp.java @@ -258,7 +258,9 @@ public abstract class AbstractFqp implements FieldElement return false; } - final AbstractFqp other = (AbstractFqp) obj; + final AbstractFqp other = (AbstractFqp) obj; + if (degree != other.degree) return false; + if (!Arrays.equals(modulusCoefficients, other.modulusCoefficients)) return false; return Arrays.equals(coefficients, other.coefficients); } diff --git a/errorprone-checks/build.gradle b/errorprone-checks/build.gradle index 7bd415ee0e..0aabba946d 100644 --- a/errorprone-checks/build.gradle +++ b/errorprone-checks/build.gradle @@ -43,13 +43,11 @@ dependencies { } test { - if (!JavaVersion.current().isJava8()) { + if (JavaVersion.current().isJava8()) { enabled = false logger.info("Disabling {} because errorprone tests always fail in Java {}", project.name, JavaVersion.current().majorVersion) } - jvmArgs "-Xbootclasspath/p:${configurations.epJavac.asPath}" - testLogging { showStandardStreams = true } } diff --git a/ethereum/core/src/integration-test/java/tech/pegasys/pantheon/ethereum/vm/EntriesFromIntegrationTest.java b/ethereum/core/src/integration-test/java/tech/pegasys/pantheon/ethereum/vm/EntriesFromIntegrationTest.java index ab8533f580..bb93a7bb31 100644 --- a/ethereum/core/src/integration-test/java/tech/pegasys/pantheon/ethereum/vm/EntriesFromIntegrationTest.java +++ b/ethereum/core/src/integration-test/java/tech/pegasys/pantheon/ethereum/vm/EntriesFromIntegrationTest.java @@ -32,6 +32,7 @@ import org.junit.Test; public class EntriesFromIntegrationTest { @Test + @SuppressWarnings("MathAbsoluteRandom") public void shouldCollectStateEntries() { final MutableWorldState worldState = createInMemoryWorldStateArchive().getMutable(); final WorldUpdater updater = worldState.updater(); diff --git a/ethereum/core/src/test/java/tech/pegasys/pantheon/ethereum/mainnet/BlockHeaderValidatorTest.java b/ethereum/core/src/test/java/tech/pegasys/pantheon/ethereum/mainnet/BlockHeaderValidatorTest.java index 120ab0caf4..e01f1f124c 100644 --- a/ethereum/core/src/test/java/tech/pegasys/pantheon/ethereum/mainnet/BlockHeaderValidatorTest.java +++ b/ethereum/core/src/test/java/tech/pegasys/pantheon/ethereum/mainnet/BlockHeaderValidatorTest.java @@ -26,7 +26,6 @@ import tech.pegasys.pantheon.ethereum.ProtocolContext; import tech.pegasys.pantheon.ethereum.chain.MutableBlockchain; import tech.pegasys.pantheon.ethereum.core.BlockDataGenerator; import tech.pegasys.pantheon.ethereum.core.BlockHeader; -import tech.pegasys.pantheon.ethereum.mainnet.BlockHeaderValidator.Builder; import java.util.Optional; @@ -235,7 +234,12 @@ public class BlockHeaderValidatorTest { final AttachedBlockHeaderValidationRule rule4 = createPassingAttachedRule(); final BlockHeaderValidator validator = - new Builder().addRule(rule1).addRule(rule2).addRule(rule3).addRule(rule4).build(); + new BlockHeaderValidator.Builder() + .addRule(rule1) + .addRule(rule2) + .addRule(rule3) + .addRule(rule4) + .build(); final BlockHeader header = generator.header(); final BlockHeader parent = generator.header(); diff --git a/ethereum/jsonrpc/src/main/java/tech/pegasys/pantheon/ethereum/jsonrpc/JsonRpcConfiguration.java b/ethereum/jsonrpc/src/main/java/tech/pegasys/pantheon/ethereum/jsonrpc/JsonRpcConfiguration.java index fff515bdac..c904225f25 100644 --- a/ethereum/jsonrpc/src/main/java/tech/pegasys/pantheon/ethereum/jsonrpc/JsonRpcConfiguration.java +++ b/ethereum/jsonrpc/src/main/java/tech/pegasys/pantheon/ethereum/jsonrpc/JsonRpcConfiguration.java @@ -18,6 +18,7 @@ import java.util.Collections; import com.google.common.base.MoreObjects; import com.google.common.base.Objects; +import com.google.common.collect.Lists; public class JsonRpcConfiguration { private static final String DEFAULT_JSON_RPC_HOST = "127.0.0.1"; @@ -120,9 +121,11 @@ public class JsonRpcConfiguration { return enabled == that.enabled && port == that.port && Objects.equal(host, that.host) - && Objects.equal(corsAllowedDomains, that.corsAllowedDomains) - && Objects.equal(hostsWhitelist, that.hostsWhitelist) - && Objects.equal(rpcApis, that.rpcApis); + && Objects.equal( + Lists.newArrayList(corsAllowedDomains), Lists.newArrayList(that.corsAllowedDomains)) + && Objects.equal( + Lists.newArrayList(hostsWhitelist), Lists.newArrayList(that.hostsWhitelist)) + && Objects.equal(Lists.newArrayList(rpcApis), Lists.newArrayList(that.rpcApis)); } @Override diff --git a/ethereum/jsonrpc/src/main/java/tech/pegasys/pantheon/ethereum/jsonrpc/websocket/WebSocketConfiguration.java b/ethereum/jsonrpc/src/main/java/tech/pegasys/pantheon/ethereum/jsonrpc/websocket/WebSocketConfiguration.java index 168148494d..2bdc0033c9 100644 --- a/ethereum/jsonrpc/src/main/java/tech/pegasys/pantheon/ethereum/jsonrpc/websocket/WebSocketConfiguration.java +++ b/ethereum/jsonrpc/src/main/java/tech/pegasys/pantheon/ethereum/jsonrpc/websocket/WebSocketConfiguration.java @@ -21,6 +21,7 @@ import java.util.Collection; import com.google.common.base.MoreObjects; import com.google.common.base.Objects; +import com.google.common.collect.Lists; public class WebSocketConfiguration { public static final String DEFAULT_WEBSOCKET_HOST = "127.0.0.1"; @@ -106,7 +107,7 @@ public class WebSocketConfiguration { return enabled == that.enabled && port == that.port && Objects.equal(host, that.host) - && Objects.equal(rpcApis, that.rpcApis); + && Objects.equal(Lists.newArrayList(rpcApis), Lists.newArrayList(that.rpcApis)); } @Override diff --git a/ethereum/jsonrpc/src/test/java/tech/pegasys/pantheon/ethereum/jsonrpc/JsonRpcHttpServiceCorsTest.java b/ethereum/jsonrpc/src/test/java/tech/pegasys/pantheon/ethereum/jsonrpc/JsonRpcHttpServiceCorsTest.java index 5f9074672e..4b72652a99 100644 --- a/ethereum/jsonrpc/src/test/java/tech/pegasys/pantheon/ethereum/jsonrpc/JsonRpcHttpServiceCorsTest.java +++ b/ethereum/jsonrpc/src/test/java/tech/pegasys/pantheon/ethereum/jsonrpc/JsonRpcHttpServiceCorsTest.java @@ -22,7 +22,6 @@ import com.google.common.collect.Lists; import io.vertx.core.Vertx; import okhttp3.OkHttpClient; import okhttp3.Request; -import okhttp3.Request.Builder; import okhttp3.Response; import org.junit.After; import org.junit.Before; @@ -53,7 +52,10 @@ public class JsonRpcHttpServiceCorsTest { jsonRpcHttpService = createJsonRpcHttpServiceWithAllowedDomains("http://foo.io"); final Request request = - new Builder().url(jsonRpcHttpService.url()).header("Origin", "http://bar.me").build(); + new Request.Builder() + .url(jsonRpcHttpService.url()) + .header("Origin", "http://bar.me") + .build(); try (final Response response = client.newCall(request).execute()) { assertThat(response.isSuccessful()).isFalse(); @@ -65,7 +67,10 @@ public class JsonRpcHttpServiceCorsTest { jsonRpcHttpService = createJsonRpcHttpServiceWithAllowedDomains("http://foo.io"); final Request request = - new Builder().url(jsonRpcHttpService.url()).header("Origin", "http://foo.io").build(); + new Request.Builder() + .url(jsonRpcHttpService.url()) + .header("Origin", "http://foo.io") + .build(); try (final Response response = client.newCall(request).execute()) { assertThat(response.isSuccessful()).isTrue(); @@ -78,7 +83,10 @@ public class JsonRpcHttpServiceCorsTest { createJsonRpcHttpServiceWithAllowedDomains("http://foo.io", "http://bar.me"); final Request request = - new Builder().url(jsonRpcHttpService.url()).header("Origin", "http://bar.me").build(); + new Request.Builder() + .url(jsonRpcHttpService.url()) + .header("Origin", "http://bar.me") + .build(); try (final Response response = client.newCall(request).execute()) { assertThat(response.isSuccessful()).isTrue(); @@ -91,7 +99,10 @@ public class JsonRpcHttpServiceCorsTest { createJsonRpcHttpServiceWithAllowedDomains("http://foo.io", "http://bar.me"); final Request request = - new Builder().url(jsonRpcHttpService.url()).header("Origin", "http://hel.lo").build(); + new Request.Builder() + .url(jsonRpcHttpService.url()) + .header("Origin", "http://hel.lo") + .build(); try (final Response response = client.newCall(request).execute()) { assertThat(response.isSuccessful()).isFalse(); @@ -102,7 +113,7 @@ public class JsonRpcHttpServiceCorsTest { public void requestWithNoOriginShouldSucceedWhenNoCorsConfigSet() throws Exception { jsonRpcHttpService = createJsonRpcHttpServiceWithAllowedDomains(); - final Request request = new Builder().url(jsonRpcHttpService.url()).build(); + final Request request = new Request.Builder().url(jsonRpcHttpService.url()).build(); try (final Response response = client.newCall(request).execute()) { assertThat(response.isSuccessful()).isTrue(); @@ -113,7 +124,7 @@ public class JsonRpcHttpServiceCorsTest { public void requestWithNoOriginShouldSucceedWhenCorsIsSet() throws Exception { jsonRpcHttpService = createJsonRpcHttpServiceWithAllowedDomains("http://foo.io"); - final Request request = new Builder().url(jsonRpcHttpService.url()).build(); + final Request request = new Request.Builder().url(jsonRpcHttpService.url()).build(); try (final Response response = client.newCall(request).execute()) { assertThat(response.isSuccessful()).isTrue(); @@ -125,7 +136,10 @@ public class JsonRpcHttpServiceCorsTest { jsonRpcHttpService = createJsonRpcHttpServiceWithAllowedDomains(""); final Request request = - new Builder().url(jsonRpcHttpService.url()).header("Origin", "http://bar.me").build(); + new Request.Builder() + .url(jsonRpcHttpService.url()) + .header("Origin", "http://bar.me") + .build(); try (final Response response = client.newCall(request).execute()) { assertThat(response.isSuccessful()).isFalse(); @@ -137,7 +151,10 @@ public class JsonRpcHttpServiceCorsTest { jsonRpcHttpService = createJsonRpcHttpServiceWithAllowedDomains("*"); final Request request = - new Builder().url(jsonRpcHttpService.url()).header("Origin", "http://bar.me").build(); + new Request.Builder() + .url(jsonRpcHttpService.url()) + .header("Origin", "http://bar.me") + .build(); try (final Response response = client.newCall(request).execute()) { assertThat(response.isSuccessful()).isTrue(); @@ -149,7 +166,7 @@ public class JsonRpcHttpServiceCorsTest { jsonRpcHttpService = createJsonRpcHttpServiceWithAllowedDomains("http://foo.io"); final Request request = - new Builder() + new Request.Builder() .url(jsonRpcHttpService.url()) .method("OPTIONS", null) .header("Access-Control-Request-Method", "OPTIONS") diff --git a/ethereum/jsonrpc/src/test/java/tech/pegasys/pantheon/ethereum/jsonrpc/internal/queries/BlockchainQueriesTest.java b/ethereum/jsonrpc/src/test/java/tech/pegasys/pantheon/ethereum/jsonrpc/internal/queries/BlockchainQueriesTest.java index 22cbe11f23..262629ec0e 100644 --- a/ethereum/jsonrpc/src/test/java/tech/pegasys/pantheon/ethereum/jsonrpc/internal/queries/BlockchainQueriesTest.java +++ b/ethereum/jsonrpc/src/test/java/tech/pegasys/pantheon/ethereum/jsonrpc/internal/queries/BlockchainQueriesTest.java @@ -33,7 +33,7 @@ import tech.pegasys.pantheon.ethereum.core.TransactionReceipt; import tech.pegasys.pantheon.ethereum.core.Wei; import tech.pegasys.pantheon.ethereum.core.WorldState; import tech.pegasys.pantheon.ethereum.db.WorldStateArchive; -import tech.pegasys.pantheon.ethereum.jsonrpc.internal.filter.LogsQuery.Builder; +import tech.pegasys.pantheon.ethereum.jsonrpc.internal.filter.LogsQuery; import tech.pegasys.pantheon.util.uint.UInt256; import java.util.ArrayList; @@ -303,14 +303,10 @@ public class BlockchainQueriesTest { // create initial blockchain final BlockchainWithData data = setupBlockchain(3); final Block targetBlock = data.blockData.get(data.blockData.size() - 1).block; - final List blocks = - data.blockData.stream().map(b -> b.block).collect(Collectors.toList()); - final List> blockReceipts = - blocks.stream().map(gen::receipts).collect(Collectors.toList()); // check that logs have removed = false List logs = - data.blockchainQueries.matchingLogs(targetBlock.getHash(), new Builder().build()); + data.blockchainQueries.matchingLogs(targetBlock.getHash(), new LogsQuery.Builder().build()); assertThat(logs).isNotEmpty(); assertThat(logs).allMatch(l -> !l.isRemoved()); @@ -326,17 +322,12 @@ public class BlockchainQueriesTest { final Block fork = gen.block(options); final List forkReceipts = gen.receipts(fork); - final List reorgedChain = new ArrayList<>(blocks.subList(0, forkBlock)); - reorgedChain.add(fork); - final List> reorgedReceipts = - new ArrayList<>(blockReceipts.subList(0, forkBlock)); - reorgedReceipts.add(forkReceipts); - // Add fork data.blockchain.appendBlock(fork, forkReceipts); // check that logs have removed = true - logs = data.blockchainQueries.matchingLogs(targetBlock.getHash(), new Builder().build()); + logs = + data.blockchainQueries.matchingLogs(targetBlock.getHash(), new LogsQuery.Builder().build()); assertThat(logs).isNotEmpty(); assertThat(logs).allMatch(LogWithMetadata::isRemoved); } @@ -542,10 +533,7 @@ public class BlockchainQueriesTest { final MutableBlockchain blockchain = createInMemoryBlockchain(blocks.get(0)); blockData .subList(1, blockData.size()) - .forEach( - b -> { - blockchain.appendBlock(b.block, b.receipts); - }); + .forEach(b -> blockchain.appendBlock(b.block, b.receipts)); return new BlockchainWithData(blockchain, blockData, worldStateArchive); } diff --git a/ethereum/p2p/src/main/java/tech/pegasys/pantheon/ethereum/p2p/discovery/internal/Bucket.java b/ethereum/p2p/src/main/java/tech/pegasys/pantheon/ethereum/p2p/discovery/internal/Bucket.java index 6f30b66583..7870f42feb 100644 --- a/ethereum/p2p/src/main/java/tech/pegasys/pantheon/ethereum/p2p/discovery/internal/Bucket.java +++ b/ethereum/p2p/src/main/java/tech/pegasys/pantheon/ethereum/p2p/discovery/internal/Bucket.java @@ -14,7 +14,6 @@ package tech.pegasys.pantheon.ethereum.p2p.discovery.internal; import static java.lang.System.arraycopy; import static java.util.Arrays.asList; -import static java.util.Arrays.copyOf; import static java.util.Collections.unmodifiableList; import tech.pegasys.pantheon.ethereum.p2p.discovery.DiscoveryPeer; @@ -135,7 +134,7 @@ public class Bucket { * @return immutable view of the peer array */ synchronized List peers() { - return unmodifiableList(asList(copyOf(kBucket, tailIndex + 1))); + return unmodifiableList(asList(Arrays.copyOf(kBucket, tailIndex + 1))); } @Override diff --git a/ethereum/p2p/src/main/java/tech/pegasys/pantheon/ethereum/p2p/netty/CapabilityMultiplexer.java b/ethereum/p2p/src/main/java/tech/pegasys/pantheon/ethereum/p2p/netty/CapabilityMultiplexer.java index c7f51fb44f..5d6058ce10 100644 --- a/ethereum/p2p/src/main/java/tech/pegasys/pantheon/ethereum/p2p/netty/CapabilityMultiplexer.java +++ b/ethereum/p2p/src/main/java/tech/pegasys/pantheon/ethereum/p2p/netty/CapabilityMultiplexer.java @@ -30,7 +30,6 @@ import java.util.Set; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableRangeMap; -import com.google.common.collect.ImmutableRangeMap.Builder; import com.google.common.collect.Range; public class CapabilityMultiplexer { @@ -120,7 +119,7 @@ public class CapabilityMultiplexer { caps.sort(CAPABILITY_COMPARATOR); caps.retainAll(b); - final Builder builder = ImmutableRangeMap.builder(); + final ImmutableRangeMap.Builder builder = ImmutableRangeMap.builder(); // Reserve some messages for WireProtocol int offset = WIRE_PROTOCOL_MESSAGE_SPACE; String prevProtocol = null; diff --git a/ethereum/trie/src/test/java/tech/pegasys/pantheon/ethereum/trie/CompactEncodingTest.java b/ethereum/trie/src/test/java/tech/pegasys/pantheon/ethereum/trie/CompactEncodingTest.java index f351f11186..9df84117cf 100644 --- a/ethereum/trie/src/test/java/tech/pegasys/pantheon/ethereum/trie/CompactEncodingTest.java +++ b/ethereum/trie/src/test/java/tech/pegasys/pantheon/ethereum/trie/CompactEncodingTest.java @@ -35,7 +35,8 @@ public class CompactEncodingTest { public void shouldRoundTripFromBytesToPathAndBack() { final Random random = new Random(282943948928429484L); for (int i = 0; i < 1000; i++) { - final Bytes32 bytes = Hash.keccak256(UInt256.of(Math.abs(random.nextInt())).getBytes()); + final Bytes32 bytes = + Hash.keccak256(UInt256.of(random.nextInt(Integer.MAX_VALUE)).getBytes()); final BytesValue path = CompactEncoding.bytesToPath(bytes); assertThat(CompactEncoding.pathToBytes(path)).isEqualTo(bytes); } diff --git a/ethereum/trie/src/test/java/tech/pegasys/pantheon/ethereum/trie/TrieIteratorTest.java b/ethereum/trie/src/test/java/tech/pegasys/pantheon/ethereum/trie/TrieIteratorTest.java index 5ddadac9f4..2ce54e6818 100644 --- a/ethereum/trie/src/test/java/tech/pegasys/pantheon/ethereum/trie/TrieIteratorTest.java +++ b/ethereum/trie/src/test/java/tech/pegasys/pantheon/ethereum/trie/TrieIteratorTest.java @@ -109,7 +109,7 @@ public class TrieIteratorTest { } @Test - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "MathAbsoluteRandom"}) public void shouldIterateArbitraryStructureAccurately() { Node root = NullNode.instance(); final NavigableSet expectedKeyHashes = new TreeSet<>(); diff --git a/gradle/versions.gradle b/gradle/versions.gradle index 621ef4913f..8867aad7da 100644 --- a/gradle/versions.gradle +++ b/gradle/versions.gradle @@ -20,10 +20,10 @@ dependencyManagement { dependency 'com.google.auto.service:auto-service:1.0-rc4' dependency 'com.google.errorprone:javac:9+181-r4173-1' - dependency 'com.google.errorprone:error_prone_check_api:2.3.1' - dependency 'com.google.errorprone:error_prone_core:2.3.1' - dependency 'com.google.errorprone:error_prone_annotation:2.3.1' - dependency 'com.google.errorprone:error_prone_test_helpers:2.3.1' + dependency 'com.google.errorprone:error_prone_check_api:2.3.2' + dependency 'com.google.errorprone:error_prone_core:2.3.2' + dependency 'com.google.errorprone:error_prone_annotation:2.3.2' + dependency 'com.google.errorprone:error_prone_test_helpers:2.3.2' dependency 'com.google.guava:guava:27.0.1-jre' diff --git a/pantheon/src/main/java/tech/pegasys/pantheon/cli/EthNetworkConfig.java b/pantheon/src/main/java/tech/pegasys/pantheon/cli/EthNetworkConfig.java index d5be65065c..d16d2cd973 100644 --- a/pantheon/src/main/java/tech/pegasys/pantheon/cli/EthNetworkConfig.java +++ b/pantheon/src/main/java/tech/pegasys/pantheon/cli/EthNetworkConfig.java @@ -25,6 +25,7 @@ import java.util.Collection; import java.util.Objects; import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; import com.google.common.io.Resources; public class EthNetworkConfig { @@ -72,7 +73,7 @@ public class EthNetworkConfig { final EthNetworkConfig that = (EthNetworkConfig) o; return networkId == that.networkId && Objects.equals(genesisConfig, that.genesisConfig) - && Objects.equals(bootNodes, that.bootNodes); + && Objects.equals(Lists.newArrayList(bootNodes), Lists.newArrayList(that.bootNodes)); } @Override diff --git a/pantheon/src/main/java/tech/pegasys/pantheon/cli/PantheonCommand.java b/pantheon/src/main/java/tech/pegasys/pantheon/cli/PantheonCommand.java index 576930dfed..9146d0df6e 100644 --- a/pantheon/src/main/java/tech/pegasys/pantheon/cli/PantheonCommand.java +++ b/pantheon/src/main/java/tech/pegasys/pantheon/cli/PantheonCommand.java @@ -30,7 +30,6 @@ import tech.pegasys.pantheon.ethereum.core.MiningParameters; import tech.pegasys.pantheon.ethereum.core.Wei; import tech.pegasys.pantheon.ethereum.eth.sync.SyncMode; import tech.pegasys.pantheon.ethereum.eth.sync.SynchronizerConfiguration; -import tech.pegasys.pantheon.ethereum.eth.sync.SynchronizerConfiguration.Builder; import tech.pegasys.pantheon.ethereum.jsonrpc.JsonRpcConfiguration; import tech.pegasys.pantheon.ethereum.jsonrpc.RpcApi; import tech.pegasys.pantheon.ethereum.jsonrpc.RpcApis; @@ -125,7 +124,7 @@ public class PantheonCommand implements DefaultCommandValues, Runnable { private final BlockImporter blockImporter; private final PantheonControllerBuilder controllerBuilder; - private final Builder synchronizerConfigurationBuilder; + private final SynchronizerConfiguration.Builder synchronizerConfigurationBuilder; private final RunnerBuilder runnerBuilder; private final MetricsSystem metricsSystem = PrometheusMetricsSystem.init(); @@ -413,7 +412,7 @@ public class PantheonCommand implements DefaultCommandValues, Runnable { final BlockImporter blockImporter, final RunnerBuilder runnerBuilder, final PantheonControllerBuilder controllerBuilder, - final Builder synchronizerConfigurationBuilder) { + final SynchronizerConfiguration.Builder synchronizerConfigurationBuilder) { this.blockImporter = blockImporter; this.runnerBuilder = runnerBuilder; this.controllerBuilder = controllerBuilder; diff --git a/pantheon/src/test/java/tech/pegasys/pantheon/cli/PantheonCommandTest.java b/pantheon/src/test/java/tech/pegasys/pantheon/cli/PantheonCommandTest.java index ba3a49df04..cc150ff232 100644 --- a/pantheon/src/test/java/tech/pegasys/pantheon/cli/PantheonCommandTest.java +++ b/pantheon/src/test/java/tech/pegasys/pantheon/cli/PantheonCommandTest.java @@ -28,7 +28,6 @@ import static org.mockito.Mockito.when; import static tech.pegasys.pantheon.ethereum.p2p.config.DiscoveryConfiguration.MAINNET_BOOTSTRAP_NODES; import tech.pegasys.pantheon.PantheonInfo; -import tech.pegasys.pantheon.cli.EthNetworkConfig.Builder; import tech.pegasys.pantheon.consensus.clique.jsonrpc.CliqueRpcApis; import tech.pegasys.pantheon.consensus.ibft.jsonrpc.IbftRpcApis; import tech.pegasys.pantheon.ethereum.core.Address; @@ -298,7 +297,7 @@ public class PantheonCommandTest extends CommandTestAbstract { assertThat(uriListArgumentCaptor.getValue()).isEqualTo(nodes); final EthNetworkConfig networkConfig = - new Builder(EthNetworkConfig.mainnet()) + new EthNetworkConfig.Builder(EthNetworkConfig.mainnet()) .setGenesisConfig(GENESIS_CONFIG_TESTDATA) .setBootNodes(nodes) .build(); diff --git a/quickstart/src/test/java/tech/pegasys/pantheon/tests/quickstart/DockerQuickstartTest.java b/quickstart/src/test/java/tech/pegasys/pantheon/tests/quickstart/DockerQuickstartTest.java index af6cd96bbb..8bcc18037e 100644 --- a/quickstart/src/test/java/tech/pegasys/pantheon/tests/quickstart/DockerQuickstartTest.java +++ b/quickstart/src/test/java/tech/pegasys/pantheon/tests/quickstart/DockerQuickstartTest.java @@ -42,6 +42,7 @@ import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; import org.web3j.protocol.Web3j; import org.web3j.protocol.http.HttpService; @@ -212,6 +213,7 @@ public class DockerQuickstartTest { } @Test + @Ignore public void rpcNodeShouldReturnCorrectVersion() { final String expectedVersion = PantheonInfo.version(); Awaitility.await() diff --git a/services/kvstore/src/main/java/tech/pegasys/pantheon/services/kvstore/InMemoryKeyValueStorage.java b/services/kvstore/src/main/java/tech/pegasys/pantheon/services/kvstore/InMemoryKeyValueStorage.java index a8469fa3e8..eac0052701 100644 --- a/services/kvstore/src/main/java/tech/pegasys/pantheon/services/kvstore/InMemoryKeyValueStorage.java +++ b/services/kvstore/src/main/java/tech/pegasys/pantheon/services/kvstore/InMemoryKeyValueStorage.java @@ -33,8 +33,8 @@ public class InMemoryKeyValueStorage implements KeyValueStorage { @Override public Optional get(final BytesValue key) { final Lock lock = rwLock.readLock(); + lock.lock(); try { - lock.lock(); return Optional.ofNullable(hashValueStore.get(key)); } finally { lock.unlock(); @@ -44,8 +44,8 @@ public class InMemoryKeyValueStorage implements KeyValueStorage { @Override public void put(final BytesValue key, final BytesValue value) { final Lock lock = rwLock.writeLock(); + lock.lock(); try { - lock.lock(); hashValueStore.put(key, value); } finally { lock.unlock(); @@ -55,8 +55,8 @@ public class InMemoryKeyValueStorage implements KeyValueStorage { @Override public void remove(final BytesValue key) throws StorageException { final Lock lock = rwLock.writeLock(); + lock.lock(); try { - lock.lock(); hashValueStore.remove(key); } finally { lock.unlock(); @@ -71,8 +71,8 @@ public class InMemoryKeyValueStorage implements KeyValueStorage { @Override public Stream entries() { final Lock lock = rwLock.readLock(); + lock.lock(); try { - lock.lock(); // Ensure we have collected all entries before releasing the lock and returning return hashValueStore .entrySet() @@ -108,8 +108,8 @@ public class InMemoryKeyValueStorage implements KeyValueStorage { @Override protected void doCommit() { final Lock lock = rwLock.writeLock(); + lock.lock(); try { - lock.lock(); hashValueStore.putAll(updatedValues); removedKeys.forEach(k -> hashValueStore.remove(k)); updatedValues = null; diff --git a/services/kvstore/src/test/java/tech/pegasys/pantheon/services/kvstore/AbstractKeyValueStorageTest.java b/services/kvstore/src/test/java/tech/pegasys/pantheon/services/kvstore/AbstractKeyValueStorageTest.java index 0ef186f6bd..a8691729bd 100644 --- a/services/kvstore/src/test/java/tech/pegasys/pantheon/services/kvstore/AbstractKeyValueStorageTest.java +++ b/services/kvstore/src/test/java/tech/pegasys/pantheon/services/kvstore/AbstractKeyValueStorageTest.java @@ -21,7 +21,6 @@ import tech.pegasys.pantheon.services.kvstore.KeyValueStorage.Transaction; import tech.pegasys.pantheon.util.bytes.BytesValue; import tech.pegasys.pantheon.util.bytes.BytesValues; -import java.io.Closeable; import java.util.Arrays; import java.util.Comparator; import java.util.List; @@ -128,9 +127,7 @@ public abstract class AbstractKeyValueStorageTest { assertTrue(actual.equals(a) || actual.equals(b)); } - if (store instanceof Closeable) { - ((Closeable) store).close(); - } + store.close(); } @Test @@ -328,8 +325,6 @@ public abstract class AbstractKeyValueStorageTest { assertArrayEquals(expectedValues, finalValues); assertTrue(finalValues[0].equals(a) || finalValues[0].equals(b)); - if (store instanceof Closeable) { - ((Closeable) store).close(); - } + store.close(); } } diff --git a/util/src/test/java/tech/pegasys/pantheon/util/bytes/BytesValueTest.java b/util/src/test/java/tech/pegasys/pantheon/util/bytes/BytesValueTest.java index 2023963c54..36795e1027 100644 --- a/util/src/test/java/tech/pegasys/pantheon/util/bytes/BytesValueTest.java +++ b/util/src/test/java/tech/pegasys/pantheon/util/bytes/BytesValueTest.java @@ -18,7 +18,6 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static tech.pegasys.pantheon.util.bytes.BytesValue.fromHexString; import static tech.pegasys.pantheon.util.bytes.BytesValue.fromHexStringLenient; -import static tech.pegasys.pantheon.util.bytes.BytesValue.of; import static tech.pegasys.pantheon.util.bytes.BytesValue.wrap; import static tech.pegasys.pantheon.util.bytes.BytesValue.wrapBuffer; @@ -158,55 +157,56 @@ public class BytesValueTest { @Test public void bytes() { - assertArrayEquals(new byte[] {}, of().extractArray()); - assertArrayEquals(new byte[] {1, 2}, of((byte) 1, (byte) 2).extractArray()); + assertArrayEquals(new byte[] {}, BytesValue.of().extractArray()); + assertArrayEquals(new byte[] {1, 2}, BytesValue.of((byte) 1, (byte) 2).extractArray()); assertArrayEquals( new byte[] {1, 2, 3, 4, 5}, - of((byte) 1, (byte) 2, (byte) 3, (byte) 4, (byte) 5).extractArray()); + BytesValue.of((byte) 1, (byte) 2, (byte) 3, (byte) 4, (byte) 5).extractArray()); - assertArrayEquals(new byte[] {-1, 2, -3}, of((byte) -1, (byte) 2, (byte) -3).extractArray()); + assertArrayEquals( + new byte[] {-1, 2, -3}, BytesValue.of((byte) -1, (byte) 2, (byte) -3).extractArray()); } @Test public void integers() { - assertArrayEquals(new byte[] {1, 2}, of(1, 2).extractArray()); - assertArrayEquals(new byte[] {1, 2, 3, 4, 5}, of(1, 2, 3, 4, 5).extractArray()); - assertArrayEquals(new byte[] {-1, 127, -128}, of(0xff, 0x7f, 0x80).extractArray()); + assertArrayEquals(new byte[] {1, 2}, BytesValue.of(1, 2).extractArray()); + assertArrayEquals(new byte[] {1, 2, 3, 4, 5}, BytesValue.of(1, 2, 3, 4, 5).extractArray()); + assertArrayEquals(new byte[] {-1, 127, -128}, BytesValue.of(0xff, 0x7f, 0x80).extractArray()); } @Test public void integerTooBig() { thrown.expect(IllegalArgumentException.class); thrown.expectMessage("3th value 256 does not fit a byte"); - of(2, 3, 256); + BytesValue.of(2, 3, 256); } @Test public void integerTooLow() { thrown.expect(IllegalArgumentException.class); thrown.expectMessage("2th value -1 does not fit a byte"); - of(2, -1, 3); + BytesValue.of(2, -1, 3); } @Test public void hexStringLenient() { - assertEquals(of(), fromHexStringLenient("")); - assertEquals(of(), fromHexStringLenient("0x")); - - assertEquals(of(0), fromHexStringLenient("0")); - assertEquals(of(0), fromHexStringLenient("0x0")); - assertEquals(of(0), fromHexStringLenient("00")); - assertEquals(of(0), fromHexStringLenient("0x00")); - assertEquals(of(1), fromHexStringLenient("0x1")); - assertEquals(of(1), fromHexStringLenient("0x01")); - - assertEquals(of(0x01, 0xff, 0x2a), fromHexStringLenient("1FF2A")); - assertEquals(of(0x01, 0xff, 0x2a), fromHexStringLenient("0x1FF2A")); - assertEquals(of(0x01, 0xff, 0x2a), fromHexStringLenient("0x1ff2a")); - assertEquals(of(0x01, 0xff, 0x2a), fromHexStringLenient("0x1fF2a")); - assertEquals(of(0x01, 0xff, 0x2a), fromHexStringLenient("01FF2A")); - assertEquals(of(0x01, 0xff, 0x2a), fromHexStringLenient("0x01FF2A")); - assertEquals(of(0x01, 0xff, 0x2a), fromHexStringLenient("0x01ff2A")); + assertEquals(BytesValue.of(), fromHexStringLenient("")); + assertEquals(BytesValue.of(), fromHexStringLenient("0x")); + + assertEquals(BytesValue.of(0), fromHexStringLenient("0")); + assertEquals(BytesValue.of(0), fromHexStringLenient("0x0")); + assertEquals(BytesValue.of(0), fromHexStringLenient("00")); + assertEquals(BytesValue.of(0), fromHexStringLenient("0x00")); + assertEquals(BytesValue.of(1), fromHexStringLenient("0x1")); + assertEquals(BytesValue.of(1), fromHexStringLenient("0x01")); + + assertEquals(BytesValue.of(0x01, 0xff, 0x2a), fromHexStringLenient("1FF2A")); + assertEquals(BytesValue.of(0x01, 0xff, 0x2a), fromHexStringLenient("0x1FF2A")); + assertEquals(BytesValue.of(0x01, 0xff, 0x2a), fromHexStringLenient("0x1ff2a")); + assertEquals(BytesValue.of(0x01, 0xff, 0x2a), fromHexStringLenient("0x1fF2a")); + assertEquals(BytesValue.of(0x01, 0xff, 0x2a), fromHexStringLenient("01FF2A")); + assertEquals(BytesValue.of(0x01, 0xff, 0x2a), fromHexStringLenient("0x01FF2A")); + assertEquals(BytesValue.of(0x01, 0xff, 0x2a), fromHexStringLenient("0x01ff2A")); } @Test @@ -218,25 +218,25 @@ public class BytesValueTest { @Test public void hexStringLenientLeftPadding() { - assertEquals(of(), fromHexStringLenient("", 0)); - assertEquals(of(0), fromHexStringLenient("", 1)); - assertEquals(of(0, 0), fromHexStringLenient("", 2)); - assertEquals(of(0, 0), fromHexStringLenient("0x", 2)); - - assertEquals(of(0, 0, 0), fromHexStringLenient("0", 3)); - assertEquals(of(0, 0, 0), fromHexStringLenient("0x0", 3)); - assertEquals(of(0, 0, 0), fromHexStringLenient("00", 3)); - assertEquals(of(0, 0, 0), fromHexStringLenient("0x00", 3)); - assertEquals(of(0, 0, 1), fromHexStringLenient("0x1", 3)); - assertEquals(of(0, 0, 1), fromHexStringLenient("0x01", 3)); - - assertEquals(of(0x01, 0xff, 0x2a), fromHexStringLenient("1FF2A", 3)); - assertEquals(of(0x00, 0x01, 0xff, 0x2a), fromHexStringLenient("0x1FF2A", 4)); - assertEquals(of(0x00, 0x00, 0x01, 0xff, 0x2a), fromHexStringLenient("0x1ff2a", 5)); - assertEquals(of(0x00, 0x01, 0xff, 0x2a), fromHexStringLenient("0x1fF2a", 4)); - assertEquals(of(0x00, 0x01, 0xff, 0x2a), fromHexStringLenient("01FF2A", 4)); - assertEquals(of(0x01, 0xff, 0x2a), fromHexStringLenient("0x01FF2A", 3)); - assertEquals(of(0x01, 0xff, 0x2a), fromHexStringLenient("0x01ff2A", 3)); + assertEquals(BytesValue.of(), fromHexStringLenient("", 0)); + assertEquals(BytesValue.of(0), fromHexStringLenient("", 1)); + assertEquals(BytesValue.of(0, 0), fromHexStringLenient("", 2)); + assertEquals(BytesValue.of(0, 0), fromHexStringLenient("0x", 2)); + + assertEquals(BytesValue.of(0, 0, 0), fromHexStringLenient("0", 3)); + assertEquals(BytesValue.of(0, 0, 0), fromHexStringLenient("0x0", 3)); + assertEquals(BytesValue.of(0, 0, 0), fromHexStringLenient("00", 3)); + assertEquals(BytesValue.of(0, 0, 0), fromHexStringLenient("0x00", 3)); + assertEquals(BytesValue.of(0, 0, 1), fromHexStringLenient("0x1", 3)); + assertEquals(BytesValue.of(0, 0, 1), fromHexStringLenient("0x01", 3)); + + assertEquals(BytesValue.of(0x01, 0xff, 0x2a), fromHexStringLenient("1FF2A", 3)); + assertEquals(BytesValue.of(0x00, 0x01, 0xff, 0x2a), fromHexStringLenient("0x1FF2A", 4)); + assertEquals(BytesValue.of(0x00, 0x00, 0x01, 0xff, 0x2a), fromHexStringLenient("0x1ff2a", 5)); + assertEquals(BytesValue.of(0x00, 0x01, 0xff, 0x2a), fromHexStringLenient("0x1fF2a", 4)); + assertEquals(BytesValue.of(0x00, 0x01, 0xff, 0x2a), fromHexStringLenient("01FF2A", 4)); + assertEquals(BytesValue.of(0x01, 0xff, 0x2a), fromHexStringLenient("0x01FF2A", 3)); + assertEquals(BytesValue.of(0x01, 0xff, 0x2a), fromHexStringLenient("0x01ff2A", 3)); } @Test @@ -255,16 +255,16 @@ public class BytesValueTest { @Test public void hexString() { - assertEquals(of(), fromHexString("0x")); + assertEquals(BytesValue.of(), fromHexString("0x")); - assertEquals(of(0), fromHexString("00")); - assertEquals(of(0), fromHexString("0x00")); - assertEquals(of(1), fromHexString("0x01")); + assertEquals(BytesValue.of(0), fromHexString("00")); + assertEquals(BytesValue.of(0), fromHexString("0x00")); + assertEquals(BytesValue.of(1), fromHexString("0x01")); - assertEquals(of(1, 0xff, 0x2a), fromHexString("01FF2A")); - assertEquals(of(1, 0xff, 0x2a), fromHexString("0x01FF2A")); - assertEquals(of(1, 0xff, 0x2a), fromHexString("0x01ff2a")); - assertEquals(of(1, 0xff, 0x2a), fromHexString("0x01fF2a")); + assertEquals(BytesValue.of(1, 0xff, 0x2a), fromHexString("01FF2A")); + assertEquals(BytesValue.of(1, 0xff, 0x2a), fromHexString("0x01FF2A")); + assertEquals(BytesValue.of(1, 0xff, 0x2a), fromHexString("0x01ff2a")); + assertEquals(BytesValue.of(1, 0xff, 0x2a), fromHexString("0x01fF2a")); } @Test @@ -283,18 +283,18 @@ public class BytesValueTest { @Test public void hexStringLeftPadding() { - assertEquals(of(), fromHexString("0x", 0)); - assertEquals(of(0, 0), fromHexString("0x", 2)); - assertEquals(of(0, 0, 0, 0), fromHexString("0x", 4)); - - assertEquals(of(0, 0), fromHexString("00", 2)); - assertEquals(of(0, 0), fromHexString("0x00", 2)); - assertEquals(of(0, 0, 1), fromHexString("0x01", 3)); - - assertEquals(of(0x00, 0x01, 0xff, 0x2a), fromHexString("01FF2A", 4)); - assertEquals(of(0x01, 0xff, 0x2a), fromHexString("0x01FF2A", 3)); - assertEquals(of(0x00, 0x00, 0x01, 0xff, 0x2a), fromHexString("0x01ff2a", 5)); - assertEquals(of(0x00, 0x00, 0x01, 0xff, 0x2a), fromHexString("0x01fF2a", 5)); + assertEquals(BytesValue.of(), fromHexString("0x", 0)); + assertEquals(BytesValue.of(0, 0), fromHexString("0x", 2)); + assertEquals(BytesValue.of(0, 0, 0, 0), fromHexString("0x", 4)); + + assertEquals(BytesValue.of(0, 0), fromHexString("00", 2)); + assertEquals(BytesValue.of(0, 0), fromHexString("0x00", 2)); + assertEquals(BytesValue.of(0, 0, 1), fromHexString("0x01", 3)); + + assertEquals(BytesValue.of(0x00, 0x01, 0xff, 0x2a), fromHexString("01FF2A", 4)); + assertEquals(BytesValue.of(0x01, 0xff, 0x2a), fromHexString("0x01FF2A", 3)); + assertEquals(BytesValue.of(0x00, 0x00, 0x01, 0xff, 0x2a), fromHexString("0x01ff2a", 5)); + assertEquals(BytesValue.of(0x00, 0x00, 0x01, 0xff, 0x2a), fromHexString("0x01fF2a", 5)); } @Test