package com.github.davidmoten.rx.internal.operators;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import java.io.File;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicBoolean;
import org.junit.Test;
import com.github.davidmoten.rx.buffertofile.DataSerializers;
public class FileBasedSPSCQueueTest {
@Test
public void test() {
FileBasedSPSCQueue<Integer> q = createQueue();
q.offer(1);
assertEquals(1, (int) q.poll());
assertNull(q.poll());
}
@Test
public void test2() {
FileBasedSPSCQueue<Integer> q = createQueue();
q.offer(1);
q.offer(2);
assertEquals(1, (int) q.poll());
assertEquals(2, (int) q.poll());
assertNull(q.poll());
}
@Test
public void test3() {
FileBasedSPSCQueue<Integer> q = createQueue();
assertNull(q.poll());
q.offer(1);
q.offer(2);
assertEquals(1, (int) q.poll());
q.offer(3);
assertEquals(2, (int) q.poll());
assertEquals(3, (int) q.poll());
assertNull(q.poll());
}
@Test
public void testConcurrent() throws InterruptedException, ExecutionException {
File file = new File("target/pq2");
file.delete();
final FileBasedSPSCQueue<Integer> queue = new FileBasedSPSCQueue<Integer>(1024, file, DataSerializers.integer());
final int max = 10000000;
long t = System.currentTimeMillis();
final AtomicBoolean failed = new AtomicBoolean(false);
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= max; i++) {
queue.offer(i);
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
int i = 1;
while (i <= max) {
Integer t = queue.poll();
if (t != null) {
if (i != t) {
failed.set(true);
System.out.println("failed for i = " + i);
}
i++;
}
}
}
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(Math.round(max * 1000.0 / (System.currentTimeMillis() - t)) + " per second");
assertFalse(failed.get());
}
private static FileBasedSPSCQueue<Integer> createQueue() {
File file = new File("target/pq");
file.delete();
FileBasedSPSCQueue<Integer> q = new FileBasedSPSCQueue<Integer>(5, file, DataSerializers.integer());
return q;
}
}