From 4ab767bec277e53065971619dc1e18db5a7f6455 Mon Sep 17 00:00:00 2001 From: Benedict Ayiko Date: Fri, 26 Feb 2021 11:41:58 +0300 Subject: [PATCH] BAEL-3439 - Add selector.wakeup() section (#10398) * Add selector.wakeup() section * Update SelectorTest.java * Update core-java-modules/core-java-nio-2/src/test/java/com/baeldung/selector/SelectorTest.java * Update SelectorTest.java * Update and rename SelectorTest.java to SelectorUnitTest.java * Update SelectorUnitTest.java * Update and rename SelectorUnitTest.java to SelectorManualTest.java --- core-java-modules/core-java-nio-2/pom.xml | 9 ++- .../baeldung/selector/SelectorManualTest.java | 64 +++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 core-java-modules/core-java-nio-2/src/test/java/com/baeldung/selector/SelectorManualTest.java diff --git a/core-java-modules/core-java-nio-2/pom.xml b/core-java-modules/core-java-nio-2/pom.xml index 0c7c079406..7c4583476d 100644 --- a/core-java-modules/core-java-nio-2/pom.xml +++ b/core-java-modules/core-java-nio-2/pom.xml @@ -14,5 +14,12 @@ 0.0.1-SNAPSHOT ../ - + + + org.assertj + assertj-core + 3.6.1 + test + + \ No newline at end of file diff --git a/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/selector/SelectorManualTest.java b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/selector/SelectorManualTest.java new file mode 100644 index 0000000000..7a6c9e6eab --- /dev/null +++ b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/selector/SelectorManualTest.java @@ -0,0 +1,64 @@ +package com.baeldung.selector; + +import org.junit.Test; +import java.io.IOException; +import java.nio.channels.Pipe; +import java.nio.channels.SelectableChannel; +import java.nio.channels.Selector; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CountDownLatch; + +import static org.assertj.core.api.Assertions.assertThat; + +import static java.nio.channels.SelectionKey.OP_READ; + +public class SelectorManualTest { + + @Test + public void whenWakeUpCalledOnSelector_thenBlockedThreadReturns() throws IOException, InterruptedException { + Pipe pipe = Pipe.open(); + + Selector selector = Selector.open(); + SelectableChannel channel = pipe.source(); + channel.configureBlocking(false); + channel.register(selector, OP_READ); + + List invocationStepsTracker = Collections.synchronizedList(new ArrayList<>()); + + CountDownLatch latch = new CountDownLatch(1); + + Thread thread = new Thread(() -> { + invocationStepsTracker.add(">> Count down"); + latch.countDown(); + try { + invocationStepsTracker.add(">> Start select"); + selector.select(); + invocationStepsTracker.add(">> End select"); + } catch (IOException e) { + e.printStackTrace(); + } + }); + + invocationStepsTracker.add(">> Start await"); + thread.start(); + latch.await(); + invocationStepsTracker.add(">> End await"); + + invocationStepsTracker.add(">> Wakeup thread"); + + selector.wakeup(); + channel.close(); + + assertThat(invocationStepsTracker) + .containsExactly( + ">> Start await", + ">> Count down", + ">> Start select", + ">> End await", + ">> Wakeup thread", + ">> End select" + ); + } +}