/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library 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 Lesser General Public License for more
* details.
*/
package com.liferay.portal.kernel.concurrent;
import com.liferay.portal.kernel.concurrent.test.TestUtil;
import com.liferay.portal.kernel.test.SyncThrowableThread;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
import org.junit.Assert;
import org.junit.Test;
/**
* @author Shuyang Zhou
*/
public class TaskQueueTest {
@Test
public void testConstructor() {
try {
new TaskQueue<Object>(0);
Assert.fail();
}
catch (IllegalArgumentException iae) {
}
try {
new TaskQueue<Object>(-1);
Assert.fail();
}
catch (IllegalArgumentException iae) {
}
TaskQueue<Object> taskQueue = new TaskQueue<>(10);
Assert.assertEquals(10, taskQueue.remainingCapacity());
taskQueue = new TaskQueue<>();
Assert.assertEquals(Integer.MAX_VALUE, taskQueue.remainingCapacity());
}
@Test
public void testDrainTo() {
TaskQueue<Object> taskQueue = new TaskQueue<>();
try {
taskQueue.drainTo(null);
Assert.fail();
}
catch (NullPointerException npe) {
}
Object object1 = new Object();
Object object2 = new Object();
Object object3 = new Object();
Object object4 = new Object();
taskQueue = new TaskQueue<>();
Assert.assertTrue(taskQueue.offer(object1, new boolean[1]));
Assert.assertTrue(taskQueue.offer(object2, new boolean[1]));
Assert.assertTrue(taskQueue.offer(object3, new boolean[1]));
Assert.assertTrue(taskQueue.offer(object4, new boolean[1]));
Set<Object> set = new HashSet<>();
taskQueue.drainTo(set);
Assert.assertEquals(set.toString(), 4, set.size());
Assert.assertTrue(set.contains(object1));
Assert.assertTrue(set.contains(object2));
Assert.assertTrue(set.contains(object3));
Assert.assertTrue(set.contains(object4));
object1 = new Object();
object2 = new Object();
object3 = new Object();
object4 = new Object();
taskQueue = new TaskQueue<>();
Assert.assertTrue(taskQueue.offer(object1, new boolean[1]));
Assert.assertTrue(taskQueue.offer(object2, new boolean[1]));
Assert.assertTrue(taskQueue.offer(object3, new boolean[1]));
Assert.assertTrue(taskQueue.offer(object4, new boolean[1]));
List<Object> list = new ArrayList<Object>() {
@Override
public boolean add(Object e) {
if (size() >= 2) {
throw new IllegalStateException();
}
return super.add(e);
}
};
try {
taskQueue.drainTo(list);
Assert.fail();
}
catch (IllegalStateException ise) {
}
Assert.assertEquals(list.toString(), 2, list.size());
Assert.assertSame(object1, list.get(0));
Assert.assertSame(object2, list.get(1));
Assert.assertEquals(2, taskQueue.size());
Assert.assertSame(object3, taskQueue.poll());
Assert.assertSame(object4, taskQueue.poll());
}
@Test
public void testIsEmpty() {
TaskQueue<Object> taskQueue = new TaskQueue<>();
Assert.assertTrue(taskQueue.isEmpty());
Assert.assertTrue(taskQueue.offer(new Object(), new boolean[1]));
Assert.assertFalse(taskQueue.isEmpty());
Assert.assertNotNull(taskQueue.poll());
Assert.assertTrue(taskQueue.isEmpty());
}
@Test
public void testOffer() {
TaskQueue<Object> taskQueue = new TaskQueue<>(10);
try {
taskQueue.offer(null, new boolean[1]);
Assert.fail();
}
catch (NullPointerException npe) {
}
taskQueue = new TaskQueue<>(10);
try {
taskQueue.offer(new Object(), null);
Assert.fail();
}
catch (NullPointerException npe) {
}
taskQueue = new TaskQueue<>(10);
try {
taskQueue.offer(new Object(), new boolean[0]);
Assert.fail();
}
catch (IllegalArgumentException iae) {
}
taskQueue = new TaskQueue<>(10);
boolean[] hasWaiterMarker = new boolean[1];
boolean result = taskQueue.offer(new Object(), hasWaiterMarker);
Assert.assertTrue(result);
Assert.assertFalse(hasWaiterMarker[0]);
}
@Test
public void testPoll() throws InterruptedException {
TaskQueue<Object> taskQueue = new TaskQueue<>();
Assert.assertNull(taskQueue.poll());
taskQueue = new TaskQueue<>();
Object object1 = new Object();
Assert.assertTrue(taskQueue.offer(object1, new boolean[1]));
Assert.assertSame(object1, taskQueue.poll());
taskQueue = new TaskQueue<>();
object1 = new Object();
Object object2 = new Object();
Assert.assertTrue(taskQueue.offer(object1, new boolean[1]));
Assert.assertTrue(taskQueue.offer(object2, new boolean[1]));
Assert.assertSame(object1, taskQueue.poll());
taskQueue = new TaskQueue<>();
Assert.assertNull(taskQueue.poll(0, TimeUnit.MILLISECONDS));
taskQueue = new TaskQueue<>();
Assert.assertNull(taskQueue.poll(-1, TimeUnit.MILLISECONDS));
taskQueue = new TaskQueue<>();
Assert.assertNull(taskQueue.poll(100, TimeUnit.MILLISECONDS));
taskQueue = new TaskQueue<>();
object1 = new Object();
Assert.assertTrue(taskQueue.offer(object1, new boolean[1]));
Assert.assertSame(object1, taskQueue.poll(100, TimeUnit.MILLISECONDS));
taskQueue = new TaskQueue<>();
object1 = new Object();
object2 = new Object();
Assert.assertTrue(taskQueue.offer(object1, new boolean[1]));
Assert.assertTrue(taskQueue.offer(object2, new boolean[1]));
Assert.assertSame(object1, taskQueue.poll(100, TimeUnit.MILLISECONDS));
}
@Test
public void testRemainingCapacity() {
TaskQueue<Object> taskQueue = new TaskQueue<>(10);
Assert.assertEquals(10, taskQueue.remainingCapacity());
for (int i = 1; i <= 10; i++) {
Assert.assertTrue(taskQueue.offer(new Object(), new boolean[1]));
Assert.assertEquals(10 - i, taskQueue.remainingCapacity());
}
}
@Test
public void testRemove() {
TaskQueue<Object> taskQueue = new TaskQueue<>(10);
Assert.assertFalse(taskQueue.remove(null));
Assert.assertFalse(taskQueue.remove(new Object()));
Object object1 = new Object();
Object object2 = new Object();
Object object3 = new Object();
Assert.assertTrue(taskQueue.offer(object1, new boolean[1]));
Assert.assertTrue(taskQueue.offer(object2, new boolean[1]));
Assert.assertTrue(taskQueue.offer(object3, new boolean[1]));
Assert.assertEquals(3, taskQueue.size());
Assert.assertTrue(taskQueue.remove(object2));
Assert.assertEquals(2, taskQueue.size());
Assert.assertTrue(taskQueue.remove(object1));
Assert.assertEquals(1, taskQueue.size());
Assert.assertTrue(taskQueue.remove(object3));
Assert.assertEquals(0, taskQueue.size());
}
@Test
public void testSize() {
TaskQueue<Object> taskQueue = new TaskQueue<>(10);
Assert.assertEquals(0, taskQueue.size());
for (int i = 1; i <= 10; i++) {
Assert.assertTrue(taskQueue.offer(new Object(), new boolean[1]));
Assert.assertEquals(i, taskQueue.size());
}
}
@Test
public void testTake() throws InterruptedException {
final TaskQueue<Object> taskQueue = new TaskQueue<>();
final Object object = new Object();
Assert.assertTrue(taskQueue.offer(object, new boolean[1]));
Assert.assertSame(object, taskQueue.take());
SyncThrowableThread<Void> syncThrowableThread =
new SyncThrowableThread<>(
new Callable<Void>() {
@Override
public Void call() throws Exception {
for (int i = 0; i < 10; i++) {
Assert.assertEquals(i, taskQueue.take());
}
try {
taskQueue.take();
Assert.fail();
}
catch (InterruptedException ie) {
}
return null;
}
});
syncThrowableThread.start();
for (int i = 0; i < 10; i++) {
Assert.assertTrue(taskQueue.offer(i, new boolean[1]));
}
Thread.sleep(TestUtil.SHORT_WAIT);
syncThrowableThread.interrupt();
syncThrowableThread.sync();
}
}