Back to Repositories

Testing Timeout Blocking Strategy Implementation in LMAX-Disruptor

This test suite evaluates the TimeoutBlockingWaitStrategy implementation in the LMAX Disruptor library, focusing on timeout behavior in concurrent operations. The tests verify that the waiting mechanism correctly handles timeout scenarios and enforces specified time limits for blocking operations.

Test Coverage Overview

The test coverage focuses on the timeout functionality of the BlockingWaitStrategy component.

  • Verifies timeout behavior when waiting for sequence updates
  • Tests exact timeout duration compliance
  • Validates exception handling for timeout scenarios
  • Covers sequence barrier interaction

Implementation Analysis

The testing approach employs JUnit Jupiter to validate timing-sensitive concurrent operations. The implementation uses precise time measurements and assertions to ensure the waiting strategy behaves correctly.

  • Utilizes DummySequenceBarrier for controlled testing
  • Implements time-based assertions for timeout verification
  • Uses JUnit’s assertThrows for exception validation

Technical Details

  • JUnit Jupiter test framework
  • TimeUnit for precise timeout specification
  • System.currentTimeMillis() for timing measurements
  • Custom sequence barrier implementation
  • Exception handling validation

Best Practices Demonstrated

The test exhibits strong concurrent testing practices with precise timing validation and clean exception handling.

  • Clear test method naming convention
  • Proper setup of test dependencies
  • Accurate timeout verification
  • Robust assertion combinations
  • Effective use of JUnit features

lmax-exchange/disruptor

src/test/java/com/lmax/disruptor/TimeoutBlockingWaitStrategyTest.java

            
package com.lmax.disruptor;

import com.lmax.disruptor.support.DummySequenceBarrier;
import org.junit.jupiter.api.Test;

import java.util.concurrent.TimeUnit;

import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;


public class TimeoutBlockingWaitStrategyTest
{
    @Test
    public void shouldTimeoutWaitFor()
    {
        final SequenceBarrier sequenceBarrier = new DummySequenceBarrier();

        long theTimeout = 500;
        TimeoutBlockingWaitStrategy waitStrategy = new TimeoutBlockingWaitStrategy(theTimeout, TimeUnit.MILLISECONDS);
        Sequence cursor = new Sequence(5);

        long t0 = System.currentTimeMillis();

        assertThrows(TimeoutException.class, () -> waitStrategy.waitFor(6, cursor, cursor, sequenceBarrier));

        long t1 = System.currentTimeMillis();

        long timeWaiting = t1 - t0;

        assertTrue(timeWaiting >= theTimeout);
    }
}