From f5997e515738fabd366a90d4352bfe7d9d60abb6 Mon Sep 17 00:00:00 2001 From: Arnaud Simon Date: Fri, 24 Oct 2008 14:09:26 +0000 Subject: qpid-1378: applied qman_24102008_compound_message_handling.patch that adds compound message handling improvements. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@707640 13f79535-47bb-0310-9956-ffa450edef68 --- .../management/domain/model/QpidClassTest.java | 8 +- .../domain/services/BrokerMessageListenerTest.java | 71 ++++++++++++ .../domain/services/MessageTokenizerTest.java | 120 +++++++++++++++++++++ 3 files changed, 196 insertions(+), 3 deletions(-) create mode 100644 java/management/client/src/test/java/org/apache/qpid/management/domain/services/MessageTokenizerTest.java (limited to 'java/management/client/src/test') diff --git a/java/management/client/src/test/java/org/apache/qpid/management/domain/model/QpidClassTest.java b/java/management/client/src/test/java/org/apache/qpid/management/domain/model/QpidClassTest.java index 837810ea0d..fab35d4c59 100644 --- a/java/management/client/src/test/java/org/apache/qpid/management/domain/model/QpidClassTest.java +++ b/java/management/client/src/test/java/org/apache/qpid/management/domain/model/QpidClassTest.java @@ -1,6 +1,5 @@ package org.apache.qpid.management.domain.model; - import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -19,6 +18,11 @@ import org.apache.qpid.management.configuration.StubConfigurator; import org.apache.qpid.management.domain.handler.impl.MethodOrEventDataTransferObject; import org.apache.qpid.management.domain.model.QpidClass.QpidManagedObject; +/** + * Test case for Qpid Class. + * + * @author Andrea Gazzarini + */ public class QpidClassTest extends TestCase { private QpidClass _class; @@ -197,8 +201,6 @@ public class QpidClassTest extends TestCase TestConstants._1, true, TestConstants._1)); - - List> statisticDefinitions = new ArrayList>(2); _class.setSchema(propertyDefinitions, TestConstants.EMPTY_STATISTICS_SCHEMA, TestConstants.EMPTY_METHODS_SCHEMA); diff --git a/java/management/client/src/test/java/org/apache/qpid/management/domain/services/BrokerMessageListenerTest.java b/java/management/client/src/test/java/org/apache/qpid/management/domain/services/BrokerMessageListenerTest.java index 533c98c973..c489f7d767 100644 --- a/java/management/client/src/test/java/org/apache/qpid/management/domain/services/BrokerMessageListenerTest.java +++ b/java/management/client/src/test/java/org/apache/qpid/management/domain/services/BrokerMessageListenerTest.java @@ -23,6 +23,7 @@ package org.apache.qpid.management.domain.services; import java.io.IOException; import java.util.HashMap; import java.util.Map; +import java.util.Random; import junit.framework.TestCase; @@ -167,4 +168,74 @@ public class BrokerMessageListenerTest extends TestCase _listener.onMessage(message); } + + /** + * Tests the execution of the onMessage() method when the incoming message is a compound message. + * + *
precondition : the incoming message is a compound message. + *
postcondition : each tokenized message is forwarded to the appropriate handler. + */ + public void testOnMessageOK_WithCompoundMessage() throws Exception + { + final Map handlersMap = new HashMap(); + char [] opcodes = {'a','b','c','d','e'}; + + class MockMessageHandler implements IMessageHandler + { + private final char _opcode; + + public MockMessageHandler(char opcode) + { + this._opcode = opcode; + } + + public void process (ManagementDecoder decoder, int sequenceNumber) + { + handlersMap.remove(_opcode); + } + + public void setDomainModel (DomainModel domainModel) + { + // Do nothing here. It's just a mock handler. + } + }; + + for (char opcode : opcodes) + { + handlersMap.put(opcode, new MockMessageHandler(opcode)); + } + + // Removes previously injected handlers (i.e. x & y) + _listener._handlers.clear(); + _listener.setHandlers(handlersMap); + + Message compoundMessage = createCompoundMessage(opcodes); + _listener.onMessage(compoundMessage); + + assertTrue(handlersMap.isEmpty()); + } + + // Creates a (non valid) compound message. + private Message createCompoundMessage(char[] opcodes) throws IOException { + byte [] compoundMessageData = new byte [12 * opcodes.length]; + Random randomizer = new Random(); + int position = 0; + + for (char opcode : opcodes) { + System.arraycopy(MessageTokenizer.MAGIC_NUMBER_BYTES, 0, compoundMessageData, position, MessageTokenizer.MAGIC_NUMBER_BYTES.length); + position+=MessageTokenizer.MAGIC_NUMBER_BYTES.length; + + compoundMessageData[position++] = (byte)opcode; + + for (int c = 4; c < 12; c++) + { + byte aByte = (byte)randomizer.nextInt(127); + compoundMessageData[position++] = aByte; + } + } + + Message compoundMessage = new ByteBufferMessage(); + compoundMessage.appendData(compoundMessageData); + return compoundMessage; + } } diff --git a/java/management/client/src/test/java/org/apache/qpid/management/domain/services/MessageTokenizerTest.java b/java/management/client/src/test/java/org/apache/qpid/management/domain/services/MessageTokenizerTest.java new file mode 100644 index 0000000000..754686bc2f --- /dev/null +++ b/java/management/client/src/test/java/org/apache/qpid/management/domain/services/MessageTokenizerTest.java @@ -0,0 +1,120 @@ +package org.apache.qpid.management.domain.services; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.*; +import java.util.Random; + +import junit.framework.TestCase; + +import org.apache.qpid.api.Message; +import org.apache.qpid.nclient.util.ByteBufferMessage; +import org.apache.qpid.transport.codec.ManagementDecoder; + +/** + * Tests case for messaeg tokenizer. + * + * @author Andrea Gazzarini + */ +public class MessageTokenizerTest extends TestCase { + + /** + * Tests the execution of the message tokenizer when the given message is not a valid AMQP message. + * + *
precondition : the incoming message is not a valid AMQP message. + *
postcondition : no exception is thrown and there will be exactly one token with the given message. + */ + public void testOK_WithNoMessage() throws IOException{ + byte [] noMessage = {2,10,120,23,23,23,4,10,11,12,2,1,3,-22}; + + Message multiMessage = new ByteBufferMessage(); + multiMessage.appendData(noMessage); + MessageTokenizer tokenizer = new MessageTokenizer(multiMessage); + + assertEquals(1, tokenizer.countTokens()); + assertEquals(tokenizer.nextElement(),noMessage); + assertFalse(tokenizer.hasMoreElements()); + } + + /** + * Tests the execution of the message tokenizer when the given message contains only one message. + * + *
precondition : the incoming message contains only one message. + *
postcondition : no exception is thrown and there will be exactly one token with the given message. + */ + public void testOK_WithOneMessage() throws IOException{ + byte [] oneEncodedMessage = {'A','M','2',23,23,23,4,10,11,12,2,1,3,-22}; + + Message multiMessage = new ByteBufferMessage(); + multiMessage.appendData(oneEncodedMessage); + MessageTokenizer tokenizer = new MessageTokenizer(multiMessage); + + assertEquals(1, tokenizer.countTokens()); + assertEquals(tokenizer.nextElement(),oneEncodedMessage); + assertFalse(tokenizer.hasMoreElements()); + } + + /** + * Tests the execution of the message tokenizer when the given message contains a random number of messages. + * + *
precondition : the incoming message contains a random number of messages. + *
postcondition : no exception is thrown and each built token is a valid message starting with right header. + */ + public void testOK_WithRandomNUmberOfMessages() throws IOException{ + Random randomizer = new Random(); + + int howManyLoops = randomizer.nextInt(10000); + byte [] compoundMessageData = new byte [12 * howManyLoops]; + + List messages = new ArrayList(howManyLoops); + + int position = 0; + for (int i = 0; i < howManyLoops; i++) + { + byte [] message = new byte[12]; + System.arraycopy(MessageTokenizer.MAGIC_NUMBER_BYTES, 0, compoundMessageData, position, MessageTokenizer.MAGIC_NUMBER_BYTES.length); + System.arraycopy(MessageTokenizer.MAGIC_NUMBER_BYTES, 0, message, 0, MessageTokenizer.MAGIC_NUMBER_BYTES.length); + position+=MessageTokenizer.MAGIC_NUMBER_BYTES.length; + + for (int c = 3; c < 12; c++) + { + byte aByte = (byte)randomizer.nextInt(127); + compoundMessageData[position++] = aByte; + message[c] = aByte; + } + messages.add(message); + } + + Message multiMessage = new ByteBufferMessage(); + multiMessage.appendData(compoundMessageData); + MessageTokenizer tokenizer = new MessageTokenizer(multiMessage); + + int howManyTokens = tokenizer.countTokens(); + assertEquals(howManyLoops, howManyTokens); + + int index = 0; + while (tokenizer.hasMoreElements()) + { + assertEquals(tokenizer.nextElement(),messages.get(index++)); + } + + assertEquals((index),howManyTokens); + } + + /** + * Internal method used for comparison of two messages. + * + * @param message the token message just built by the tokenizer. + * @param expected the expected result. + */ + private void assertEquals(Message message, byte [] expected) throws IOException + { + ByteBuffer messageContent = message.readData(); + ManagementDecoder decoder = new ManagementDecoder(); + decoder.init(messageContent); + byte [] content = decoder.readReaminingBytes(); + assertTrue(Arrays.equals(content, expected)); + } +} -- cgit v1.2.1