Skip to content

Commit

Permalink
FileOpener: Close input file resources.
Browse files Browse the repository at this point in the history
  • Loading branch information
blackwinter committed Dec 21, 2023
1 parent e9c348d commit 478cc73
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 80 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -154,8 +154,8 @@ public Reader open(final InputStream stream) throws IOException {

@Override
public void process(final String file) {
try {
getReceiver().process(open(file));
try (Reader reader = open(file)) {
getReceiver().process(reader);
}
catch (final IOException e) {
throw new MetafactureException(e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,31 +16,26 @@

package org.metafacture.io;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.verify;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.Arrays;
import org.metafacture.framework.ObjectReceiver;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.metafacture.commons.ResourceUtil;
import org.metafacture.framework.ObjectReceiver;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.Arrays;

/**
* Tests for file compression in class {@link FileOpener}.
*
Expand All @@ -62,13 +57,10 @@ public final class FileOpenerCompressionTest {
@Mock
private ObjectReceiver<Reader> receiver;

private FileOpener fileOpener;

private final String resourcePath;
private final FileCompression compression;

public FileOpenerCompressionTest(final String resourcePath,
final FileCompression compression) {
public FileOpenerCompressionTest(final String resourcePath, final FileCompression compression) {
this.resourcePath = resourcePath;
this.compression = compression;
}
Expand All @@ -93,35 +85,15 @@ public static Iterable<Object[]> data() {
});
}

@Before
public void setup() {
fileOpener = new FileOpener();
fileOpener.setReceiver(receiver);
}

@Test
public void testOpenCompressedFiles() throws IOException {
final File file = copyResourceToTempFile();

fileOpener.setCompression(compression);
fileOpener.process(file.getAbsolutePath());

final ArgumentCaptor<Reader> readerCaptor =
ArgumentCaptor.forClass(Reader.class);
verify(receiver).process(readerCaptor.capture());
final String charsFromFile;
try (Reader reader = readerCaptor.getValue()) {
charsFromFile = ResourceUtil.readAll(reader);
}
assertEquals(DATA, charsFromFile);
}

private File copyResourceToTempFile() throws IOException {
final File file = tempFolder.newFile();

try (InputStream in = getClass().getResourceAsStream(resourcePath)) {
Files.copy(in, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
return file;

FileOpenerTest.assertData(receiver, DATA, file, o -> o.setCompression(compression));
}

}
68 changes: 31 additions & 37 deletions metafacture-io/src/test/java/org/metafacture/io/FileOpenerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,18 @@

package org.metafacture.io;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeFalse;
import static org.mockito.Mockito.verify;
import org.metafacture.commons.ResourceUtil;
import org.metafacture.framework.ObjectReceiver;

import org.junit.Assert;
import org.junit.Assume;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;

import java.io.File;
import java.io.FileOutputStream;
Expand All @@ -32,17 +40,7 @@
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.metafacture.commons.ResourceUtil;
import org.metafacture.framework.ObjectReceiver;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import java.util.function.Consumer;

/**
* Tests for class {@link FileOpener}.
Expand All @@ -63,24 +61,12 @@ public final class FileOpenerTest {
@Mock
private ObjectReceiver<Reader> receiver;

@Captor
private ArgumentCaptor<Reader> processedObject;

@Test
public void testUtf8IsDefaultEncoding() throws IOException {
assumeFalse("Default encoding is UTF-8: It is not possible to test whether " +
"FileOpener sets the encoding to UTF-8 correctly.",
StandardCharsets.UTF_8.equals(Charset.defaultCharset()));

final File testFile = createTestFile();

final FileOpener opener = new FileOpener();
opener.setReceiver(receiver);
opener.process(testFile.getAbsolutePath());
opener.closeStream();
Assume.assumeFalse("Default encoding is UTF-8: It is not possible to test whether FileOpener sets " +
"the encoding to UTF-8 correctly.", StandardCharsets.UTF_8.equals(Charset.defaultCharset()));

verify(receiver).process(processedObject.capture());
assertEquals(DATA, ResourceUtil.readAll(processedObject.getValue()));
assertData(receiver, DATA, createTestFile(), null);
}

@Test
Expand All @@ -105,19 +91,27 @@ private void testDecompressConcatenated(final boolean decompressConcatenated) th
}

final String data = sb.toString();
assertTrue(data.length() + " > " + maxBytes, data.length() > maxBytes);
Assert.assertTrue(data.length() + " > " + maxBytes, data.length() > maxBytes);

final File testFile = copyResourceToTempFile("compressed-large.txt.bgzf");
assertData(receiver, decompressConcatenated ? data : data.substring(0, maxBytes),
copyResourceToTempFile("compressed-large.txt.bgzf"), o -> o.setDecompressConcatenated(decompressConcatenated));
}

/*package-private*/ static void assertData(final ObjectReceiver<Reader> receiver, final String expected, final File file, final Consumer<FileOpener> consumer) {
final StringBuilder sb = new StringBuilder();
Mockito.doAnswer(i -> sb.append(ResourceUtil.readAll(i.getArgument(0)))).when(receiver).process(Mockito.any(Reader.class));

final FileOpener opener = new FileOpener();
opener.setDecompressConcatenated(decompressConcatenated);
if (consumer != null) {
consumer.accept(opener);
}

opener.setReceiver(receiver);
opener.process(testFile.getAbsolutePath());
opener.process(file.getAbsolutePath());
opener.closeStream();

verify(receiver).process(processedObject.capture());
assertEquals(decompressConcatenated ? data : data.substring(0, maxBytes),
ResourceUtil.readAll(processedObject.getValue()));
Mockito.verify(receiver).process(Mockito.any(Reader.class));
Assert.assertEquals(expected, sb.toString());
}

private File createTestFile() throws IOException {
Expand Down

0 comments on commit 478cc73

Please sign in to comment.