Skip to content

Commit 478cc73

Browse files
committed
FileOpener: Close input file resources.
1 parent e9c348d commit 478cc73

File tree

3 files changed

+46
-80
lines changed

3 files changed

+46
-80
lines changed

metafacture-io/src/main/java/org/metafacture/io/FileOpener.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,8 @@ public Reader open(final InputStream stream) throws IOException {
154154

155155
@Override
156156
public void process(final String file) {
157-
try {
158-
getReceiver().process(open(file));
157+
try (Reader reader = open(file)) {
158+
getReceiver().process(reader);
159159
}
160160
catch (final IOException e) {
161161
throw new MetafactureException(e);

metafacture-io/src/test/java/org/metafacture/io/FileOpenerCompressionTest.java

Lines changed: 13 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -16,31 +16,26 @@
1616

1717
package org.metafacture.io;
1818

19-
import static org.junit.Assert.assertEquals;
20-
import static org.mockito.Mockito.verify;
21-
22-
import java.io.File;
23-
import java.io.IOException;
24-
import java.io.InputStream;
25-
import java.io.Reader;
26-
import java.nio.file.Files;
27-
import java.nio.file.StandardCopyOption;
28-
import java.util.Arrays;
19+
import org.metafacture.framework.ObjectReceiver;
2920

30-
import org.junit.Before;
3121
import org.junit.Rule;
3222
import org.junit.Test;
3323
import org.junit.rules.TemporaryFolder;
3424
import org.junit.runner.RunWith;
3525
import org.junit.runners.Parameterized;
3626
import org.junit.runners.Parameterized.Parameters;
37-
import org.metafacture.commons.ResourceUtil;
38-
import org.metafacture.framework.ObjectReceiver;
39-
import org.mockito.ArgumentCaptor;
4027
import org.mockito.Mock;
4128
import org.mockito.junit.MockitoJUnit;
4229
import org.mockito.junit.MockitoRule;
4330

31+
import java.io.File;
32+
import java.io.IOException;
33+
import java.io.InputStream;
34+
import java.io.Reader;
35+
import java.nio.file.Files;
36+
import java.nio.file.StandardCopyOption;
37+
import java.util.Arrays;
38+
4439
/**
4540
* Tests for file compression in class {@link FileOpener}.
4641
*
@@ -62,13 +57,10 @@ public final class FileOpenerCompressionTest {
6257
@Mock
6358
private ObjectReceiver<Reader> receiver;
6459

65-
private FileOpener fileOpener;
66-
6760
private final String resourcePath;
6861
private final FileCompression compression;
6962

70-
public FileOpenerCompressionTest(final String resourcePath,
71-
final FileCompression compression) {
63+
public FileOpenerCompressionTest(final String resourcePath, final FileCompression compression) {
7264
this.resourcePath = resourcePath;
7365
this.compression = compression;
7466
}
@@ -93,35 +85,15 @@ public static Iterable<Object[]> data() {
9385
});
9486
}
9587

96-
@Before
97-
public void setup() {
98-
fileOpener = new FileOpener();
99-
fileOpener.setReceiver(receiver);
100-
}
101-
10288
@Test
10389
public void testOpenCompressedFiles() throws IOException {
104-
final File file = copyResourceToTempFile();
105-
106-
fileOpener.setCompression(compression);
107-
fileOpener.process(file.getAbsolutePath());
108-
109-
final ArgumentCaptor<Reader> readerCaptor =
110-
ArgumentCaptor.forClass(Reader.class);
111-
verify(receiver).process(readerCaptor.capture());
112-
final String charsFromFile;
113-
try (Reader reader = readerCaptor.getValue()) {
114-
charsFromFile = ResourceUtil.readAll(reader);
115-
}
116-
assertEquals(DATA, charsFromFile);
117-
}
118-
119-
private File copyResourceToTempFile() throws IOException {
12090
final File file = tempFolder.newFile();
91+
12192
try (InputStream in = getClass().getResourceAsStream(resourcePath)) {
12293
Files.copy(in, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
12394
}
124-
return file;
95+
96+
FileOpenerTest.assertData(receiver, DATA, file, o -> o.setCompression(compression));
12597
}
12698

12799
}

metafacture-io/src/test/java/org/metafacture/io/FileOpenerTest.java

Lines changed: 31 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,18 @@
1616

1717
package org.metafacture.io;
1818

19-
import static org.junit.Assert.assertEquals;
20-
import static org.junit.Assert.assertTrue;
21-
import static org.junit.Assume.assumeFalse;
22-
import static org.mockito.Mockito.verify;
19+
import org.metafacture.commons.ResourceUtil;
20+
import org.metafacture.framework.ObjectReceiver;
21+
22+
import org.junit.Assert;
23+
import org.junit.Assume;
24+
import org.junit.Rule;
25+
import org.junit.Test;
26+
import org.junit.rules.TemporaryFolder;
27+
import org.mockito.Mock;
28+
import org.mockito.Mockito;
29+
import org.mockito.junit.MockitoJUnit;
30+
import org.mockito.junit.MockitoRule;
2331

2432
import java.io.File;
2533
import java.io.FileOutputStream;
@@ -32,17 +40,7 @@
3240
import java.nio.charset.StandardCharsets;
3341
import java.nio.file.Files;
3442
import java.nio.file.StandardCopyOption;
35-
36-
import org.junit.Rule;
37-
import org.junit.Test;
38-
import org.junit.rules.TemporaryFolder;
39-
import org.metafacture.commons.ResourceUtil;
40-
import org.metafacture.framework.ObjectReceiver;
41-
import org.mockito.ArgumentCaptor;
42-
import org.mockito.Captor;
43-
import org.mockito.Mock;
44-
import org.mockito.junit.MockitoJUnit;
45-
import org.mockito.junit.MockitoRule;
43+
import java.util.function.Consumer;
4644

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

66-
@Captor
67-
private ArgumentCaptor<Reader> processedObject;
68-
6964
@Test
7065
public void testUtf8IsDefaultEncoding() throws IOException {
71-
assumeFalse("Default encoding is UTF-8: It is not possible to test whether " +
72-
"FileOpener sets the encoding to UTF-8 correctly.",
73-
StandardCharsets.UTF_8.equals(Charset.defaultCharset()));
74-
75-
final File testFile = createTestFile();
76-
77-
final FileOpener opener = new FileOpener();
78-
opener.setReceiver(receiver);
79-
opener.process(testFile.getAbsolutePath());
80-
opener.closeStream();
66+
Assume.assumeFalse("Default encoding is UTF-8: It is not possible to test whether FileOpener sets " +
67+
"the encoding to UTF-8 correctly.", StandardCharsets.UTF_8.equals(Charset.defaultCharset()));
8168

82-
verify(receiver).process(processedObject.capture());
83-
assertEquals(DATA, ResourceUtil.readAll(processedObject.getValue()));
69+
assertData(receiver, DATA, createTestFile(), null);
8470
}
8571

8672
@Test
@@ -105,19 +91,27 @@ private void testDecompressConcatenated(final boolean decompressConcatenated) th
10591
}
10692

10793
final String data = sb.toString();
108-
assertTrue(data.length() + " > " + maxBytes, data.length() > maxBytes);
94+
Assert.assertTrue(data.length() + " > " + maxBytes, data.length() > maxBytes);
10995

110-
final File testFile = copyResourceToTempFile("compressed-large.txt.bgzf");
96+
assertData(receiver, decompressConcatenated ? data : data.substring(0, maxBytes),
97+
copyResourceToTempFile("compressed-large.txt.bgzf"), o -> o.setDecompressConcatenated(decompressConcatenated));
98+
}
99+
100+
/*package-private*/ static void assertData(final ObjectReceiver<Reader> receiver, final String expected, final File file, final Consumer<FileOpener> consumer) {
101+
final StringBuilder sb = new StringBuilder();
102+
Mockito.doAnswer(i -> sb.append(ResourceUtil.readAll(i.getArgument(0)))).when(receiver).process(Mockito.any(Reader.class));
111103

112104
final FileOpener opener = new FileOpener();
113-
opener.setDecompressConcatenated(decompressConcatenated);
105+
if (consumer != null) {
106+
consumer.accept(opener);
107+
}
108+
114109
opener.setReceiver(receiver);
115-
opener.process(testFile.getAbsolutePath());
110+
opener.process(file.getAbsolutePath());
116111
opener.closeStream();
117112

118-
verify(receiver).process(processedObject.capture());
119-
assertEquals(decompressConcatenated ? data : data.substring(0, maxBytes),
120-
ResourceUtil.readAll(processedObject.getValue()));
113+
Mockito.verify(receiver).process(Mockito.any(Reader.class));
114+
Assert.assertEquals(expected, sb.toString());
121115
}
122116

123117
private File createTestFile() throws IOException {

0 commit comments

Comments
 (0)