diff options
| author | Martin Ritchie <ritchiem@apache.org> | 2009-08-06 09:39:28 +0000 |
|---|---|---|
| committer | Martin Ritchie <ritchiem@apache.org> | 2009-08-06 09:39:28 +0000 |
| commit | 2c7a2197fca7a86f6ebede1d238518afcbf85fd9 (patch) | |
| tree | 5825d40ba249b3d9f5f5889f76b4718cfe2dbb17 /java/systests | |
| parent | 0d20ef4c1d46f1591a70973140d477ae16be2c9f (diff) | |
| download | qpid-python-2c7a2197fca7a86f6ebede1d238518afcbf85fd9.tar.gz | |
QPID-2002: MessageStore Logging , DerbyMS Does not have Queue Recovery logging just yet as its approach to recovery does not provide the requried details.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@801572 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/systests')
3 files changed, 457 insertions, 1 deletions
diff --git a/java/systests/src/main/java/org/apache/qpid/server/logging/DerbyMessageStoreLoggingTest.java b/java/systests/src/main/java/org/apache/qpid/server/logging/DerbyMessageStoreLoggingTest.java new file mode 100644 index 0000000000..0d365467d2 --- /dev/null +++ b/java/systests/src/main/java/org/apache/qpid/server/logging/DerbyMessageStoreLoggingTest.java @@ -0,0 +1,256 @@ +/* + * + * 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.logging; + +import org.apache.commons.configuration.Configuration; +import org.apache.qpid.server.configuration.ServerConfiguration; +import org.apache.qpid.server.logging.subjects.AbstractTestLogSubject; + +import java.util.List; + +/** + * The MessageStore test suite validates that the follow log messages as + * specified in the Functional Specification. + * + * This suite of tests validate that the MessageStore messages occur correctly + * and according to the following format: + * + * MST-1001 : Created : <name> + * MST-1003 : Closed + * + * NOTE: Only for Persistent Stores + * MST-1002 : Store location : <path> + * MST-1004 : Recovery Start [: <queue.name>] + * MST-1005 : Recovered <count> messages for queue <queue.name> + * MST-1006 : Recovery Complete [: <queue.name>] + */ +public class DerbyMessageStoreLoggingTest extends MemoryMessageStoreLoggingTest +{ + + @Override + public void setUp() throws Exception + { + super.setUp(); + // MemoryMessageStoreLoggingTest setUp itself does not call super.setUp + //We call super.setUp but this will not start the broker as that is + //part of the test case. + + // Load current configuration file to get the list of defined vhosts + Configuration configuration = ServerConfiguration.flatConfig(_configFile); + List<String> vhosts = configuration.getList("virtualhosts.virtualhost.name"); + + // Make them all persistent i.e. Use DerbyMessageStore and + // test that it logs correctly. + for (String vhost : vhosts) + { + makeVirtualHostPersistent(vhost); + } + } + + /** + * Description: + * Persistent MessageStores will require space on disk to persist the data. + * This value will be logged on startup after the MessageStore has been + * created. + * Input: + * Default configuration + * Output: + * + * <date> MST-1002 : Store location : <path> + * + * Validation Steps: + * + * 1. The MST ID is correct + * 2. This must occur after MST-1001 + */ + public void testMessageStoreStoreLocation() throws Exception + { + assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX); + + startBroker(); + + List<String> results = _monitor.findMatches(MESSAGES_STORE_PREFIX); + + // Validation + + assertTrue("MST messages not logged", results.size() > 0); + + // Load VirtualHost list from file. + Configuration configuration = ServerConfiguration.flatConfig(_configFile); + List<String> vhosts = configuration.getList("virtualhosts.virtualhost.name"); + + //Validate each vhost logs a creation + results = _monitor.findMatches("MST-1002"); + + assertEquals("Each vhost did not close its store.", vhosts.size(), results.size()); + + for (int index = 0; index < results.size(); index++) + { + String result = getLog(results.get(index)); + + // getSlize will return extract the vhost from vh(/test) -> '/test' + // so remove the '/' to get the name + String vhostName = AbstractTestLogSubject.getSlice("vh", result).substring(1); + + // To get the store class used in the configuration we need to know + // the virtualhost name, found above. AND + // the index that the virtualhost is within the configuration. + // we can retrive that from the vhosts list previously extracted. + String fullStoreName = configuration.getString("virtualhosts.virtualhost(" + vhosts.indexOf(vhostName) + ")." + vhostName + ".store.class"); + String storePath = configuration.getString("virtualhosts.virtualhost(" + vhosts.indexOf(vhostName) + ")." + vhostName + ".store.environment-path"); + + // Get the Simple class name from the expected class name of o.a.q.s.s.MMS + String storeName = fullStoreName.substring(fullStoreName.lastIndexOf(".") + 1); + + assertTrue("MST-1002 does not contain requried store path'" + + storePath + "' found:" + getMessageString(result), + getMessageString(result).endsWith(storePath)); + + assertEquals("The store name does not match expected value", + storeName, AbstractTestLogSubject.getSlice("ms", fromSubject(result))); + } + } + + /** + * Description: + * Persistent message stores may have state on disk that they must recover + * during startup. As the MessageStore starts up it will report that it is + * about to start the recovery process by logging MST-1004. This message + * will always be logged for persistent MessageStores. If there is no data + * to recover then there will be no subsequent recovery messages. + * Input: + * Default persistent configuration + * Output: + * <date> MST-1004 : Recovery Start + * + * Validation Steps: + * + * 1. The MST ID is correct + * 2. The MessageStore must have first logged a creation event. + */ + public void testMessageStoreRecoveryStart() throws Exception + { + assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX); + + startBroker(); + + List<String> results = _monitor.findMatches(MESSAGES_STORE_PREFIX); + + // Validation + + assertTrue("MST messages not logged", results.size() > 0); + + // Load VirtualHost list from file. + Configuration configuration = ServerConfiguration.flatConfig(_configFile); + List<String> vhosts = configuration.getList("virtualhosts.virtualhost.name"); + + //Validate each vhost logs a creation + results = _monitor.findMatches("MST-1004"); + + assertEquals("Each vhost did not close its store.", vhosts.size(), results.size()); + + for (int index = 0; index < results.size(); index++) + { + String result = getLog(results.get(index)); + + // getSlize will return extract the vhost from vh(/test) -> '/test' + // so remove the '/' to get the name + String vhostName = AbstractTestLogSubject.getSlice("vh", result).substring(1); + + // To get the store class used in the configuration we need to know + // the virtualhost name, found above. AND + // the index that the virtualhost is within the configuration. + // we can retrive that from the vhosts list previously extracted. + String fullStoreName = configuration.getString("virtualhosts.virtualhost(" + vhosts.indexOf(vhostName) + ")." + vhostName + ".store.class"); + + // Get the Simple class name from the expected class name of o.a.q.s.s.MMS + String storeName = fullStoreName.substring(fullStoreName.lastIndexOf(".") + 1); + + assertEquals("MST-1004 does have expected message", "Recovery Start", + getMessageString(result)); + + assertEquals("The store name does not match expected value", + storeName, AbstractTestLogSubject.getSlice("ms", fromSubject(result))); + } + } + + /** + * Description: + * Once all persistent queues have been recovered and the MessageStore has completed all recovery it must logged that the recovery process has completed. + * Input: + * Default persistent configuration + * Output: + * + * <date> MST-1006 : Recovery Complete + * + * Validation Steps: + * + * 1. The MST ID is correct + * 2. This is the last message from the MessageStore during startup. + * 3. This must be proceeded by a MST-1006 Recovery Start. + */ + public void testMessageStoreRecoveryComplete() throws Exception + { + assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX); + + startBroker(); + + List<String> results = _monitor.findMatches(MESSAGES_STORE_PREFIX); + + // Validation + + assertTrue("MST messages not logged", results.size() > 0); + + // Load VirtualHost list from file. + Configuration configuration = ServerConfiguration.flatConfig(_configFile); + List<String> vhosts = configuration.getList("virtualhosts.virtualhost.name"); + + //Validate each vhost logs a creation + results = _monitor.findMatches("MST-1006"); + + assertEquals("Each vhost did not close its store.", vhosts.size(), results.size()); + + for (int index = 0; index < results.size(); index++) + { + String result = getLog(results.get(index)); + + // getSlize will return extract the vhost from vh(/test) -> '/test' + // so remove the '/' to get the name + String vhostName = AbstractTestLogSubject.getSlice("vh", result).substring(1); + + // To get the store class used in the configuration we need to know + // the virtualhost name, found above. AND + // the index that the virtualhost is within the configuration. + // we can retrive that from the vhosts list previously extracted. + String fullStoreName = configuration.getString("virtualhosts.virtualhost(" + vhosts.indexOf(vhostName) + ")." + vhostName + ".store.class"); + + // Get the Simple class name from the expected class name of o.a.q.s.s.MMS + String storeName = fullStoreName.substring(fullStoreName.lastIndexOf(".") + 1); + + assertEquals("MST-1006 does have expected message", "Recovery Complete", + getMessageString(result)); + + assertEquals("The store name does not match expected value", + storeName, AbstractTestLogSubject.getSlice("ms", fromSubject(result))); + } + } + +} diff --git a/java/systests/src/main/java/org/apache/qpid/server/logging/MemoryMessageStoreLoggingTest.java b/java/systests/src/main/java/org/apache/qpid/server/logging/MemoryMessageStoreLoggingTest.java new file mode 100644 index 0000000000..280fc7d83b --- /dev/null +++ b/java/systests/src/main/java/org/apache/qpid/server/logging/MemoryMessageStoreLoggingTest.java @@ -0,0 +1,200 @@ +/* +* +* 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.logging; + +import org.apache.commons.configuration.Configuration; +import org.apache.qpid.server.configuration.ServerConfiguration; +import org.apache.qpid.server.logging.subjects.AbstractTestLogSubject; +import org.apache.qpid.util.LogMonitor; + +import java.io.File; +import java.util.List; + +/** + * The MessageStore test suite validates that the follow log messages as + * specified in the Functional Specification. + * + * This suite of tests validate that the MessageStore messages occur correctly + * and according to the following format: + * + * MST-1001 : Created : <name> + * MST-1003 : Closed + * + * NOTE: Only for Persistent Stores + * MST-1002 : Store location : <path> + * MST-1004 : Recovery Start [: <queue.name>] + * MST-1005 : Recovered <count> messages for queue <queue.name> + * MST-1006 : Recovery Complete [: <queue.name>] + */ +public class MemoryMessageStoreLoggingTest extends AbstractTestLogging +{ + protected static final String MESSAGES_STORE_PREFIX = "MST-"; + + public void setUp() throws Exception + { + // set QPID_WORK to be [QPID_WORK|io.tmpdir]/<testName> + setSystemProperty("QPID_WORK", + System.getProperty("QPID_WORK", + System.getProperty("java.io.tmpdir")) + + File.separator + getName()); + + + //We explicitly do not call super.setUp as starting up the broker is + //part of the test case. + // So we have to make the new Log Monitor here + + _monitor = new LogMonitor(_outputFile); + } + + /** + * Description: + * During Virtualhost startup a MessageStore will be created. The first MST + * message that must be logged is the MST-1001 MessageStore creation. + * Input: + * Default configuration + * Output: + * <date> MST-1001 : Created : <name> + * + * Validation Steps: + * + * 1. The MST ID is correct + * 2. The <name> is the correct MessageStore type as specified in the Default configuration + * + * @throws Exception caused by broker startup + */ + public void testMessageStoreCreation() throws Exception + { + assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX); + + startBroker(); + + List<String> results = _monitor.findMatches(MESSAGES_STORE_PREFIX); + + // Validation + + assertTrue("MST messages not logged", results.size() > 0); + + String log = getLog(results.get(0)); + //1 + assertEquals("MST-1001 is not the first MST message", "MST-1001", getMessageID(fromMessage(log))); + + // Load VirtualHost list from file. + Configuration configuration = ServerConfiguration.flatConfig(_configFile); + List<String> vhosts = configuration.getList("virtualhosts.virtualhost.name"); + + //Validate each vhost logs a creation + results = _monitor.findMatches("MST-1001"); + + assertEquals("Each vhost did not create a store.", vhosts.size(), results.size()); + + for (int index = 0; index < results.size(); index++) + { + String result = getLog(results.get(index)); + + // getSlize will return extract the vhost from vh(/test) -> '/test' + // so remove the '/' to get the name + String vhostName = AbstractTestLogSubject.getSlice("vh", result).substring(1); + + // To get the store class used in the configuration we need to know + // the virtualhost name, found above. AND + // the index that the virtualhost is within the configuration. + // we can retrive that from the vhosts list previously extracted. + String fullStoreName = configuration.getString("virtualhosts.virtualhost(" + vhosts.indexOf(vhostName) + ")." + vhostName + ".store.class"); + + // Get the Simple class name from the expected class name of o.a.q.s.s.MMS + String storeName = fullStoreName.substring(fullStoreName.lastIndexOf(".") + 1); + + assertTrue("MST-1001 does not contains correct store name:" + + storeName + ":" + result, getMessageString(result).endsWith(storeName)); + + assertEquals("The store name does not match expected value", + storeName, AbstractTestLogSubject.getSlice("ms", fromSubject(result))); + } + } + + /** + * Description: + * During shutdown the MessageStore will also cleanly close. When this has + * completed a MST-1003 closed message will be logged. No further messages + * from this MessageStore will be logged after this message. + * + * Input: + * Default configuration + * Output: + * <date> MST-1003 : Closed + * + * Validation Steps: + * + * 1. The MST ID is correct + * 2. This is teh last log message from this MessageStore + * + * @throws Exception caused by broker startup + */ + public void testMessageStoreClose() throws Exception + { + assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX); + + startBroker(); + + //Stop the broker so we get the close messages. + stopBroker(); + + List<String> results = _monitor.findMatches(MESSAGES_STORE_PREFIX); + + // Validation + + assertTrue("MST messages not logged", results.size() > 0); + + // Load VirtualHost list from file. + Configuration configuration = ServerConfiguration.flatConfig(_configFile); + List<String> vhosts = configuration.getList("virtualhosts.virtualhost.name"); + + //Validate each vhost logs a creation + results = _monitor.findMatches("MST-1003"); + + assertEquals("Each vhost did not close its store.", vhosts.size(), results.size()); + + for (int index = 0; index < results.size(); index++) + { + String result = getLog(results.get(index)); + + // getSlize will return extract the vhost from vh(/test) -> '/test' + // so remove the '/' to get the name + String vhostName = AbstractTestLogSubject.getSlice("vh", result).substring(1); + + // To get the store class used in the configuration we need to know + // the virtualhost name, found above. AND + // the index that the virtualhost is within the configuration. + // we can retrive that from the vhosts list previously extracted. + String fullStoreName = configuration.getString("virtualhosts.virtualhost(" + vhosts.indexOf(vhostName) + ")." + vhostName + ".store.class"); + + // Get the Simple class name from the expected class name of o.a.q.s.s.MMS + String storeName = fullStoreName.substring(fullStoreName.lastIndexOf(".") + 1); + + assertEquals("MST-1003 does not close:", + "Closed", getMessageString(result)); + + assertEquals("The store name does not match expected value", + storeName, AbstractTestLogSubject.getSlice("ms", fromSubject(result))); + } + } + +} diff --git a/java/systests/src/main/java/org/apache/qpid/test/utils/QpidTestCase.java b/java/systests/src/main/java/org/apache/qpid/test/utils/QpidTestCase.java index c182db5d78..b9b1eadb0c 100644 --- a/java/systests/src/main/java/org/apache/qpid/test/utils/QpidTestCase.java +++ b/java/systests/src/main/java/org/apache/qpid/test/utils/QpidTestCase.java @@ -540,7 +540,7 @@ public class QpidTestCase extends TestCase ".store.class", storeClass.getName()); configuration.setProperty("virtualhosts.virtualhost." + virtualhost + ".store." + DerbyMessageStore.ENVIRONMENT_PATH_PROPERTY, - "${work}"); + "${work}/"+virtualhost); File tmpFile = File.createTempFile("configFile", "test"); tmpFile.deleteOnExit(); |
