mirror of https://github.com/sipwise/jitsi.git
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.
357 lines
14 KiB
357 lines
14 KiB
/*
|
|
* Jitsi, 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.io.*;
|
|
|
|
import javax.xml.parsers.*;
|
|
|
|
import junit.framework.*;
|
|
|
|
import org.jitsi.service.configuration.*;
|
|
import org.jitsi.util.xml.*;
|
|
import org.osgi.framework.*;
|
|
import org.w3c.dom.*;
|
|
|
|
/**
|
|
* Tests ConfiguratioService persistency, which means that it makes the
|
|
* ConfigurationService store and load its properties from a file and checks
|
|
* whether everything is going well.
|
|
*
|
|
* @author Emil Ivov
|
|
*/
|
|
public class TestConfigurationServicePersistency extends TestCase
|
|
{
|
|
//property1 values
|
|
private static final String property1 = "p1";
|
|
private static final String property1Value = "p1.value";
|
|
private static final String property1Value2 = "p1.value.2";
|
|
private static final String property1Path = "parent.";
|
|
|
|
//property2 values
|
|
private static final String systemProperty = "SYSTEM_PROPERTY";
|
|
private static final String systemPropertyValue = "I AM the SyS guy";
|
|
private static final String systemPropertyValue2 = "sys guy's new face";
|
|
private static final String systemPropertyPath = "parent.";
|
|
|
|
//added_property values
|
|
private static final String addedProperty = "ADDED_PROPERTY";
|
|
private static final String addedPropertyValue = "added";
|
|
private static final String addedPropertyValue2 = "and then re-aded";
|
|
|
|
private static final String addedPropertyPath = "parent.";
|
|
|
|
//INNER_PROPERTY values
|
|
private static final String innerProperty = "INNER_PROPERTY";
|
|
private static final String innerPropertyValue = "I am an insider";
|
|
private static final String innerPropertyValue2 = "I am a modified inner";
|
|
private static final String innerPropertyPath = "parent.innerprops.";
|
|
|
|
/** the contents of our properties file.*/
|
|
private static final String confFileContent =
|
|
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
|
|
"<sip-communicator>\n" +
|
|
" <parent>" +"\n"+
|
|
" <"+property1+" value=\""+property1Value+"\"/>" +"\n"+
|
|
" <"+systemProperty
|
|
+" value=\""+systemPropertyValue+"\" system=\"true\"/>" +"\n"+
|
|
" <innerprops>" +"\n"+
|
|
" <"+innerProperty+" value=\""+innerPropertyValue+"\"/>" +"\n"+
|
|
" </innerprops>" +"\n"+
|
|
" </parent>" +"\n"+
|
|
"</sip-communicator>\n";
|
|
|
|
/** the contents of our second properties file that we use to test reload.*/
|
|
private static final String confFileContent2 =
|
|
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
|
|
"<sip-communicator>\n" +
|
|
" <parent>" +"\n"+
|
|
" <"+property1+" value=\""+property1Value2+"\"/>" +"\n"+
|
|
" <"+systemProperty
|
|
+" value=\""+systemPropertyValue2+"\" system=\"true\"/>" +"\n"+
|
|
" <innerprops>" +"\n"+
|
|
" <"+innerProperty+" value=\""+innerPropertyValue2+"\"/>" +"\n"+
|
|
" </innerprops>" +"\n"+
|
|
" </parent>" +"\n"+
|
|
"</sip-communicator>\n";
|
|
|
|
private static final String ourConfFileName
|
|
= "test.persistency.sip-communicator.xml";
|
|
|
|
private String originalConfFileName = null;
|
|
|
|
/** the configuration file itself (created and deleted for every test)*/
|
|
private File confFile = null;
|
|
|
|
/**
|
|
* The ConfigurationService that we will be testing.
|
|
*/
|
|
private ConfigurationService configurationService = null;
|
|
|
|
/**
|
|
* Generic JUnit Constructor.
|
|
* @param name the name of the test
|
|
*/
|
|
public TestConfigurationServicePersistency(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.
|
|
*/
|
|
@Override
|
|
protected void setUp() throws Exception
|
|
{
|
|
String confDirLocation
|
|
= System.getProperty(
|
|
ConfigurationService.PNAME_SC_HOME_DIR_LOCATION,
|
|
System.getProperty("user.home"));
|
|
String confDirName
|
|
= System.getProperty(
|
|
ConfigurationService.PNAME_SC_HOME_DIR_NAME,
|
|
".sip-communicator");
|
|
|
|
confFile
|
|
= new File(
|
|
confDirLocation + File.separator + confDirName,
|
|
ourConfFileName);
|
|
|
|
configurationService.purgeStoredConfiguration();
|
|
originalConfFileName
|
|
= System.getProperty(
|
|
ConfigurationService.PNAME_CONFIGURATION_FILE_NAME);
|
|
System.setProperty(
|
|
ConfigurationService.PNAME_CONFIGURATION_FILE_NAME,
|
|
ourConfFileName);
|
|
|
|
/*
|
|
* We're going to (attempt to) create a new file so (try to) make sure
|
|
* the parent directory exists.
|
|
*/
|
|
confFile.getParentFile().mkdir();
|
|
confFile.createNewFile();
|
|
|
|
FileOutputStream out = new FileOutputStream(confFile);
|
|
out.write(confFileContent.getBytes());
|
|
out.flush();
|
|
out.close();
|
|
|
|
configurationService.reloadConfiguration();
|
|
|
|
super.setUp();
|
|
}
|
|
|
|
/**
|
|
* Generic JUnit tearDown method.
|
|
* @throws Exception if anything goes wrong.
|
|
*/
|
|
@Override
|
|
protected void tearDown() throws Exception
|
|
{
|
|
//delete the temp conf file
|
|
confFile.delete();
|
|
|
|
configurationService.purgeStoredConfiguration();
|
|
|
|
//reset the fileNameProperty
|
|
System.setProperty("net.java.sip.communicator.CONFIGURATION_FILE_NAME",
|
|
originalConfFileName);
|
|
|
|
super.tearDown();
|
|
}
|
|
|
|
/**
|
|
* Tests whether the load method has properly loaded our conf file during
|
|
* setup.
|
|
*/
|
|
public void testLoadConfiguration()
|
|
{
|
|
Object returnedValueObj =
|
|
configurationService.getProperty(property1Path
|
|
+ property1);
|
|
assertNotNull("configuration not properly loaded", returnedValueObj);
|
|
assertTrue("returned prop is not a String",
|
|
returnedValueObj instanceof String);
|
|
String returnedValue = returnedValueObj.toString();
|
|
|
|
assertEquals("configuration not properly loaded",
|
|
property1Value, returnedValue);
|
|
|
|
|
|
returnedValueObj =
|
|
configurationService.getProperty(systemPropertyPath
|
|
+ systemProperty);
|
|
assertNotNull("configuration not properly loaded", returnedValueObj);
|
|
assertTrue("returned prop is not a String",
|
|
returnedValueObj instanceof String);
|
|
|
|
//check whether this property was resolved in System.properties
|
|
returnedValue = System.getProperty(systemPropertyPath + systemProperty);
|
|
assertNotNull("A system property was not resolved", returnedValue);
|
|
assertEquals("A system property was not resolved",
|
|
systemPropertyValue, returnedValue);
|
|
|
|
returnedValue = returnedValueObj.toString();
|
|
assertEquals("configuration not properly loaded",
|
|
systemPropertyValue, returnedValue);
|
|
|
|
//check whether inner properties are properly loaded
|
|
returnedValueObj =
|
|
configurationService.getProperty(innerPropertyPath
|
|
+ innerProperty).toString();
|
|
assertNotNull("configuration not properly loaded", returnedValueObj);
|
|
assertTrue("returned prop is not a String",
|
|
returnedValueObj instanceof String);
|
|
returnedValue = returnedValueObj.toString();
|
|
assertEquals("configuration not properly loaded",
|
|
innerPropertyValue, returnedValue);
|
|
}
|
|
|
|
/**
|
|
* Tests whether a configuration is properly reloaded (i.e. values of
|
|
* the properties are updated to match those present in the file, and
|
|
* any additional properties added since the previous load are clreared).
|
|
*
|
|
* @throws java.lang.Exception if an error occurs during testing.
|
|
*/
|
|
public void testReLoadConfiguration() throws Exception
|
|
{
|
|
//set a new property so that we could see whether its deleted after
|
|
//the file contents is reloaded.
|
|
configurationService.setProperty(addedPropertyPath + addedProperty,
|
|
addedPropertyValue);
|
|
|
|
//write the new file
|
|
FileOutputStream out = new FileOutputStream(confFile);
|
|
out.write(confFileContent2.getBytes());
|
|
out.flush();
|
|
out.close();
|
|
|
|
configurationService.reloadConfiguration();
|
|
|
|
//check whether normal properties are properly reloaded
|
|
Object returnedValueObj =
|
|
configurationService.getProperty(property1Path
|
|
+ property1);
|
|
assertNotNull("configuration not properly loaded", returnedValueObj);
|
|
assertTrue("returned prop is not a String",
|
|
returnedValueObj instanceof String);
|
|
String returnedValue = returnedValueObj.toString();
|
|
|
|
assertEquals("configuration not properly reloaded",
|
|
property1Value2, returnedValue);
|
|
|
|
//check whether systemproperties are properly reresolved
|
|
returnedValueObj =
|
|
configurationService.getProperty(systemPropertyPath
|
|
+ systemProperty);
|
|
assertNotNull("configuration not properly reloaded", returnedValueObj);
|
|
assertTrue("returned prop is not a String",
|
|
returnedValueObj instanceof String);
|
|
returnedValue = returnedValueObj.toString();
|
|
assertEquals("configuration not properly reloaded",
|
|
systemPropertyValue2, returnedValue);
|
|
|
|
//make sure that the property was re-resolved in System.properties
|
|
returnedValue = System.getProperty(systemPropertyPath + systemProperty);
|
|
assertNotNull("A system property was not resolved", returnedValue);
|
|
assertEquals("A system property was not resolved",
|
|
systemPropertyValue2, returnedValue);
|
|
|
|
//verify that the inner property is also reloaded
|
|
returnedValueObj =
|
|
configurationService.getProperty(innerPropertyPath
|
|
+ innerProperty);
|
|
assertNotNull("configuration not properly reloaded", returnedValueObj);
|
|
assertTrue("returned prop is not a String",
|
|
returnedValueObj instanceof String);
|
|
returnedValue = returnedValueObj.toString();
|
|
assertEquals("configuration not properly reloaded",
|
|
innerPropertyValue2, returnedValue);
|
|
|
|
//make sure the property we added in the beginning is not there anymore.
|
|
returnedValueObj =
|
|
configurationService.getProperty(addedPropertyPath
|
|
+ addedProperty);
|
|
assertNull("reload didn't remove newly added properties",
|
|
returnedValueObj);
|
|
}
|
|
|
|
/**
|
|
* Test whether a configuration is properly stored in the configuration
|
|
* file.
|
|
*
|
|
* @throws java.lang.Exception if an error occurs during testing.
|
|
*/
|
|
public void testStoreConfiguration() throws Exception
|
|
{
|
|
//add a new property that will have to be added to the xml conf file.
|
|
configurationService.setProperty(addedPropertyPath + addedProperty,
|
|
addedPropertyValue2);
|
|
|
|
//then give new values to existing properties
|
|
configurationService.setProperty(property1Path + property1,
|
|
property1Value2);
|
|
configurationService.setProperty(systemPropertyPath + systemProperty,
|
|
systemPropertyValue2);
|
|
configurationService.setProperty(innerPropertyPath + innerProperty,
|
|
innerPropertyValue2);
|
|
|
|
configurationService.storeConfiguration();
|
|
|
|
//reload the conf
|
|
configurationService.reloadConfiguration();
|
|
|
|
//Now reload the file and make sure it containts the updated values.
|
|
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
|
DocumentBuilder builder = factory.newDocumentBuilder();
|
|
Document document = builder.parse(confFile);
|
|
|
|
Node root = document.getFirstChild();
|
|
|
|
Node parent = XMLUtils.findChild( (Element) root, "parent");
|
|
|
|
Node property1Node = XMLUtils.findChild( (Element) parent, property1);
|
|
|
|
Node systemPropertyNode =
|
|
XMLUtils.findChild( (Element) parent, systemProperty);
|
|
|
|
Node addedPropertyNode =
|
|
XMLUtils.findChild( (Element) parent, addedProperty);
|
|
|
|
Node innerpropNode =
|
|
XMLUtils.findChild( (Element) parent, "innerprops");
|
|
|
|
Node innerPropertyNode =
|
|
XMLUtils.findChild((Element)innerpropNode, innerProperty);
|
|
|
|
String xmlProp1Value = XMLUtils.getAttribute(property1Node, "value");
|
|
String xmlProp2Value =
|
|
XMLUtils.getAttribute(systemPropertyNode, "value");
|
|
String xmlAddedPropertyValue =
|
|
XMLUtils.getAttribute(addedPropertyNode, "value");
|
|
String xmlInnerPropertyValue =
|
|
XMLUtils.getAttribute(innerPropertyNode, "value");
|
|
|
|
|
|
assertEquals("property1 was incorrectly stored",
|
|
property1Value2, xmlProp1Value);
|
|
assertEquals("System property was incorrectly stored",
|
|
systemPropertyValue2, xmlProp2Value);
|
|
assertEquals("The added property was incorrectly stored",
|
|
addedPropertyValue2, xmlAddedPropertyValue);
|
|
assertEquals("The inner property was incorrectly stored",
|
|
innerPropertyValue2, xmlInnerPropertyValue);
|
|
}
|
|
}
|