diff --git a/core-java-modules/core-java-io/pom.xml b/core-java-modules/core-java-io/pom.xml index 8364f36874..c5fbbc10f9 100644 --- a/core-java-modules/core-java-io/pom.xml +++ b/core-java-modules/core-java-io/pom.xml @@ -54,6 +54,13 @@ + + maven-compiler-plugin + + 11 + 11 + + org.codehaus.mojo exec-maven-plugin diff --git a/core-java-modules/core-java-io/src/test/java/com/baeldung/close/StreamCloseUnitTest.java b/core-java-modules/core-java-io/src/test/java/com/baeldung/close/StreamCloseUnitTest.java new file mode 100644 index 0000000000..aa462ba984 --- /dev/null +++ b/core-java-modules/core-java-io/src/test/java/com/baeldung/close/StreamCloseUnitTest.java @@ -0,0 +1,118 @@ +package com.baeldung.close; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.io.*; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.io.input.AutoCloseInputStream; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@RunWith(MockitoJUnitRunner.class) +public class StreamCloseUnitTest { + + private static final Logger log = LoggerFactory.getLogger(StreamCloseUnitTest.class); + + @Mock + private OutputStream wrappedOutputStream; + + @Mock + private InputStream wrappedInputStream; + + @Test + public void whenStreamClosedByFinally_thenIOStreamsCloseCalled() throws IOException { + + InputStream inputStream = null; + OutputStream outputStream = null; + + try { + inputStream = new BufferedInputStream(wrappedInputStream); + outputStream = new BufferedOutputStream(wrappedOutputStream); + } + finally { + try { + if (inputStream != null) + inputStream.close(); + } + catch (IOException ioe1) { + log.error("Cannot close InputStream"); + } + try { + if (outputStream != null) + outputStream.close(); + } + catch (IOException ioe2) { + log.error("Cannot close OutputStream"); + } + } + + verify(wrappedInputStream).close(); + verify(wrappedOutputStream).close(); + } + + @Test + public void whenStreamClosedByCloseQuietly_thenIOStreamsCloseCalled() throws IOException { + + InputStream inputStream = null; + OutputStream outputStream = null; + + try { + inputStream = new BufferedInputStream(wrappedInputStream); + outputStream = new BufferedOutputStream(wrappedOutputStream); + } + finally { + IOUtils.closeQuietly(inputStream); + IOUtils.closeQuietly(outputStream); + } + + verify(wrappedInputStream).close(); + verify(wrappedOutputStream).close(); + } + + @Test + public void whenFinishReadOnAutoCloseInputStream_thenInputStreamsCloseCalled() throws IOException { + + // Mimic no more data in the InputStream + when(wrappedInputStream.read(any(byte[].class))).thenReturn(-1); + + InputStream inputStream = AutoCloseInputStream.builder().setInputStream(wrappedInputStream).get(); + + byte[] buffer = new byte[256]; + while (inputStream.read(buffer) != -1) { + } + + verify(wrappedInputStream).close(); + } + + @Test + public void whenStreamClosedByWithResources_thenIOStreamsCloseCalled() throws IOException { + + try (BufferedInputStream inputStream = new BufferedInputStream(wrappedInputStream); + BufferedOutputStream outputStream = new BufferedOutputStream(wrappedOutputStream)) { + } + + verify(wrappedInputStream).close(); + verify(wrappedOutputStream).close(); + } + + @Test + public void whenStreamClosedByWithResourcesJava9_thenIOStreamsCloseCalled() throws IOException { + + InputStream inputStream = new BufferedInputStream(wrappedInputStream); + OutputStream outputStream = new BufferedOutputStream(wrappedOutputStream); + + try (inputStream; outputStream) { + } + + verify(wrappedInputStream).close(); + verify(wrappedOutputStream).close(); + } + +} \ No newline at end of file