/*
* Copyright 2015 Red Hat, Inc.
*
* 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 org.jboss.as.ee.subsystem;
import java.io.IOException;
import org.jboss.as.controller.RunningMode;
import org.jboss.as.controller.client.helpers.ClientConstants;
import org.jboss.as.controller.client.helpers.Operations;
import org.jboss.as.controller.client.helpers.Operations.CompositeOperationBuilder;
import org.jboss.as.subsystem.test.AbstractSubsystemBaseTest;
import org.jboss.as.subsystem.test.AdditionalInitialization;
import org.jboss.as.subsystem.test.ControllerInitializer;
import org.jboss.as.subsystem.test.KernelServices;
import org.jboss.dmr.ModelNode;
import org.junit.Assert;
import org.junit.Test;
import org.wildfly.common.cpu.ProcessorInfo;
/**
* @author <a href="mailto:jperkins@redhat.com">James R. Perkins</a>
*/
public class EeOperationsTestCase extends AbstractSubsystemBaseTest {
public EeOperationsTestCase() {
super(EeExtension.SUBSYSTEM_NAME, new EeExtension());
}
@Override
protected void standardSubsystemTest(final String configId) throws Exception {
// do nothing as this is not a subsystem parsing test
}
@Override
protected String getSubsystemXml() throws IOException {
return readResource("simple-subsystem.xml");
}
@Test
public void testManagedExecutorFailureOperations() throws Exception {
// Boot the container
final KernelServices kernelServices = createKernelServicesBuilder(createAdditionalInitialization()).setSubsystemXml(getSubsystemXml()).build();
// Default address
final ModelNode address = Operations.createAddress(ClientConstants.SUBSYSTEM, EeExtension.SUBSYSTEM_NAME, "managed-executor-service", "default");
// Create a composite operation that should fail; note that if the queue-length is undefined, 0 or Integer.MAX_VALUE the
// core-threads must be greater than 0
ModelNode op = Operations.createWriteAttributeOperation(address, "core-threads", 0);
ModelNode result = kernelServices.executeOperation(op);
Assert.assertFalse(Operations.isSuccessfulOutcome(result));
op = CompositeOperationBuilder.create()
.addStep(Operations.createWriteAttributeOperation(address, "queue-length", Integer.MAX_VALUE))
.addStep(Operations.createWriteAttributeOperation(address, "core-threads", 0))
.build().getOperation();
result = kernelServices.executeOperation(op);
Assert.assertFalse(Operations.isSuccessfulOutcome(result));
op = CompositeOperationBuilder.create()
.addStep(Operations.createWriteAttributeOperation(address, "queue-length", 0))
.addStep(Operations.createWriteAttributeOperation(address, "core-threads", 0))
.build().getOperation();
result = kernelServices.executeOperation(op);
Assert.assertFalse(Operations.isSuccessfulOutcome(result));
// The max-threads must be greater than or equal to the core-threads
op = CompositeOperationBuilder.create()
.addStep(Operations.createWriteAttributeOperation(address, "core-threads", 4))
.addStep(Operations.createWriteAttributeOperation(address, "max-threads", 1))
.build().getOperation();
result = kernelServices.executeOperation(op);
Assert.assertFalse(Operations.isSuccessfulOutcome(result));
// Test a failure at the runtime-stage
op = CompositeOperationBuilder.create()
.addStep(Operations.createWriteAttributeOperation(address, "queue-length", "${test.queue-length:10}"))
.addStep(Operations.createWriteAttributeOperation(address, "core-threads", "${test.core-threads:500}"))
.build().getOperation();
result = kernelServices.executeOperation(op);
Assert.assertFalse(Operations.isSuccessfulOutcome(result));
// The max-threads must be greater than or equal to the core-threads
final int calculatedMaxThreads = (ProcessorInfo.availableProcessors() * 2);
op = CompositeOperationBuilder.create()
.addStep(Operations.createWriteAttributeOperation(address, "core-threads", calculatedMaxThreads))
.addStep(Operations.createWriteAttributeOperation(address, "max-threads", calculatedMaxThreads - 1))
.build().getOperation();
result = kernelServices.executeOperation(op);
Assert.assertFalse(Operations.isSuccessfulOutcome(result));
}
@Test
public void testManagedExecutorOperations() throws Exception {
// Boot the container
final KernelServices kernelServices = createKernelServicesBuilder(createAdditionalInitialization()).setSubsystemXml(getSubsystemXml()).build();
// Default address
final ModelNode address = Operations.createAddress(ClientConstants.SUBSYSTEM, EeExtension.SUBSYSTEM_NAME, "managed-executor-service", "default");
ModelNode op = CompositeOperationBuilder.create()
.addStep(Operations.createWriteAttributeOperation(address, "queue-length", Integer.MAX_VALUE))
.addStep(Operations.createWriteAttributeOperation(address, "core-threads", 5))
.build().getOperation();
executeForSuccess(kernelServices, op);
op = CompositeOperationBuilder.create()
.addStep(Operations.createWriteAttributeOperation(address, "max-threads", 5))
.addStep(Operations.createWriteAttributeOperation(address, "queue-length", 10))
.addStep(Operations.createWriteAttributeOperation(address, "core-threads", 0))
.build().getOperation();
executeForSuccess(kernelServices, op);
// The max-threads must be greater than or equal to the core-threads
op = CompositeOperationBuilder.create()
.addStep(Operations.createWriteAttributeOperation(address, "core-threads", 4))
.addStep(Operations.createWriteAttributeOperation(address, "max-threads", 4))
.build().getOperation();
executeForSuccess(kernelServices, op);
}
private ModelNode executeForSuccess(final KernelServices kernelServices, final ModelNode op) {
final ModelNode result = kernelServices.executeOperation(op);
if (!Operations.isSuccessfulOutcome(result)) {
Assert.fail(Operations.getFailureDescription(result).asString());
}
return result;
}
@Override
protected AdditionalInitialization createAdditionalInitialization() {
return new AdditionalInitialization() {
@Override
protected RunningMode getRunningMode() {
return RunningMode.NORMAL;
}
@Override
protected ControllerInitializer createControllerInitializer() {
return new EeInitializer();
}
};
}
class EeInitializer extends ControllerInitializer {
public EeInitializer() {
addSystemProperty("test.queue-length", "0");
addSystemProperty("test.core-threads", "0");
}
}
}