/*
* Password Management Servlets (PWM)
* http://www.pwm-project.org
*
* Copyright (c) 2006-2009 Novell, Inc.
* Copyright (c) 2009-2017 The PWM Project
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package password.pwm.manual;
import junit.framework.TestCase;
import password.pwm.util.java.JavaHelper;
import password.pwm.util.localdb.LocalDB;
import password.pwm.util.localdb.LocalDBFactory;
import password.pwm.util.localdb.LocalDBStoredQueue;
import password.pwm.util.secure.PwmRandom;
import java.io.File;
import java.util.Iterator;
import java.util.NoSuchElementException;
public class LocalDBStoredQueueTest extends TestCase {
private static final int SIZE = 5;
private LocalDBStoredQueue storedQueue;
private LocalDB localDB;
@Override
protected void setUp() throws Exception {
super.setUp(); //To change body of overridden methods use File | Settings | File Templates.
TestHelper.setupLogging();
final File fileLocation = new File(TestHelper.getParameter("pwmDBlocation"));
localDB = LocalDBFactory.getInstance(fileLocation, false, null, null);
storedQueue = LocalDBStoredQueue.createLocalDBStoredQueue(localDB, LocalDB.DB.TEMP, true);
}
private void populatedQueue(final int n, final LocalDBStoredQueue storedQueue) {
storedQueue.clear();
assertTrue(storedQueue.isEmpty());
for (int i = 0; i < n; ++i)
assertTrue(storedQueue.offer(String.valueOf(i)));
assertFalse(storedQueue.isEmpty());
assertEquals(n, storedQueue.size());
}
/**
* isEmpty is true before add, false after
*/
public void testEmpty() {
storedQueue.clear();
assertTrue(storedQueue.isEmpty());
}
public void testRemove() {
storedQueue.clear();
storedQueue.add("value1");
storedQueue.add("value2");
assertEquals(2, storedQueue.size());
storedQueue.remove();
assertEquals(1, storedQueue.size());
storedQueue.remove();
assertTrue(storedQueue.isEmpty());
assertEquals(0, storedQueue.size());
try {
storedQueue.remove();
assertTrue(false);
} catch (NoSuchElementException e) {
assertTrue(true);
} catch (Exception e) {
assertTrue(false);
}
assertTrue(storedQueue.isEmpty());
assertEquals(0, storedQueue.size());
}
public void testDequeue() {
storedQueue.clear();
assertEquals(0,storedQueue.size());
storedQueue.addLast("value3");
assertEquals(1,storedQueue.size());
storedQueue.addLast("value4");
assertEquals(2,storedQueue.size());
storedQueue.addFirst("value2");
assertEquals(3,storedQueue.size());
storedQueue.addFirst("value1");
assertEquals(4,storedQueue.size());
storedQueue.addFirst("value0");
assertEquals(5,storedQueue.size());
{
final Iterator<String> iter = storedQueue.iterator(); iter.hasNext();
assertEquals("value0",iter.next());
assertEquals("value1",iter.next());
assertEquals("value2",iter.next());
assertEquals("value3",iter.next());
assertEquals("value4",iter.next());
}
{
final Iterator<String> iter = storedQueue.descendingIterator(); iter.hasNext();
assertEquals("value4",iter.next());
assertEquals("value3",iter.next());
assertEquals("value2",iter.next());
assertEquals("value1",iter.next());
assertEquals("value0",iter.next());
}
assertEquals(5,storedQueue.size());
assertEquals("value0",storedQueue.removeFirst());
assertEquals(4,storedQueue.size());
assertEquals("value4",storedQueue.removeLast());
assertEquals(3,storedQueue.size());
assertEquals("value3",storedQueue.peekLast());
assertEquals("value1",storedQueue.peekFirst());
assertEquals("value3",storedQueue.pollLast());
assertEquals("value1",storedQueue.pollFirst());
assertEquals("value2",storedQueue.peek());
assertEquals("value2",storedQueue.peekLast());
assertEquals("value2",storedQueue.peekFirst());
assertEquals(1,storedQueue.size());
}
/**
* size changes when elements added and removed
*/
public void testSize() {
storedQueue.clear();
assertTrue(storedQueue.isEmpty());
populatedQueue(SIZE, storedQueue);
assertEquals(SIZE, storedQueue.size());
for (int i = 0; i < SIZE; ++i) {
JavaHelper.pause(PwmRandom.getInstance().nextInt(1000));
assertEquals(SIZE - i, storedQueue.size());
storedQueue.remove();
}
for (int i = 0; i < SIZE; ++i) {
assertEquals(i, storedQueue.size());
storedQueue.add(String.valueOf(i));
}
}
/**
* Offer succeeds
*/
public void testOffer() {
storedQueue.clear();
assertTrue(storedQueue.isEmpty());
assertTrue(storedQueue.offer(String.valueOf(0)));
assertTrue(storedQueue.offer(String.valueOf(1)));
assertEquals(2, storedQueue.size());
}
/**
* add succeeds
*/
public void testAdd() {
storedQueue.clear();
assertTrue(storedQueue.isEmpty());
for (int i = 0; i < SIZE; ++i) {
assertEquals(i, storedQueue.size());
assertTrue(storedQueue.add(String.valueOf(i)));
}
}
/**
* poll succeeds unless empty
*/
public void testPoll() {
storedQueue.clear();
assertTrue(storedQueue.isEmpty());
populatedQueue(SIZE, storedQueue);
for (int i = SIZE - 1; i >= 0; i--) {
System.out.println("iteration " + i);
assertEquals(i, Integer.parseInt(storedQueue.poll()));
}
assertNull(storedQueue.poll());
}
/**
* peek returns next element, or null if empty
*/
public void testPeek() {
storedQueue.clear();
assertTrue(storedQueue.isEmpty());
populatedQueue(SIZE, storedQueue);
int initialSize = storedQueue.size();
assertNotNull(storedQueue.peek());
assertEquals(initialSize, storedQueue.size());
}
@Override
protected void tearDown() throws Exception {
System.out.println("tearing down");
super.tearDown();
if (storedQueue != null) {
storedQueue = null;
}
if (localDB != null) {
localDB.close();
localDB = null;
}
}
}