/*
* JBoss, a division of Red Hat
* Copyright 2011, Red Hat Middleware, LLC, and individual
* contributors as indicated by the @authors tag. See the
* copyright.txt 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.gatein.wsrp.producer.config;
import junit.framework.TestCase;
import org.gatein.registration.RegistrationPolicy;
import org.gatein.registration.policies.DefaultRegistrationPolicy;
import org.gatein.registration.policies.DefaultRegistrationPropertyValidator;
import org.gatein.registration.policies.RegistrationPolicyWrapper;
import org.gatein.registration.policies.RegistrationPropertyValidator;
import org.gatein.wsrp.WSRPConstants;
import org.gatein.wsrp.api.plugins.PluginsAccess;
import org.gatein.wsrp.producer.config.impl.AbstractProducerConfigurationService;
import org.gatein.wsrp.registration.LocalizedString;
import org.gatein.wsrp.registration.RegistrationPropertyDescription;
import javax.xml.namespace.QName;
import java.net.URL;
import java.util.Locale;
import java.util.Map;
/**
* @author <a href="mailto:chris.laprun@jboss.com">Chris Laprun</a>
* @version $Revision: 10408 $
* @since 2.6
*/
public abstract class ProducerConfigurationTestCase extends TestCase
{
protected AbstractProducerConfigurationService service;
static
{
if (PluginsAccess.getPlugins() == null)
{
PluginsAccess.register(new TestPlugins());
}
}
public void testCustomPolicyUnmarshalling() throws Exception
{
ProducerConfiguration producerConfiguration = getProducerConfiguration("custom-policy.xml");
assertTrue(producerConfiguration.isUsingStrictMode());
ProducerRegistrationRequirements requirements = producerConfiguration.getRegistrationRequirements();
assertNotNull(requirements);
RegistrationPolicy policy = requirements.getPolicy();
// check that the policy is properly wrapped
assertTrue(policy.isWrapped());
// policy is wrapped so instanceof won't work!
assertFalse(policy instanceof TestRegistrationPolicy);
// and that the delegate is indeed the expected policy
assertEquals(TestRegistrationPolicy.class, RegistrationPolicyWrapper.unwrap(policy).getClass());
}
public void testExtendedUnmarshalling() throws Exception
{
ProducerConfiguration producerConfiguration = getProducerConfiguration("extended.xml");
assertTrue(producerConfiguration.isUsingStrictMode());
ProducerRegistrationRequirements requirements = producerConfiguration.getRegistrationRequirements();
assertNotNull(requirements);
RegistrationPolicy policy = RegistrationPolicyWrapper.unwrap(requirements.getPolicy());
assertTrue(policy instanceof DefaultRegistrationPolicy);
RegistrationPropertyValidator propertyValidator = ((DefaultRegistrationPolicy)policy).getValidator();
assertNotNull(propertyValidator);
assertTrue(propertyValidator instanceof DefaultRegistrationPropertyValidator);
assertTrue(requirements.isRegistrationRequired());
assertTrue(requirements.isRegistrationRequiredForFullDescription());
Map properties = requirements.getRegistrationProperties();
assertNotNull(properties);
assertEquals(2, properties.size());
checkRegistrationProperty(requirements, 1);
checkRegistrationProperty(requirements, 2);
}
public void testMinimalRegistrationUnmarshalling() throws Exception
{
ProducerConfiguration producerConfiguration = getProducerConfiguration("minimal-registration.xml");
assertTrue(producerConfiguration.isUsingStrictMode());
ProducerRegistrationRequirements requirements = producerConfiguration.getRegistrationRequirements();
assertNotNull(requirements);
assertTrue(requirements.isRegistrationRequired());
assertTrue(!requirements.isRegistrationRequiredForFullDescription());
Map properties = requirements.getRegistrationProperties();
assertNotNull(properties);
assertTrue(properties.isEmpty());
assertNotNull(requirements.getPolicy());
}
public void testMinimalUnmarshalling() throws Exception
{
ProducerConfiguration producerConfiguration = getProducerConfiguration("minimal.xml");
assertTrue(producerConfiguration.isUsingStrictMode());
ProducerRegistrationRequirements requirements = producerConfiguration.getRegistrationRequirements();
assertNotNull(requirements);
assertFalse(requirements.isRegistrationRequired());
assertFalse(requirements.isRegistrationRequiredForFullDescription());
assertTrue(requirements.getRegistrationProperties().isEmpty());
// make sure that we always have a RegistrationPolicy regardless of registration requirements
assertNotNull(requirements.getPolicy());
}
public void testInvalidMultipleRegistrationConfiguration() throws Exception
{
try
{
getProducerConfiguration("invalid2.xml");
fail("Only one registration-configuration element allowed!");
}
catch (Exception expected)
{
}
}
public void testInvalidTypeValue() throws Exception
{
try
{
getProducerConfiguration("invalid-type.xml");
fail("Invalid type for property description should fail.");
}
catch (Exception expected)
{
}
}
public void testInvalidPropertyValidator()
{
try
{
getProducerConfiguration("invalid3.xml");
fail("Doesn't make sense to define a property validator if a registration policy other than DefaultRegistrationPolicy");
}
catch (Exception expected)
{
}
}
public void testInvalidFullServiceDescriptionValue()
{
try
{
getProducerConfiguration("invalid1.xml");
fail("Invalid value for fullServiceDescriptionRequiresRegistration should have caused failure");
}
catch (Exception expected)
{
}
}
public void testUseStrictMode() throws Exception
{
ProducerConfiguration producerConfiguration = getProducerConfiguration("strict-mode.xml");
assertFalse(producerConfiguration.isUsingStrictMode());
}
public void testChangeListeners() throws Exception
{
ProducerConfiguration producerConfiguration = getProducerConfiguration("minimal.xml");
assertTrue(producerConfiguration.isUsingStrictMode());
TestProducerConfigurationChangeListener listener = new TestProducerConfigurationChangeListener();
producerConfiguration.addChangeListener(listener);
assertFalse(listener.called);
// we're not changing the value, the listeners shouldn't be called
producerConfiguration.setUsingStrictMode(true);
assertFalse(listener.called);
producerConfiguration.setUsingStrictMode(false);
assertFalse(producerConfiguration.isUsingStrictMode());
assertTrue(listener.called);
}
public void testSaveAndReload() throws Exception
{
ProducerConfiguration configuration = getProducerConfiguration((URL)null);
configuration.setUsingStrictMode(false);
ProducerRegistrationRequirements registrationRequirements = configuration.getRegistrationRequirements();
registrationRequirements.setRegistrationRequiredForFullDescription(true);
registrationRequirements.setRegistrationRequired(true);
String prop1 = "prop1";
registrationRequirements.addEmptyRegistrationProperty(prop1);
registrationRequirements.getRegistrationPropertyWith(prop1).setDefaultLabel("label1");
String prop2 = "prop2";
registrationRequirements.addEmptyRegistrationProperty(prop2);
registrationRequirements.getRegistrationPropertyWith(prop2).setDefaultHint("hint2");
String prop3 = "prop3";
registrationRequirements.addEmptyRegistrationProperty(prop3);
registrationRequirements.getRegistrationPropertyWith(prop3).setDefaultDescription("description3");
String prop4 = "prop4";
registrationRequirements.addEmptyRegistrationProperty(prop4);
RegistrationPropertyDescription propDesc4 = registrationRequirements.getRegistrationPropertyWith(prop4);
propDesc4.setDefaultLabel("label4");
propDesc4.setDefaultHint("hint4");
propDesc4.setDefaultDescription("description4");
service.saveConfiguration();
configuration = getProducerConfiguration(getConfigurationURL());
assertFalse(configuration.isUsingStrictMode());
registrationRequirements = configuration.getRegistrationRequirements();
assertTrue(registrationRequirements.isRegistrationRequired());
assertTrue(registrationRequirements.isRegistrationRequiredForFullDescription());
assertEquals(4, registrationRequirements.getRegistrationProperties().size());
assertEquals("label1", registrationRequirements.getRegistrationPropertyWith(prop1).getLabel().getValue());
assertEquals("hint2", registrationRequirements.getRegistrationPropertyWith(prop2).getHint().getValue());
assertEquals("description3", registrationRequirements.getRegistrationPropertyWith(prop3).getDescription().getValue());
propDesc4 = registrationRequirements.getRegistrationPropertyWith(prop4);
assertEquals("label4", propDesc4.getLabel().getValue());
assertEquals("hint4", propDesc4.getHint().getValue());
assertEquals("description4", propDesc4.getDescription().getValue());
}
public void testCheckThatSavingWithModificationsProperlyChangesLastModified() throws Exception
{
ProducerConfiguration configuration = getProducerConfiguration((URL)null);
configuration.setUsingStrictMode(false);
ProducerRegistrationRequirements registrationRequirements = configuration.getRegistrationRequirements();
registrationRequirements.setRegistrationRequiredForFullDescription(true);
registrationRequirements.setRegistrationRequired(true);
String prop1 = "prop1";
registrationRequirements.addEmptyRegistrationProperty(prop1);
registrationRequirements.getRegistrationPropertyWith(prop1).setDefaultLabel("label1");
long initial = configuration.getLastModified();
service.saveConfiguration();
assertEquals(initial, configuration.getLastModified());
assertEquals(initial, service.getPersistedLastModifiedForConfiguration());
// modify strict mode, save and check last modified
configuration.setUsingStrictMode(true);
service.saveConfiguration();
long lastModified = configuration.getLastModified();
assertTrue(initial < lastModified);
assertEquals(lastModified, service.getPersistedLastModifiedForConfiguration());
initial = lastModified;
// modify registration properties, save and check last modified
registrationRequirements.getRegistrationPropertyWith(prop1).setDefaultLabel("new label");
service.saveConfiguration();
lastModified = configuration.getLastModified();
assertTrue(initial < lastModified);
assertEquals(lastModified, service.getPersistedLastModifiedForConfiguration());
initial = lastModified;
// reload policy and check last modified
registrationRequirements.reloadPolicyFrom(TestRegistrationPolicy.class.getName(), null);
service.saveConfiguration();
lastModified = configuration.getLastModified();
assertTrue(initial < lastModified);
assertEquals(lastModified, service.getPersistedLastModifiedForConfiguration());
}
protected abstract URL getConfigurationURL();
protected ProducerConfiguration getProducerConfiguration(String fileName) throws Exception
{
URL location = Thread.currentThread().getContextClassLoader().getResource(fileName);
assertNotNull(location);
System.out.println("Loading producer configuration = " + location);
return getProducerConfiguration(location);
}
protected abstract ProducerConfiguration getProducerConfiguration(URL location) throws Exception;
private void checkRegistrationProperty(ProducerRegistrationRequirements requirements, int index)
{
RegistrationPropertyDescription desc = requirements.getRegistrationPropertyWith("name" + index);
assertNotNull(desc);
assertEquals(new QName("name" + index), desc.getName());
assertEquals(WSRPConstants.XSD_STRING, desc.getType());
LocalizedString localizedString = new LocalizedString("hint" + index, Locale.ENGLISH);
localizedString.setResourceName("resource.hint" + index);
localizedString.setValue("hint" + index);
assertEquals(localizedString, desc.getHint());
localizedString = new LocalizedString("label" + index, Locale.ENGLISH);
localizedString.setResourceName("resource.label" + index);
localizedString.setValue("label" + index);
assertEquals(localizedString, desc.getLabel());
}
private static class TestProducerConfigurationChangeListener implements ProducerConfigurationChangeListener
{
boolean called = false;
public void usingStrictModeChangedTo(boolean strictMode)
{
called = true;
}
}
}