From d72671c4204d9a4d650d8d250aaf3d5caffa9d50 Mon Sep 17 00:00:00 2001 From: Florian Angerer <florian.angerer@oracle.com> Date: Thu, 14 Dec 2017 19:04:50 +0100 Subject: [PATCH] Reading files lazy and aborting if file is too large. --- .../packages/analyzer/FileLineListReader.java | 36 +++++++++++ .../packages/analyzer/FileLineReader.java | 42 +++++++++++++ .../analyzer/FileLineStreamReader.java | 33 +++++++++++ .../detectors/ConfigureErrorDetector.java | 4 +- .../packages/analyzer/detectors/Detector.java | 3 +- .../InstallationProblemDetector.java | 4 +- .../analyzer/detectors/LineDetector.java | 4 +- .../analyzer/detectors/RErrorDetector.java | 4 +- .../detectors/RInternalErrorDetector.java | 9 +-- .../analyzer/detectors/SegfaultDetector.java | 4 +- .../detectors/SymbolLookupErrorDetector.java | 4 +- .../UnsupportedSpecializationDetector.java | 4 +- .../analyzer/parser/LogFileParser.java | 59 +++++++++++++------ .../analyzer/test/RErrorDetectorTest.java | 32 +++++----- 14 files changed, 190 insertions(+), 52 deletions(-) create mode 100644 com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/FileLineListReader.java create mode 100644 com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/FileLineReader.java create mode 100644 com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/FileLineStreamReader.java diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/FileLineListReader.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/FileLineListReader.java new file mode 100644 index 0000000000..c2d9f1d960 --- /dev/null +++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/FileLineListReader.java @@ -0,0 +1,36 @@ +package com.oracle.truffle.r.test.packages.analyzer; + +import java.io.IOException; +import java.util.Iterator; +import java.util.List; + +public class FileLineListReader extends FileLineReader { + + private final Iterator<String> it; + private final boolean empty; + + public FileLineListReader(List<String> lines) { + Iterator<String> iterator = lines.iterator(); + this.it = iterator; + this.empty = iterator.hasNext(); + } + + @Override + public String readLine() throws IOException { + if (!it.hasNext()) { + return null; + } + return it.next(); + } + + @Override + public boolean isEmpty() { + return empty; + } + + @Override + public Iterator<String> iterator() { + return it; + } + +} diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/FileLineReader.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/FileLineReader.java new file mode 100644 index 0000000000..4d3301e999 --- /dev/null +++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/FileLineReader.java @@ -0,0 +1,42 @@ +package com.oracle.truffle.r.test.packages.analyzer; + +import java.io.IOException; +import java.util.Iterator; +import java.util.NoSuchElementException; + +public abstract class FileLineReader implements Iterable<String> { + + public abstract String readLine() throws IOException; + + public abstract boolean isEmpty(); + + @Override + public Iterator<String> iterator() { + return new Iterator<String>() { + + private String line = null; + + @Override + public boolean hasNext() { + try { + if (line == null) { + line = readLine(); + } + return line != null; + } catch (IOException e) { + // ignore + } + return false; + } + + @Override + public String next() { + if (hasNext()) { + return line; + } + throw new NoSuchElementException(); + } + }; + } + +} diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/FileLineStreamReader.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/FileLineStreamReader.java new file mode 100644 index 0000000000..fec19a56cb --- /dev/null +++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/FileLineStreamReader.java @@ -0,0 +1,33 @@ +package com.oracle.truffle.r.test.packages.analyzer; + +import java.io.BufferedReader; +import java.io.IOException; + +public class FileLineStreamReader extends FileLineReader { + /** Maximum number of lines that will be analyzed. */ + public static final int MAX_LINES = 50000; + + private final BufferedReader reader; + private int cnt = 0; + + public FileLineStreamReader(BufferedReader in) { + this.reader = in; + } + + @Override + public String readLine() throws IOException { + if (cnt++ >= MAX_LINES) { + throw new IOException("File is too large for analysis."); + } + return reader.readLine(); + } + + @Override + public boolean isEmpty() { + try { + return reader.ready(); + } catch (IOException e) { + return false; + } + } +} diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/ConfigureErrorDetector.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/ConfigureErrorDetector.java index 008b48d83c..324fa59d33 100644 --- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/ConfigureErrorDetector.java +++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/ConfigureErrorDetector.java @@ -24,8 +24,8 @@ package com.oracle.truffle.r.test.packages.analyzer.detectors; import java.util.Collection; import java.util.LinkedList; -import java.util.List; +import com.oracle.truffle.r.test.packages.analyzer.FileLineReader; import com.oracle.truffle.r.test.packages.analyzer.Location; import com.oracle.truffle.r.test.packages.analyzer.Problem; import com.oracle.truffle.r.test.packages.analyzer.model.RPackageTestRun; @@ -45,7 +45,7 @@ public class ConfigureErrorDetector extends LineDetector { } @Override - public Collection<Problem> detect(RPackageTestRun pkgTestRun, Location startLocation, List<String> body) { + public Collection<Problem> detect(RPackageTestRun pkgTestRun, Location startLocation, FileLineReader body) { Collection<Problem> problems = new LinkedList<>(); assert body.isEmpty() || startLocation != null; int lineNr = startLocation != null ? startLocation.lineNr : 0; diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/Detector.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/Detector.java index b71512b5e5..c31440649c 100644 --- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/Detector.java +++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/Detector.java @@ -22,6 +22,7 @@ */ package com.oracle.truffle.r.test.packages.analyzer.detectors; +import java.io.IOException; import java.util.Collection; import java.util.LinkedList; @@ -60,6 +61,6 @@ public abstract class Detector<T> { * @param body The content to analyze (e.g. a list of lines in a file). * @return A list of detected problems (must not be {@code null}). */ - public abstract Collection<Problem> detect(RPackageTestRun pkgTestRun, Location startLineLocation, T body); + public abstract Collection<Problem> detect(RPackageTestRun pkgTestRun, Location startLineLocation, T body) throws IOException; } diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/InstallationProblemDetector.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/InstallationProblemDetector.java index b63d31b1d5..d975a8a359 100644 --- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/InstallationProblemDetector.java +++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/InstallationProblemDetector.java @@ -24,10 +24,10 @@ package com.oracle.truffle.r.test.packages.analyzer.detectors; import java.util.Collection; import java.util.Collections; -import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import com.oracle.truffle.r.test.packages.analyzer.FileLineReader; import com.oracle.truffle.r.test.packages.analyzer.Location; import com.oracle.truffle.r.test.packages.analyzer.Problem; import com.oracle.truffle.r.test.packages.analyzer.model.RPackageTestRun; @@ -47,7 +47,7 @@ public class InstallationProblemDetector extends LineDetector { } @Override - public Collection<Problem> detect(RPackageTestRun pkg, Location startLocation, List<String> body) { + public Collection<Problem> detect(RPackageTestRun pkg, Location startLocation, FileLineReader body) { int lineNr = startLocation.lineNr; for (String line : body) { Matcher matcher = pattern.matcher(line); diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/LineDetector.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/LineDetector.java index a035f5eb1b..ac8f861041 100644 --- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/LineDetector.java +++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/LineDetector.java @@ -22,9 +22,9 @@ */ package com.oracle.truffle.r.test.packages.analyzer.detectors; -import java.util.List; +import com.oracle.truffle.r.test.packages.analyzer.FileLineReader; -public abstract class LineDetector extends Detector<List<String>> { +public abstract class LineDetector extends Detector<FileLineReader> { protected LineDetector() { super(null); diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/RErrorDetector.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/RErrorDetector.java index 6f30403744..1a586f6eed 100644 --- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/RErrorDetector.java +++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/RErrorDetector.java @@ -25,10 +25,10 @@ package com.oracle.truffle.r.test.packages.analyzer.detectors; import java.util.Collection; import java.util.Iterator; import java.util.LinkedList; -import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import com.oracle.truffle.r.test.packages.analyzer.FileLineReader; import com.oracle.truffle.r.test.packages.analyzer.Location; import com.oracle.truffle.r.test.packages.analyzer.Problem; import com.oracle.truffle.r.test.packages.analyzer.model.RPackageTestRun; @@ -48,7 +48,7 @@ public class RErrorDetector extends LineDetector { } @Override - public Collection<Problem> detect(RPackageTestRun pkg, Location startLocation, List<String> body) { + public Collection<Problem> detect(RPackageTestRun pkg, Location startLocation, FileLineReader body) { Collection<Problem> problems = new LinkedList<>(); assert body.isEmpty() || startLocation != null; diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/RInternalErrorDetector.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/RInternalErrorDetector.java index 56b5e78ced..6283bc19d5 100644 --- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/RInternalErrorDetector.java +++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/RInternalErrorDetector.java @@ -22,10 +22,11 @@ */ package com.oracle.truffle.r.test.packages.analyzer.detectors; +import java.io.IOException; import java.util.Collection; import java.util.LinkedList; -import java.util.List; +import com.oracle.truffle.r.test.packages.analyzer.FileLineReader; import com.oracle.truffle.r.test.packages.analyzer.Location; import com.oracle.truffle.r.test.packages.analyzer.Problem; import com.oracle.truffle.r.test.packages.analyzer.model.RPackageTestRun; @@ -46,11 +47,11 @@ public class RInternalErrorDetector extends LineDetector { } @Override - public Collection<Problem> detect(RPackageTestRun pkg, Location startLocation, List<String> body) { + public Collection<Problem> detect(RPackageTestRun pkg, Location startLocation, FileLineReader body) throws IOException { Collection<Problem> problems = new LinkedList<>(); - assert body.isEmpty() || startLocation != null; int lineNr = startLocation != null ? startLocation.lineNr : 0; - for (String line : body) { + String line = null; + while ((line = body.readLine()) != null) { int indexOf = line.indexOf(P); if (indexOf != -1) { String message = line.substring(indexOf + P.length()); diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/SegfaultDetector.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/SegfaultDetector.java index f23d7933a9..0c601f37f2 100644 --- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/SegfaultDetector.java +++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/SegfaultDetector.java @@ -24,8 +24,8 @@ package com.oracle.truffle.r.test.packages.analyzer.detectors; import java.util.Collection; import java.util.Collections; -import java.util.List; +import com.oracle.truffle.r.test.packages.analyzer.FileLineReader; import com.oracle.truffle.r.test.packages.analyzer.Location; import com.oracle.truffle.r.test.packages.analyzer.Problem; import com.oracle.truffle.r.test.packages.analyzer.model.RPackageTestRun; @@ -44,7 +44,7 @@ public class SegfaultDetector extends LineDetector { } @Override - public Collection<Problem> detect(RPackageTestRun pkg, Location startLocation, List<String> body) { + public Collection<Problem> detect(RPackageTestRun pkg, Location startLocation, FileLineReader body) { StringBuilder segfaultMessage = new StringBuilder(); boolean collect = false; assert body.isEmpty() || startLocation != null; diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/SymbolLookupErrorDetector.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/SymbolLookupErrorDetector.java index bd218894e0..4676780e54 100644 --- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/SymbolLookupErrorDetector.java +++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/SymbolLookupErrorDetector.java @@ -24,10 +24,10 @@ package com.oracle.truffle.r.test.packages.analyzer.detectors; import java.util.Collection; import java.util.LinkedList; -import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import com.oracle.truffle.r.test.packages.analyzer.FileLineReader; import com.oracle.truffle.r.test.packages.analyzer.Location; import com.oracle.truffle.r.test.packages.analyzer.Problem; import com.oracle.truffle.r.test.packages.analyzer.model.RPackageTestRun; @@ -47,7 +47,7 @@ public final class SymbolLookupErrorDetector extends LineDetector { } @Override - public Collection<Problem> detect(RPackageTestRun pkgTestRun, Location startLocation, List<String> body) { + public Collection<Problem> detect(RPackageTestRun pkgTestRun, Location startLocation, FileLineReader body) { Collection<Problem> problems = new LinkedList<>(); int lineNr = startLocation != null ? startLocation.lineNr : 0; for (String line : body) { diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/UnsupportedSpecializationDetector.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/UnsupportedSpecializationDetector.java index 99f270940e..260e7a09cb 100644 --- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/UnsupportedSpecializationDetector.java +++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/UnsupportedSpecializationDetector.java @@ -24,10 +24,10 @@ package com.oracle.truffle.r.test.packages.analyzer.detectors; import java.util.Collection; import java.util.LinkedList; -import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import com.oracle.truffle.r.test.packages.analyzer.FileLineReader; import com.oracle.truffle.r.test.packages.analyzer.Location; import com.oracle.truffle.r.test.packages.analyzer.Problem; import com.oracle.truffle.r.test.packages.analyzer.model.RPackageTestRun; @@ -49,7 +49,7 @@ public class UnsupportedSpecializationDetector extends LineDetector { } @Override - public Collection<Problem> detect(RPackageTestRun pkg, Location startLocation, List<String> body) { + public Collection<Problem> detect(RPackageTestRun pkg, Location startLocation, FileLineReader body) { Collection<Problem> problems = new LinkedList<>(); String message = null; assert body.isEmpty() || startLocation != null; diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/parser/LogFileParser.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/parser/LogFileParser.java index 57ddf81a2a..7e93063deb 100644 --- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/parser/LogFileParser.java +++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/parser/LogFileParser.java @@ -27,12 +27,12 @@ import java.io.IOException; import java.nio.file.FileVisitResult; import java.nio.file.FileVisitor; import java.nio.file.Files; -import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; @@ -46,6 +46,9 @@ import java.util.logging.Logger; import java.util.stream.Collectors; import java.util.stream.Stream; +import com.oracle.truffle.r.test.packages.analyzer.FileLineListReader; +import com.oracle.truffle.r.test.packages.analyzer.FileLineReader; +import com.oracle.truffle.r.test.packages.analyzer.FileLineStreamReader; import com.oracle.truffle.r.test.packages.analyzer.Location; import com.oracle.truffle.r.test.packages.analyzer.Problem; import com.oracle.truffle.r.test.packages.analyzer.detectors.Detector; @@ -176,18 +179,23 @@ public class LogFileParser { if (Files.isReadable(outputFile)) { ignoreFiles.add(outputFile); - checkResults.problems.addAll(applyDetectors(Token.OUTPUT_MISMATCH_FASTR, outputFile, 0, Files.readAllLines(outputFile))); + try (BufferedReader in = Files.newBufferedReader(outputFile)) { + checkResults.problems.addAll(applyDetectors(Token.OUTPUT_MISMATCH_FASTR, outputFile, 0, new FileLineStreamReader(in))); + } catch (IOException e) { + // silently ignore + } } else { // try to find the file anywhere in the test run directory (there were some // cases) Optional<Path> findFirst = null; - try { - findFirst = Files.find(logFile.path.getParent(), 3, (path, attr) -> path.getFileName().equals(outputFile.getFileName())).findFirst(); + findFirst = Files.find(logFile.path.getParent(), 3, (path, attr) -> path.getFileName().equals(outputFile.getFileName())).findFirst(); + try (BufferedReader in = Files.newBufferedReader(findFirst.get())) { if (findFirst.isPresent()) { ignoreFiles.add(findFirst.get()); - checkResults.problems.addAll(applyDetectors(Token.OUTPUT_MISMATCH_FASTR, findFirst.get(), 0, Files.readAllLines(findFirst.get()))); + checkResults.problems.addAll(applyDetectors(Token.OUTPUT_MISMATCH_FASTR, findFirst.get(), 0, new FileLineStreamReader(in))); } - } catch (NoSuchFileException e) { + } catch (IOException e) { + // silently ignore } if (findFirst == null || !findFirst.isPresent()) { LOGGER.warning("Cannot read output file " + outputFile); @@ -198,8 +206,10 @@ public class LogFileParser { } checkResults.setSuccess(false); - } else { + } else if (laMatches(Token.END_CHECKING)) { break; + } else { + consumeLine(); } } @@ -304,11 +314,15 @@ public class LogFileParser { // apply detectors to diff chunks testing.problems.addAll(applyTestResultDetectors(diffResult)); diffResult.stream().forEach(chunk -> { - if (!chunk.getLeft().isEmpty()) { - testing.problems.addAll(applyDetectors(Token.RUNNING_SPECIFIC_TESTS, chunk.getLeftFile(), chunk.getLeftStartLine(), chunk.getLeft())); - } - if (!chunk.getRight().isEmpty()) { - testing.problems.addAll(applyDetectors(Token.RUNNING_SPECIFIC_TESTS, chunk.getRightFile(), chunk.getRightStartLine(), chunk.getRight())); + try { + if (!chunk.getLeft().isEmpty()) { + testing.problems.addAll(applyDetectors(Token.RUNNING_SPECIFIC_TESTS, chunk.getLeftFile(), chunk.getLeftStartLine(), new FileLineListReader(chunk.getLeft()))); + } + if (!chunk.getRight().isEmpty()) { + testing.problems.addAll(applyDetectors(Token.RUNNING_SPECIFIC_TESTS, chunk.getRightFile(), chunk.getRightStartLine(), new FileLineListReader(chunk.getRight()))); + } + } catch (IOException e) { + // ignore, since this won't happen here } }); @@ -423,7 +437,11 @@ public class LogFileParser { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { if (endsWith(file, ".Rout", ".fail") && includeCheck.test(file)) { - outputCheck.problems.addAll(applyDetectors(Token.BEGIN_CHECKING, file, 0, Files.readAllLines(file))); + try (BufferedReader in = Files.newBufferedReader(file)) { + outputCheck.problems.addAll(applyDetectors(Token.BEGIN_CHECKING, file, 0, new FileLineStreamReader(in))); + } catch (IOException e) { + LOGGER.severe(String.format("Error analyzing output file %s: %s", file, e.getMessage())); + } } return FileVisitResult.CONTINUE; } @@ -450,16 +468,16 @@ public class LogFileParser { }); } - private Collection<Problem> applyDetectors(Token start, Path file, List<Line> body) { + private Collection<Problem> applyDetectors(Token start, Path file, List<Line> body) throws IOException { if (!body.isEmpty()) { Line firstLine = body.get(0); List<String> strBody = body.stream().map(l -> l.text).collect(Collectors.toList()); - return applyDetectors(start, file, firstLine.lineNr, strBody); + return applyDetectors(start, file, firstLine.lineNr, new FileLineListReader(strBody)); } return new LinkedList<>(); } - private Collection<Problem> applyDetectors(Token start, Path file, int startLineNr, List<String> body) { + private Collection<Problem> applyDetectors(Token start, Path file, int startLineNr, FileLineReader body) throws IOException { assert Files.isRegularFile(file); Location startLocation = null; if (!body.isEmpty()) { @@ -487,7 +505,14 @@ public class LogFileParser { } private Collection<Problem> applyTestResultDetectors(List<DiffChunk> diffChunk) { - return testResultDetectors.stream().map(detector -> detector.detect(pkg, null, diffChunk)).flatMap(l -> l.stream()).collect(Collectors.toList()); + return testResultDetectors.stream().map(detector -> { + try { + return detector.detect(pkg, null, diffChunk); + } catch (IOException e) { + // just abort, won't happen here + } + return Collections.<Problem> emptyList(); + }).flatMap(l -> l.stream()).collect(Collectors.toList()); } /** diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/test/RErrorDetectorTest.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/test/RErrorDetectorTest.java index 9e295bb54b..e404e94230 100644 --- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/test/RErrorDetectorTest.java +++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/test/RErrorDetectorTest.java @@ -26,12 +26,12 @@ import java.nio.file.Paths; import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.List; import java.util.Optional; import org.junit.Assert; import org.junit.Test; +import com.oracle.truffle.r.test.packages.analyzer.FileLineListReader; import com.oracle.truffle.r.test.packages.analyzer.Location; import com.oracle.truffle.r.test.packages.analyzer.Problem; import com.oracle.truffle.r.test.packages.analyzer.detectors.RErrorDetector; @@ -51,8 +51,8 @@ public class RErrorDetectorTest { @Test public void testMultiLine() { - List<String> lines = Arrays.asList(new String[]{"Error in check(options) : ", - "ERROR: installing Rd objects failed for package ‘RUnit’"}); + FileLineListReader lines = new FileLineListReader(Arrays.asList(new String[]{"Error in check(options) : ", + "ERROR: installing Rd objects failed for package ‘RUnit’"})); Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines); Assert.assertEquals(1, detect.size()); @@ -65,7 +65,7 @@ public class RErrorDetectorTest { @Test public void testSingleLine0() { - List<String> lines = Collections.singletonList("Error in check(options) : invalid value for 'label' "); + FileLineListReader lines = new FileLineListReader(Collections.singletonList("Error in check(options) : invalid value for 'label' ")); Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines); Assert.assertEquals(1, detect.size()); @@ -78,7 +78,7 @@ public class RErrorDetectorTest { @Test public void testSingleLine1() { - List<String> lines = Collections.singletonList("Error in check : invalid value for 'label' "); + FileLineListReader lines = new FileLineListReader(Collections.singletonList("Error in check : invalid value for 'label' ")); Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines); Assert.assertEquals(1, detect.size()); @@ -91,7 +91,7 @@ public class RErrorDetectorTest { @Test public void testSingleLineMultipleColon() { - List<String> lines = Collections.singletonList("Error in check(options) : invalid value for 'label' : "); + FileLineListReader lines = new FileLineListReader(Collections.singletonList("Error in check(options) : invalid value for 'label' : ")); Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines); Assert.assertEquals(1, detect.size()); @@ -104,7 +104,7 @@ public class RErrorDetectorTest { @Test public void testSingleLineWithoutCallstring0() { - List<String> lines = Collections.singletonList("Error: invalid value for 'label' "); + FileLineListReader lines = new FileLineListReader(Collections.singletonList("Error: invalid value for 'label' ")); Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines); Assert.assertEquals(1, detect.size()); @@ -117,7 +117,7 @@ public class RErrorDetectorTest { @Test public void testSingleLineWithoutCallstring1() { - List<String> lines = Collections.singletonList("Error: invalid value for 'label' : "); + FileLineListReader lines = new FileLineListReader(Collections.singletonList("Error: invalid value for 'label' : ")); Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines); Assert.assertEquals(1, detect.size()); @@ -129,7 +129,7 @@ public class RErrorDetectorTest { @Test public void testRInternalError0() { - List<String> lines = Collections.singletonList("RInternalError: invalid value for 'label'"); + FileLineListReader lines = new FileLineListReader(Collections.singletonList("RInternalError: invalid value for 'label'")); Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines); Assert.assertEquals(0, detect.size()); @@ -137,7 +137,7 @@ public class RErrorDetectorTest { @Test public void testRInternalError1() { - List<String> lines = Collections.singletonList("> RInternalError: invalid value for 'label'"); + FileLineListReader lines = new FileLineListReader(Collections.singletonList("> RInternalError: invalid value for 'label'")); Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines); Assert.assertEquals(0, detect.size()); @@ -145,7 +145,7 @@ public class RErrorDetectorTest { @Test public void testRInternalError2() { - List<String> lines = Collections.singletonList(" RInternalError: invalid value for 'label'"); + FileLineListReader lines = new FileLineListReader(Collections.singletonList(" RInternalError: invalid value for 'label'")); Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines); Assert.assertEquals(0, detect.size()); @@ -153,7 +153,7 @@ public class RErrorDetectorTest { @Test public void testWithLinePrefix() { - List<String> lines = Collections.singletonList("> Error: invalid value for 'label'"); + FileLineListReader lines = new FileLineListReader(Collections.singletonList("> Error: invalid value for 'label'")); Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines); Assert.assertEquals(1, detect.size()); @@ -165,8 +165,8 @@ public class RErrorDetectorTest { @Test public void testCallstringWithNamesAndValues0() { - List<String> lines = Arrays.asList(new String[]{"Error in grep(pattern, all.names, value = TRUE) : ", - " invalid regular expression '*': Dangling meta character '*' near index 0"}); + FileLineListReader lines = new FileLineListReader(Arrays.asList(new String[]{"Error in grep(pattern, all.names, value = TRUE) : ", + " invalid regular expression '*': Dangling meta character '*' near index 0"})); Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines); Assert.assertEquals(1, detect.size()); @@ -178,8 +178,8 @@ public class RErrorDetectorTest { @Test public void testCallstringWithNamesAndValues1() { - List<String> lines = Arrays.asList(new String[]{"Error in grep(pattern, all.names, value = \":\") : ", - " invalid regular expression '*': Dangling meta character '*' near index 0"}); + FileLineListReader lines = new FileLineListReader(Arrays.asList(new String[]{"Error in grep(pattern, all.names, value = \":\") : ", + " invalid regular expression '*': Dangling meta character '*' near index 0"})); Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines); Assert.assertEquals(1, detect.size()); -- GitLab