You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gr...@apache.org on 2010/10/13 17:06:27 UTC

svn commit: r1022127 [5/15] - in /qpid/branches/grkvlt-network-20101013/qpid/java: ./ broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/ broker-plugins/access-control/src/test/java/org/apache/qpid/server/securit...

Added: qpid/branches/grkvlt-network-20101013/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/ConfigurationFileTest.java
URL: http://svn.apache.org/viewvc/qpid/branches/grkvlt-network-20101013/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/ConfigurationFileTest.java?rev=1022127&view=auto
==============================================================================
--- qpid/branches/grkvlt-network-20101013/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/ConfigurationFileTest.java (added)
+++ qpid/branches/grkvlt-network-20101013/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/ConfigurationFileTest.java Wed Oct 13 15:05:29 2010
@@ -0,0 +1,781 @@
+/*
+ *
+ * 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.qpid.server.configuration;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.server.exchange.Exchange;
+import org.apache.qpid.server.registry.ApplicationRegistry;
+import org.apache.qpid.server.registry.ConfigurationFileApplicationRegistry;
+import org.apache.qpid.server.util.TestApplicationRegistry;
+import org.apache.qpid.server.virtualhost.VirtualHost;
+import org.apache.qpid.server.virtualhost.VirtualHostRegistry;
+import org.apache.qpid.test.utils.QpidTestCase;
+
+public class ConfigurationFileTest extends QpidTestCase
+{
+    private void writeConfigFile(File mainFile, boolean allow) throws IOException {
+        writeConfigFile(mainFile, allow, true, null, "test");
+    }
+
+    private void writeConfigFile(File mainFile, boolean allow, boolean includeVhosts, File vhostsFile, String name) throws IOException {
+        FileWriter out = new FileWriter(mainFile);
+        out.write("<broker>\n");
+        out.write("\t<management><enabled>false</enabled></management>\n");
+        out.write("\t<security>\n");
+        out.write("\t\t<principal-databases>\n");
+        out.write("\t\t\t<principal-database>\n");
+        out.write("\t\t\t\t<name>passwordfile</name>\n");
+        out.write("\t\t\t\t<class>org.apache.qpid.server.security.auth.database.PlainPasswordFilePrincipalDatabase</class>\n");
+        out.write("\t\t\t\t<attributes>\n");
+        out.write("\t\t\t\t\t<attribute>\n");
+        out.write("\t\t\t\t\t\t<name>passwordFile</name>\n");
+        out.write("\t\t\t\t\t\t<value>/dev/null</value>\n");
+        out.write("\t\t\t\t\t</attribute>\n");
+        out.write("\t\t\t\t</attributes>\n");
+        out.write("\t\t\t</principal-database>\n");
+        out.write("\t\t</principal-databases>\n");
+        out.write("\t\t<jmx>\n");
+        out.write("\t\t\t<access>/dev/null</access>\n");
+        out.write("\t\t\t<principal-database>passwordfile</principal-database>\n");
+        out.write("\t\t</jmx>\n");
+        out.write("\t\t<firewall>\n");
+        out.write("\t\t\t<rule access=\""+ ((allow) ? "allow" : "deny") +"\" network=\"127.0.0.1\"/>");
+        out.write("\t\t</firewall>\n");
+        out.write("\t</security>\n");
+        if (includeVhosts)
+        {
+	        out.write("\t<virtualhosts>\n");
+            out.write("\t\t<default>test</default>\n");
+	        out.write("\t\t<virtualhost>\n");
+	        out.write(String.format("\t\t\t<name>%s</name>\n", name));
+	        out.write(String.format("\t\t<%s> \n", name));
+	        out.write("\t\t\t<exchanges>\n");
+	        out.write("\t\t\t\t<exchange>\n");
+	        out.write("\t\t\t\t\t<type>topic</type>\n");
+	        out.write(String.format("\t\t\t\t\t<name>%s.topic</name>\n", name));
+	        out.write("\t\t\t\t\t<durable>true</durable>\n");
+	        out.write("\t\t\t\t</exchange>\n");
+	        out.write("\t\tt</exchanges>\n");
+	        out.write(String.format("\t\t</%s> \n", name));
+	        out.write("\t\t</virtualhost>\n");
+	        out.write("\t</virtualhosts>\n");
+        }
+        if (vhostsFile != null)
+        {
+        	out.write("\t<virtualhosts>"+vhostsFile.getAbsolutePath()+"</virtualhosts>\n");	
+        }
+        out.write("</broker>\n");
+        out.close();
+    }
+
+    private void writeTestFishConfigFile(File mainFile) throws IOException {
+        FileWriter out = new FileWriter(mainFile);
+        out.write("<broker>\n");
+        out.write("\t<management><enabled>false</enabled></management>\n");
+        out.write("\t<security>\n");
+        out.write("\t\t<principal-databases>\n");
+        out.write("\t\t\t<principal-database>\n");
+        out.write("\t\t\t\t<name>passwordfile</name>\n");
+        out.write("\t\t\t\t<class>org.apache.qpid.server.security.auth.database.PlainPasswordFilePrincipalDatabase</class>\n");
+        out.write("\t\t\t\t<attributes>\n");
+        out.write("\t\t\t\t\t<attribute>\n");
+        out.write("\t\t\t\t\t\t<name>passwordFile</name>\n");
+        out.write("\t\t\t\t\t\t<value>/dev/null</value>\n");
+        out.write("\t\t\t\t\t</attribute>\n");
+        out.write("\t\t\t\t</attributes>\n");
+        out.write("\t\t\t</principal-database>\n");
+        out.write("\t\t</principal-databases>\n");
+        out.write("\t\t<jmx>\n");
+        out.write("\t\t\t<access>/dev/null</access>\n");
+        out.write("\t\t\t<principal-database>passwordfile</principal-database>\n");
+        out.write("\t\t</jmx>\n");
+        out.write("\t\t<firewall>\n");
+        out.write("\t\t\t<rule access=\"allow\" network=\"127.0.0.1\"/>");
+        out.write("\t\t</firewall>\n");
+        out.write("\t</security>\n");
+        out.write("\t<virtualhosts>\n");
+        out.write("\t\t<virtualhost>\n");
+        out.write("\t\t\t<name>test</name>\n");
+        out.write("\t\t<test> \n");
+        out.write("\t\t\t<exchanges>\n");
+        out.write("\t\t\t\t<exchange>\n");
+        out.write("\t\t\t\t\t<type>topic</type>\n");
+        out.write("\t\t\t\t\t<name>test.topic</name>\n");
+        out.write("\t\t\t\t\t<durable>true</durable>\n");
+        out.write("\t\t\t\t</exchange>\n");
+        out.write("\t\tt</exchanges>\n");
+        out.write("\t\t</test> \n");
+        out.write("\t\t</virtualhost>\n");
+        out.write("\t\t<virtualhost>\n");
+        out.write("\t\t\t<name>fish</name>\n");
+        out.write("\t\t<fish> \n");
+        out.write("\t\t\t<exchanges>\n");
+        out.write("\t\t\t\t<exchange>\n");
+        out.write("\t\t\t\t\t<type>topic</type>\n");
+        out.write("\t\t\t\t\t<name>fish.topic</name>\n");
+        out.write("\t\t\t\t\t<durable>false</durable>\n");
+        out.write("\t\t\t\t</exchange>\n");
+        out.write("\t\tt</exchanges>\n");
+        out.write("\t\t</fish> \n");
+        out.write("\t\t</virtualhost>\n");
+        out.write("\t</virtualhosts>\n");
+        out.write("</broker>\n");
+        out.close();
+    }
+
+    private void writeVirtualHostsFile(File vhostsFile, String name) throws IOException {
+        FileWriter out = new FileWriter(vhostsFile);
+        out.write("<virtualhosts>\n");
+        out.write(String.format("\t\t<default>%s</default>\n", name));
+        out.write("\t<virtualhost>\n");
+        out.write(String.format("\t\t<name>%s</name>\n", name));
+        out.write(String.format("\t\t<%s>\n", name));
+        out.write("\t\t\t<exchanges>\n");
+        out.write("\t\t\t\t<exchange>\n");
+        out.write("\t\t\t\t\t<type>topic</type>\n");
+        out.write("\t\t\t\t\t<name>test.topic</name>\n");
+        out.write("\t\t\t\t\t<durable>true</durable>\n");
+        out.write("\t\t\t\t</exchange>\n");
+        out.write("\t\tt</exchanges>\n");
+        out.write(String.format("\t\t</%s>\n", name));
+        out.write("\t</virtualhost>\n");
+        out.write("</virtualhosts>\n");
+        out.close();
+    }
+
+    private void writeMultiVirtualHostsFile(File vhostsFile) throws IOException {
+        FileWriter out = new FileWriter(vhostsFile);
+        out.write("<virtualhosts>\n");
+        out.write("\t<virtualhost>\n");
+        out.write("\t\t<name>topic</name>\n");
+        out.write("\t\t<topic>\n");
+        out.write("\t\t\t<exchanges>\n");
+        out.write("\t\t\t\t<exchange>\n");
+        out.write("\t\t\t\t\t<type>topic</type>\n");
+        out.write("\t\t\t\t\t<name>test.topic</name>\n");
+        out.write("\t\t\t\t\t<durable>true</durable>\n");
+        out.write("\t\t\t\t</exchange>\n");
+        out.write("\t\tt</exchanges>\n");
+        out.write("\t\t</topic>\n");
+        out.write("\t</virtualhost>\n");
+        out.write("\t<virtualhost>\n");
+        out.write("\t\t<name>fanout</name>\n");
+        out.write("\t\t<fanout>\n");
+        out.write("\t\t\t<exchanges>\n");
+        out.write("\t\t\t\t<exchange>\n");
+        out.write("\t\t\t\t\t<type>fanout</type>\n");
+        out.write("\t\t\t\t\t<name>test.fanout</name>\n");
+        out.write("\t\t\t\t\t<durable>true</durable>\n");
+        out.write("\t\t\t\t</exchange>\n");
+        out.write("\t\tt</exchanges>\n");
+        out.write("\t\t</fanout>\n");
+        out.write("\t</virtualhost>\n");
+        out.write("</virtualhosts>\n");
+        out.close();
+    }
+
+    private void writeMultipleVhostsConfigFile(File mainFile, File[] vhostsFileArray) throws IOException {
+        FileWriter out = new FileWriter(mainFile);
+        out.write("<broker>\n");
+        out.write("\t<management><enabled>false</enabled></management>\n");
+        out.write("\t<security>\n");
+        out.write("\t\t<principal-databases>\n");
+        out.write("\t\t\t<principal-database>\n");
+        out.write("\t\t\t\t<name>passwordfile</name>\n");
+        out.write("\t\t\t\t<class>org.apache.qpid.server.security.auth.database.PlainPasswordFilePrincipalDatabase</class>\n");
+        out.write("\t\t\t\t<attributes>\n");
+        out.write("\t\t\t\t\t<attribute>\n");
+        out.write("\t\t\t\t\t\t<name>passwordFile</name>\n");
+        out.write("\t\t\t\t\t\t<value>/dev/null</value>\n");
+        out.write("\t\t\t\t\t</attribute>\n");
+        out.write("\t\t\t\t</attributes>\n");
+        out.write("\t\t\t</principal-database>\n");
+        out.write("\t\t</principal-databases>\n");
+        out.write("\t\t<jmx>\n");
+        out.write("\t\t\t<access>/dev/null</access>\n");
+        out.write("\t\t\t<principal-database>passwordfile</principal-database>\n");
+        out.write("\t\t</jmx>\n");
+        out.write("\t\t<firewall>\n");
+        out.write("\t\t\t<rule access=\"allow\" network=\"127.0.0.1\"/>");
+        out.write("\t\t</firewall>\n");
+        out.write("\t</security>\n");
+        for (File vhostsFile : vhostsFileArray)
+        {
+        	out.write("\t<virtualhosts>"+vhostsFile.getAbsolutePath()+"</virtualhosts>\n");
+        }
+	    out.write("</broker>\n");
+        out.close();
+    }
+
+    private void writeCombinedConfigFile(File mainFile, File fileA, File fileB) throws Exception
+    {
+        FileWriter out = new FileWriter(mainFile);
+        out.write("<configuration><system/>");
+        out.write("<xml fileName=\"" + fileA.getAbsolutePath() + "\"/>");
+        out.write("<xml fileName=\"" + fileB.getAbsolutePath() + "\"/>");
+        out.write("</configuration>");
+        out.close();
+    }
+    public void testSingleConfiguration() throws IOException, Exception
+    {
+        File fileA = File.createTempFile(getClass().getName(), null);
+        fileA.deleteOnExit();
+        FileWriter out = new FileWriter(fileA);
+        out.write("<broker><connector><port>2342</port><ssl><port>4235</port></ssl></connector></broker>");
+        out.close();
+        
+        ServerConfiguration conf = new ServerConfiguration(fileA);
+        TestApplicationRegistry instance = new TestApplicationRegistry(conf);
+        ApplicationRegistry.initialise(instance);
+        conf.initialise();
+        
+        assertEquals(4235, conf.getSSLPort());
+    }
+
+    public void testCombinedConfiguration() throws IOException, Exception
+    {
+        File mainFile = File.createTempFile(getClass().getName(), null);
+        File fileA = File.createTempFile(getClass().getName(), null);
+        File fileB = File.createTempFile(getClass().getName(), null);
+
+        mainFile.deleteOnExit();
+        fileA.deleteOnExit();
+        fileB.deleteOnExit();
+
+        FileWriter out = new FileWriter(mainFile);
+        out.write("<configuration><system/>");
+        out.write("<xml fileName=\"" + fileA.getAbsolutePath() + "\"/>");
+        out.write("<xml fileName=\"" + fileB.getAbsolutePath() + "\"/>");
+        out.write("</configuration>");
+        out.close();
+
+        out = new FileWriter(fileA);
+        out.write("<broker><connector><port>2342</port><ssl><port>4235</port></ssl></connector></broker>");
+        out.close();
+
+        out = new FileWriter(fileB);
+        out.write("<broker><connector><ssl><port>2345</port></ssl><qpidnio>true</qpidnio></connector></broker>");
+        out.close();
+
+        ServerConfiguration config = new ServerConfiguration(mainFile.getAbsoluteFile());
+        TestApplicationRegistry instance = new TestApplicationRegistry(config);
+        ApplicationRegistry.initialise(instance);
+        config.initialise();
+        
+        assertEquals(4235, config.getSSLPort()); // From first file, not overriden by second
+        assertNotNull(config.getPorts());
+        assertEquals(1, config.getPorts().size());
+        assertEquals("2342", config.getPorts().get(0)); // From the first file, not present in the second
+        assertTrue(config.getQpidNIO()); // From the second file, not present in the first
+    }
+
+    public void testVariableInterpolation() throws Exception
+    {
+        File mainFile = File.createTempFile(getClass().getName(), null);
+
+        mainFile.deleteOnExit();
+
+        FileWriter out = new FileWriter(mainFile);
+        out.write("<broker>\n");
+        out.write("\t<work>foo</work>\n");
+        out.write("\t<management><ssl><keyStorePath>${work}</keyStorePath></ssl></management>\n");
+        out.write("</broker>\n");
+        out.close();
+
+        ServerConfiguration config = new ServerConfiguration(mainFile.getAbsoluteFile());
+        TestApplicationRegistry instance = new TestApplicationRegistry(config);
+        ApplicationRegistry.initialise(instance);
+        config.initialise();
+        
+        assertEquals("Did not get correct interpolated value", "foo", config.getManagementKeyStorePath());
+    }
+    
+    /**
+     * Test that configuration loads correctly when virtual hosts are specified in the main
+     * configuration file only.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testInternalVirtualhostConfigFile() throws Exception
+    {
+        // Write out config
+        File mainFile = File.createTempFile(getClass().getName(), "config");
+        mainFile.deleteOnExit();
+        writeConfigFile(mainFile, false, true, null, "test");
+
+        // Load config
+        ApplicationRegistry reg = new ConfigurationFileApplicationRegistry(mainFile);
+        ApplicationRegistry.initialise(reg);
+
+        // Test config
+        VirtualHostRegistry virtualHostRegistry = reg.getVirtualHostRegistry();
+        String defaultVirtualHost = reg.getConfiguration().getDefaultVirtualHost();
+        VirtualHost virtualHost = virtualHostRegistry.getVirtualHost("test");
+        Exchange exchange = virtualHost.getExchangeRegistry().getExchange(new AMQShortString("test.topic"));
+
+        assertEquals("Incorrect default host", "test", defaultVirtualHost);
+        assertEquals("Incorrect virtualhost count", 1, virtualHostRegistry.getVirtualHosts().size());
+        assertEquals("Incorrect virtualhost name", "test", virtualHost.getName());
+        assertEquals("Incorrect exchange type", "topic", exchange.getType().getName().toString());
+    }
+    
+    /**
+     * Test that configuration loads correctly when virtual hosts are specified in an external
+     * configuration file only.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testExternalVirtualhostXMLFile() throws Exception
+    {
+        // Write out config
+        File mainFile = File.createTempFile(getClass().getName(), "config");
+        mainFile.deleteOnExit();
+        File vhostsFile = File.createTempFile(getClass().getName(), "vhosts");
+        vhostsFile.deleteOnExit();
+        writeConfigFile(mainFile, false, false, vhostsFile, null);    
+        writeVirtualHostsFile(vhostsFile, "test");
+
+        // Load config
+        ApplicationRegistry reg = new ConfigurationFileApplicationRegistry(mainFile);
+        ApplicationRegistry.initialise(reg);
+
+        // Test config
+        VirtualHostRegistry virtualHostRegistry = reg.getVirtualHostRegistry();
+        String defaultVirtualHost = reg.getConfiguration().getDefaultVirtualHost();
+        VirtualHost virtualHost = virtualHostRegistry.getVirtualHost("test");
+        Exchange exchange = virtualHost.getExchangeRegistry().getExchange(new AMQShortString("test.topic"));
+
+        assertEquals("Incorrect default host", "test", defaultVirtualHost);
+        assertEquals("Incorrect virtualhost count", 1, virtualHostRegistry.getVirtualHosts().size());
+        assertEquals("Incorrect virtualhost name", "test", virtualHost.getName());
+        assertEquals("Incorrect exchange type", "topic", exchange.getType().getName().toString());
+    }
+    
+    /**
+     * Test that configuration loads correctly when virtual hosts are specified in an external
+     * configuration file only, with two vhosts that have different properties.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testExternalMultiVirtualhostXMLFile() throws Exception
+    {
+        // Write out vhosts
+        File vhostsFile = File.createTempFile(getClass().getName(), "vhosts-multi");
+        vhostsFile.deleteOnExit();
+        writeMultiVirtualHostsFile(vhostsFile);
+        
+        // Write out config
+        File mainFile = File.createTempFile(getClass().getName(), "config");
+        mainFile.deleteOnExit();
+        writeConfigFile(mainFile, false, false, vhostsFile, null);
+
+        // Load config
+        ApplicationRegistry reg = new ConfigurationFileApplicationRegistry(mainFile);
+        ApplicationRegistry.initialise(reg);
+
+        // Test config
+        VirtualHostRegistry virtualHostRegistry = reg.getVirtualHostRegistry();
+
+        assertEquals("Incorrect virtualhost count", 2, virtualHostRegistry.getVirtualHosts().size());
+        
+        // test topic host
+        VirtualHost topicVirtualHost = virtualHostRegistry.getVirtualHost("topic");
+        Exchange topicExchange = topicVirtualHost.getExchangeRegistry().getExchange(new AMQShortString("test.topic"));
+        
+        assertEquals("Incorrect topic virtualhost name", "topic", topicVirtualHost.getName());
+        assertEquals("Incorrect topic exchange type", "topic", topicExchange.getType().getName().toString());
+        
+        // Test fanout host
+        VirtualHost fanoutVirtualHost = virtualHostRegistry.getVirtualHost("fanout");
+        Exchange fanoutExchange = fanoutVirtualHost.getExchangeRegistry().getExchange(new AMQShortString("test.fanout"));
+        
+        assertEquals("Incorrect fanout virtualhost name", "fanout", fanoutVirtualHost.getName());
+        assertEquals("Incorrect fanout exchange type", "fanout", fanoutExchange.getType().getName().toString());
+    }
+    
+    /**
+     * Test that configuration does not load when virtual hosts are specified in both the main
+     * configuration file and an external file. Should throw a {@link Exception}.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testInternalAndExternalVirtualhostXMLFile() throws Exception
+    {
+        // Write out vhosts
+        File vhostsFile = File.createTempFile(getClass().getName(), "vhosts");
+        vhostsFile.deleteOnExit();
+        writeVirtualHostsFile(vhostsFile, "test");
+        
+        // Write out config
+        File mainFile = File.createTempFile(getClass().getName(), "config");
+        mainFile.deleteOnExit();
+        writeConfigFile(mainFile, false, true, vhostsFile, "test");
+        
+        // Load config
+        try
+        {       
+            ApplicationRegistry reg = new ConfigurationFileApplicationRegistry(mainFile);
+            ApplicationRegistry.initialise(reg);
+            fail("Different virtualhost XML configurations not allowed");
+        }
+        catch (Exception ce)
+        {
+            assertEquals("Incorrect error message", "Only one of external or embedded virtualhosts configuration allowed.", ce.getMessage());
+        }
+    }
+    
+    /**
+     * Test that configuration does not load when virtual hosts are specified in multiple external
+     * files. Should throw a {@link Exception}.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testMultipleInternalVirtualhostXMLFile() throws Exception
+    {
+        // Write out vhosts
+        File vhostsFileOne = File.createTempFile(getClass().getName(), "vhosts-one");
+        vhostsFileOne.deleteOnExit();
+        writeVirtualHostsFile(vhostsFileOne, "one");
+        File vhostsFileTwo = File.createTempFile(getClass().getName(), "vhosts-two");
+        vhostsFileTwo.deleteOnExit();
+        writeVirtualHostsFile(vhostsFileTwo, "two");
+        
+        // Write out config
+        File mainFile = File.createTempFile(getClass().getName(), "config");
+        mainFile.deleteOnExit();
+        writeMultipleVhostsConfigFile(mainFile, new File[] { vhostsFileOne, vhostsFileTwo });
+        
+        // Load config
+        try
+        {
+            ApplicationRegistry reg = new ConfigurationFileApplicationRegistry(mainFile);
+            ApplicationRegistry.initialise(reg);
+            fail("Multiple virtualhost XML configurations not allowed");
+        }
+        catch (Exception ce)
+        {
+            assertEquals("Incorrect error message",
+                    "Only one external virtualhosts configuration file allowed, multiple filenames found.",
+                    ce.getMessage());
+        }
+    }
+    
+    /**
+     * Test that configuration loads correctly when virtual hosts are specified in an external
+     * configuration file in the first of two configurations and embedded in the second. This
+     * will throe a {@link Exception} since the configurations have different 
+     * types.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testCombinedDifferentVirtualhostConfig() throws Exception
+    {
+        // Write out vhosts config
+        File vhostsFile = File.createTempFile(getClass().getName(), "vhosts");
+        vhostsFile.deleteOnExit();  
+        writeVirtualHostsFile(vhostsFile, "external");
+        
+        // Write out combined config file
+        File mainFile = File.createTempFile(getClass().getName(), "main");
+        File fileA = File.createTempFile(getClass().getName(), "a");
+        File fileB = File.createTempFile(getClass().getName(), "b");
+        mainFile.deleteOnExit();
+        fileA.deleteOnExit();
+        fileB.deleteOnExit();
+        writeCombinedConfigFile(mainFile, fileA, fileB);
+        writeConfigFile(fileA, false, false, vhostsFile, null);  
+        writeConfigFile(fileB, false);
+
+        // Load config
+        try
+        {
+            ServerConfiguration config = new ServerConfiguration(mainFile.getAbsoluteFile());
+	        TestApplicationRegistry instance = new TestApplicationRegistry(config);
+	        ApplicationRegistry.initialise(instance);
+            config.initialise();
+            fail("Different virtualhost XML configurations not allowed");
+        }
+        catch (Exception ce)
+        {
+            assertEquals("Incorrect error message", "Only one of external or embedded virtualhosts configuration allowed.", ce.getMessage());
+        }
+    }
+
+    /**
+     * Test that configuration loads correctly when virtual hosts are specified two overriding configurations
+     * each with an embedded virtualhost section. The first configuration section should be used.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testCombinedConfigEmbeddedVirtualhost() throws Exception
+    {
+        // Write out combined config file
+        File mainFile = File.createTempFile(getClass().getName(), "main");
+        File fileA = File.createTempFile(getClass().getName(), "a");
+        File fileB = File.createTempFile(getClass().getName(), "b");
+        mainFile.deleteOnExit();
+        fileA.deleteOnExit();
+        fileB.deleteOnExit();
+        writeCombinedConfigFile(mainFile, fileA, fileB);
+        writeConfigFile(fileA, false, true, null, "a");
+        writeConfigFile(fileB, false, true, null, "b"); 
+
+        // Load config
+        ServerConfiguration config = new ServerConfiguration(mainFile.getAbsoluteFile());
+        TestApplicationRegistry instance = new TestApplicationRegistry(config);
+        ApplicationRegistry.initialise(instance);
+        config.initialise();
+        
+        // Test config
+        VirtualHostConfiguration virtualHost = config.getVirtualHostConfig("a");
+
+        assertEquals("Incorrect virtualhost count", 1, config.getVirtualHosts().length);
+        assertEquals("Incorrect virtualhost name", "a", virtualHost.getName());
+    }
+
+    /**
+     * Test that configuration loads correctly when virtual hosts are specified two overriding configurations
+     * each with an external virtualhost XML file. The first configuration file should be used.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testCombinedConfigExternalVirtualhost() throws Exception
+    {
+        // Write out vhosts config
+        File vhostsOne = File.createTempFile(getClass().getName(), "vhosts-one");
+        vhostsOne.deleteOnExit();
+        writeVirtualHostsFile(vhostsOne, "one");
+        File vhostsTwo = File.createTempFile(getClass().getName(), "vhosts-two");
+        vhostsTwo.deleteOnExit();
+        writeVirtualHostsFile(vhostsTwo, "two");
+        
+        // Write out combined config file
+        File mainFile = File.createTempFile(getClass().getName(), "main");
+        File fileA = File.createTempFile(getClass().getName(), "a");
+        File fileB = File.createTempFile(getClass().getName(), "b");
+        mainFile.deleteOnExit();
+        fileA.deleteOnExit();
+        fileB.deleteOnExit();
+        writeCombinedConfigFile(mainFile, fileA, fileB);
+        writeConfigFile(fileA, false, false, vhostsOne, null);
+        writeConfigFile(fileB, false, false, vhostsTwo, null);
+
+        // Load config
+        ServerConfiguration config = new ServerConfiguration(mainFile.getAbsoluteFile());
+        TestApplicationRegistry instance = new TestApplicationRegistry(config);
+        ApplicationRegistry.initialise(instance);
+        config.initialise();
+        
+        // Test config
+        VirtualHostConfiguration virtualHost = config.getVirtualHostConfig("one");
+
+        assertEquals("Incorrect virtualhost count", 1, config.getVirtualHosts().length);
+        assertEquals("Incorrect virtualhost name", "one", virtualHost.getName());
+    }
+
+    /**
+     * Test that configuration loads correctly when an overriding virtualhost configuration resets
+     * a property of an embedded virtualhost section. The overriding configuration property value
+     * should be used.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testCombinedConfigEmbeddedVirtualhostOverride() throws Exception
+    {
+        // Write out combined config file
+        File mainFile = File.createTempFile(getClass().getName(), "main");
+        File fileA = File.createTempFile(getClass().getName(), "override");
+        File fileB = File.createTempFile(getClass().getName(), "config");
+        mainFile.deleteOnExit();
+        fileA.deleteOnExit();
+        fileB.deleteOnExit();
+        writeCombinedConfigFile(mainFile, fileA, fileB);
+        writeTestFishConfigFile(fileB);
+        
+        // Write out overriding virtualhosts section
+        FileWriter out = new FileWriter(fileA);
+        out.write("<broker>\n");
+        out.write("<virtualhosts>\n");
+        out.write("\t<virtualhost>\n");
+        out.write("\t\t<test>\n");
+        out.write("\t\t\t<exchanges>\n");
+        out.write("\t\t\t\t<exchange>\n");
+        out.write("\t\t\t\t\t<durable>false</durable>\n");
+        out.write("\t\t\t\t</exchange>\n");
+        out.write("\t\tt</exchanges>\n");
+        out.write("\t\t</test>\n");
+        out.write("\t\t<fish>\n");
+        out.write("\t\t\t<exchanges>\n");
+        out.write("\t\t\t\t<exchange>\n");
+        out.write("\t\t\t\t\t<durable>true</durable>\n");
+        out.write("\t\t\t\t</exchange>\n");
+        out.write("\t\tt</exchanges>\n");
+        out.write("\t\t</fish>\n");
+        out.write("\t</virtualhost>\n");
+        out.write("</virtualhosts>\n");
+        out.write("</broker>\n");
+        out.close();
+
+        // Load config
+        ServerConfiguration config = new ServerConfiguration(mainFile.getAbsoluteFile());
+        TestApplicationRegistry instance = new TestApplicationRegistry(config);
+        ApplicationRegistry.initialise(instance);
+        config.initialise();
+        
+        // Test config
+        VirtualHostConfiguration testHost = config.getVirtualHostConfig("test");
+        ExchangeConfiguration testExchange = testHost.getExchangeConfiguration("test.topic");
+        VirtualHostConfiguration fishHost = config.getVirtualHostConfig("fish");
+        ExchangeConfiguration fishExchange = fishHost.getExchangeConfiguration("fish.topic");
+
+        assertEquals("Incorrect virtualhost count", 2, config.getVirtualHosts().length);
+        assertEquals("Incorrect virtualhost name", "test", testHost.getName());
+        assertFalse("Incorrect exchange durable property", testExchange.getDurable());
+        assertEquals("Incorrect virtualhost name", "fish", fishHost.getName());
+        assertTrue("Incorrect exchange durable property", fishExchange.getDurable());
+    }
+
+    /**
+     * Test that configuration loads correctly when the virtualhost configuration is a set of overriding
+     * configuration files that resets a property of a virtualhost. The opmost overriding configuration
+     * property value should be used.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testCombinedVirtualhostOverride() throws Exception
+    {
+        // Write out combined config file
+        File mainFile = File.createTempFile(getClass().getName(), "main");
+        File vhostsFile = File.createTempFile(getClass().getName(), "vhosts");
+        File fileA = File.createTempFile(getClass().getName(), "vhosts-override");
+        File fileB = File.createTempFile(getClass().getName(), "vhosts-base");
+        mainFile.deleteOnExit();
+        vhostsFile.deleteOnExit();
+        fileA.deleteOnExit();
+        fileB.deleteOnExit();
+        writeConfigFile(mainFile, true, false, vhostsFile, null);
+        writeCombinedConfigFile(vhostsFile, fileA, fileB);
+
+        // Write out overriding virtualhosts sections
+        FileWriter out = new FileWriter(fileA);
+        out.write("<virtualhosts>\n");
+        out.write("\t<virtualhost>\n");
+        out.write("\t\t<test>\n");
+        out.write("\t\t\t<exchanges>\n");
+        out.write("\t\t\t\t<exchange>\n");
+        out.write("\t\t\t\t\t<durable>false</durable>\n");
+        out.write("\t\t\t\t</exchange>\n");
+        out.write("\t\tt</exchanges>\n");
+        out.write("\t\t</test>\n");
+        out.write("\t</virtualhost>\n");
+        out.write("</virtualhosts>\n");
+        out.close();
+        writeVirtualHostsFile(fileB, "test");
+
+        // Load config
+        ServerConfiguration config = new ServerConfiguration(mainFile.getAbsoluteFile());
+        TestApplicationRegistry instance = new TestApplicationRegistry(config);
+        ApplicationRegistry.initialise(instance);
+        config.initialise();
+        
+        // Test config
+        VirtualHostConfiguration testHost = config.getVirtualHostConfig("test");
+        ExchangeConfiguration testExchange = testHost.getExchangeConfiguration("test.topic");
+
+        assertEquals("Incorrect virtualhost count", 1, config.getVirtualHosts().length);
+        assertEquals("Incorrect virtualhost name", "test", testHost.getName());
+        assertFalse("Incorrect exchange durable property", testExchange.getDurable());
+    }
+
+    /**
+     * Test that configuration loads correctly when the virtualhost configuration is a set of overriding
+     * configuration files that define multiple virtualhosts, one per file. Only the virtualhosts defined in
+     * the topmost file should be used.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testCombinedMultipleVirtualhosts() throws Exception
+    {
+        // Write out combined config file
+        File mainFile = File.createTempFile(getClass().getName(), "main");
+        File vhostsFile = File.createTempFile(getClass().getName(), "vhosts");
+        File fileA = File.createTempFile(getClass().getName(), "vhosts-one");
+        File fileB = File.createTempFile(getClass().getName(), "vhosts-two");
+        mainFile.deleteOnExit();
+        vhostsFile.deleteOnExit();
+        fileA.deleteOnExit();
+        fileB.deleteOnExit();
+        writeConfigFile(mainFile, true, false, vhostsFile, null);
+        writeCombinedConfigFile(vhostsFile, fileA, fileB);
+
+        // Write both virtualhosts definitions
+        writeVirtualHostsFile(fileA, "test-one");
+        writeVirtualHostsFile(fileB, "test-two");
+
+        // Load config
+        ServerConfiguration config = new ServerConfiguration(mainFile.getAbsoluteFile());
+        TestApplicationRegistry instance = new TestApplicationRegistry(config);
+        ApplicationRegistry.initialise(instance);
+        config.initialise();
+        
+        // Test config
+        VirtualHostConfiguration oneHost = config.getVirtualHostConfig("test-one");
+
+        assertEquals("Incorrect virtualhost count", 1, config.getVirtualHosts().length);
+        assertEquals("Incorrect virtualhost name", "test-one", oneHost.getName());
+    }
+
+    /**
+     * Test that a non-existant virtualhost file throws a {@link Exception}.
+     * <p>
+     * Test for QPID-2624
+     */
+    public void testNonExistantVirtualhosts() throws Exception
+    {
+        // Write out combined config file
+        File mainFile = File.createTempFile(getClass().getName(), "main");
+        File vhostsFile = new File("doesnotexist");
+        mainFile.deleteOnExit();
+        writeConfigFile(mainFile, true, false, vhostsFile, null);
+
+        // Load config
+        try
+        {
+            ServerConfiguration config = new ServerConfiguration(mainFile.getAbsoluteFile());
+	        TestApplicationRegistry instance = new TestApplicationRegistry(config);
+	        ApplicationRegistry.initialise(instance);
+            config.initialise();
+        }
+        catch (ConfigurationException ce)
+        {
+            assertEquals("Virtualhosts file does not exist", ce.getMessage());
+        }
+        catch (Exception e)
+        {
+            fail("Should throw a Exception");
+        }
+    }
+}

Modified: qpid/branches/grkvlt-network-20101013/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/QueueConfigurationTest.java
URL: http://svn.apache.org/viewvc/qpid/branches/grkvlt-network-20101013/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/QueueConfigurationTest.java?rev=1022127&r1=1022126&r2=1022127&view=diff
==============================================================================
--- qpid/branches/grkvlt-network-20101013/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/QueueConfigurationTest.java (original)
+++ qpid/branches/grkvlt-network-20101013/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/QueueConfigurationTest.java Wed Oct 13 15:05:29 2010
@@ -20,12 +20,12 @@
  */
 package org.apache.qpid.server.configuration;
 
-import junit.framework.TestCase;
 import org.apache.commons.configuration.CompositeConfiguration;
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.qpid.test.utils.QpidTestCase;
 
-public class QueueConfigurationTest extends TestCase
+public class QueueConfigurationTest extends QpidTestCase
 {
 
     private VirtualHostConfiguration _emptyConf;



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org