You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
jitsi/test/net/java/sip/communicator/slick/configuration/TestConfigurationService.java

687 lines
25 KiB

/*
* SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package net.java.sip.communicator.slick.configuration;
import java.util.*;
import org.osgi.framework.*;
import junit.framework.*;
import net.java.sip.communicator.service.configuration.*;
import net.java.sip.communicator.service.configuration.event.*;
import net.java.sip.communicator.util.*;
/**
* Tests basic ConfiguratioService behaviour.
*
* @author Emil Ivov
*/
public class TestConfigurationService extends TestCase
{
/**
* The ConfigurationService that we will be testing.
*/
private ConfigurationService configurationService = null;
/**
* The PropertyChangeEvent that our test listeners will capture for testing.
* Make sure we null that upon tear down
*/
private PropertyChangeEvent propertyChangeEvent = null;
/**
* The name of a property that we will be using for testing.
*/
private String propertyName = new String("my.test.property");
/**
* The name of a property that we will be using for testing custom event
* notification.
*/
private String listenedPropertyName = new String("a.property.i.listen.to");
/**
* The value of the property with name propertyName.
*/
private Integer propertyValue = new Integer(19200);
/**
* A new value for the property with name propertyName
*/
private Integer propertyNewValue = new Integer(19201);
/**
* A PropertyChange listener impl that registers the last received event.
*/
private PropertyChangeListener pListener = new PropertyChangeListener()
{
public void propertyChange(PropertyChangeEvent event)
{
propertyChangeEvent = event;
}
};
/**
* A straightforward Vetoable change listener that throws an exception
* upon any change
*/
VetoableChangeListener rudeVetoListener = new VetoableChangeListener()
{
public void vetoableChange(PropertyChangeEvent event) throws
PropertyVetoException
{
throw new PropertyVetoException("Just for the fun of it", event);
}
};
/**
* A straightforward implementation of a vetoable change listener that that
* does not throw a veto exception and only stored the last received event.
*/
VetoableChangeListener gentleVetoListener = new VetoableChangeListener()
{
public void vetoableChange(PropertyChangeEvent event) throws
PropertyVetoException
{
propertyChangeEvent = event;
}
};
/**
* Generic JUnit Constructor.
* @param name the name of the test
*/
public TestConfigurationService(String name)
{
super(name);
BundleContext context = ConfigurationServiceLick.bc;
ServiceReference ref = context.getServiceReference(
ConfigurationService.class.getName());
configurationService = (ConfigurationService)context.getService(ref);
}
/**
* Generic JUnit setUp method.
* @throws Exception if anything goes wrong.
*/
protected void setUp() throws Exception
{
configurationService.setProperty(propertyName, null);
configurationService.setProperty(listenedPropertyName, null);
super.setUp();
}
/**
* Generic JUnit tearDown method.
* @throws Exception if anything goes wrong.
*/
protected void tearDown() throws Exception
{
//first remove any remaining listeners
configurationService.removePropertyChangeListener(pListener);
configurationService.removeVetoableChangeListener(rudeVetoListener);
configurationService.removeVetoableChangeListener(gentleVetoListener);
//clear used properties.
configurationService.setProperty(propertyName, null);
configurationService.setProperty(listenedPropertyName, null);
propertyChangeEvent = null;
super.tearDown();
}
/**
* Tests whether setting and getting properties works correctly.
* @throws PropertyVetoException in case someone wrongfully vetoes the
* property change.
*/
public void testSetGetProperty() throws PropertyVetoException
{
String propertyName = "my.test.property";
Object property = new String("my.test.property's value");
configurationService.setProperty(propertyName, property);
Object actualReturn = configurationService.getProperty(propertyName);
assertEquals("a property was not properly stored",
property, actualReturn);
}
/**
* Tests whether setting and getting works alright for properties declared
* as system and whether resolving and retrieving from the system property
* set are done right.
* @throws PropertyVetoException in case someone wrongfully vetoes the
* property change.
*/
public void testSystemPoperties() throws PropertyVetoException
{
//first simply store and retrieve a system property
String propertyName = "my.test.system.property";
Object property = new String("sys.value.1");
configurationService.setProperty(propertyName, property, true);
Object actualReturn = configurationService.getProperty(propertyName);
assertEquals("a sys property was not properly stored",
property, actualReturn);
//now check whether you can also retrieve it from the sys property set.
actualReturn = System.getProperty(propertyName);
assertEquals("a property was not properly stored", property, actualReturn);
//verify that modifying it in the sys property set would affect the
//value in the configuration service
property = new String("second.sys.value");
System.setProperty(propertyName, property.toString());
actualReturn = configurationService.getProperty(propertyName);
assertEquals("a property was not properly stored", property, actualReturn);
//now make sure that modifying it in the configurationService would
//result in the corresponding change in the system property set.
property = new String("third.sys.value");
configurationService.setProperty(propertyName, property.toString());
actualReturn = System.getProperty(propertyName);
assertEquals("a property was not properly stored", property, actualReturn);
}
/**
* Tests whether getString properly returns string values and that it
* correctly handles corner cases.
*
* @throws PropertyVetoException if someone vetoes our change (which
* shouldn't happen)
*/
public void testGetString() throws PropertyVetoException
{
//test a basic scenario
String propertyName = "my.test.property";
Object property = new String("my.test.property's value");
configurationService.setProperty(propertyName, property);
String actualReturn = configurationService.getString(propertyName);
assertEquals("getString failed to retrieve a property",
property.toString(), actualReturn);
//verify that setting a non string object would not mess things up
property = new Integer(7121979);
configurationService.setProperty(propertyName, property);
actualReturn = configurationService.getString(propertyName);
assertEquals("getString failed to retrieve a property",
property.toString(), actualReturn);
//verify that setting a whitespace only string would return null
property = new String("\t\n ");
configurationService.setProperty(propertyName, property);
actualReturn = configurationService.getString(propertyName);
assertNull("getString did not trim a white space only string",
actualReturn);
}
/**
* Records a few properties with a similar prefix and verifies that they're
* all returned by the getPropertyNamesByPrefix() method.
*
* @throws PropertyVetoException if someone vetoes our change (which
* shouldn't happen)
*/
public void testGetPropertyNamesByPrefix() throws PropertyVetoException
{
String prefix = "this.is.a.prefix";
String exactPrefixProp1Name = prefix + ".PROP1";
String exactPrefixProp2Name = prefix + ".PROP3";
String longerPrefixProp3Name = prefix + ".which.is.longer.PROP3";
String completeMismatchProp4Name = "and.hereis.one.other.prefix.PROP4";
configurationService.setProperty(exactPrefixProp1Name, new Object());
configurationService.setProperty(exactPrefixProp2Name, new Object());
configurationService.setProperty(longerPrefixProp3Name, new Object());
configurationService.setProperty(completeMismatchProp4Name
, new Object());
//try an exact match first
List propertyNames
= configurationService.getPropertyNamesByPrefix(prefix, true);
assertTrue("Returned list did not contain all property names. "
+ " MissingPropertyName: " + exactPrefixProp1Name
, propertyNames.contains(exactPrefixProp1Name));
assertTrue("Returned list did not contain all property names. "
+ " MissingPropertyName: " + exactPrefixProp2Name
, propertyNames.contains(exactPrefixProp2Name));
assertEquals("Returned list contains more properties than expected. "
+ " List was: " + propertyNames
, 2, propertyNames.size() );
//try a broader search
propertyNames
= configurationService.getPropertyNamesByPrefix(prefix, false);
assertTrue("Returned list did not contain all property names. "
+ " MissingPropertyName: " + exactPrefixProp1Name
, propertyNames.contains(exactPrefixProp1Name));
assertTrue("Returned list did not contain all property names. "
+ " MissingPropertyName: " + exactPrefixProp2Name
, propertyNames.contains(exactPrefixProp2Name));
assertTrue("Returned list did not contain all property names. "
+ " MissingPropertyName: " + longerPrefixProp3Name
, propertyNames.contains(longerPrefixProp3Name));
assertEquals("Returned list contains more properties than expected. "
+ " List was: " + propertyNames
, 3, propertyNames.size());
}
/**
* Tests event notification through multicast listeners (those that are
* registered for the whole configuration and not a single property only).
*/
public void testMulticastEventNotification()
{
propertyChangeEvent = null;
configurationService.addPropertyChangeListener(pListener);
// test the initial set of a property.
try
{
configurationService.setProperty(propertyName, propertyValue);
}
catch (PropertyVetoException ex)
{
fail("A PropertyVetoException came from nowhere. Exc="
+ ex.getMessage());
}
assertNotNull( "No PropertyChangeEvent was delivered upon setProperty",
propertyChangeEvent);
assertNull("oldValue must be null", propertyChangeEvent.getOldValue());
assertEquals( "newValue is not the value we just set!",
propertyValue,
propertyChangeEvent.getNewValue()
);
assertEquals( "propertyName is not the value we just set!",
propertyName,
propertyChangeEvent.getPropertyName()
);
//test setting a new value;
propertyChangeEvent = null;
try
{
configurationService.setProperty(propertyName, propertyNewValue);
}
catch (PropertyVetoException ex)
{
fail("A PropertyVetoException came from nowhere. Exc="
+ ex.getMessage());
}
assertNotNull( "No PropertyChangeEvent was delivered upon setProperty",
propertyChangeEvent);
assertEquals("incorrect oldValue",
propertyValue,
propertyChangeEvent.getOldValue());
assertEquals( "newValue is not the value we just set!",
propertyNewValue,
propertyChangeEvent.getNewValue());
//test remove
propertyChangeEvent = null;
configurationService.removePropertyChangeListener(pListener);
try
{
configurationService.setProperty(propertyName, propertyValue);
}
catch (PropertyVetoException ex)
{
fail("A PropertyVetoException came from nowhere. Exc="
+ ex.getMessage());
}
assertNull( "A PropertyChangeEvent after unregistering a listener.",
propertyChangeEvent);
}
/**
* Test event dispatch to vetoable listeners registered for the whole
* configuration.
*/
public void testMulticastEventNotificationToVetoableListeners()
{
Integer propertyValue = new Integer(19200);
Integer propertyNewValue = new Integer(19201);
propertyChangeEvent = null;
configurationService.addVetoableChangeListener(gentleVetoListener);
// test the initial set of a property.
try
{
configurationService.setProperty(propertyName, propertyValue);
}
catch (PropertyVetoException ex)
{
fail("A PropertyVetoException came from nowhere. Exc="
+ ex.getMessage());
}
assertNotNull( "No PropertyChangeEvent was delivered "
+"to VetoableListeners upon setProperty",
propertyChangeEvent);
assertNull("oldValue must be null", propertyChangeEvent.getOldValue());
assertEquals( "newValue is not the value we just set!",
propertyValue,
propertyChangeEvent.getNewValue());
assertEquals( "propertyName is not the value we just set!",
propertyName,
propertyChangeEvent.getPropertyName());
//test setting a new value;
propertyChangeEvent = null;
try
{
configurationService.setProperty(propertyName, propertyNewValue);
}
catch (PropertyVetoException ex)
{
fail("A PropertyVetoException came from nowhere. Exc="
+ ex.getMessage());
}
assertNotNull( "No PropertyChangeEvent was delivered to veto listener "
+"upon setProperty",
propertyChangeEvent);
assertEquals("incorrect oldValue",
propertyValue,
propertyChangeEvent.getOldValue());
assertEquals( "newValue is not the value we just set!",
propertyNewValue,
propertyChangeEvent.getNewValue());
//test remove
propertyChangeEvent = null;
configurationService.removeVetoableChangeListener(gentleVetoListener);
try
{
configurationService.setProperty(propertyName, propertyValue);
}
catch (PropertyVetoException ex)
{
fail("A PropertyVetoException came from nowhere. Exc="
+ ex.getMessage());
}
assertNull( "A PropertyChangeEvent after unregistering a listener.",
propertyChangeEvent);
}
/**
* Test whether vetoing changes works as it is supposed to.
*/
public void testVetos()
{
propertyChangeEvent = null;
configurationService.addVetoableChangeListener(rudeVetoListener);
configurationService.addPropertyChangeListener(pListener);
PropertyVetoException exception = null;
try
{
configurationService.setProperty(propertyName, propertyValue);
}
catch (PropertyVetoException ex)
{
exception = ex;
}
//make sure the exception was thrown
assertNotNull("A vetoable change event was not dispatched or an "
+"exception was not let through.",
exception);
//make sure no further event dispatching was done
assertNull("A property change event was delivered even after "+
"the property change was vetoed.",
propertyChangeEvent);
//make sure the property did not get modified after vetoing the change
assertNull( "A property was changed even avfter vetoing the change."
,configurationService.getProperty(propertyName));
// now let's make sure that we have the right order of event dispatching.
propertyChangeEvent = null;
configurationService.removeVetoableChangeListener(rudeVetoListener);
VetoableChangeListener vcListener = new VetoableChangeListener(){
public void vetoableChange(PropertyChangeEvent event)
{
assertNull("propertyChangeEvent was not null which means that it has "
+"bean delivered to the propertyChangeListener prior to "
+"being delivered to the vetoable change listener.",
propertyChangeEvent);
}
};
try
{
configurationService.setProperty(propertyName, propertyNewValue);
}
catch (PropertyVetoException ex1)
{
ex1.printStackTrace();
fail("unexpected veto exception. message:" + ex1.getMessage());
}
configurationService.removeVetoableChangeListener(vcListener);
}
/**
* Make sure that adding listeners for a single property name
* only gets us events for that listeners. Removing a listener for a
* specific property should also be proved to no obstruct event delivery to
* the same listener had it been registered for other properties.
*
* @throws PropertyVetoException if someone vetoes our change (which
* shouldn't happen)
*/
public void testSinglePropertyEventNotification()
throws PropertyVetoException
{
Double listenedPropertyValue = new Double(19.2598);
Double listenedPropertyNewValue = new Double(19.29581);
//test basic selective event dispatch
configurationService.addPropertyChangeListener(
listenedPropertyName, pListener);
propertyChangeEvent = null;
configurationService.setProperty(
propertyName, propertyValue);
assertNull("setting prop:"+propertyName + " caused an event notif. to "+
"listener registered for prop:" + listenedPropertyName,
propertyChangeEvent);
configurationService.setProperty(
listenedPropertyName, listenedPropertyValue);
assertNotNull("No event was dispatched upon modification of prop:"
+listenedPropertyName,
propertyChangeEvent );
assertNull("oldValue must be null", propertyChangeEvent.getOldValue());
assertEquals("wrong newValue",
listenedPropertyValue,
propertyChangeEvent.getNewValue());
//test that a generic remove only removes the generic listener
propertyChangeEvent = null;
configurationService.removePropertyChangeListener(pListener);
configurationService.setProperty(
listenedPropertyName, listenedPropertyNewValue);
assertNotNull("No event was dispatched upon modification of prop:"
+listenedPropertyName
+ ". The listener was wrongfully removed.",
propertyChangeEvent );
assertEquals("wrong oldValue",
listenedPropertyValue,
propertyChangeEvent.getOldValue());
assertEquals("wrong newValue",
listenedPropertyNewValue,
propertyChangeEvent.getNewValue());
//make sure that removing the listener properly - really removes it.
propertyChangeEvent = null;
configurationService.removePropertyChangeListener(
listenedPropertyName, pListener);
configurationService.setProperty(listenedPropertyName, propertyValue);
assertNull(
"An event was wrongfully dispatched after removing a listener",
propertyChangeEvent
);
}
/**
* Make sure that adding vetoable listeners for a single property name
* only gets us events for that listeners. Removing a listener for a
* specific property should also be proved to no obstruct event delivery to
* the same listener had it been registered for other properties.
*
* @throws PropertyVetoException if someone vetoes our change (which
* shouldn't happen)
*/
public void testSinglePropertyVetoEventNotification()
throws PropertyVetoException
{
Double listenedPropertyValue = new Double(19.2598);
Double listenedPropertyNewValue = new Double(19.29581);
VetoableChangeListener vetoListener = new VetoableChangeListener()
{
public void vetoableChange(PropertyChangeEvent event)
{
propertyChangeEvent = event;
}
};
//test basic selective event dispatch
configurationService.addVetoableChangeListener(
listenedPropertyName, vetoListener);
propertyChangeEvent = null;
configurationService.setProperty(
propertyName, propertyValue);
assertNull("setting prop:" + propertyName + " caused an event notif. to " +
"listener registered for prop:" + listenedPropertyName,
propertyChangeEvent);
configurationService.setProperty(
listenedPropertyName, listenedPropertyValue);
assertNotNull("No event was dispatched upon modification of prop:"
+ listenedPropertyName,
propertyChangeEvent);
assertNull("oldValue must be null", propertyChangeEvent.getOldValue());
assertEquals("wrong newValue",
listenedPropertyValue,
propertyChangeEvent.getNewValue());
//test that a generic remove only removes the generic listener
propertyChangeEvent = null;
configurationService.removeVetoableChangeListener(vetoListener);
configurationService.setProperty(
listenedPropertyName, listenedPropertyNewValue);
assertNotNull("No event was dispatched upon modification of prop:"
+ listenedPropertyName
+ ". The listener was wrongfully removed.",
propertyChangeEvent);
assertEquals("wrong oldValue",
listenedPropertyValue,
propertyChangeEvent.getOldValue());
assertEquals("wrong newValue",
listenedPropertyNewValue,
propertyChangeEvent.getNewValue());
//make sure that removing the listener properly - really removes it.
propertyChangeEvent = null;
configurationService.removeVetoableChangeListener(
listenedPropertyName, vetoListener);
configurationService.setProperty(
listenedPropertyName, listenedPropertyValue);
assertNull(
"An event was wrongfully dispatched after removing a listener",
propertyChangeEvent
);
//make sure that adding a generic listener, then adding a custom prop
//listener, then removing it - would not remove the generic listener.
propertyChangeEvent = null;
configurationService.addVetoableChangeListener(vetoListener);
configurationService.addVetoableChangeListener(
listenedPropertyName, vetoListener);
configurationService.removeVetoableChangeListener(
listenedPropertyName, vetoListener);
configurationService.setProperty(
listenedPropertyName, listenedPropertyNewValue);
assertNotNull("No event was dispatched upon modification of prop:"
+ listenedPropertyName
+ ". The global listener was wrongfully removed.",
propertyChangeEvent);
assertEquals("wrong propertyName",
listenedPropertyName,
propertyChangeEvent.getPropertyName());
assertEquals("wrong oldValue",
listenedPropertyValue,
propertyChangeEvent.getOldValue());
assertEquals("wrong newValue",
listenedPropertyNewValue,
propertyChangeEvent.getNewValue());
//fail("Testing failures! "
//+"Wanted to know whether cruisecontrol will notice the falure. emil.");
}
}