/*
* JBoss, Home of Professional Open Source
* Copyright 2014, JBoss Inc., and individual contributors as indicated
* by the @authors tag.
*
* 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.manualmode.deployment;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DEPLOYMENT;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OUTCOME;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.UUID;
import javax.inject.Inject;
import org.apache.commons.io.FileUtils;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.client.ModelControllerClient;
import org.jboss.as.controller.client.helpers.standalone.ServerDeploymentHelper;
import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
import org.jboss.as.controller.operations.common.Util;
import org.jboss.as.protocol.StreamUtils;
import org.jboss.as.test.shared.TestSuiteEnvironment;
import org.jboss.as.test.shared.TimeoutUtil;
import org.jboss.dmr.ModelNode;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.wildfly.core.testrunner.ServerControl;
import org.wildfly.core.testrunner.ServerController;
import org.wildfly.core.testrunner.WildflyTestRunner;
/**
* @author Emanuel Muckenhuber
*/
@RunWith(WildflyTestRunner.class)
@ServerControl(manual = true)
public class DeploymentScannerNotificationUnitTestCase extends AbstractDeploymentUnitTestCase {
private static final PathAddress DEPLOYMENT_ONE = PathAddress.pathAddress(DEPLOYMENT, "deployment-one.jar");
@Inject
private ServerController container;
private ModelControllerClient client;
private static final String tempDir = System.getProperty("java.io.tmpdir");
private static File deployDir;
@Before
public void before() throws IOException {
deployDir = new File(tempDir + File.separator + "deployment-test-" + UUID.randomUUID().toString());
if (deployDir.exists()) {
FileUtils.deleteDirectory(deployDir);
}
assertTrue("Unable to create deployment scanner directory.", deployDir.mkdir());
}
@After
public void after() throws IOException {
FileUtils.deleteDirectory(deployDir);
}
@Test
public void testStartup() throws Exception {
container.start();
try {
client = TestSuiteEnvironment.getModelControllerClient();
try {
final File deploymentOne = new File(deployDir, "deployment-one.jar");
createDeployment(deploymentOne, "org.jboss.modules");
// Add a new de
addDeploymentScanner(1000);
try {
// Wait until deployed ...
long timeout = System.currentTimeMillis() + TimeoutUtil.adjust(30000);
while (!exists(DEPLOYMENT_ONE) && System.currentTimeMillis() < timeout) {
Thread.sleep(100);
}
Assert.assertTrue(exists(DEPLOYMENT_ONE));
Assert.assertEquals("OK", deploymentState(DEPLOYMENT_ONE));
final Path oneDeployed = deployDir.toPath().resolve("deployment-one.jar.deployed");
final Path oneUndeployed = deployDir.toPath().resolve("deployment-one.jar.undeployed");
Assert.assertTrue(Files.deleteIfExists(oneDeployed));
timeout = System.currentTimeMillis() + TimeoutUtil.adjust(30000);
while (!Files.exists(oneUndeployed) && System.currentTimeMillis() < timeout) {
Thread.sleep(10);
}
Assert.assertFalse(Files.exists(oneDeployed));
Assert.assertTrue(Files.exists(oneUndeployed));
Assert.assertTrue(Files.exists(deployDir.toPath().resolve("deployment-one.jar")));
Assert.assertFalse(exists(DEPLOYMENT_ONE));
ModelNode disableScanner = Util.getWriteAttributeOperation(PathAddress.parseCLIStyleAddress("/subsystem=deployment-scanner/scanner=testScanner"), "scan-interval", 300000);
ModelNode result = executeOperation(disableScanner);
assertEquals("Unexpected outcome of disabling the test deployment scanner: " + disableScanner, ModelDescriptionConstants.SUCCESS, result.get(OUTCOME).asString());
deploy(deploymentOne);
Assert.assertTrue(exists(DEPLOYMENT_ONE));
Assert.assertEquals("OK", deploymentState(DEPLOYMENT_ONE));
timeout = System.currentTimeMillis() + TimeoutUtil.adjust(30000);
while (!Files.exists(oneDeployed) && System.currentTimeMillis() < timeout) {
Thread.sleep(10);
}
Assert.assertTrue(Files.exists(oneDeployed));
Assert.assertFalse(Files.exists(oneUndeployed));
} finally {
removeDeploymentScanner();
undeploy("deployment-one.jar");
}
} finally {
StreamUtils.safeClose(client);
}
} finally {
container.stop();
}
}
protected void undeploy(String deployment) throws Exception {
ServerDeploymentHelper helper = new ServerDeploymentHelper(client);
helper.undeploy(deployment);
}
protected void deploy(File deployment) throws Exception {
ServerDeploymentHelper helper = new ServerDeploymentHelper(client);
try (InputStream in = Files.newInputStream(deployment.toPath())) {
helper.deploy(deployment.getName(), in);
}
}
@Override
protected ModelNode executeOperation(ModelNode op) throws IOException {
return client.execute(op);
}
@Override
protected File getDeployDir() {
return deployDir;
}
}