/********************************************************************************** * * $Id: BasicConfigurationServiceTest.java 107118 2012-04-16 14:41:07Z azeckoski@unicon.net $ * *********************************************************************************** * * Copyright (c) 2007, 2008 Sakai Foundation * * Licensed under the Educational Community 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.opensource.org/licenses/ECL-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.sakaiproject.component.impl; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Locale; import junit.framework.TestCase; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.component.api.ServerConfigurationService.ConfigData; /** * Used for testing protected methods in the BasicConfigurationService */ public class BasicConfigurationServiceTest extends TestCase { private static Log log = LogFactory.getLog(BasicConfigurationServiceTest.class); private BasicConfigurationService basicConfigurationService; private String SOURCE = "TEST"; public void setUp() throws Exception { basicConfigurationService = new BasicConfigurationService(); basicConfigurationService.addConfigItem( new ConfigItemImpl("name", "Aaron"), SOURCE); basicConfigurationService.addConfigItem( new ConfigItemImpl("AZ", "Aaron Zeckoski"), SOURCE); basicConfigurationService.addConfigItem( new ConfigItemImpl("testKeyEmpty", ""), SOURCE); basicConfigurationService.addConfigItem( new ConfigItemImpl("testKeyInvalid", "testing invalid=${invalid} testing"), SOURCE); basicConfigurationService.addConfigItem( new ConfigItemImpl("testKeyNested", "testing name=${name} testing"), SOURCE); basicConfigurationService.addConfigItem( new ConfigItemImpl("testKeyNestedMulti", "testing az=${AZ} nested=${testKeyNested} invalid=${invalid}"), SOURCE); basicConfigurationService.addConfigItem( new ConfigItemImpl("test1", "test1"), SOURCE); basicConfigurationService.addConfigItem( new ConfigItemImpl("test2", "test2"), SOURCE); basicConfigurationService.addConfigItem( new ConfigItemImpl("test3", "test3"), SOURCE); basicConfigurationService.addConfigItem( new ConfigItemImpl("test4", "test4"), SOURCE); basicConfigurationService.addConfigItem( new ConfigItemImpl("test5", "test5"), SOURCE); basicConfigurationService.addConfigItem( new ConfigItemImpl("test6", "test6"), SOURCE); basicConfigurationService.addConfigItem( new ConfigItemImpl("test7", "${AZ}"), SOURCE); basicConfigurationService.addConfigItem( new ConfigItemImpl("intVal", 11), SOURCE); basicConfigurationService.addConfigItem( new ConfigItemImpl("booleanVal", true), SOURCE); log.info(basicConfigurationService.getConfigData()); } public void testDereferenceString() throws Exception { // https://jira.sakaiproject.org/browse/SAK-22148 String value = null; // testing for - String dereferenceValue(String value) value = basicConfigurationService.dereferenceValue(null); assertNull(value); value = basicConfigurationService.dereferenceValue(""); assertNotNull(value); assertEquals("", value); value = basicConfigurationService.dereferenceValue(" "); assertNotNull(value); assertEquals(" ", value); value = basicConfigurationService.dereferenceValue("hello world"); assertNotNull(value); assertEquals("hello world", value); value = basicConfigurationService.dereferenceValue("hello ${name}"); assertNotNull(value); assertEquals("hello Aaron", value); value = basicConfigurationService.dereferenceValue("hello ${testKeyInvalid}"); assertNotNull(value); assertEquals("hello testing invalid=${invalid} testing", value); value = basicConfigurationService.dereferenceValue("hello ${testKeyEmpty}"); assertNotNull(value); assertEquals("hello ", value); value = basicConfigurationService.dereferenceValue("hello ${testKeyNested}"); assertNotNull(value); assertEquals("hello testing name=Aaron testing", value); value = basicConfigurationService.dereferenceValue("hello ${testKeyNestedMulti}"); assertNotNull(value); assertEquals("hello testing az=Aaron Zeckoski nested=testing name=Aaron testing invalid=${invalid}", value); } public void testDereferenceAll() throws Exception { // https://jira.sakaiproject.org/browse/SAK-22148 int changed = basicConfigurationService.dereferenceConfig(); ConfigData cd = basicConfigurationService.getConfigData(); assertEquals(16, cd.getTotalConfigItems()); assertEquals(3, changed); // 4 of them have keys but 1 key is invalid so it will not be replaced assertEquals("Aaron", basicConfigurationService.getConfig("name", "default") ); assertEquals("testing name=Aaron testing", basicConfigurationService.getConfig("testKeyNested", "default") ); assertEquals("testing az=Aaron Zeckoski nested=testing name=Aaron testing invalid=${invalid}", basicConfigurationService.getConfig("testKeyNestedMulti", "default") ); assertEquals("Aaron Zeckoski", basicConfigurationService.getConfig("test7", "default") ); } public void testKNL1038() throws Exception { /* KNL-1038 - "${sakai.home}/samigo/answerUploadRepositoryPath" * This is basically testing whether replacements work in default values * (as they should) */ String val = null; val = basicConfigurationService.getString("name"); assertNotSame("", val); assertEquals("Aaron", val); // namePlusLast should NOT exist val = basicConfigurationService.getString("namePlusLast"); assertEquals("", val); val = basicConfigurationService.getString("namePlusLast", "${name} Zeckoski"); assertNotSame("", val); assertEquals("Aaron Zeckoski", val); } public void testKNL_1052() { String val; val = basicConfigurationService.getString("xxxxxxxAAAZZZZ"); assertEquals("", val); val = basicConfigurationService.getString("xxxxxxxAAAZZZZ","DEFAULT"); assertEquals("DEFAULT", val); basicConfigurationService.addConfigItem( new ConfigItemImpl("xxxxxxxAAAZZZZ", "AZ"), SOURCE); val = basicConfigurationService.getString("xxxxxxxAAAZZZZ"); assertEquals("AZ", val); } public void testLocales() { Locale locale; Locale defaultLocale = Locale.getDefault(); Locale[] locales; int lsize = 0; locale = basicConfigurationService.getLocaleFromString("az"); assertNotNull(locale); assertNotSame(defaultLocale, locale); assertEquals(new Locale("az"), locale); locale = basicConfigurationService.getLocaleFromString("az_JP"); assertNotNull(locale); assertNotSame(defaultLocale, locale); assertEquals(new Locale("az","JP"), locale); locale = basicConfigurationService.getLocaleFromString("az-JP"); assertNotNull(locale); assertNotSame(defaultLocale, locale); assertEquals(new Locale("az","JP"), locale); // blank should become Default Locale to match existing behavior locale = basicConfigurationService.getLocaleFromString(""); assertNotNull(locale); assertEquals(defaultLocale, locale); // invalid format should become Default to match existing behaviors locale = basicConfigurationService.getLocaleFromString("_"); assertNotNull(locale); assertEquals(defaultLocale, locale); locale = basicConfigurationService.getLocaleFromString("__"); assertNotNull(locale); assertEquals(defaultLocale, locale); // null stays as null locale = basicConfigurationService.getLocaleFromString(null); assertNull(locale); // check the basic retrieval locales = basicConfigurationService.getSakaiLocales(); assertNotNull(locales); lsize = locales.length; assertTrue( lsize > 0 ); assertFalse( hasDuplicate(Arrays.asList(locales)) ); assertTrue( ArrayUtils.contains(locales, Locale.getDefault()) ); // test limited set basicConfigurationService.addConfigItem( new ConfigItemImpl("locales", "az, az_JP, az_ZW"), SOURCE); locales = basicConfigurationService.getSakaiLocales(); assertNotNull(locales); lsize = locales.length; assertTrue( lsize > 0 ); assertFalse( hasDuplicate(Arrays.asList(locales)) ); assertTrue( ArrayUtils.contains(locales, Locale.getDefault()) ); assertEquals(4, lsize); assertTrue( ArrayUtils.contains(locales, new Locale("az")) ); assertTrue( ArrayUtils.contains(locales, new Locale("az","JP")) ); assertTrue( ArrayUtils.contains(locales, new Locale("az","ZW")) ); // test dupes and empty entries (which should just become the default) basicConfigurationService.addConfigItem( new ConfigItemImpl("locales", "az, az, az, az, az_JP, az_JP, az_ZW, , "), SOURCE); locales = basicConfigurationService.getSakaiLocales(); assertNotNull(locales); lsize = locales.length; assertTrue( lsize > 0 ); assertFalse( hasDuplicate(Arrays.asList(locales)) ); assertTrue( ArrayUtils.contains(locales, Locale.getDefault()) ); assertEquals(4, lsize); assertTrue( ArrayUtils.contains(locales, new Locale("az")) ); assertTrue( ArrayUtils.contains(locales, new Locale("az","JP")) ); assertTrue( ArrayUtils.contains(locales, new Locale("az","ZW")) ); // test empty has at least the default one basicConfigurationService.addConfigItem( new ConfigItemImpl("locales", ""), SOURCE); locales = basicConfigurationService.getSakaiLocales(); assertNotNull(locales); lsize = locales.length; assertTrue( lsize > 0 ); assertFalse( hasDuplicate(Arrays.asList(locales)) ); assertTrue( ArrayUtils.contains(locales, Locale.getDefault()) ); assertEquals(1, lsize); } public static <T> boolean hasDuplicate(Collection<T> list) { HashSet<T> set = new HashSet<T>(); // Set#add returns false if the set does not change, which indicates that a duplicate element has been added. for (T each: list) { if (!set.add(each)) { return true; } } return false; } public void testKNL_1132() { // testing integer and boolean handling int intVal = basicConfigurationService.getInt("intVal", -1); assertEquals(11, intVal); intVal = basicConfigurationService.getInt("intVal2", 12); // doesn't exist assertEquals(12, intVal); basicConfigurationService.addConfigItem( new ConfigItemImpl("intVal3", null), SOURCE); intVal = basicConfigurationService.getInt("intVal3", 13); // value is null assertEquals(13, intVal); boolean booleanValue = basicConfigurationService.getBoolean("booleanVal", false); assertEquals(true, booleanValue); booleanValue = basicConfigurationService.getBoolean("booleanVal2", true); // doesn't exist assertEquals(true, booleanValue); basicConfigurationService.addConfigItem( new ConfigItemImpl("booleanVal3", null), SOURCE); booleanValue = basicConfigurationService.getBoolean("booleanVal3", true); // value is null assertEquals(true, booleanValue); // NOTE: this is internal only (i.e. no one outside the kernel could encounter this) ConfigItemImpl booleanVal4 = new ConfigItemImpl("booleanVal4", null); booleanVal4.setDefaultValue(""); // causes an NPE basicConfigurationService.addConfigItem( booleanVal4, SOURCE); boolean booleanValue4 = basicConfigurationService.getBoolean("booleanVal4", false); assertEquals(false, booleanValue4); } }