This is an automated email from the ASF dual-hosted git repository. mblow pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit f95c8f509c3a369952edc4c10ead1de622931c49 Author: Michael Blow <[email protected]> AuthorDate: Thu Dec 12 12:16:56 2019 -0500 [NO ISSUE][TEST] Canonicalize file outputs in test framework Change-Id: Ib707c5426d2f5b9f8b285e19a2eacddc091ce57a Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/4463 Tested-by: Jenkins <[email protected]> Integration-Tests: Jenkins <[email protected]> Reviewed-by: Murtadha Hubail <[email protected]> --- .../apache/asterix/test/common/TestExecutor.java | 18 +++++++++++------ .../asterix/test/sqlpp/ParserTestExecutor.java | 13 ++++++------ .../org/apache/hyracks/util/file/FileUtil.java | 20 +++++++++++++++++++ .../org/apache/hyracks/util/file/FileUtilTest.java | 23 ++++++++++++++++++++++ 4 files changed, 62 insertions(+), 12 deletions(-) diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java index 4d9ceeb..9e2d028 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java @@ -19,6 +19,7 @@ package org.apache.asterix.test.common; import static java.nio.charset.StandardCharsets.UTF_8; +import static org.apache.hyracks.util.file.FileUtil.canonicalize; import java.io.BufferedReader; import java.io.ByteArrayInputStream; @@ -223,7 +224,7 @@ public class TestExecutor { public void runScriptAndCompareWithResult(File scriptFile, File expectedFile, File actualFile, ComparisonEnum compare, Charset actualEncoding) throws Exception { - LOGGER.info("Expected results file: {} ", expectedFile); + LOGGER.info("Expected results file: {} ", canonicalize(expectedFile)); boolean regex = false; try (BufferedReader readerExpected = new BufferedReader(new InputStreamReader(new FileInputStream(expectedFile), UTF_8)); @@ -288,7 +289,11 @@ public class TestExecutor { throw createLineChangedException(scriptFile, "<EOF>", lineActual, num); } } catch (Exception e) { - LOGGER.info("Actual results file: {} encoding: {}", actualFile, actualEncoding); + if (!actualEncoding.equals(UTF_8)) { + LOGGER.info("Actual results file: {} encoding: {}", canonicalize(actualFile), actualEncoding); + } else { + LOGGER.info("Actual results file: {}", canonicalize(actualFile)); + } throw e; } @@ -296,8 +301,8 @@ public class TestExecutor { private ComparisonException createLineChangedException(File scriptFile, String lineExpected, String lineActual, int num) { - return new ComparisonException("Result for " + scriptFile + " changed at line " + num + ":\nexpected < " - + truncateIfLong(lineExpected) + "\nactual > " + truncateIfLong(lineActual)); + return new ComparisonException("Result for " + canonicalize(scriptFile) + " changed at line " + num + + ":\nexpected < " + truncateIfLong(lineExpected) + "\nactual > " + truncateIfLong(lineActual)); } private String truncateIfLong(String string) { @@ -434,7 +439,7 @@ public class TestExecutor { if (match && !negate || negate && !match) { continue; } - throw new Exception("Result for " + scriptFile + ": expected pattern '" + expression + throw new Exception("Result for " + canonicalize(scriptFile) + ": expected pattern '" + expression + "' not found in result: " + actual); } } @@ -463,7 +468,8 @@ public class TestExecutor { } endOfMatch = matcher.end(); } - throw new Exception("Result for " + scriptFile + ": actual file did not match expected result"); + throw new Exception( + "Result for " + canonicalize(scriptFile) + ": actual file did not match expected result"); } } diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java index 5dd41c3..5da8cb3 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java @@ -18,6 +18,7 @@ */ package org.apache.asterix.test.sqlpp; +import static org.apache.hyracks.util.file.FileUtil.canonicalize; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -79,7 +80,7 @@ public class ParserTestExecutor extends TestExecutor { try { if (queryCount >= expectedResultFileCtxs.size() && !cUnit.getOutputDir().getValue().equals("none")) { - throw new ComparisonException("no result file for " + testFile.toString() + "; queryCount: " + throw new ComparisonException("no result file for " + canonicalize(testFile) + "; queryCount: " + queryCount + ", filectxs.size: " + expectedResultFileCtxs.size()); } @@ -93,21 +94,21 @@ public class ParserTestExecutor extends TestExecutor { "[TEST]: " + testCaseCtx.getTestCase().getFilePath() + "/" + cUnit.getName() + " PASSED "); queryCount++; } catch (Exception e) { - System.err.println("testFile " + testFile.toString() + " raised an exception: " + e); + System.err.println("testFile " + canonicalize(testFile) + " raised an exception: " + e); if (cUnit.getExpectedError().isEmpty()) { e.printStackTrace(); System.err.println("...Unexpected!"); if (failedGroup != null) { failedGroup.getTestCase().add(testCaseCtx.getTestCase()); } - throw new Exception("Test \"" + testFile + "\" FAILED!", e); + throw new Exception("Test \"" + canonicalize(testFile) + "\" FAILED!", e); } else { // must compare with the expected failure message if (e instanceof ComparisonException) { throw e; } - LOGGER.info("[TEST]: " + testCaseCtx.getTestCase().getFilePath() + "/" + cUnit.getName() - + " failed as expected: " + e.getMessage()); + LOGGER.info("[TEST]: " + canonicalize(testCaseCtx.getTestCase().getFilePath()) + "/" + + cUnit.getName() + " failed as expected: " + e.getMessage()); System.err.println("...but that was expected."); } } @@ -153,7 +154,7 @@ public class ParserTestExecutor extends TestExecutor { runScriptAndCompareWithResult(queryFile, expectedFile, actualResultFile, ComparisonEnum.TEXT, StandardCharsets.UTF_8); } catch (Exception e) { - GlobalConfig.ASTERIX_LOGGER.warn("Failed while testing file " + queryFile); + GlobalConfig.ASTERIX_LOGGER.warn("Failed while testing file " + canonicalize(queryFile)); throw e; } finally { writer.close(); diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/file/FileUtil.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/file/FileUtil.java index fe60653..7d162ee 100644 --- a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/file/FileUtil.java +++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/file/FileUtil.java @@ -22,6 +22,7 @@ import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.file.Path; +import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.io.FileUtils; @@ -31,6 +32,7 @@ import org.apache.logging.log4j.Logger; public class FileUtil { private static final Logger LOGGER = LogManager.getLogger(); + private static final Pattern PARENT_DIR = Pattern.compile("([/\\\\]|^)[^./\\\\]+[/\\\\]\\.\\.([/\\\\]|$)"); private static final Object LOCK = new Object(); private static final int MAX_COPY_ATTEMPTS = 3; @@ -95,4 +97,22 @@ public class FileUtil { raf.getChannel().force(true); } } + + public static String canonicalize(CharSequence path) { + String newPath = path.toString(); + Matcher matcher = PARENT_DIR.matcher(newPath); + while (matcher.find()) { + // TODO(mblow): use StringBuilder once Java 8 is no longer supported (requires >=9) + StringBuffer sb = new StringBuffer(); + matcher.appendReplacement(sb, matcher.group(2).isEmpty() ? "" : matcher.group(1).replace("\\", "\\\\")); + matcher.appendTail(sb); + newPath = sb.toString(); + matcher.reset(newPath); + } + return newPath; + } + + public static File canonicalize(File file) { + return new File(canonicalize(file.getPath())); + } } diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/file/FileUtilTest.java b/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/file/FileUtilTest.java index 8d6c631..87c730c 100644 --- a/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/file/FileUtilTest.java +++ b/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/file/FileUtilTest.java @@ -41,4 +41,27 @@ public class FileUtilTest { joinPath('\\', "\\\\myserver\\tmp\\\\far\\baz\\\\\\\\lala")); Assert.assertEquals("C:\\temp\\far\\baz\\lala", joinPath('\\', "C:\\temp\\\\far\\baz\\\\\\\\lala\\")); } + + @Test + public void testCanonicalize() { + Assert.assertEquals("bat.txt", FileUtil.canonicalize("foo/../bat.txt")); + Assert.assertEquals("bat.txt", FileUtil.canonicalize("foo/bar/../../bat.txt")); + Assert.assertEquals("foo/", FileUtil.canonicalize("foo/bar/../")); + Assert.assertEquals("foo", FileUtil.canonicalize("foo/bar/..")); + Assert.assertEquals("../bat.txt", FileUtil.canonicalize("../bat.txt")); + Assert.assertEquals("/bat.txt", FileUtil.canonicalize("/foo/bar/../../bat.txt")); + Assert.assertEquals("/bar/bat.txt", FileUtil.canonicalize("/foo/../bar/bat.txt")); + } + + @Test + public void testCanonicalizeWindoze() { + Assert.assertEquals("bat.txt", FileUtil.canonicalize("foo\\..\\bat.txt")); + Assert.assertEquals("bat.txt", FileUtil.canonicalize("foo\\bar\\..\\..\\bat.txt")); + Assert.assertEquals("foo\\", FileUtil.canonicalize("foo\\bar\\..\\")); + Assert.assertEquals("foo", FileUtil.canonicalize("foo\\bar\\..")); + Assert.assertEquals("..\\bat.txt", FileUtil.canonicalize("..\\bat.txt")); + Assert.assertEquals("\\bat.txt", FileUtil.canonicalize("\\foo\\bar\\..\\..\\bat.txt")); + Assert.assertEquals("\\bar\\bat.txt", FileUtil.canonicalize("\\foo\\..\\bar\\bat.txt")); + Assert.assertEquals("C:\\bar\\bat.txt", FileUtil.canonicalize("C:\\foo\\..\\bar\\bat.txt")); + } }
