-
Notifications
You must be signed in to change notification settings - Fork 466
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[WFCORE-7008] Split ManagementInterfaceResourcesTestCase for differen…
…t stability levels.
- Loading branch information
Showing
5 changed files
with
232 additions
and
165 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
127 changes: 127 additions & 0 deletions
127
...a/org/wildfly/core/test/standalone/mgmt/AbstractManagementInterfaceResourcesTestCase.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
|
||
} |
81 changes: 81 additions & 0 deletions
81
.../org/wildfly/core/test/standalone/mgmt/ManagementInterfaceResourcesCommunityTestCase.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
|
||
} | ||
} |
Oops, something went wrong.