// Copyright 2010 Google Inc. // // Licensed under the Apache 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.apache.org/licenses/LICENSE-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 com.google.enterprise.connector.util.database; import com.google.enterprise.connector.manager.Context; import junit.framework.TestCase; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.util.List; /** * Tests for DatabaseResourceBundleManager. */ public class DatabaseResourceBundleManagerTest extends TestCase { private static final String TEST_DIR = "testdata/contextTests/databaseResourceBundleTests/"; private static final String APPLICATION_CONTEXT = TEST_DIR + "DatabaseResourceBundleManagerTest.xml"; private static final String BASE_PATH = TEST_DIR.replace('/', '.'); private DatabaseResourceBundleManager mgr; private ClassLoader classLoader; @Override protected void setUp() throws Exception { Context.refresh(); Context context = Context.getInstance(); context.setStandaloneContext(APPLICATION_CONTEXT, TEST_DIR); mgr = new DatabaseResourceBundleManager(); classLoader = new TestClassLoader(); } public void testGetBundleNames() { List<String> names = mgr.getBundleNames("Test", ""); assertEquals(1, names.size()); assertEquals("Test", names.get(0)); names = mgr.getBundleNames("Test", "_apple"); assertEquals(2, names.size()); assertEquals("Test", names.get(0)); assertEquals("Test_apple", names.get(1)); names = mgr.getBundleNames("Test", "_apple_banana_strawberry_rhubarb"); assertEquals(5, names.size()); assertEquals("Test", names.get(0)); assertEquals("Test_apple", names.get(1)); assertEquals("Test_apple_banana", names.get(2)); assertEquals("Test_apple_banana_strawberry", names.get(3)); assertEquals("Test_apple_banana_strawberry_rhubarb", names.get(4)); // Don't get fooled by underscore characters embedded in the baseName. names = mgr.getBundleNames("BaseName_Underscore", "_apple_banana"); assertEquals(3, names.size()); assertEquals("BaseName_Underscore", names.get(0)); assertEquals("BaseName_Underscore_apple", names.get(1)); assertEquals("BaseName_Underscore_apple_banana", names.get(2)); } public void testLoadNonExistentBundle() throws Exception { assertNull(mgr.loadBundle("NonExistentDatabasePropertyResourceBundle", null, classLoader)); } public void testLoadBundle() throws Exception { String name = BASE_PATH + "BaseName"; DatabasePropertyResourceBundle bundle = mgr.loadBundle(name, null, classLoader); assertNotNull(bundle); assertEquals("BaseName", bundle.getString("bundle.name")); assertNull(bundle.getParent()); } public void testLoadBundles() throws Exception { String name = BASE_PATH + "BaseName"; String ext = "_dbname_dbversion_dbvariant"; mgr.loadBundles(mgr.getBundleNames(name, ext), classLoader); DatabasePropertyResourceBundle bundle = mgr.cache.get(name + ext); assertNotNull(bundle); assertEquals("BaseName_dbname_dbversion_dbvariant", bundle.getString("bundle.name")); bundle = bundle.getParent(); assertNotNull(bundle); assertEquals("BaseName_dbname_dbversion", bundle.getString("bundle.name")); bundle = bundle.getParent(); assertNotNull(bundle); assertEquals("BaseName_dbname", bundle.getString("bundle.name")); bundle = bundle.getParent(); assertNotNull(bundle); assertEquals("BaseName", bundle.getString("bundle.name")); bundle = bundle.getParent(); assertNull(bundle); } public void testBestFallbackForNonExistentBundle() throws Exception { String name = BASE_PATH + "BaseName"; String ext = "_dbname_dbversion_non_existent_variant"; mgr.loadBundles(mgr.getBundleNames(name, ext), classLoader); DatabasePropertyResourceBundle bundle = mgr.cache.get(name + ext); assertNotNull(bundle); assertEquals("BaseName_dbname_dbversion", bundle.getString("bundle.name")); bundle = bundle.getParent(); assertNotNull(bundle); assertEquals("BaseName_dbname", bundle.getString("bundle.name")); bundle = bundle.getParent(); assertNotNull(bundle); assertEquals("BaseName", bundle.getString("bundle.name")); bundle = bundle.getParent(); assertNull(bundle); } public void testGetResourceBundle() { String name = BASE_PATH + "BaseName"; DatabasePropertyResourceBundle bundle = mgr.getResourceBundle(name, null, classLoader); assertNotNull(bundle); assertEquals("BaseName", bundle.getString("bundle.name")); assertNull(bundle.getParent()); } public void testGetNonExistentResourceBundle() throws Exception { assertNull(mgr.getResourceBundle( "NonExistentDatabasePropertyResourceBundle", null, classLoader)); } public void testGetResourceBundleWithExtension1() throws Exception { String name = BASE_PATH + "BaseName"; DatabasePropertyResourceBundle bundle = mgr.getResourceBundle(name, "_dbname", classLoader); assertNotNull(bundle); assertEquals("BaseName_dbname", bundle.getString("bundle.name")); bundle = bundle.getParent(); assertNotNull(bundle); assertEquals("BaseName", bundle.getString("bundle.name")); bundle = bundle.getParent(); assertNull(bundle); } public void testGetResourceBundleWithExtension2() throws Exception { String name = BASE_PATH + "BaseName"; DatabasePropertyResourceBundle bundle = mgr.getResourceBundle(name, "_dbname_dbversion", classLoader); assertNotNull(bundle); assertEquals("BaseName_dbname_dbversion", bundle.getString("bundle.name")); bundle = bundle.getParent(); assertNotNull(bundle); assertEquals("BaseName_dbname", bundle.getString("bundle.name")); bundle = bundle.getParent(); assertNotNull(bundle); assertEquals("BaseName", bundle.getString("bundle.name")); bundle = bundle.getParent(); assertNull(bundle); } public void testGetResourceBundleWithDbInfo3() throws Exception { String name = BASE_PATH + "BaseName"; DatabasePropertyResourceBundle bundle = mgr.getResourceBundle(name, "_dbname_dbversion_dbvariant", classLoader); assertNotNull(bundle); assertEquals("BaseName_dbname_dbversion_dbvariant", bundle.getString("bundle.name")); bundle = bundle.getParent(); assertNotNull(bundle); assertEquals("BaseName_dbname_dbversion", bundle.getString("bundle.name")); bundle = bundle.getParent(); assertNotNull(bundle); assertEquals("BaseName_dbname", bundle.getString("bundle.name")); bundle = bundle.getParent(); assertNotNull(bundle); assertEquals("BaseName", bundle.getString("bundle.name")); bundle = bundle.getParent(); assertNull(bundle); } public void testBestFallbackForNonExistentResourceBundle() throws Exception { String name = BASE_PATH + "BaseName"; DatabasePropertyResourceBundle bundle = mgr.getResourceBundle(name, "_dbname_dbversion_non_existent_variant", classLoader); assertNotNull(bundle); assertEquals("BaseName_dbname_dbversion", bundle.getString("bundle.name")); bundle = bundle.getParent(); assertNotNull(bundle); assertEquals("BaseName_dbname", bundle.getString("bundle.name")); bundle = bundle.getParent(); assertNotNull(bundle); assertEquals("BaseName", bundle.getString("bundle.name")); bundle = bundle.getParent(); assertNull(bundle); } public void testSubstitutionFromParentBundles() throws Exception { String name = BASE_PATH + "BaseName"; DatabasePropertyResourceBundle bundle = mgr.getResourceBundle(name, "_dbname_dbversion_dbvariant", classLoader); assertNotNull(bundle); assertEquals("BaseName_dbname_dbversion_dbvariant", bundle.getString("bundle.name")); assertEquals("Hello", bundle.getString("hello.property")); assertEquals("Goodbye Cruel World", bundle.getString("hello.world.property")); bundle = bundle.getParent(); assertNotNull(bundle); assertEquals("BaseName_dbname_dbversion", bundle.getString("bundle.name")); assertEquals("Goodbye Earth", bundle.getString("hello.world.property")); bundle = bundle.getParent(); assertNotNull(bundle); assertEquals("BaseName_dbname", bundle.getString("bundle.name")); assertEquals("Hello World", bundle.getString("hello.world.property")); bundle = bundle.getParent(); assertNotNull(bundle); assertEquals("BaseName", bundle.getString("bundle.name")); assertEquals("Hello", bundle.getString("hello.property")); assertNull(bundle.getString("hello.world.property")); bundle = bundle.getParent(); assertNull(bundle); } // Check that if I load a bundle, then ask for a parent bundle, // I get the one that was cached from loading the first bundle, // rather than loading it again. public void testCacheParentBundles() throws Exception { String name = BASE_PATH + "BaseName"; DatabasePropertyResourceBundle bundle = mgr.getResourceBundle(name, "_dbname_dbversion_dbvariant", classLoader); assertNotNull(bundle); DatabasePropertyResourceBundle parent = mgr.getResourceBundle(name, "_dbname_dbversion", classLoader); assertNotNull(parent); assertSame(parent, bundle.getParent()); bundle = parent; parent = mgr.getResourceBundle(name, "_dbname", classLoader); assertNotNull(parent); assertSame(parent, bundle.getParent()); bundle = parent; parent = mgr.getResourceBundle(name, null, classLoader); assertNotNull(parent); assertSame(parent, bundle.getParent()); } // Check that if I load a bundle, then load another bundle with a // common parent, I get the parent that was cached from loading the // first bundle, rather than loading it again. public void testCacheParentBundlesAlternateChild() throws Exception { String name = BASE_PATH + "BaseName"; DatabasePropertyResourceBundle bundle = mgr.getResourceBundle(name, "_dbname_dbversion_dbvariant", classLoader); assertNotNull(bundle); DatabasePropertyResourceBundle parent = mgr.getResourceBundle(name, "_dbname_dbversion", classLoader); assertNotNull(parent); assertSame(parent, bundle.getParent()); DatabasePropertyResourceBundle bundle2 = mgr.getResourceBundle(name, "_dbname_dbversion_dbvariant2", classLoader); assertNotNull(bundle); assertSame(parent, bundle2.getParent()); } // A ClassLoader that looks for resources relative to the // current working directory. private class TestClassLoader extends ClassLoader { @Override public URL getResource(String name) { try { File file = new File(name); if (file.exists() && file.isFile()) { return file.toURI().toURL(); } } catch (MalformedURLException e) { // Fall through and look on classpath. } return this.getClass().getClassLoader().getResource(name); } } }