From 41f5f3515742a8ed25e599d496b5408ac2250104 Mon Sep 17 00:00:00 2001 From: Meteorite Date: Sun, 20 Aug 2017 12:31:06 +0300 Subject: [PATCH] fix hanging on AllData with large file --- src/main/java/net/pterodactylus/fcp/FcpUtils.java | 2 +- .../net/pterodactylus/fcp/TempInputStreamTest.java | 54 ++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 src/test/java/net/pterodactylus/fcp/TempInputStreamTest.java diff --git a/src/main/java/net/pterodactylus/fcp/FcpUtils.java b/src/main/java/net/pterodactylus/fcp/FcpUtils.java index b809f5d..b83de58 100644 --- a/src/main/java/net/pterodactylus/fcp/FcpUtils.java +++ b/src/main/java/net/pterodactylus/fcp/FcpUtils.java @@ -353,7 +353,7 @@ public class FcpUtils { FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(tempFile); - FcpUtils.copy(originalInputStream, fileOutputStream); + FcpUtils.copy(originalInputStream, fileOutputStream, length); fileInputStream = new FileInputStream(tempFile); } finally { FcpUtils.close(fileOutputStream); diff --git a/src/test/java/net/pterodactylus/fcp/TempInputStreamTest.java b/src/test/java/net/pterodactylus/fcp/TempInputStreamTest.java new file mode 100644 index 0000000..4e3646b --- /dev/null +++ b/src/test/java/net/pterodactylus/fcp/TempInputStreamTest.java @@ -0,0 +1,54 @@ +package net.pterodactylus.fcp; + +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertArrayEquals; + + +public class TempInputStreamTest { + + private byte[] prepareArrayOfNBytes(int n) { + byte[] data = new byte[n]; + for (int i = 0; i < n; ++i) { + data[i] = (byte)i; + } + return data; + } + + private void checkTempInputStreamStoresPartOfAnotherStream(int length, int maxMemoryLength) throws IOException { + byte[] originalData = prepareArrayOfNBytes(length + 1); + InputStream anotherStream = new ByteArrayInputStream(originalData); + FcpUtils.TempInputStream cut = new FcpUtils.TempInputStream(anotherStream, length, maxMemoryLength); + + // check length bytes are read from anotherStream and are accessible from cut + byte[] buffer = new byte[length]; + int n = cut.read(buffer); + assertThat(n, is(length)); + assertArrayEquals(Arrays.copyOf(originalData, length), buffer); + assertThat(cut.read(), is(-1)); // check end of cut stream + + // check the rest of data in anotherStream is still there + n = anotherStream.read(buffer); + assertThat(n, is(1)); + assertThat(buffer[0], is(originalData[originalData.length - 1])); + assertThat(anotherStream.read(), is(-1)); // check end of another stream + } + + @Test + public void tempInputStreamShouldCorrectlyStorePartOfAnotherStreamInMemory() throws IOException { + checkTempInputStreamStoresPartOfAnotherStream(1, 1); + } + + @Test + public void tempInputStreamShouldCorrectlyStorePartOfAnotherStreamInFile() throws IOException { + checkTempInputStreamStoresPartOfAnotherStream(2, 1); + } + +} -- 2.7.4