@Test void awaitingShutdownMustBlockUntilAllMessagesHaveBeenProcessed() throws Exception final Event specialShutdownObservedEvent = new Event(); final CountDownLatch awaitStartLatch = new CountDownLatch( 1 ); final EventConsumer consumer = new EventConsumer(); asyncEvents.send( new Event() ); asyncEvents.send( new Event() ); asyncEvents.send( new Event() ); asyncEvents.send( new Event() ); asyncEvents.send( new Event() ); asyncEvents.send( new Event() );
@Test void mustProcessEventsDirectlyWhenShutDown() { assertTimeout( ofSeconds( 10 ), () -> { EventConsumer consumer = new EventConsumer(); AsyncEvents<Event> asyncEvents = new AsyncEvents<>( consumer, AsyncEvents.Monitor.NONE ); executor.submit( asyncEvents ); asyncEvents.send( new Event() ); Thread threadForFirstEvent = consumer.poll( 10, TimeUnit.SECONDS ).processedBy; asyncEvents.shutdown(); assertThat( threadForFirstEvent, is( not( Thread.currentThread() ) ) ); Thread threadForSubsequentEvents; do { asyncEvents.send( new Event() ); threadForSubsequentEvents = consumer.poll( 10, TimeUnit.SECONDS ).processedBy; } while ( threadForSubsequentEvents != Thread.currentThread() ); } ); }
@Test void eventsMustBeProcessedByBackgroundThread() throws Exception { EventConsumer consumer = new EventConsumer(); AsyncEvents<Event> asyncEvents = new AsyncEvents<>( consumer, AsyncEvents.Monitor.NONE ); executor.submit( asyncEvents ); Event firstSentEvent = new Event(); asyncEvents.send( firstSentEvent ); Event firstProcessedEvent = consumer.poll( 10, TimeUnit.SECONDS ); Event secondSentEvent = new Event(); asyncEvents.send( secondSentEvent ); Event secondProcessedEvent = consumer.poll( 10, TimeUnit.SECONDS ); asyncEvents.shutdown(); assertThat( firstProcessedEvent, is( firstSentEvent ) ); assertThat( secondProcessedEvent, is( secondSentEvent ) ); }
@Test void mustNotProcessEventInSameThreadWhenNotShutDown() throws Exception { EventConsumer consumer = new EventConsumer(); AsyncEvents<Event> asyncEvents = new AsyncEvents<>( consumer, AsyncEvents.Monitor.NONE ); executor.submit( asyncEvents ); asyncEvents.send( new Event() ); Thread processingThread = consumer.poll( 10, TimeUnit.SECONDS ).processedBy; asyncEvents.shutdown(); assertThat( processingThread, is( not( Thread.currentThread() ) ) ); }