/*
* Copyright 2016 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.test.integration.batch.deployment;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.stream.Collectors;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.OperateOnDeployment;
import org.jboss.arquillian.container.test.api.RunAsClient;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.as.arquillian.container.ManagementClient;
import org.jboss.as.controller.client.ModelControllerClient;
import org.jboss.as.controller.client.helpers.Operations;
import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
import org.jboss.as.test.integration.batch.common.AbstractBatchTestCase;
import org.jboss.as.test.integration.batch.common.CountingItemReader;
import org.jboss.as.test.integration.batch.common.CountingItemWriter;
import org.jboss.dmr.ModelNode;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Tests the start, stop and restart functionality for deployments.
*
* @author <a href="mailto:jperkins@redhat.com">James R. Perkins</a>
*/
@RunWith(Arquillian.class)
@RunAsClient
public class DeploymentResourceTestCase extends AbstractBatchTestCase {
private static final String DEPLOYMENT_NAME_1 = "test-batch-1.war";
private static final String DEPLOYMENT_NAME_2 = "test-batch-2.war";
@ArquillianResource
// @OperateOnDeployment is required until WFARQ-13 is resolved
@OperateOnDeployment(DEPLOYMENT_NAME_1)
private ManagementClient managementClient;
@Deployment(name = DEPLOYMENT_NAME_1)
public static WebArchive createDeployment1() {
final Package pkg = DeploymentResourceTestCase.class.getPackage();
final WebArchive deployment = createDefaultWar(DEPLOYMENT_NAME_1, pkg)
.addClasses(CountingItemReader.class, CountingItemWriter.class);
addJobXml(pkg, deployment, "test-chunk.xml");
addJobXml(pkg, deployment, "test-chunk.xml", "same-test-chunk.xml");
return deployment;
}
@Deployment(name = DEPLOYMENT_NAME_2)
public static WebArchive createDeployment2() {
final Package pkg = DeploymentResourceTestCase.class.getPackage();
final WebArchive deployment = createDefaultWar(DEPLOYMENT_NAME_2, pkg)
.addClasses(CountingItemReader.class, CountingItemWriter.class);
addJobXml(pkg, deployment, "test-chunk.xml");
addJobXml(pkg, deployment, "test-chunk.xml", "same-test-chunk.xml");
addJobXml(pkg, deployment, "test-chunk-other.xml");
addJobXml(deployment, EmptyAsset.INSTANCE, "invalid.xml");
return deployment;
}
@Test
public void testRootResourceJobXmlListing() throws Exception {
// First deployment should only have two available XML descriptors
validateJobXmlNames(DEPLOYMENT_NAME_1, "test-chunk.xml", "same-test-chunk.xml");
// Second deployment should have 3 available descriptors and one missing descriptor as it's invalid
validateJobXmlNames(DEPLOYMENT_NAME_2, Arrays.asList("test-chunk.xml", "same-test-chunk.xml", "test-chunk-other.xml"), Collections.singleton("invalid.xml"));
}
@Test
public void testDeploymentJobXmlListing() throws Exception {
// First deployment should have two available XML descriptors on the single job
ModelNode address = Operations.createAddress("deployment", DEPLOYMENT_NAME_1, "subsystem", "batch-jberet", "job", "test-chunk");
validateJobXmlNames(address, "test-chunk.xml", "same-test-chunk.xml");
// Second deployment should have two available jobs. The first job should have two available XML descriptors the
// second job should only have one descriptor.
address = Operations.createAddress("deployment", DEPLOYMENT_NAME_2, "subsystem", "batch-jberet", "job", "test-chunk");
validateJobXmlNames(address, "test-chunk.xml", "same-test-chunk.xml");
address = Operations.createAddress("deployment", DEPLOYMENT_NAME_2, "subsystem", "batch-jberet", "job", "test-chunk-other");
validateJobXmlNames(address, "test-chunk-other.xml");
}
@Test
public void testEmptyResources() throws Exception {
final ModelNode address = Operations.createAddress("deployment", DEPLOYMENT_NAME_2, "subsystem", "batch-jberet");
final ModelNode op = Operations.createReadResourceOperation(address, true);
op.get(ModelDescriptionConstants.INCLUDE_RUNTIME).set(true);
final ModelNode result = executeOperation(op);
final ModelNode otherJob = result.get("job", "test-chunk-other");
Assert.assertTrue("Expected the test-chunk-other job resource to exist", otherJob.isDefined());
Assert.assertEquals(0, otherJob.get("instance-count").asInt());
Assert.assertEquals(0, otherJob.get("running-executions").asInt());
Assert.assertFalse(otherJob.get("executions").isDefined());
}
private void validateJobXmlNames(final String deploymentName, final String... expectedDescriptors) throws IOException {
validateJobXmlNames(deploymentName, Arrays.asList(expectedDescriptors), Collections.emptyList());
}
private void validateJobXmlNames(final ModelNode address, final String... expectedDescriptors) throws IOException {
validateJobXmlNames(address, Arrays.asList(expectedDescriptors), Collections.emptyList());
}
private void validateJobXmlNames(final String deploymentName, final Collection<String> expectedDescriptors,
final Collection<String> unexpectedDescriptors) throws IOException {
final ModelNode address = Operations.createAddress("deployment", deploymentName, "subsystem", "batch-jberet");
validateJobXmlNames(address, expectedDescriptors, unexpectedDescriptors);
}
private void validateJobXmlNames(final ModelNode address, final Collection<String> expectedDescriptors,
final Collection<String> unexpectedDescriptors) throws IOException {
final ModelNode op = Operations.createReadAttributeOperation(address, "job-xml-names");
final ModelNode result = executeOperation(op);
final Collection<String> jobNames = result.asList()
.stream()
.map(ModelNode::asString)
.collect(Collectors.toSet());
Assert.assertEquals(expectedDescriptors.size(), jobNames.size());
for (String xmlDescriptor : expectedDescriptors) {
Assert.assertTrue(String.format("Expected %s to be in the list of job-xml-names.", xmlDescriptor),
jobNames.contains(xmlDescriptor));
}
for (String xmlDescriptor : unexpectedDescriptors) {
Assert.assertFalse(String.format("Expected %s to NOT be in the list of job-xml-names.", xmlDescriptor),
jobNames.contains(xmlDescriptor));
}
}
@SuppressWarnings("Duplicates")
private ModelNode executeOperation(final ModelNode op) throws IOException {
final ModelControllerClient client = managementClient.getControllerClient();
final ModelNode result = client.execute(op);
if (Operations.isSuccessfulOutcome(result)) {
return Operations.readResult(result);
}
Assert.fail(Operations.getFailureDescription(result).asString());
// Should never be reached
return new ModelNode();
}
}