1717
1818import static com .google .common .truth .Truth .assertThat ;
1919
20+ import java .util .ArrayList ;
2021import java .util .concurrent .atomic .AtomicInteger ;
2122import java .util .concurrent .locks .ReentrantLock ;
2223
3132 * @author ben.manes@gmail.com (Ben Manes)
3233 */
3334public final class BoundedBufferTest {
34- static final String DUMMY = "test" ;
3535
3636 @ DataProvider
3737 public Object [][] buffer () {
38- return new Object [][] {{ new BoundedBuffer <String >() }};
38+ return new Object [][] {{ new BoundedBuffer <Boolean >() }};
3939 }
4040
4141 @ Test (dataProvider = "buffer" )
42- public void offer (BoundedBuffer <String > buffer ) {
42+ public void offer (BoundedBuffer <Boolean > buffer ) {
4343 ConcurrentTestHarness .timeTasks (10 , () -> {
4444 for (int i = 0 ; i < 100 ; i ++) {
45- buffer .offer (DUMMY );
45+ buffer .offer (Boolean . TRUE );
4646 }
4747 });
4848 assertThat (buffer .writes ()).isGreaterThan (0 );
4949 assertThat (buffer .writes ()).isEqualTo (buffer .size ());
5050 }
5151
5252 @ Test (dataProvider = "buffer" )
53- public void drain (BoundedBuffer <String > buffer ) {
53+ public void drain (BoundedBuffer <Boolean > buffer ) {
5454 for (int i = 0 ; i < BoundedBuffer .BUFFER_SIZE ; i ++) {
55- buffer .offer (DUMMY );
55+ buffer .offer (Boolean . TRUE );
5656 }
5757 long [] read = new long [1 ];
5858 buffer .drainTo (e -> read [0 ]++);
@@ -62,12 +62,12 @@ public void drain(BoundedBuffer<String> buffer) {
6262
6363 @ Test (dataProvider = "buffer" )
6464 @ SuppressWarnings ("ThreadPriorityCheck" )
65- public void offerAndDrain (BoundedBuffer <String > buffer ) {
65+ public void offerAndDrain (BoundedBuffer <Boolean > buffer ) {
6666 var lock = new ReentrantLock ();
6767 var reads = new AtomicInteger ();
6868 ConcurrentTestHarness .timeTasks (10 , () -> {
6969 for (int i = 0 ; i < 1000 ; i ++) {
70- boolean shouldDrain = (buffer .offer (DUMMY ) == Buffer .FULL );
70+ boolean shouldDrain = (buffer .offer (Boolean . TRUE ) == Buffer .FULL );
7171 if (shouldDrain && lock .tryLock ()) {
7272 buffer .drainTo (e -> reads .incrementAndGet ());
7373 lock .unlock ();
@@ -79,4 +79,22 @@ public void offerAndDrain(BoundedBuffer<String> buffer) {
7979 assertThat (reads .longValue ()).isEqualTo (buffer .reads ());
8080 assertThat (reads .longValue ()).isEqualTo (buffer .writes ());
8181 }
82+
83+ @ Test
84+ public void overflow () {
85+ var buffer = new BoundedBuffer .RingBuffer <Boolean >(null );
86+ buffer .writeCounter = Long .MAX_VALUE ;
87+ buffer .readCounter = Long .MAX_VALUE ;
88+
89+ buffer .offer (Boolean .TRUE );
90+ var data = new ArrayList <>();
91+ buffer .drainTo (data ::add );
92+
93+ for (var e : buffer .buffer ) {
94+ assertThat (e ).isNull ();
95+ }
96+ assertThat (data ).containsExactly (Boolean .TRUE );
97+ assertThat (buffer .readCounter ).isEqualTo (Long .MIN_VALUE );
98+ assertThat (buffer .writeCounter ).isEqualTo (Long .MIN_VALUE );
99+ }
82100}
0 commit comments