package org.jgroups.tests; import org.jgroups.util.RingBuffer; import org.jgroups.util.Util; import org.testng.annotations.Test; import java.util.Arrays; /** * @author Bela Ban * @since 4.0 */ @Test public class RingBufferTest { public void testEmpty() { RingBuffer<Integer> rb=new RingBuffer<>(Integer.class, 8); System.out.println("rb = " + rb); //noinspection SizeReplaceableByIsEmpty assert rb.size() == 0; assert rb.isEmpty(); assert rb.readIndex() == rb.writeIndex(); } public void testWriteAndRead() throws Exception { RingBuffer<Integer> rb=new RingBuffer<>(Integer.class, 8); rb.put(1).put(2); System.out.println("rb = " + rb); assert rb.size() == 2; assert !rb.isEmpty(); rb.put(3).put(4); for(int i=1; i <= 4; i++) { int num=rb.take(); assert num == i; } for(int num: Arrays.asList(5,6,7,8,9,10)) rb.put(num); System.out.println("rb = " + rb); assert rb.size() == 6; for(int num: Arrays.asList(5,6,7,8,9,10)) { int n=rb.take(); assert num == n; } System.out.println("rb = " + rb); } public void testReadBlocking() throws InterruptedException { final RingBuffer<Integer> rb=new RingBuffer<>(Integer.class, 8); new Thread(()-> {Util.sleep(1000); try { rb.put(50); } catch(InterruptedException e) { } }).start(); int num=rb.take(); System.out.println("num = " + num); assert num == 50; } public void testWriteBlocking() throws InterruptedException { final RingBuffer<Integer> rb=new RingBuffer<>(Integer.class, 8); for(int i=1; i <= 8; i++) rb.put(i); new Thread(()-> {Util.sleep(1000); try { rb.take(); } catch(InterruptedException e) { } }).start(); rb.put(9); // this blocks first until the read() above has completed System.out.println("rb = " + rb); assert rb.size() == 8; int num=rb.take(); assert num == 2; } }