diff options
| author | Martin Ritchie <ritchiem@apache.org> | 2009-08-06 17:00:04 +0000 |
|---|---|---|
| committer | Martin Ritchie <ritchiem@apache.org> | 2009-08-06 17:00:04 +0000 |
| commit | 19df22c7e0600730febfaa1c89cf327dc84e98eb (patch) | |
| tree | 68d1894ce0f90e3befc182e4c83b20381ce04c5a | |
| parent | cb0a034781906ca86f28688361b05685d3defacf (diff) | |
| download | qpid-python-19df22c7e0600730febfaa1c89cf327dc84e98eb.tar.gz | |
QPID-2002 : Add Binding Logging Messages with test
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@801723 13f79535-47bb-0310-9956-ffa450edef68
4 files changed, 293 insertions, 19 deletions
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ExchangeBinding.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ExchangeBinding.java index a2fcab9e73..7584a3b7cc 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ExchangeBinding.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ExchangeBinding.java @@ -21,6 +21,10 @@ package org.apache.qpid.server.queue; import org.apache.qpid.server.exchange.Exchange; +import org.apache.qpid.server.logging.actors.CurrentActor; +import org.apache.qpid.server.logging.messages.BindingMessages; +import org.apache.qpid.server.logging.subjects.BindingLogSubject; +import org.apache.qpid.server.logging.LogSubject; import org.apache.qpid.framing.AMQShortString; import org.apache.qpid.framing.FieldTable; import org.apache.qpid.AMQException; @@ -31,23 +35,26 @@ public class ExchangeBinding private final AMQShortString _routingKey; private final FieldTable _arguments; - private static final FieldTable EMPTY_ARGUMENTS = new FieldTable(); + private static final FieldTable EMPTY_ARGUMENTS = new FieldTable(); + private LogSubject _logSubject; - ExchangeBinding(AMQShortString routingKey, Exchange exchange) - { - this(routingKey, exchange, EMPTY_ARGUMENTS); - } - - ExchangeBinding(AMQShortString routingKey, Exchange exchange, FieldTable arguments) + ExchangeBinding(AMQShortString routingKey, Exchange exchange, AMQQueue queue, FieldTable arguments) { _routingKey = routingKey == null ? AMQShortString.EMPTY_STRING : routingKey; _exchange = exchange; _arguments = arguments == null ? EMPTY_ARGUMENTS : arguments; + _logSubject = new BindingLogSubject(routingKey,exchange,queue); + + CurrentActor.get().message(_logSubject, BindingMessages.BND_1001(_arguments.toString(), arguments != null)); } + + void unbind(AMQQueue queue) throws AMQException { _exchange.deregisterQueue(_routingKey, queue, _arguments); + + CurrentActor.get().message(_logSubject, BindingMessages.BND_1002()); } public Exchange getExchange() diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ExchangeBindings.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ExchangeBindings.java index fb839c1783..89262aee59 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ExchangeBindings.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ExchangeBindings.java @@ -52,13 +52,13 @@ class ExchangeBindings */ void addBinding(AMQShortString routingKey, FieldTable arguments, Exchange exchange) { - _bindings.add(new ExchangeBinding(routingKey, exchange, arguments)); + _bindings.add(new ExchangeBinding(routingKey, exchange, _queue, arguments)); } public boolean remove(AMQShortString routingKey, FieldTable arguments, Exchange exchange) { - return _bindings.remove(new ExchangeBinding(routingKey, exchange, arguments)); + return _bindings.remove(new ExchangeBinding(routingKey, exchange, _queue, arguments)); } diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/server/logging/BindingLoggingTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/server/logging/BindingLoggingTest.java new file mode 100644 index 0000000000..835d90ba8c --- /dev/null +++ b/qpid/java/systests/src/main/java/org/apache/qpid/server/logging/BindingLoggingTest.java @@ -0,0 +1,268 @@ +/* + * + * 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.qpid.server.logging.subjects.AbstractTestLogSubject; + +import javax.jms.Connection; +import javax.jms.JMSException; +import javax.jms.Queue; +import javax.jms.Session; +import javax.jms.Topic; +import java.io.IOException; +import java.util.List; + +/** + * Binding + * + * The Binding test suite validates that the follow log messages as specified in the Functional Specification. + * + * This suite of tests validate that the Binding messages occur correctly and according to the following format: + * + * BND-1001 : Create [: Arguments : <key=value>] + * BND-1002 : Deleted + */ +public class BindingLoggingTest extends AbstractTestLogging +{ + + static final String BND_PREFIX = "BND-"; + + Connection _connection; + Session _session; + Queue _queue; + Topic _topic; + + @Override + public void setUp() throws Exception + { + super.setUp(); + //Ignore broker startup messages + _monitor.reset(); + + _connection = getConnection(); + + _session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE); + + _queue = _session.createQueue(getName()); + _topic = (Topic) getInitialContext().lookup(TOPIC); + } + + private void validateLogMessage(String log, String messageID, String exchange, String message) + { + validateMessageID(messageID, log); + + String subject = fromSubject(log); + + assertEquals("Queue not correct.", getName(), + AbstractTestLogSubject.getSlice("qu", subject)); + assertEquals("Routing Key not correct.", getName(), + AbstractTestLogSubject.getSlice("rk", subject)); + assertEquals("Virtualhost not correct.", "/test", + AbstractTestLogSubject.getSlice("vh", subject)); + assertEquals("Exchange not correct.", exchange, + AbstractTestLogSubject.getSlice("ex", subject)); + + assertEquals("Log Message not as expected", message, getMessageString(fromMessage(log))); + } + + /** + * testBindingCreate + * + * Description: + * The binding of a Queue and an Exchange is done via a Binding. When this Binding is created a BND-1001 Create message will be logged. + * Input: + * + * 1. Running Broker + * 2. New Client requests that a Queue is bound to a new exchange. + * Output: + * + * <date> BND-1001 : Create + * + * Validation Steps: + * 3. The BND ID is correct + * 4. This will be the first message for the given binding + */ + public void testBindingCreate() throws JMSException, IOException + { + _session.createConsumer(_queue).close(); + + List<String> results = _monitor.findMatches(BND_PREFIX); + + // We will have two binds as we bind all queues to the default exchange + assertEquals("Result set larger than expected.", 2, results.size()); + + String exchange = "direct/<<default>>"; + String messageID = "BND-1001"; + String message = "Create"; + + validateLogMessage(getLog(results.get(0)), messageID, exchange, message); + + exchange = "direct/amq.direct"; + validateLogMessage(getLog(results.get(1)), messageID, exchange, message); + } + + /** + * Description: + * A Binding can be made with a set of arguments. When this occurs we logged the key,value pairs as part of the Binding log message. When the subscriber with a JMS Selector consumes from an exclusive queue such as a topic. The binding is made with the JMS Selector as an argument. + * Input: + * + * 1. Running Broker + * 2. Java Client consumes from a topic with a JMS selector. + * Output: + * + * <date> BND-1001 : Create : Arguments : <key=value> + * + * Validation Steps: + * 3. The BND ID is correct + * 4. The JMS Selector argument is present in the message + * 5. This will be the first message for the given binding + */ + public void testBindingCreateWithArguments() throws JMSException, IOException + { + final String SELECTOR = "Selector='True'"; + + _session.createDurableSubscriber(_topic, getName(), SELECTOR, false).close(); + + List<String> results = _monitor.findMatches(BND_PREFIX); + + // We will have two binds as we bind all queues to the default exchange + assertEquals("Result set larger than expected.", 2, results.size()); + + String log = getLog(results.get(0)); + + //Verify the first entry is the default binding + validateMessageID("BND-1001", log); + + String subject = fromSubject(log); + + assertEquals("Queue not correct.", "clientid:" + getName(), + AbstractTestLogSubject.getSlice("qu", subject)); + // NOTE default binding is the queue name + assertEquals("Routing Key not correct.", "clientid:" + getName(), + AbstractTestLogSubject.getSlice("rk", subject)); + assertEquals("Virtualhost not correct.", "/test", + AbstractTestLogSubject.getSlice("vh", subject)); + assertEquals("Exchange not correct.", "direct/<<default>>", + AbstractTestLogSubject.getSlice("ex", fromSubject(log))); + + String message = getMessageString(log); + + //Default binding will be without the selector + assertTrue("JMSSelector identified in binding:"+message, !message.contains("jms-selector")); + + // Perform full testing on the second non default binding + log = getLog(results.get(1)); + validateMessageID("BND-1001", log); + + subject = fromSubject(log); + + assertEquals("Queue not correct.", "clientid:" + getName(), + AbstractTestLogSubject.getSlice("qu", subject)); + assertEquals("Routing Key not correct.", "topic", + AbstractTestLogSubject.getSlice("rk", subject)); + assertEquals("Virtualhost not correct.", "/test", + AbstractTestLogSubject.getSlice("vh", subject)); + assertEquals("Exchange not correct.", "topic/amq.topic", + AbstractTestLogSubject.getSlice("ex", subject)); + + message = getMessageString(log); + + assertTrue("JMSSelector not identified in binding:"+message, message.contains("jms-selector")); + assertTrue("Selector not part of binding.:"+message, message.contains(SELECTOR)); + + } + + /** + * Description: + * Bindings can be deleted so that a queue can be rebound with a different set of values. + * Input: + * + * 1. Running Broker + * 2. AMQP UnBind Request is made + * Output: + * + * <date> BND-1002 : Deleted + * + * Validation Steps: + * 3. The BND ID is correct + * 4. There must have been a BND-1001 Create message first. + * 5. This will be the last message for the given binding + */ + public void testBindingDelete() throws JMSException, IOException + { + //Closing a consumer on a temporary queue will cause it to autodelete + // and so unbind. + _session.createConsumer(_session.createTemporaryQueue()).close(); + + List<String> results = _monitor.findMatches(BND_PREFIX); + + // We will have two binds as we bind all queues to the default exchange + assertEquals("Result set larger than expected.", 4, results.size()); + + + String messageID = "BND-1001"; + String message = "Create"; + + String log = getLog(results.get(0)); + validateMessageID(messageID, log); + assertEquals("Log Message not as expected", message, getMessageString(fromMessage(log))); + + log = getLog(results.get(1)); + validateMessageID(messageID, log); + assertEquals("Log Message not as expected", message, getMessageString(fromMessage(log))); + + + String exchange = "direct/<<default>>"; + messageID = "BND-1002"; + message = "Deleted"; + + log = getLog(results.get(2)); + validateMessageID(messageID, log); + + String subject = fromSubject(log); + + assertTrue("Routing Key does not start with TempQueue:"+AbstractTestLogSubject.getSlice("rk", subject), + AbstractTestLogSubject.getSlice("rk", subject).startsWith("TempQueue")); + assertEquals("Virtualhost not correct.", "/test", + AbstractTestLogSubject.getSlice("vh", subject)); + assertEquals("Exchange not correct.", exchange, + AbstractTestLogSubject.getSlice("ex", subject)); + + assertEquals("Log Message not as expected", message, getMessageString(fromMessage(log))); + + exchange = "direct/amq.direct"; + log = getLog(results.get(3)); + + validateMessageID(messageID, log); + + subject = fromSubject(log); + + assertTrue("Routing Key does not start with TempQueue:"+AbstractTestLogSubject.getSlice("rk", subject), + AbstractTestLogSubject.getSlice("rk", subject).startsWith("TempQueue")); + assertEquals("Virtualhost not correct.", "/test", + AbstractTestLogSubject.getSlice("vh", subject)); + assertEquals("Exchange not correct.", exchange, + AbstractTestLogSubject.getSlice("ex", subject)); + + assertEquals("Log Message not as expected", message, getMessageString(fromMessage(log))); + + } +} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/server/logging/ExchangeLoggingTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/server/logging/ExchangeLoggingTest.java index 3571f24fef..778201e3e4 100644 --- a/qpid/java/systests/src/main/java/org/apache/qpid/server/logging/ExchangeLoggingTest.java +++ b/qpid/java/systests/src/main/java/org/apache/qpid/server/logging/ExchangeLoggingTest.java @@ -96,19 +96,18 @@ public class ExchangeLoggingTest extends AbstractTestLogging List<String> results = _monitor.findMatches(EXH_PREFIX); - for (String rawLog : results) - { - String log = getLog(rawLog); + assertTrue("No Results found for Exchange.", results.size()>0); - validateMessageID("EXH-1001", log); + String log = getLog(results.get(0)); + + validateMessageID("EXH-1001", log); - String message = getMessageString(fromMessage(log)); - assertTrue("Log Message does not start with create:" + message, - message.startsWith("Create")); + String message = getMessageString(fromMessage(log)); + assertTrue("Log Message does not start with create:" + message, + message.startsWith("Create")); - assertTrue("Log Message does not contain Durable:" + message, - message.contains("Durable")); - } + assertTrue("Log Message does not contain Durable:" + message, + message.contains("Durable")); } |
