/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 org.apache.jackrabbit.core.config; import junit.framework.TestCase; import org.xml.sax.InputSource; import org.apache.commons.io.FileUtils; import org.apache.commons.io.input.ClosedInputStream; import org.apache.jackrabbit.core.cluster.ClusterNode; import org.apache.jackrabbit.core.security.authorization.WorkspaceAccessManager; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; /** * Test cases for repository configuration handling. */ public class RepositoryConfigTest extends TestCase { private static final File DIR = new File("target", "RepositoryConfigTest"); private static final File XML = new File(DIR, "repository.xml"); private RepositoryConfig config; /** * Sets up the test case by creating the repository home directory * and copying the repository configuration file in place. */ protected void setUp() throws Exception { config = RepositoryConfig.install(DIR); } protected void tearDown() { FileUtils.deleteQuietly(DIR); } public void testCreateWithRepositoryDirectory() { try { RepositoryConfig.create(DIR); } catch (ConfigurationException e) { fail("Valid repository directory"); } try { RepositoryConfig.create(new File(DIR, "invalid-repo-dir")); fail("Invalid repository directory"); } catch (ConfigurationException e) { } } public void testCreateWithRepositoryConfigAndDirectory() { try { RepositoryConfig.create(XML, DIR); } catch (ConfigurationException e) { fail("Valid repository configuration and directory"); } try { RepositoryConfig.create(XML, new File(DIR, "invalid-repo-dir")); fail("Invalid repository directory"); } catch (ConfigurationException e) { } try { RepositoryConfig.create(new File(DIR, "invalid.xml"), DIR); fail("Invalid repository configuration"); } catch (ConfigurationException e) { } } /** * Tests that a file name can be used for the configuration. */ public void testRepositoryConfigCreateWithFileName() { try { RepositoryConfig.create(XML.getPath(), DIR.getPath()); } catch (ConfigurationException e) { fail("Valid configuration file name"); } try { RepositoryConfig.create( new File(DIR, "invalid-config-file.xml").getPath(), DIR.getPath()); fail("Invalid configuration file name"); } catch (ConfigurationException e) { } } /** * Tests that a URI can be used for the configuration. */ public void testRepositoryConfigCreateWithURI() throws URISyntaxException { try { RepositoryConfig.create(XML.toURI(), DIR.getPath()); } catch (ConfigurationException e) { fail("Valid configuration URI"); } try { RepositoryConfig.create( new File(DIR, "invalid-config-file.xml").toURI(), DIR.getPath()); fail("Invalid configuration URI"); } catch (ConfigurationException e) { } try { RepositoryConfig.create( new URI("invalid://config/uri"), DIR.getPath()); fail("Invalid configuration URI"); } catch (ConfigurationException e) { } } /** * Tests that an input stream can be used for the configuration. */ public void testRepositoryConfigCreateWithInputStream() throws IOException { InputStream input = new FileInputStream(XML); try { RepositoryConfig.create(input, DIR.getPath()); } catch (ConfigurationException e) { fail("Valid configuration input stream"); } finally { input.close(); } try { RepositoryConfig.create( new InputStream() { public int read() throws IOException { throw new IOException("invalid input stream"); } }, DIR.getPath()); fail("Invalid configuration input stream"); } catch (ConfigurationException e) { } try { RepositoryConfig.create( new ClosedInputStream(), DIR.getPath()); fail("Invalid configuration input stream"); } catch (ConfigurationException e) { } } /** * Tests that an InputSource can be used for the configuration. */ public void testRepositoryConfigCreateWithInputSource() throws IOException { try { InputSource source = new InputSource(XML.toURI().toString()); RepositoryConfig.create(source, DIR.getPath()); } catch (ConfigurationException e) { fail("Valid configuration input source with file URI"); } InputStream stream = new FileInputStream(XML); try { InputSource source = new InputSource(stream); RepositoryConfig.create(source, DIR.getPath()); } catch (ConfigurationException e) { fail("Valid configuration input source with input stream"); } finally { stream.close(); } } /** * Test that the repository configuration file is correctly parsed. */ public void testRepositoryConfig() throws Exception { assertRepositoryConfiguration(config); } public void testInit() throws Exception { File workspaces_dir = new File(DIR, "workspaces"); File workspace_dir = new File(workspaces_dir, "default"); File workspace_xml = new File(workspace_dir, "workspace.xml"); assertTrue("Default workspace is created", workspace_xml.exists()); } public void testCreateWorkspaceConfig() throws Exception { config.createWorkspaceConfig("test-workspace", (StringBuffer) null); File workspaces_dir = new File(DIR, "workspaces"); File workspace_dir = new File(workspaces_dir, "test-workspace"); File workspace_xml = new File(workspace_dir, "workspace.xml"); assertTrue(workspace_xml.exists()); } public void testCreateDuplicateWorkspaceConfig() throws Exception { try { config.createWorkspaceConfig("default", (StringBuffer) null); fail("No exception thrown when creating a duplicate workspace"); } catch (ConfigurationException e) { // test passed } } public void testRepositoryConfigWithSystemVariables() throws Exception { final String id = "testvalue"; final long syncDelay = 11; System.setProperty(ClusterNode.SYSTEM_PROPERTY_NODE_ID, id); System.setProperty("cluster.syncDelay", Long.toString(syncDelay)); try { InputStream in = getClass().getResourceAsStream( "/org/apache/jackrabbit/core/cluster/repository.xml"); RepositoryConfig config = RepositoryConfig.create(in, DIR.getPath()); ClusterConfig clusterConfig = config.getClusterConfig(); assertEquals(id, clusterConfig.getId()); assertEquals(syncDelay, clusterConfig.getSyncDelay()); } finally { System.clearProperty(ClusterNode.SYSTEM_PROPERTY_NODE_ID); System.clearProperty("cluster.syncDelay"); } } public void testAutomaticClusterNodeIdCreation() throws Exception { final long syncDelay = 12; assertNull( "This test requires the system property " + ClusterNode.SYSTEM_PROPERTY_NODE_ID + " not to be set; found value: " + System.getProperty(ClusterNode.SYSTEM_PROPERTY_NODE_ID) + " (leftover from broken unit test?)", System.getProperty(ClusterNode.SYSTEM_PROPERTY_NODE_ID)); System.setProperty("cluster.syncDelay", Long.toString(syncDelay)); try { File file = new File(DIR, "cluster_node.id"); assertFalse(file.exists()); // Check that a new cluster node id is automatically persisted InputStream in = getClass().getResourceAsStream( "/org/apache/jackrabbit/core/cluster/repository.xml"); RepositoryConfig config = RepositoryConfig.create(in, DIR.getPath()); assertTrue(file.exists()); String id = FileUtils.readFileToString(file); ClusterConfig clusterConfig = config.getClusterConfig(); assertEquals(id, clusterConfig.getId()); assertEquals(syncDelay, clusterConfig.getSyncDelay()); // Check that the persisted cluster node id is used when it exists in = getClass().getResourceAsStream( "/org/apache/jackrabbit/core/cluster/repository.xml"); config = RepositoryConfig.create(in, DIR.getPath()); assertTrue(file.exists()); assertEquals(id, FileUtils.readFileToString(file)); clusterConfig = config.getClusterConfig(); assertEquals(id, clusterConfig.getId()); assertEquals(syncDelay, clusterConfig.getSyncDelay()); } finally { System.clearProperty("cluster.syncDelay"); } } /** * Test that a RepositoryConfig can be copied into a new instance. * * @throws Exception if an unexpected error occurs during the test */ public void testCopyConfig() throws Exception { RepositoryConfig copyConfig = RepositoryConfig.create(config); assertNotNull("Configuration not created properly", copyConfig); assertRepositoryConfiguration(copyConfig); } private void assertRepositoryConfiguration(RepositoryConfig config) throws ConfigurationException { assertEquals(DIR.getPath(), config.getHomeDir()); assertEquals("default", config.getDefaultWorkspaceName()); assertEquals( new File(DIR, "workspaces").getPath(), new File(config.getWorkspacesConfigRootDir()).getPath()); assertEquals("Jackrabbit", config.getSecurityConfig().getAppName()); // SecurityManagerConfig SecurityManagerConfig smc = config.getSecurityConfig().getSecurityManagerConfig(); assertEquals( "org.apache.jackrabbit.core.DefaultSecurityManager", smc.getClassName()); assertTrue(smc.getParameters().isEmpty()); assertNotNull(smc.getWorkspaceName()); BeanConfig bc = smc.getWorkspaceAccessConfig(); if (bc != null) { WorkspaceAccessManager wac = smc.getWorkspaceAccessConfig().newInstance(WorkspaceAccessManager.class); assertEquals("org.apache.jackrabbit.core.security.simple.SimpleWorkspaceAccessManager", wac.getClass().getName()); } // AccessManagerConfig AccessManagerConfig amc = config.getSecurityConfig().getAccessManagerConfig(); assertEquals( "org.apache.jackrabbit.core.security.DefaultAccessManager", amc.getClassName()); assertTrue(amc.getParameters().isEmpty()); VersioningConfig vc = config.getVersioningConfig(); assertEquals(new File(DIR, "version"), vc.getHomeDir()); assertEquals( "org.apache.jackrabbit.core.persistence.pool.DerbyPersistenceManager", vc.getPersistenceManagerConfig().getClassName()); } }