diff --git a/tomcat/src/main/java/org/apache/catalina/connector/Connector.java b/tomcat/src/main/java/org/apache/catalina/connector/Connector.java index 2cf5e9e874..ea22734454 100644 --- a/tomcat/src/main/java/org/apache/catalina/connector/Connector.java +++ b/tomcat/src/main/java/org/apache/catalina/connector/Connector.java @@ -16,7 +16,7 @@ public class Connector implements Runnable { private static final int DEFAULT_PORT = 8080; private static final int DEFAULT_ACCEPT_COUNT = 100; - private static final int DEFAULT_MAX_THREADS = 250; + static final int DEFAULT_MAX_THREADS = 250; private final ServerSocket serverSocket; private final ExecutorService executor; diff --git a/tomcat/src/test/java/org/apache/catalina/connector/ConnectorTest.java b/tomcat/src/test/java/org/apache/catalina/connector/ConnectorTest.java new file mode 100644 index 0000000000..066a9655d7 --- /dev/null +++ b/tomcat/src/test/java/org/apache/catalina/connector/ConnectorTest.java @@ -0,0 +1,50 @@ +package org.apache.catalina.connector; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.net.ConnectException; +import java.net.Socket; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadPoolExecutor; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class ConnectorTest { + + @DisplayName("서버를 종료하면 더 이상 클라이언트를 받을 수 없다") + @Test + void stop() { + Connector connector = new Connector(); + connector.start(); + connector.stop(); + + assertThatThrownBy(() -> { + try (Socket clientSocket = new Socket("localhost", 8080)) {} + }).isInstanceOf(ConnectException.class); + } + + @DisplayName("스레드 풀의 크기는 250이다") + @Test + void testServerStop() { + final var executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(Connector.DEFAULT_MAX_THREADS); + for (int i = 0; i < 350; i++) { + executor.submit(threadSleep()); + } + final int expectedPoolSize = Connector.DEFAULT_MAX_THREADS; + final int expectedQueueSize = 100; + + assertThat(expectedPoolSize).isEqualTo(executor.getPoolSize()); + assertThat(expectedQueueSize).isEqualTo(executor.getQueue().size()); + } + + private Runnable threadSleep() { + return () -> { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + }; + } +}