/*
* JBoss, Home of Professional Open Source.
* Copyright 2013, Red Hat Middleware LLC, 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.jboss.as.webservices.config;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.net.URL;
import java.net.URLClassLoader;
import javax.management.MBeanServer;
import org.jboss.msc.value.ImmediateValue;
import org.jboss.wsf.spi.management.ServerConfig;
import org.jboss.wsf.spi.management.StackConfig;
import org.jboss.wsf.spi.management.StackConfigFactory;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* @author <a href="mailto:alessio.soldano@jboss.com>Alessio Soldano</a>
*/
public class ServerConfigImplTestCase {
private static ClassLoader origTCCL;
public ServerConfigImplTestCase() {
}
@Test
public void testIsModifiable() throws Exception {
ServerConfigImpl sc = newServerConfigImpl();
sc.create();
assertTrue(sc.isModifiable());
sc.incrementWSDeploymentCount();
assertFalse(sc.isModifiable());
sc.decrementWSDeploymentCount();
assertTrue(sc.isModifiable());
sc.incrementWSDeploymentCount();
sc.incrementWSDeploymentCount();
assertFalse(sc.isModifiable());
sc.create();
assertTrue(sc.isModifiable());
}
@Test
public void testSingleAttributeUpdate() throws Exception {
internalTestSingleAttributeUpdate(new Callback() {
@Override
public void setAttribute(ServerConfig sc) throws Exception {
sc.setModifySOAPAddress(true);
}
});
internalTestSingleAttributeUpdate(new Callback() {
@Override
public void setAttribute(ServerConfig sc) throws Exception {
sc.setWebServiceHost("foo");
}
});
internalTestSingleAttributeUpdate(new Callback() {
@Override
public void setAttribute(ServerConfig sc) throws Exception {
sc.setWebServicePort(976);
}
});
internalTestSingleAttributeUpdate(new Callback() {
@Override
public void setAttribute(ServerConfig sc) throws Exception {
sc.setWebServiceSecurePort(5435);
}
});
internalTestSingleAttributeUpdate(new Callback() {
@Override
public void setAttribute(ServerConfig sc) throws Exception {
sc.setWebServicePathRewriteRule("MY/TEST/PATH");
}
});
}
@Test
public void testMultipleAttributesUpdate() throws Exception {
Callback cbA = new Callback() {
@Override
public void setAttribute(ServerConfig sc) throws Exception {
sc.setModifySOAPAddress(true);
}
};
Callback cbB = new Callback() {
@Override
public void setAttribute(ServerConfig sc) throws Exception {
sc.setWebServiceHost("foo");
}
};
Callback cbC = new Callback() {
@Override
public void setAttribute(ServerConfig sc) throws Exception {
sc.setWebServicePort(976);
}
};
Callback cbD = new Callback() {
@Override
public void setAttribute(ServerConfig sc) throws Exception {
sc.setWebServiceSecurePort(5435);
}
};
Callback cbE = new Callback() {
@Override
public void setAttribute(ServerConfig sc) throws Exception {
sc.setWebServicePathRewriteRule("MY/TEST/PATH");
}
};
internalTestMultipleAttributeUpdate(cbA, new Callback[]{cbB, cbC, cbD, cbE});
internalTestMultipleAttributeUpdate(cbB, new Callback[]{cbA, cbC, cbD, cbE});
internalTestMultipleAttributeUpdate(cbC, new Callback[]{cbA, cbB, cbD, cbE});
internalTestMultipleAttributeUpdate(cbD, new Callback[]{cbA, cbB, cbC, cbE});
internalTestMultipleAttributeUpdate(cbE, new Callback[]{cbA, cbB, cbC, cbD});
}
protected void internalTestSingleAttributeUpdate(Callback cb) throws Exception {
ServerConfigImpl sc = newServerConfigImpl();
sc.create();
assertTrue(sc.isModifiable());
cb.setAttribute(sc);
sc.incrementWSDeploymentCount();
assertFalse(sc.isModifiable());
try {
cb.setAttribute(sc);
fail();
} catch (DisabledOperationException e) {
//check the error message says the operation can't be done because there's an active deployment
assertTrue("Expected WFLYWS0064 message, but got " + e.getMessage(), e.getMessage().contains("WFLYWS0064"));
}
sc.decrementWSDeploymentCount();
assertTrue(sc.isModifiable());
try {
cb.setAttribute(sc);
fail();
} catch (DisabledOperationException e) {
//check the error message says the operation can't be done because of pending former model update(s) requiring reload
assertTrue("Expected WFLYWS0063 message, but got " + e.getMessage(), e.getMessage().contains("WFLYWS0063"));
}
sc.create();
assertTrue(sc.isModifiable());
cb.setAttribute(sc);
}
protected void internalTestMultipleAttributeUpdate(Callback cb1, Callback[] otherCbs) throws Exception {
ServerConfigImpl sc = newServerConfigImpl();
sc.create();
assertTrue(sc.isModifiable());
cb1.setAttribute(sc);
sc.incrementWSDeploymentCount();
assertFalse(sc.isModifiable());
try {
cb1.setAttribute(sc);
fail();
} catch (DisabledOperationException e) {
//check the error message says the operation can't be done because there's an active deployment
assertTrue("Expected WFLYWS0064 message, but got " + e.getMessage(), e.getMessage().contains("WFLYWS0064"));
}
sc.decrementWSDeploymentCount();
assertTrue(sc.isModifiable());
try {
cb1.setAttribute(sc);
fail();
} catch (DisabledOperationException e) {
//check the error message says the operation can't be done because of pending former model update(s) requiring reload
assertTrue("Expected WFLYWS0063 message, but got " + e.getMessage(), e.getMessage().contains("WFLYWS0063"));
}
//other attributes are still modified properly as they're still in synch
for (Callback cb : otherCbs) {
cb.setAttribute(sc);
}
}
private static ServerConfigImpl newServerConfigImpl() {
ServerConfigImpl sc = ServerConfigImpl.newInstance();
sc.getMBeanServerInjector().setValue(new ImmediateValue<MBeanServer>(null));
return sc;
}
@BeforeClass
public static void setStackConfigFactory() throws Exception {
URL url = ServerConfigImplTestCase.class.getResource("util/");
origTCCL = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(new URLClassLoader(new URL[]{url}));
}
@AfterClass
public static void restoreStackConfigFactory() {
Thread.currentThread().setContextClassLoader(origTCCL);
origTCCL = null;
}
public interface Callback {
void setAttribute(ServerConfig sc) throws Exception;
}
public static class TestStackConfigFactory extends StackConfigFactory {
@Override
public StackConfig getStackConfig() {
return new TestStackConfig();
}
}
public static class TestStackConfig implements StackConfig {
@Override
public String getImplementationTitle() {
return null;
}
@Override
public String getImplementationVersion() {
return null;
}
public void validatePathRewriteRule(String rule) {
//NOOP
}
}
}