/*
* JBoss, Home of Professional Open Source.
* Copyright 2013, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.extension.batch;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.concurrent.TimeUnit;
import javax.xml.stream.XMLStreamException;
import org.jboss.as.controller.client.Operation;
import org.jboss.as.controller.client.helpers.Operations.CompositeOperationBuilder;
import org.jboss.as.subsystem.test.AdditionalInitialization;
import org.jboss.as.subsystem.test.KernelServices;
import org.jboss.as.subsystem.test.SubsystemOperations;
import org.jboss.dmr.ModelNode;
import org.junit.Assert;
import org.junit.Test;
public class SubsystemOperationsTestCase extends AbstractBatchTestCase {
public SubsystemOperationsTestCase() {
super(BatchSubsystemDefinition.NAME, new BatchSubsystemExtension());
}
@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("/default-subsystem.xml");
}
@Override
protected AdditionalInitialization createAdditionalInitialization() {
return new AdditionalInitialization();
}
@Test
public void testFailure() throws Exception {
final KernelServices kernelServices = boot();
// Add another named job-repository
ModelNode op = SubsystemOperations.createAddOperation(createAddress(JobRepositoryDefinition.NAME, "foo"));
ModelNode result = kernelServices.executeOperation(op);
Assert.assertFalse(SubsystemOperations.isSuccessfulOutcome(result));
// Add another named thread-pool
op = SubsystemOperations.createAddOperation(createAddress(BatchConstants.THREAD_POOL, "foo"));
result = kernelServices.executeOperation(op);
Assert.assertFalse(SubsystemOperations.isSuccessfulOutcome(result));
}
@Test
public void testRemoveThreadPool() throws Exception {
final KernelServices kernelServices = boot(getSubsystemXml("/minimal-subsystem.xml"));
final ModelNode address = createAddress(BatchSubsystemDefinition.THREAD_POOL_PATH);
// Remove the thread pool
final ModelNode removeOp = SubsystemOperations.createRemoveOperation(address);
executeOperation(kernelServices, removeOp);
// Reboot with a default thread pool
String marshalledXml = kernelServices.getPersistedSubsystemXml();
try {
boot(marshalledXml);
Assert.fail("Should be missing <thread-pool/>");
} catch (XMLStreamException ignore) {
}
// Add back a thread-pool, must be named batch
final ModelNode addOp = SubsystemOperations.createAddOperation(address);
addOp.get("max-threads").set(10);
final ModelNode keepAlive = addOp.get("keepalive-time");
keepAlive.get("time").set(100L);
keepAlive.get("unit").set(TimeUnit.MILLISECONDS.toString());
executeOperation(kernelServices, addOp);
// Get the serialized output and boot
marshalledXml = kernelServices.getPersistedSubsystemXml();
try {
final KernelServices k = boot(marshalledXml);
Assert.assertTrue(k.isSuccessfulBoot());
} catch (XMLStreamException e) {
final StringWriter writer = new StringWriter();
e.printStackTrace(new PrintWriter(writer));
Assert.fail("Failed to parse XML; " + writer.toString());
}
// Remove and add in a composite operation
final Operation compositeOp = CompositeOperationBuilder.create()
.addStep(removeOp)
.addStep(addOp)
.build();
executeOperation(kernelServices, compositeOp);
// Get the serialized output and boot
marshalledXml = kernelServices.getPersistedSubsystemXml();
try {
final KernelServices k = boot(marshalledXml);
Assert.assertTrue(k.isSuccessfulBoot());
} catch (XMLStreamException e) {
final StringWriter writer = new StringWriter();
e.printStackTrace(new PrintWriter(writer));
Assert.fail("Failed to parse XML; " + writer.toString());
}
}
@Test
public void testAddSubsystem() throws Exception {
// Boot with no subsystem
final KernelServices kernelServices = boot(null);
// Create the base subsystem address
final ModelNode subsystemAddress = createAddress(null);
final ModelNode addSubsystemOp = SubsystemOperations.createAddOperation(subsystemAddress);
addSubsystemOp.get(BatchSubsystemDefinition.JOB_REPOSITORY_TYPE.getName()).set("in-memory");
final ModelNode threadPool = addSubsystemOp.get(BatchConstants.THREAD_POOL, BatchConstants.THREAD_POOL_NAME);
threadPool.get("max-threads").set(10);
final ModelNode keepAlive = threadPool.get("keepalive-time");
keepAlive.get("time").set(100L);
keepAlive.get("unit").set(TimeUnit.MILLISECONDS.toString());
// Execute the add operation
executeOperation(kernelServices, addSubsystemOp);
}
@Test
public void testRemoveSubsystem() throws Exception {
final KernelServices kernelServices = boot();
final ModelNode removeSubsystemOp = SubsystemOperations.createRemoveOperation(createAddress(null));
executeOperation(kernelServices, removeSubsystemOp);
}
}