diff options
Diffstat (limited to 'qpid/java/broker-core/src/test/java/org/apache/qpid/server/queue/SortedQueueEntryListTest.java')
-rw-r--r-- | qpid/java/broker-core/src/test/java/org/apache/qpid/server/queue/SortedQueueEntryListTest.java | 373 |
1 files changed, 373 insertions, 0 deletions
diff --git a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/queue/SortedQueueEntryListTest.java b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/queue/SortedQueueEntryListTest.java new file mode 100644 index 0000000000..7add2d4d43 --- /dev/null +++ b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/queue/SortedQueueEntryListTest.java @@ -0,0 +1,373 @@ +/* + * 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.queue; + +import java.util.Collections; +import org.apache.qpid.AMQException; +import org.apache.qpid.server.message.AMQMessageHeader; +import org.apache.qpid.server.message.MessageReference; +import org.apache.qpid.server.message.ServerMessage; + +import java.util.Arrays; + +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class SortedQueueEntryListTest extends QueueEntryListTestBase +{ + private static SelfValidatingSortedQueueEntryList _sqel; + + public final static String keys[] = { " 73", " 18", " 11", "127", "166", "163", " 69", " 60", "191", "144", + " 17", "161", "145", "140", "157", " 47", "136", " 56", "176", " 81", + "195", " 96", " 2", " 68", "101", "141", "159", "187", "149", " 45", + " 64", "100", " 83", " 51", " 79", " 82", "180", " 26", " 61", " 62", + " 78", " 46", "147", " 91", "120", "164", " 92", "172", "188", " 50", + "111", " 89", " 4", " 8", " 16", "151", "122", "178", " 33", "124", + "171", "165", "116", "113", "155", "148", " 29", " 0", " 37", "131", + "146", " 57", "112", " 97", " 23", "108", "123", "117", "167", " 52", + " 98", " 6", "160", " 25", " 49", " 34", "182", "185", " 30", " 66", + "152", " 58", " 86", "118", "189", " 84", " 36", "104", " 7", " 76", + " 87", " 1", " 80", " 10", "142", " 59", "137", " 12", " 67", " 22", + " 9", "106", " 75", "109", " 93", " 42", "177", "134", " 77", " 88", + "114", " 43", "143", "135", " 55", "181", " 32", "174", "175", "184", + "133", "107", " 28", "126", "103", " 85", " 38", "158", " 39", "162", + "129", "194", " 15", " 24", " 19", " 35", "186", " 31", " 65", " 99", + "192", " 74", "156", " 27", " 95", " 54", " 70", " 13", "110", " 41", + " 90", "173", "125", "196", "130", "183", "102", "190", "132", "105", + " 21", " 53", "139", " 94", "115", " 48", " 44", "179", "128", " 14", + " 72", "119", "153", "168", "197", " 40", "150", "138", " 5", "154", + "169", " 71", "199", "198", "170", " 3", "121", " 20", " 63", "193" }; + + public final static String textkeys[] = { "AAA", "BBB", "CCC", "DDD", "EEE", "FFF", "GGG", "HHH", "III", "JJJ", + "KKK", "LLL", "MMM", "NNN", "OOO", "PPP", "QQQ", "RRR", "SSS", "TTT", + "UUU", "VVV", "XXX", "YYY", "ZZZ"}; + + private final static String keysSorted[] = keys.clone(); + + @Override + protected void setUp() throws Exception + { + super.setUp(); + + // Create result array + Arrays.sort(keysSorted); + + // Create test list + _sqel = new SelfValidatingSortedQueueEntryList(_testQueue, "KEY"); + + // Build test list + long messageId = 0L; + for(final String key : keys) + { + final ServerMessage msg = generateTestMessage(messageId++, key); + _sqel.add(msg); + } + + } + + @Override + public QueueEntryList getTestList() + { + return getTestList(false); + } + + @Override + public QueueEntryList getTestList(boolean newList) + { + if(newList) + { + return new SelfValidatingSortedQueueEntryList(_testQueue, "KEY"); + } + else + { + return _sqel; + } + } + + public int getExpectedListLength() + { + return keys.length; + } + + public long getExpectedFirstMsgId() + { + return 67L; + } + + public ServerMessage getTestMessageToAdd() throws AMQException + { + return generateTestMessage(1, "test value"); + } + + private ServerMessage generateTestMessage(final long id, final String keyValue) throws AMQException + { + final ServerMessage message = mock(ServerMessage.class); + AMQMessageHeader hdr = mock(AMQMessageHeader.class); + when(message.getMessageHeader()).thenReturn(hdr); + when(hdr.getHeader(eq("KEY"))).thenReturn(keyValue); + when(hdr.containsHeader(eq("KEY"))).thenReturn(true); + when(hdr.getHeaderNames()).thenReturn(Collections.singleton("KEY")); + MessageReference ref = mock(MessageReference.class); + when(ref.getMessage()).thenReturn(message); + when(message.newReference()).thenReturn(ref); + when(message.getMessageNumber()).thenReturn(id); + + return message; + } + + public void testIterator() + { + super.testIterator(); + + // Test sorted order of list + final QueueEntryIterator<?> iter = getTestList().iterator(); + int count = 0; + while(iter.advance()) + { + assertEquals("Sorted queue entry value does not match sorted key array", + keysSorted[count++], getSortedKeyValue(iter)); + } + } + + private Object getSortedKeyValue(QueueEntryIterator<?> iter) + { + return (iter.getNode()).getMessage().getMessageHeader().getHeader("KEY"); + } + + private Long getMessageId(QueueEntryIterator<?> iter) + { + return (iter.getNode()).getMessage().getMessageNumber(); + } + + public void testNonUniqueSortKeys() throws Exception + { + _sqel = new SelfValidatingSortedQueueEntryList(_testQueue, "KEY"); + + // Build test list + long messageId = 0L; + while(messageId < 200) + { + final ServerMessage msg = generateTestMessage(messageId++, "samekey"); + _sqel.add(msg); + } + + final QueueEntryIterator<?> iter = getTestList().iterator(); + int count=0; + while(iter.advance()) + { + assertEquals("Sorted queue entry value is not as expected", "samekey", getSortedKeyValue(iter)); + assertEquals("Message id not as expected", Long.valueOf(count++), getMessageId(iter)); + } + } + + public void testNullSortKeys() throws Exception + { + _sqel = new SelfValidatingSortedQueueEntryList(_testQueue, "KEY"); + + // Build test list + long messageId = 0L; + while(messageId < 200) + { + final ServerMessage msg = generateTestMessage(messageId++, null); + _sqel.add(msg); + } + + final QueueEntryIterator<?> iter = getTestList().iterator(); + int count=0; + while(iter.advance()) + { + assertNull("Sorted queue entry value is not as expected", getSortedKeyValue(iter)); + assertEquals("Message id not as expected", Long.valueOf(count++), getMessageId(iter)); } + } + + public void testAscendingSortKeys() throws Exception + { + _sqel = new SelfValidatingSortedQueueEntryList(_testQueue, "KEY"); + + // Build test list + long messageId = 0L; + for(String textKey : textkeys) + { + final ServerMessage msg = generateTestMessage(messageId, textKey); + messageId++; + _sqel.add(msg); + } + + final QueueEntryIterator<?> iter = getTestList().iterator(); + int count=0; + while(iter.advance()) + { + assertEquals("Sorted queue entry value is not as expected", textkeys[count], getSortedKeyValue(iter)); + assertEquals("Message id not as expected", Long.valueOf(count), getMessageId(iter)); + count++; + } + } + + public void testDescendingSortKeys() throws Exception + { + _sqel = new SelfValidatingSortedQueueEntryList(_testQueue, "KEY"); + + // Build test list + long messageId = 0L; + for(int i=textkeys.length-1; i >=0; i--) + { + final ServerMessage msg = generateTestMessage(messageId, textkeys[i]); + messageId++; + _sqel.add(msg); + } + + final QueueEntryIterator<?> iter = getTestList().iterator(); + int count=0; + while(iter.advance()) + { + assertEquals("Sorted queue entry value is not as expected", textkeys[count], getSortedKeyValue(iter)); + assertEquals("Message id not as expected", Long.valueOf(textkeys.length-count-1), getMessageId(iter)); + count++; + } + } + + public void testInsertAfter() throws Exception + { + _sqel = new SelfValidatingSortedQueueEntryList(_testQueue, "KEY"); + + ServerMessage msg = generateTestMessage(1, "A"); + _sqel.add(msg); + + SortedQueueEntryImpl entry = _sqel.next(_sqel.getHead()); + validateEntry(entry, "A", 1); + + msg = generateTestMessage(2, "B"); + _sqel.add(msg); + + entry = _sqel.next(_sqel.getHead()); + validateEntry(entry, "A", 1); + + entry = _sqel.next(entry); + validateEntry(entry, "B", 2); + } + + public void testInsertBefore() throws Exception + { + _sqel = new SelfValidatingSortedQueueEntryList(_testQueue, "KEY"); + + ServerMessage msg = generateTestMessage(1, "B"); + _sqel.add(msg); + + SortedQueueEntryImpl entry = _sqel.next(_sqel.getHead()); + validateEntry(entry, "B", 1); + + msg = generateTestMessage(2, "A"); + _sqel.add(msg); + + entry = _sqel.next(_sqel.getHead()); + validateEntry(entry, "A", 2); + + entry = _sqel.next(entry); + validateEntry(entry, "B", 1); + } + + public void testInsertInbetween() throws Exception + { + _sqel = new SelfValidatingSortedQueueEntryList(_testQueue, "KEY"); + + ServerMessage msg = generateTestMessage(1, "A"); + _sqel.add(msg); + SortedQueueEntryImpl entry = _sqel.next(_sqel.getHead()); + validateEntry(entry, "A", 1); + + msg = generateTestMessage(2, "C"); + _sqel.add(msg); + + entry = _sqel.next(_sqel.getHead()); + validateEntry(entry, "A", 1); + + entry = _sqel.next(entry); + validateEntry(entry, "C", 2); + + msg = generateTestMessage(3, "B"); + _sqel.add(msg); + + entry = _sqel.next(_sqel.getHead()); + validateEntry(entry, "A", 1); + + entry = _sqel.next(entry); + validateEntry(entry, "B", 3); + + entry = _sqel.next(entry); + validateEntry(entry, "C", 2); + } + + public void testInsertAtHead() throws Exception + { + _sqel = new SelfValidatingSortedQueueEntryList(_testQueue, "KEY"); + + ServerMessage msg = generateTestMessage(1, "B"); + _sqel.add(msg); + + SortedQueueEntryImpl entry = _sqel.next(_sqel.getHead()); + validateEntry(entry, "B", 1); + + msg = generateTestMessage(2, "D"); + _sqel.add(msg); + + entry = _sqel.next(_sqel.getHead()); + validateEntry(entry, "B", 1); + + entry = _sqel.next(entry); + validateEntry(entry, "D", 2); + + msg = generateTestMessage(3, "C"); + _sqel.add(msg); + + entry = _sqel.next(_sqel.getHead()); + validateEntry(entry, "B", 1); + + entry = _sqel.next(entry); + validateEntry(entry, "C", 3); + + entry = _sqel.next(entry); + validateEntry(entry, "D", 2); + + msg = generateTestMessage(4, "A"); + _sqel.add(msg); + + entry = _sqel.next(_sqel.getHead()); + validateEntry(entry, "A", 4); + + entry = _sqel.next(entry); + validateEntry(entry, "B", 1); + + entry = _sqel.next(entry); + validateEntry(entry, "C", 3); + + entry = _sqel.next(entry); + validateEntry(entry, "D", 2); + } + + private void validateEntry(final SortedQueueEntryImpl entry, final String expectedSortKey, final long expectedMessageId) + { + assertEquals("Sorted queue entry value is not as expected", + expectedSortKey, entry.getMessage().getMessageHeader().getHeader("KEY")); + assertEquals("Sorted queue entry id is not as expected", + expectedMessageId, entry.getMessage().getMessageNumber()); + } + +} |