/**
* 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 java.util.Arrays;
import java.util.Comparator;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.junit.Assert;
import org.junit.Test;
/**
* @author Shuyang Zhou
*/
public class CoalescedPipeTest {
@Test
public void testBlockingTake() throws InterruptedException {
final CoalescedPipe<String> coalescedPipe = new CoalescedPipe<>();
ScheduledExecutorService scheduledExecutorService =
Executors.newScheduledThreadPool(1);
scheduledExecutorService.schedule(
new Runnable() {
@Override
public void run() {
try {
coalescedPipe.put("test1");
}
catch (InterruptedException ie) {
Assert.fail(ie.getMessage());
}
}
},
500, TimeUnit.MILLISECONDS);
long startTime = System.currentTimeMillis();
Assert.assertEquals("test1", coalescedPipe.take());
Assert.assertTrue((System.currentTimeMillis() - startTime) > 250L);
scheduledExecutorService.shutdownNow();
scheduledExecutorService.awaitTermination(120, TimeUnit.SECONDS);
}
@Test
public void testNonBlockingTake() throws InterruptedException {
CoalescedPipe<String> coalescedPipe = new CoalescedPipe<>();
coalescedPipe.put("test2");
coalescedPipe.put("test3");
long startTime = System.currentTimeMillis();
Assert.assertEquals("test2", coalescedPipe.take());
Assert.assertTrue((System.currentTimeMillis() - startTime) < 100);
startTime = System.currentTimeMillis();
Assert.assertEquals("test3", coalescedPipe.take());
Assert.assertTrue((System.currentTimeMillis() - startTime) < 100);
}
@Test
public void testPut() throws InterruptedException {
// Without comparator
CoalescedPipe<String> coalescedPipe = new CoalescedPipe<>();
// Null
try {
coalescedPipe.put(null);
Assert.fail();
}
catch (NullPointerException npe) {
}
// Normal
coalescedPipe.put("test1");
Assert.assertEquals(1, coalescedPipe.pendingCount());
Assert.assertEquals(0, coalescedPipe.coalescedCount());
coalescedPipe.put("test2");
Assert.assertEquals(2, coalescedPipe.pendingCount());
Assert.assertEquals(0, coalescedPipe.coalescedCount());
// Coalesce
coalescedPipe.put("test1");
Assert.assertEquals(2, coalescedPipe.pendingCount());
Assert.assertEquals(1, coalescedPipe.coalescedCount());
coalescedPipe.put("test2");
Assert.assertEquals(2, coalescedPipe.pendingCount());
Assert.assertEquals(2, coalescedPipe.coalescedCount());
// With comparator
coalescedPipe = new CoalescedPipe<String>(
new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
});
// Null
try {
coalescedPipe.put(null);
Assert.fail();
}
catch (NullPointerException npe) {
}
// Normal
coalescedPipe.put("a");
Assert.assertEquals(1, coalescedPipe.pendingCount());
Assert.assertEquals(0, coalescedPipe.coalescedCount());
coalescedPipe.put("ab");
Assert.assertEquals(2, coalescedPipe.pendingCount());
Assert.assertEquals(0, coalescedPipe.coalescedCount());
// Coalesce
coalescedPipe.put("c");
Assert.assertEquals(2, coalescedPipe.pendingCount());
Assert.assertEquals(1, coalescedPipe.coalescedCount());
coalescedPipe.put("cd");
Assert.assertEquals(2, coalescedPipe.pendingCount());
Assert.assertEquals(2, coalescedPipe.coalescedCount());
}
@Test
public void testTakeSnapshot() throws InterruptedException {
CoalescedPipe<String> coalescedPipe = new CoalescedPipe<>();
Object[] snapShot = coalescedPipe.takeSnapshot();
Assert.assertEquals(Arrays.toString(snapShot), 0, snapShot.length);
coalescedPipe.put("test1");
snapShot = coalescedPipe.takeSnapshot();
Assert.assertEquals(Arrays.toString(snapShot), 1, snapShot.length);
Assert.assertEquals("test1", snapShot[0]);
coalescedPipe.put("test2");
snapShot = coalescedPipe.takeSnapshot();
Assert.assertEquals(Arrays.toString(snapShot), 2, snapShot.length);
Assert.assertEquals("test1", snapShot[0]);
Assert.assertEquals("test2", snapShot[1]);
}
}