Skip to content

Commit

Permalink
[WFCORE-7008] Split ManagementInterfaceResourcesTestCase for differen…
Browse files Browse the repository at this point in the history
…t stability levels.
  • Loading branch information
darranl committed Oct 2, 2024
1 parent 62ef035 commit e35ec7b
Show file tree
Hide file tree
Showing 5 changed files with 232 additions and 165 deletions.
18 changes: 8 additions & 10 deletions testsuite/manualmode/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@
<!--
<byteman.jvm.args>-javaagent:${org.jboss.byteman:byteman:jar}=port:${byteman.port},address:${byteman.host},boot:${org.jboss.byteman:byteman:jar} -Dorg.jboss.byteman.transform.all -Dorg.jboss.byteman.verbose=true</byteman.jvm.args>
-->

</properties>

<dependencies>
<dependency>
<groupId>jakarta.inject</groupId>
Expand Down Expand Up @@ -583,7 +583,7 @@
<!-- restart the server -->
<exclude>org.jboss.as.test.manualmode.deployment.DeploymentScannerRedeploymentTestCase</exclude>
<exclude>org.jboss.as.test.manualmode.deployment.DeploymentScannerUnitTestCase</exclude>

<!-- restart the server -->
<exclude>org.jboss.as.test.manualmode.logging.LoggingDependenciesTestCase</exclude>
<exclude>org.jboss.as.test.manualmode.logging.LoggingPreferencesTestCase</exclude>
Expand All @@ -598,7 +598,7 @@
<exclude>org.jboss.as.test.manualmode.provisioning.InstallationManagerBootTestCase</exclude>
<!-- restart the server -->
<exclude>org.jboss.as.test.manualmode.management.*TestCase</exclude>

<exclude>org.jboss.as.test.manualmode.management.cli.ManagementOpTimeoutTestCase</exclude>
<exclude>org.jboss.as.test.manualmode.management.cli.ShutdownTestCase</exclude>

Expand All @@ -615,21 +615,19 @@
<exclude>org.jboss.as.test.manualmode.management.cli.RemoveManagementRealmTestCase</exclude>
<!-- no git support -->
<exclude>org.jboss.as.test.manualmode.management.persistence.*TestCase</exclude>

<!-- replace config file -->
<exclude>org.jboss.as.test.manualmode.mgmt.elytron.ElytronModelControllerClientTestCase</exclude>

<!--- remove a module after having closed the server -->
<exclude>org.jboss.as.test.manualmode.expressions.CredentialStoreExpressionsTestCase</exclude>

<!-- admin mode -->
<exclude>org.wildfly.core.test.standalone.mgmt.ManagementInterfaceResourcesTestCase</exclude>
<exclude>org.jboss.as.test.manualmode.adminonly.auditlog.*TestCase.java</exclude>
<exclude>org.jboss.as.test.manualmode.cli.boot.ops.CliBootOperationsTestCase.java</exclude>

<!-- start /stop, and install extension before start -->
<exclude>org.wildfly.core.test.standalone.mgmt.PreparedResponseTestCase</exclude>

<!-- start/stop/start the server -->
<exclude>org.wildfly.core.test.standalone.mgmt.events.*TestCase</exclude>
<!-- Requires modification of the process-uuid file inside the Jar -->
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
/*
* Copyright The WildFly Authors
* SPDX-License-Identifier: Apache-2.0
*/

package org.wildfly.core.test.standalone.mgmt;

import static org.jboss.as.test.shared.TimeoutUtil.adjust;
import static org.junit.Assert.assertTrue;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.jboss.as.test.shared.TestSuiteEnvironment;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.wildfly.common.function.ExceptionRunnable;
import org.wildfly.core.testrunner.ServerControl;
import org.wildfly.core.testrunner.ServerController;
import org.wildfly.core.testrunner.WildFlyRunner;

import jakarta.inject.Inject;

/**
* Test case to test resource limits and clean up of management interface connections.
*
* @author <a href="mailto:[email protected]">Darran Lofthouse</a>
*/
@RunWith(WildFlyRunner.class)
@ServerControl(manual = true)
public abstract class AbstractManagementInterfaceResourcesTestCase {
protected static final Logger LOG = Logger.getLogger(ManagementInterfaceResourcesTestCase.class.getName());


@Inject
protected static ServerController controller;

/**
* Test that the management interface will not accept new connections when the number of active connections reaches the
* high water mark. After the number of open connections has been reduced to the low watermark it will test that connections
* are accepted again.
*/
@Test
public void testWatermarks() throws Exception {
runTest(60000, () -> {
String mgmtAddress = TestSuiteEnvironment.getServerAddress();
int mgmtPort = TestSuiteEnvironment.getServerPort();
LOG.info(mgmtAddress + ":" + mgmtPort);
SocketAddress targetAddress = new InetSocketAddress(mgmtAddress, mgmtPort);

int socketsOpened = 0;
boolean oneFailed = false;
Socket[] sockets = new Socket[9];
for (int i = 0 ; i < 9 ; i++) {
LOG.info("Opening socket " + i + " socketsOpened=" + socketsOpened);
try {
sockets[i] = new Socket();
sockets[i].connect(targetAddress, 5000);
socketsOpened++;
} catch (IOException e) {
LOG.log(Level.SEVERE, "Probably an expected exception trying to open a new connection", e);
assertTrue("Less sockets than low watermark opened.", socketsOpened > 3);
oneFailed = true;
}
}
assertTrue("Opening of one socket was expected to fail.", oneFailed);

// Now close the connections and we should be able to connect again.
for (int i = 0 ; i < socketsOpened ; i++) {
sockets[i].close();
}

Socket goodSocket = new Socket();
// This needs a reasonable time to give the server time to respond to the closed connections.
goodSocket.connect(targetAddress, 10000);
goodSocket.close();
});
}

@Test
public void testTimeout() throws Exception {
runTest(10000, () -> {
String mgmtAddress = TestSuiteEnvironment.getServerAddress();
int mgmtPort = TestSuiteEnvironment.getServerPort();
SocketAddress targetAddress = new InetSocketAddress(mgmtAddress, mgmtPort);

int socketsOpened = 0;
boolean oneFailed = false;
Socket[] sockets = new Socket[9];
for (int i = 0 ; i < 9 ; i++) {
LOG.info("Opening socket " + i + " socketsOpened=" + socketsOpened);
try {
sockets[i] = new Socket();
sockets[i].connect(targetAddress, 5000);
socketsOpened++;
} catch (IOException e) {
LOG.log(Level.SEVERE, "Probably an expected exception trying to open a new connection", e);
assertTrue("Less sockets than low watermark opened.", socketsOpened > 3);
oneFailed = true;
}
}
assertTrue("Opening of one socket was expected to fail.", oneFailed);

// Notice that the exception received when we tried to open a new socket could have been a timeout (SocketTimeoutException)
// or a connection refused (IOException). It depends on the OS and the network configuration.
// So, we could also have had 5000ms for each bad socket that triggered a SocketTimeoutException.
Thread.sleep(adjust(12000));

Socket goodSocket = new Socket();
// This needs to be longer than 500ms to give the server time to respond to the closed connections.
goodSocket.connect(targetAddress, 10000);
goodSocket.close();

// Clean up remaining sockets
for (int i = 0 ; i < socketsOpened ; i++) {
sockets[i].close();
}
});
}

protected abstract void runTest(int noRequestTimeout, ExceptionRunnable<Exception> test) throws Exception;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/*
* Copyright The WildFly Authors
* SPDX-License-Identifier: Apache-2.0
*/

package org.wildfly.core.test.standalone.mgmt;

import static org.jboss.as.controller.client.helpers.Operations.createAddress;
import static org.jboss.as.controller.client.helpers.Operations.createWriteAttributeOperation;
import static org.jboss.as.test.integration.management.util.ServerReload.executeReloadAndWaitForCompletion;

import org.jboss.as.test.integration.management.util.ServerReload;
import org.jboss.as.version.Stability;
import org.jboss.dmr.ModelNode;
import org.wildfly.common.function.ExceptionRunnable;
import org.wildfly.core.testrunner.ManagementClient;
import org.wildfly.core.testrunner.ServerSetupTask;
import org.wildfly.test.stability.StabilityServerSetupSnapshotRestoreTasks;

/**
* Test case to test resource limits and clean up of management interface connections.
*
* This test case uses attributes defined directly on the HTTP management interface resource for configuration.
*
* @author <a href="mailto:[email protected]">Darran Lofthouse</a>
*/
public class ManagementInterfaceResourcesCommunityTestCase extends AbstractManagementInterfaceResourcesTestCase {

/*
* Attribute names
*/
private static final String BACKLOG_ATTRIBUTE = "backlog";
private static final String CONNECTION_HIGH_WATER_ATTRIBUTE = "connection-high-water";
private static final String CONNECTION_LOW_WATER_ATTRIBUTE = "connection-low-water";
private static final String NO_REQUEST_TIMEOUT_ATTRIBUTE = "no-request-timeout";

private static final ModelNode HTTP_INTERFACE_ADDRESS = createAddress("core-service", "management", "management-interface", "http-interface");

protected void runTest(int noRequestTimeout, ExceptionRunnable<Exception> test) throws Exception {
controller.start();
ManagementClient client = controller.getClient();

ServerSetupTask task = new ManagementInterfaceSetUpTask(noRequestTimeout);

try {
task.setup(client);
test.run();
controller.reload();
} finally {
task.tearDown(client);
controller.stop();
}
}

class ManagementInterfaceSetUpTask extends StabilityServerSetupSnapshotRestoreTasks.Community {

private final int noRequestTimeout;

public ManagementInterfaceSetUpTask(int noRequestTimeout) {
this.noRequestTimeout = noRequestTimeout;
}

protected void doSetup(ManagementClient managementClient) throws Exception {
writeAttribute(managementClient, BACKLOG_ATTRIBUTE, 2);
writeAttribute(managementClient, CONNECTION_HIGH_WATER_ATTRIBUTE, 6);
writeAttribute(managementClient, CONNECTION_LOW_WATER_ATTRIBUTE, 3);
writeAttribute(managementClient, NO_REQUEST_TIMEOUT_ATTRIBUTE, noRequestTimeout);

// Execute the reload
ServerReload.Parameters parameters = new ServerReload.Parameters()
.setStability(Stability.COMMUNITY);
executeReloadAndWaitForCompletion(managementClient.getControllerClient(), parameters);
}

private void writeAttribute(final ManagementClient managementClient, final String attributeName, final int value) throws Exception {
ModelNode writeOp = createWriteAttributeOperation(HTTP_INTERFACE_ADDRESS, attributeName, value);
managementClient.executeForResult(writeOp);
}

}
}
Loading

0 comments on commit e35ec7b

Please sign in to comment.