[PAN-2577] Integration Integration test(s) on p2p of 'net_services' (#1402)

Signed-off-by: Adrian Sutton <adrian.sutton@consensys.net>
pull/2/head
S. Matthew English 6 years ago committed by GitHub
parent 8b7c5f7949
commit 01780b8332
  1. 55
      acceptance-tests/src/test/java/tech/pegasys/pantheon/tests/acceptance/dsl/condition/net/ExpectNetServicesReturnsAllServicesAsActive.java
  2. 46
      acceptance-tests/src/test/java/tech/pegasys/pantheon/tests/acceptance/dsl/condition/net/ExpectNetServicesReturnsOnlyJsonRpcActive.java
  3. 10
      acceptance-tests/src/test/java/tech/pegasys/pantheon/tests/acceptance/dsl/jsonrpc/Net.java
  4. 2
      acceptance-tests/src/test/java/tech/pegasys/pantheon/tests/acceptance/dsl/node/PantheonNode.java
  5. 24
      acceptance-tests/src/test/java/tech/pegasys/pantheon/tests/acceptance/dsl/node/factory/PantheonNodeFactory.java
  6. 36
      acceptance-tests/src/test/java/tech/pegasys/pantheon/tests/acceptance/dsl/transaction/CustomNetJsonRpcRequestFactory.java
  7. 7
      acceptance-tests/src/test/java/tech/pegasys/pantheon/tests/acceptance/dsl/transaction/JsonRequestFactories.java
  8. 42
      acceptance-tests/src/test/java/tech/pegasys/pantheon/tests/acceptance/dsl/transaction/net/NetServicesTransaction.java
  9. 4
      acceptance-tests/src/test/java/tech/pegasys/pantheon/tests/acceptance/dsl/transaction/net/NetTransactions.java
  10. 55
      acceptance-tests/src/test/java/tech/pegasys/pantheon/tests/acceptance/jsonrpc/NetServicesAcceptanceTest.java

@ -0,0 +1,55 @@
/*
* 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.
*/
package tech.pegasys.pantheon.tests.acceptance.dsl.condition.net;
import static org.assertj.core.api.Assertions.assertThat;
import tech.pegasys.pantheon.tests.acceptance.dsl.condition.Condition;
import tech.pegasys.pantheon.tests.acceptance.dsl.node.Node;
import tech.pegasys.pantheon.tests.acceptance.dsl.transaction.net.NetServicesTransaction;
import tech.pegasys.pantheon.util.NetworkUtility;
import java.util.Arrays;
import java.util.Map;
import com.google.common.net.InetAddresses;
public class ExpectNetServicesReturnsAllServicesAsActive implements Condition {
private final NetServicesTransaction transaction;
public ExpectNetServicesReturnsAllServicesAsActive(final NetServicesTransaction transaction) {
this.transaction = transaction;
}
@Override
public void verify(final Node node) {
final Map<String, Map<String, String>> result = node.execute(transaction);
assertThat(result.keySet())
.containsExactlyInAnyOrderElementsOf(Arrays.asList("p2p", "jsonrpc", "ws"));
assertThat(InetAddresses.isUriInetAddress(result.get("p2p").get("host"))).isTrue();
final int p2pPort = Integer.valueOf(result.get("p2p").get("port"));
assertThat(NetworkUtility.isValidPort(p2pPort)).isTrue();
assertThat(InetAddresses.isUriInetAddress(result.get("ws").get("host"))).isTrue();
final int wsPort = Integer.valueOf(result.get("ws").get("port"));
// TODO: Port should not be 0-valued. Refer to PAN-2703
assertThat(NetworkUtility.isValidPort(p2pPort) || wsPort == 0).isTrue();
assertThat(InetAddresses.isUriInetAddress(result.get("jsonrpc").get("host"))).isTrue();
final int jsonRpcPort = Integer.valueOf(result.get("jsonrpc").get("port"));
// TODO: Port should not be 0-valued. Refer to PAN-2703
assertThat(NetworkUtility.isValidPort(p2pPort) || jsonRpcPort == 0).isTrue();
}
}

@ -0,0 +1,46 @@
/*
* 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.
*/
package tech.pegasys.pantheon.tests.acceptance.dsl.condition.net;
import static org.assertj.core.api.Assertions.assertThat;
import tech.pegasys.pantheon.tests.acceptance.dsl.condition.Condition;
import tech.pegasys.pantheon.tests.acceptance.dsl.node.Node;
import tech.pegasys.pantheon.tests.acceptance.dsl.transaction.net.NetServicesTransaction;
import tech.pegasys.pantheon.util.NetworkUtility;
import java.util.Collections;
import java.util.Map;
import com.google.common.net.InetAddresses;
public class ExpectNetServicesReturnsOnlyJsonRpcActive implements Condition {
private final NetServicesTransaction transaction;
public ExpectNetServicesReturnsOnlyJsonRpcActive(final NetServicesTransaction transaction) {
this.transaction = transaction;
}
@Override
public void verify(final Node node) {
final Map<String, Map<String, String>> result = node.execute(transaction);
assertThat(result.keySet())
.containsExactlyInAnyOrderElementsOf(Collections.singletonList("jsonrpc"));
assertThat(InetAddresses.isUriInetAddress(result.get("jsonrpc").get("host"))).isTrue();
final int jsonrpcPort = Integer.valueOf(result.get("jsonrpc").get("port"));
// TODO: Port should not be 0-valued. Refer to PAN-2703
assertThat(NetworkUtility.isValidPort(jsonrpcPort) || jsonrpcPort == 0).isTrue();
}
}

@ -15,6 +15,8 @@ package tech.pegasys.pantheon.tests.acceptance.dsl.jsonrpc;
import tech.pegasys.pantheon.tests.acceptance.dsl.condition.Condition;
import tech.pegasys.pantheon.tests.acceptance.dsl.condition.net.AwaitNetPeerCount;
import tech.pegasys.pantheon.tests.acceptance.dsl.condition.net.AwaitNetPeerCountException;
import tech.pegasys.pantheon.tests.acceptance.dsl.condition.net.ExpectNetServicesReturnsAllServicesAsActive;
import tech.pegasys.pantheon.tests.acceptance.dsl.condition.net.ExpectNetServicesReturnsOnlyJsonRpcActive;
import tech.pegasys.pantheon.tests.acceptance.dsl.condition.net.ExpectNetVersionConnectionException;
import tech.pegasys.pantheon.tests.acceptance.dsl.condition.net.ExpectNetVersionConnectionExceptionWithCause;
import tech.pegasys.pantheon.tests.acceptance.dsl.condition.net.ExpectNetVersionIsNotBlank;
@ -32,6 +34,14 @@ public class Net {
this.transactions = transactions;
}
public Condition netServicesAllActive() {
return new ExpectNetServicesReturnsAllServicesAsActive(transactions.netServices());
}
public Condition netServicesOnlyJsonRpcEnabled() {
return new ExpectNetServicesReturnsOnlyJsonRpcActive(transactions.netServices());
}
public Condition netVersion() {
return new ExpectNetVersionIsNotBlank(transactions.netVersion());
}

@ -31,6 +31,7 @@ import tech.pegasys.pantheon.tests.acceptance.dsl.httptransaction.HttpRequestFac
import tech.pegasys.pantheon.tests.acceptance.dsl.httptransaction.HttpTransaction;
import tech.pegasys.pantheon.tests.acceptance.dsl.transaction.AdminJsonRpcRequestFactory;
import tech.pegasys.pantheon.tests.acceptance.dsl.transaction.CliqueJsonRpcRequestFactory;
import tech.pegasys.pantheon.tests.acceptance.dsl.transaction.CustomNetJsonRpcRequestFactory;
import tech.pegasys.pantheon.tests.acceptance.dsl.transaction.EeaJsonRpcRequestFactory;
import tech.pegasys.pantheon.tests.acceptance.dsl.transaction.IbftJsonRpcRequestFactory;
import tech.pegasys.pantheon.tests.acceptance.dsl.transaction.JsonRequestFactories;
@ -282,6 +283,7 @@ public class PantheonNode implements NodeConfiguration, RunnableNode, AutoClosea
new PermissioningJsonRpcRequestFactory(web3jService),
new AdminJsonRpcRequestFactory(web3jService),
new EeaJsonRpcRequestFactory(web3jService),
new CustomNetJsonRpcRequestFactory(web3jService),
websocketService);
}

@ -132,6 +132,30 @@ public class PantheonNodeFactory {
.build());
}
public PantheonNode createArchiveNodeNetServicesEnabled(final String name) throws IOException {
// TODO: Enable metrics coverage in the acceptance tests. See PIE-1606
// final MetricsConfiguration metricsConfiguration = MetricsConfiguration.createDefault();
// metricsConfiguration.setEnabled(true);
// metricsConfiguration.setPort(0);
return create(
new PantheonFactoryConfigurationBuilder()
.name(name)
// .setMetricsConfiguration(metricsConfiguration)
.jsonRpcConfiguration(jsonRpcConfigWithAdmin())
.webSocketEnabled()
.p2pEnabled(true)
.build());
}
public PantheonNode createArchiveNodeNetServicesDisabled(final String name) throws IOException {
return create(
new PantheonFactoryConfigurationBuilder()
.name(name)
.jsonRpcConfiguration(jsonRpcConfigWithAdmin())
.p2pEnabled(false)
.build());
}
public PantheonNode createArchiveNodeWithAuthentication(final String name)
throws IOException, URISyntaxException {
return create(

@ -0,0 +1,36 @@
/*
* 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.
*/
package tech.pegasys.pantheon.tests.acceptance.dsl.transaction;
import java.util.Collections;
import java.util.Map;
import org.web3j.protocol.Web3jService;
import org.web3j.protocol.core.Request;
import org.web3j.protocol.core.Response;
public class CustomNetJsonRpcRequestFactory {
public static class NetServicesResponse extends Response<Map<String, Map<String, String>>> {}
private final Web3jService web3jService;
public CustomNetJsonRpcRequestFactory(final Web3jService web3jService) {
this.web3jService = web3jService;
}
public Request<?, NetServicesResponse> netServices() {
return new Request<>(
"net_services", Collections.emptyList(), web3jService, NetServicesResponse.class);
}
}

@ -25,6 +25,7 @@ public class JsonRequestFactories {
private final PermissioningJsonRpcRequestFactory perm;
private final AdminJsonRpcRequestFactory admin;
private final EeaJsonRpcRequestFactory eea;
private final CustomNetJsonRpcRequestFactory customNet;
private final Optional<WebSocketService> websocketService;
public JsonRequestFactories(
@ -34,6 +35,7 @@ public class JsonRequestFactories {
final PermissioningJsonRpcRequestFactory perm,
final AdminJsonRpcRequestFactory admin,
final EeaJsonRpcRequestFactory eea,
final CustomNetJsonRpcRequestFactory customNet,
final Optional<WebSocketService> websocketService) {
this.netEth = netEth;
this.clique = clique;
@ -41,6 +43,7 @@ public class JsonRequestFactories {
this.perm = perm;
this.admin = admin;
this.eea = eea;
this.customNet = customNet;
this.websocketService = websocketService;
}
@ -68,6 +71,10 @@ public class JsonRequestFactories {
return admin;
}
public CustomNetJsonRpcRequestFactory customNet() {
return customNet;
}
public EeaJsonRpcRequestFactory eea() {
return eea;
}

@ -0,0 +1,42 @@
/*
* 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.
*/
package tech.pegasys.pantheon.tests.acceptance.dsl.transaction.net;
import tech.pegasys.pantheon.tests.acceptance.dsl.transaction.CustomNetJsonRpcRequestFactory;
import tech.pegasys.pantheon.tests.acceptance.dsl.transaction.JsonRequestFactories;
import tech.pegasys.pantheon.tests.acceptance.dsl.transaction.Transaction;
import java.util.Map;
import org.web3j.protocol.core.Request;
public class NetServicesTransaction implements Transaction<Map<String, Map<String, String>>> {
NetServicesTransaction() {}
@Override
public Map<String, Map<String, String>> execute(final JsonRequestFactories requestFactories) {
CustomNetJsonRpcRequestFactory.NetServicesResponse netServicesResponse = null;
try {
final CustomNetJsonRpcRequestFactory netServicesJsonRpcRequestFactory =
requestFactories.customNet();
final Request<?, CustomNetJsonRpcRequestFactory.NetServicesResponse> request =
netServicesJsonRpcRequestFactory.netServices();
netServicesResponse = request.send();
} catch (final Exception e) {
throw new RuntimeException(e);
}
return netServicesResponse.getResult();
}
}

@ -18,6 +18,10 @@ public class NetTransactions {
return new NetVersionTransaction();
}
public NetServicesTransaction netServices() {
return new NetServicesTransaction();
}
public NetPeerCountTransaction peerCount() {
return new NetPeerCountTransaction();
}

@ -0,0 +1,55 @@
/*
* 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.
*/
package tech.pegasys.pantheon.tests.acceptance.jsonrpc;
import tech.pegasys.pantheon.tests.acceptance.dsl.AcceptanceTestBase;
import tech.pegasys.pantheon.tests.acceptance.dsl.node.Node;
import tech.pegasys.pantheon.tests.acceptance.dsl.node.cluster.Cluster;
import tech.pegasys.pantheon.tests.acceptance.dsl.node.cluster.ClusterConfiguration;
import tech.pegasys.pantheon.tests.acceptance.dsl.node.cluster.ClusterConfigurationBuilder;
import org.junit.Test;
public class NetServicesAcceptanceTest extends AcceptanceTestBase {
private Cluster noDiscoveryCluster;
private Node nodeA;
private Node nodeB;
@Test
public void shouldIndicateNetServicesEnabled() throws Exception {
final ClusterConfiguration clusterConfiguration =
new ClusterConfigurationBuilder().awaitPeerDiscovery(false).build();
noDiscoveryCluster = new Cluster(clusterConfiguration, net);
nodeA = pantheon.createArchiveNodeNetServicesEnabled("nodeA");
nodeB = pantheon.createArchiveNodeNetServicesEnabled("nodeB");
noDiscoveryCluster.start(nodeA, nodeB);
nodeA.verify(net.netServicesAllActive());
nodeB.verify(net.netServicesAllActive());
}
@Test
public void shouldNotDisplayDisabledServices() throws Exception {
final ClusterConfiguration clusterConfiguration =
new ClusterConfigurationBuilder().awaitPeerDiscovery(false).build();
noDiscoveryCluster = new Cluster(clusterConfiguration, net);
nodeA = pantheon.createArchiveNodeNetServicesDisabled("nodeA");
nodeB = pantheon.createArchiveNodeNetServicesDisabled("nodeB");
noDiscoveryCluster.start(nodeA, nodeB);
nodeA.verify(net.netServicesOnlyJsonRpcEnabled());
nodeB.verify(net.netServicesOnlyJsonRpcEnabled());
}
}
Loading…
Cancel
Save