blob: 38b12f82504442a3da32d8c40698e97a4afeae26 [file] [log] [blame]
/*
* 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 org.apache.qpid.AMQException;
import org.apache.qpid.server.message.AMQMessage;
import org.apache.qpid.server.message.ServerMessage;
import java.util.Arrays;
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
{
return new AMQMessage(new MockStoredMessage(id, "KEY", keyValue));
}
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 ((SortedQueueEntryImpl) iter.getNode()).getMessage().getMessageHeader().getHeader("KEY");
}
private Long getMessageId(QueueEntryIterator<?> iter)
{
return ((SortedQueueEntryImpl) 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());
}
}