From b3dd0f06b1d27afc1bf547605c856952e4392a08 Mon Sep 17 00:00:00 2001 Date: Thu, 18 Jan 2024 14:57:37 +0800 Subject: [PATCH] puyuan: jdk17.0.9 patch --- src/hotspot/cpu/x86/x86_32.ad | 24 +-- src/hotspot/share/classfile/stringTable.hpp | 8 +- .../share/gc/shenandoah/shenandoahFullGC.cpp | 3 + src/hotspot/share/opto/compile.cpp | 2 +- src/hotspot/share/runtime/arguments.cpp | 1 - .../share/classes/java/util/zip/ZipFile.java | 18 ++- .../classes/sun/security/pkcs/PKCS7.java | 4 +- .../classes/java/io/WinNTFileSystem.java | 31 ++++ .../PLATFORM_API_WinOS_DirectSound.cpp | 26 +++- .../javax/xml/stream/XMLStreamException.java | 2 +- .../TestArrayAllocatorMallocLimit.java | 4 +- .../CommandLine/UnrecognizedProperty.java | 45 ++++++ .../ExceptionCauseTest.java | 62 ++++++++ test/jdk/java/io/File/GetAbsolutePath.java | 114 ++++++++------ test/jdk/java/io/File/GetCanonicalPath.java | 82 ++++++++-- test/jdk/java/io/File/IsAbsolute.java | 58 +++---- test/jdk/java/io/File/WindowsPrefixes.java | 97 ++++++++++++ .../Lines/OpenLineAfterScreenLock.java | 144 ++++++++++++++++++ .../pkcs11/MessageDigest/TestCloning.java | 25 ++- test/jdk/sun/security/pkcs11/PSSUtil.java | 84 ++++++++++ .../Signature/KeyAndParamCheckForPSS.java | 104 +++++++------ .../pkcs11/Signature/SignatureTestPSS.java | 110 ++++++------- .../x509/X509CRLImpl/UnexpectedNPE.java | 63 +++----- 23 files changed, 842 insertions(+), 269 deletions(-) create mode 100644 test/hotspot/jtreg/runtime/CommandLine/UnrecognizedProperty.java create mode 100644 test/jaxp/javax/xml/jaxp/unittest/stream/XMLStreamExceptionTest/ExceptionCauseTest.java create mode 100644 test/jdk/java/io/File/WindowsPrefixes.java create mode 100644 test/jdk/javax/sound/sampled/Lines/OpenLineAfterScreenLock.java create mode 100644 test/jdk/sun/security/pkcs11/PSSUtil.java diff --git a/src/hotspot/cpu/x86/x86_32.ad b/src/hotspot/cpu/x86/x86_32.ad index 01005c730..e7ab73b77 100644 --- a/src/hotspot/cpu/x86/x86_32.ad +++ b/src/hotspot/cpu/x86/x86_32.ad @@ -13150,7 +13150,7 @@ instruct cmovPP_reg_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, eRegP dst, eRegP s // Compare 2 longs and CMOVE doubles instruct cmovDDPR_reg_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, regDPR dst, regDPR src) %{ - predicate( UseSSE<=1 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge ); + predicate( UseSSE<=1 && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge ) ); match(Set dst (CMoveD (Binary cmp flags) (Binary dst src))); ins_cost(200); expand %{ @@ -13160,7 +13160,7 @@ instruct cmovDDPR_reg_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, regDPR dst, regD // Compare 2 longs and CMOVE doubles instruct cmovDD_reg_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, regD dst, regD src) %{ - predicate( UseSSE>=2 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge ); + predicate( UseSSE>=2 && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge ) ); match(Set dst (CMoveD (Binary cmp flags) (Binary dst src))); ins_cost(200); expand %{ @@ -13169,7 +13169,7 @@ instruct cmovDD_reg_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, regD dst, regD src %} instruct cmovFFPR_reg_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, regFPR dst, regFPR src) %{ - predicate( UseSSE==0 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge ); + predicate( UseSSE==0 && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge ) ); match(Set dst (CMoveF (Binary cmp flags) (Binary dst src))); ins_cost(200); expand %{ @@ -13178,7 +13178,7 @@ instruct cmovFFPR_reg_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, regFPR dst, regF %} instruct cmovFF_reg_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, regF dst, regF src) %{ - predicate( UseSSE>=1 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge ); + predicate( UseSSE>=1 && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge ) ); match(Set dst (CMoveF (Binary cmp flags) (Binary dst src))); ins_cost(200); expand %{ @@ -13313,7 +13313,7 @@ instruct cmovPP_reg_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, eRegP dst, eRegP s // Compare 2 longs and CMOVE doubles instruct cmovDDPR_reg_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, regDPR dst, regDPR src) %{ - predicate( UseSSE<=1 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne ); + predicate( UseSSE<=1 && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne ) ); match(Set dst (CMoveD (Binary cmp flags) (Binary dst src))); ins_cost(200); expand %{ @@ -13323,7 +13323,7 @@ instruct cmovDDPR_reg_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, regDPR dst, regD // Compare 2 longs and CMOVE doubles instruct cmovDD_reg_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, regD dst, regD src) %{ - predicate( UseSSE>=2 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne ); + predicate( UseSSE>=2 && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne ) ); match(Set dst (CMoveD (Binary cmp flags) (Binary dst src))); ins_cost(200); expand %{ @@ -13332,7 +13332,7 @@ instruct cmovDD_reg_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, regD dst, regD src %} instruct cmovFFPR_reg_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, regFPR dst, regFPR src) %{ - predicate( UseSSE==0 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne ); + predicate( UseSSE==0 && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne ) ); match(Set dst (CMoveF (Binary cmp flags) (Binary dst src))); ins_cost(200); expand %{ @@ -13341,7 +13341,7 @@ instruct cmovFFPR_reg_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, regFPR dst, regF %} instruct cmovFF_reg_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, regF dst, regF src) %{ - predicate( UseSSE>=1 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne ); + predicate( UseSSE>=1 && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne ) ); match(Set dst (CMoveF (Binary cmp flags) (Binary dst src))); ins_cost(200); expand %{ @@ -13508,7 +13508,7 @@ instruct cmovPP_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, eRegP dst, // Compare 2 longs and CMOVE doubles instruct cmovDDPR_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, regDPR dst, regDPR src) %{ - predicate( UseSSE<=1 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt ); + predicate( UseSSE<=1 && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt ) ); match(Set dst (CMoveD (Binary cmp flags) (Binary dst src))); ins_cost(200); expand %{ @@ -13518,7 +13518,7 @@ instruct cmovDDPR_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, regDPR d // Compare 2 longs and CMOVE doubles instruct cmovDD_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, regD dst, regD src) %{ - predicate( UseSSE>=2 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt ); + predicate( UseSSE>=2 && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt ) ); match(Set dst (CMoveD (Binary cmp flags) (Binary dst src))); ins_cost(200); expand %{ @@ -13527,7 +13527,7 @@ instruct cmovDD_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, regD dst, %} instruct cmovFFPR_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, regFPR dst, regFPR src) %{ - predicate( UseSSE==0 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt ); + predicate( UseSSE==0 && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt ) ); match(Set dst (CMoveF (Binary cmp flags) (Binary dst src))); ins_cost(200); expand %{ @@ -13537,7 +13537,7 @@ instruct cmovFFPR_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, regFPR d instruct cmovFF_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, regF dst, regF src) %{ - predicate( UseSSE>=1 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt ); + predicate( UseSSE>=1 && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt ) ); match(Set dst (CMoveF (Binary cmp flags) (Binary dst src))); ins_cost(200); expand %{ diff --git a/src/hotspot/share/classfile/stringTable.hpp b/src/hotspot/share/classfile/stringTable.hpp index 6c6ded24c..823aa6975 100644 --- a/src/hotspot/share/classfile/stringTable.hpp +++ b/src/hotspot/share/classfile/stringTable.hpp @@ -25,7 +25,7 @@ #ifndef SHARE_CLASSFILE_STRINGTABLE_HPP #define SHARE_CLASSFILE_STRINGTABLE_HPP -#include "memory/allocation.hpp" +#include "memory/allStatic.hpp" #include "memory/padded.hpp" #include "oops/oop.hpp" #include "oops/weakHandle.hpp" @@ -36,15 +36,11 @@ class DumpedInternedStrings; class JavaThread; class SerializeClosure; -class StringTable; class StringTableConfig; -class StringTableCreateEntry; -class StringTable : public CHeapObj{ +class StringTable : AllStatic { friend class VMStructs; - friend class Symbol; friend class StringTableConfig; - friend class StringTableCreateEntry; static volatile bool _has_work; diff --git a/src/hotspot/share/opto/compile.cpp b/src/hotspot/share/opto/compile.cpp index 4b22284f9..56471d69a 100644 --- a/src/hotspot/share/opto/compile.cpp +++ b/src/hotspot/share/opto/compile.cpp @@ -775,7 +775,7 @@ Compile::Compile( ciEnv* ci_env, ciMethod* target, int osr_bci, // If any phase is randomized for stress testing, seed random number // generation and log the seed for repeatability. if (StressLCM || StressGCM || StressIGVN || StressCCP) { - if (FLAG_IS_DEFAULT(StressSeed) || (FLAG_IS_ERGO(StressSeed) && RepeatCompilation)) { + if (FLAG_IS_DEFAULT(StressSeed) || (FLAG_IS_ERGO(StressSeed) && directive->RepeatCompilationOption)) { _stress_seed = static_cast(Ticks::now().nanoseconds()); FLAG_SET_ERGO(StressSeed, _stress_seed); } else { diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index 5683e4fe0..60f639795 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -339,7 +339,6 @@ static bool matches_property_suffix(const char* option, const char* property, si // any of the reserved module properties. // property should be passed without the leading "-D". bool Arguments::is_internal_module_property(const char* property) { - assert((strncmp(property, "-D", 2) != 0), "Unexpected leading -D"); if (strncmp(property, MODULE_PROPERTY_PREFIX, MODULE_PROPERTY_PREFIX_LEN) == 0) { const char* property_suffix = property + MODULE_PROPERTY_PREFIX_LEN; if (matches_property_suffix(property_suffix, ADDEXPORTS, ADDEXPORTS_LEN) || diff --git a/src/java.base/share/classes/java/util/zip/ZipFile.java b/src/java.base/share/classes/java/util/zip/ZipFile.java index d47a1d260..7e16e6a67 100644 --- a/src/java.base/share/classes/java/util/zip/ZipFile.java +++ b/src/java.base/share/classes/java/util/zip/ZipFile.java @@ -95,8 +95,9 @@ import static java.util.zip.ZipUtils.*; * @since 1.1 */ public class ZipFile implements ZipConstants, Closeable { - - private final String name; // zip file name + + private final String filePath; // zip file path + private final String fileName; // name of the file private volatile boolean closeRequested; // The "resource" used by this zip file that needs to be @@ -246,7 +247,8 @@ public class ZipFile implements ZipConstants, Closeable { } Objects.requireNonNull(charset, "charset"); - this.name = name; + this.filePath = name; + this.fileName = file.getName(); long t0 = System.nanoTime(); this.res = new CleanableResource(this, ZipCoder.get(charset), file, mode); @@ -477,8 +479,16 @@ public class ZipFile implements ZipConstants, Closeable { * @return the path name of the ZIP file */ public String getName() { - return name; + return filePath; } + + /** + * {@return a string identifying this {@code ZipFile}, for debugging} + */ + @Override + public String toString() { + return this.fileName+ "@" + Integer.toHexString(System.identityHashCode(this)); + } private class ZipEntryIterator implements Enumeration, Iterator { diff --git a/src/java.base/windows/classes/java/io/WinNTFileSystem.java b/src/java.base/windows/classes/java/io/WinNTFileSystem.java index 0fabd6f2b..d910beb44 100644 --- a/src/java.base/windows/classes/java/io/WinNTFileSystem.java +++ b/src/java.base/windows/classes/java/io/WinNTFileSystem.java @@ -41,6 +41,8 @@ import sun.security.action.GetPropertyAction; */ class WinNTFileSystem extends FileSystem { + private static final String LONG_PATH_PREFIX = "\\\\?\\"; + private final char slash; private final char altSlash; private final char semicolon; @@ -59,6 +61,23 @@ class WinNTFileSystem extends FileSystem { ENABLE_ADS = true; } } + // Strip a long path or UNC prefix and return the result. + // If there is no such prefix, return the parameter passed in. + private static String stripLongOrUNCPrefix(String path) { + // if a prefix is present, remove it + if (path.startsWith(LONG_PATH_PREFIX)) { + if (path.startsWith("UNC\\", 4)) { + path = "\\\\" + path.substring(8); + } else { + path = path.substring(4); + // if only "UNC" remains, a trailing "\\" was likely removed + if (path.equals("UNC")) { + path = "\\\\"; + } + } + } + return path; + } public WinNTFileSystem() { Properties props = GetPropertyAction.privilegedGetProperties(); @@ -100,6 +119,7 @@ class WinNTFileSystem extends FileSystem { This way we iterate through the whole pathname string only once. */ @Override public String normalize(String path) { + path = stripLongOrUNCPrefix(path); int n = path.length(); char slash = this.slash; char altSlash = this.altSlash; @@ -225,6 +245,8 @@ class WinNTFileSystem extends FileSystem { @Override public int prefixLength(String path) { + assert !path.startsWith(LONG_PATH_PREFIX); + char slash = this.slash; int n = path.length(); if (n == 0) return 0; @@ -244,6 +266,8 @@ class WinNTFileSystem extends FileSystem { @Override public String resolve(String parent, String child) { + assert !child.startsWith(LONG_PATH_PREFIX); + int pn = parent.length(); if (pn == 0) return child; int cn = child.length(); @@ -315,6 +339,9 @@ class WinNTFileSystem extends FileSystem { @Override public boolean isAbsolute(File f) { + String path = f.getPath(); + assert !path.startsWith(LONG_PATH_PREFIX); + int pl = f.getPrefixLength(); return (((pl == 2) && (f.getPath().charAt(0) == slash)) || (pl == 3)); @@ -353,6 +380,8 @@ class WinNTFileSystem extends FileSystem { @Override public String resolve(File f) { String path = f.getPath(); + assert !path.startsWith(LONG_PATH_PREFIX); + int pl = f.getPrefixLength(); if ((pl == 2) && (path.charAt(0) == slash)) return path; /* UNC */ @@ -440,6 +469,8 @@ class WinNTFileSystem extends FileSystem { @Override public String canonicalize(String path) throws IOException { + assert !path.startsWith(LONG_PATH_PREFIX); + // If path is a drive letter only then skip canonicalization int len = path.length(); if ((len == 2) && diff --git a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp index ea188e934..8585eda01 100644 --- a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp +++ b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp @@ -357,7 +379,7 @@ typedef struct { } DS_Info; -LPCSTR TranslateDSError(HRESULT hr) { +LPSTR TranslateDSError(HRESULT hr) { switch(hr) { case DSERR_ALLOCATED: return "DSERR_ALLOCATED"; diff --git a/src/java.xml/share/classes/javax/xml/stream/XMLStreamException.java b/src/java.xml/share/classes/javax/xml/stream/XMLStreamException.java index 5a229ed1e..ec9734d7c 100644 --- a/src/java.xml/share/classes/javax/xml/stream/XMLStreamException.java +++ b/src/java.xml/share/classes/javax/xml/stream/XMLStreamException.java @@ -94,7 +94,7 @@ public class XMLStreamException extends Exception { public XMLStreamException(String msg, Location location, Throwable th) { super("ParseError at [row,col]:["+location.getLineNumber()+","+ location.getColumnNumber()+"]\n"+ - "Message: "+msg); + "Message: "+msg, th); nested = th; this.location = location; } diff --git a/test/hotspot/jtreg/runtime/CommandLine/UnrecognizedProperty.java b/test/hotspot/jtreg/runtime/CommandLine/UnrecognizedProperty.java new file mode 100644 index 000000000..78ec54bbc --- /dev/null +++ b/test/hotspot/jtreg/runtime/CommandLine/UnrecognizedProperty.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8321479 + * @summary VM should not crash with property "-D-D" + * @requires vm.flagless + * @library /test/lib + * @run driver UnrecognizedProperty + */ + +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; + +public class UnrecognizedProperty { + public static void main(String[] args) throws Exception { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-D-D"); + + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldContain("Usage: java"); + output.shouldHaveExitValue(1); + } +} \ No newline at end of file diff --git a/test/jaxp/javax/xml/jaxp/unittest/stream/XMLStreamExceptionTest/ExceptionCauseTest.java b/test/jaxp/javax/xml/jaxp/unittest/stream/XMLStreamExceptionTest/ExceptionCauseTest.java new file mode 100644 index 000000000..e32527621 --- /dev/null +++ b/test/jaxp/javax/xml/jaxp/unittest/stream/XMLStreamExceptionTest/ExceptionCauseTest.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package stream.XMLStreamExceptionTest; + +import java.io.IOException; + +import javax.xml.stream.Location; +import javax.xml.stream.XMLStreamException; + +import org.testng.Assert; +import org.testng.annotations.Listeners; +import org.testng.annotations.Test; + +/* + * @test + * @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest + * @run testng/othervm -DrunSecMngr=true -Djava.security.manager=allow stream.XMLStreamExceptionTest.ExceptionCauseTest + * @run testng/othervm stream.XMLStreamExceptionTest.ExceptionCauseTest + * @summary Test XMLStreamException constructor initializes chained exception + */ +@Listeners({jaxp.library.BasePolicy.class}) +public class ExceptionCauseTest { + + @Test + public void testExceptionCause() { + + // Create exception with cause + Throwable cause = new Throwable("cause"); + Location location = new Location() { + public int getLineNumber() { return 0; } + public int getColumnNumber() { return 0; } + public int getCharacterOffset() { return 0; } + public String getPublicId() { return null; } + public String getSystemId() { return null; } + }; + XMLStreamException e = new XMLStreamException("message", location, cause); + + // Verify cause + Assert.assertSame(e.getCause(), cause, "XMLStreamException has the wrong cause"); + } +} diff --git a/test/jdk/java/io/File/GetAbsolutePath.java b/test/jdk/java/io/File/GetAbsolutePath.java index 1f69d0b6e..ad2e1cc79 100644 --- a/test/jdk/java/io/File/GetAbsolutePath.java +++ b/test/jdk/java/io/File/GetAbsolutePath.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,74 +22,92 @@ */ /* @test - @bug 4131169 4109131 - @summary Basic test for getAbsolutePath method + * @bug 4131169 4109131 8287843 + * @summary Basic test for getAbsolutePath method + * @run junit GetAbsolutePath */ -import java.io.*; +import java.io.File; +import java.io.IOException; +import java.util.stream.Stream; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledOnOs; +import org.junit.jupiter.api.condition.OS; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.*; public class GetAbsolutePath { - private static boolean ignoreCase = false; + private static final String USER_DIR = System.getProperty("user.dir"); - private static void ck(String path, String ans) throws Exception { - File f = new File(path); - String p = f.getAbsolutePath(); - if ((ignoreCase && p.equalsIgnoreCase(ans)) || p.equals(ans)) - System.err.println(path + " ==> " + p); - else - throw new Exception(path + ": expected " + ans + ", got " + p); + private static char driveLetter() { + assert System.getProperty("os.name").startsWith("Windows"); + + if ((USER_DIR.length() > 2) && (USER_DIR.charAt(1) == ':') + && (USER_DIR.charAt(2) == '\\')) + return USER_DIR.charAt(0); + + throw new RuntimeException("Current directory has no drive"); } - private static void testWin32() throws Exception { - String wd = System.getProperty("user.dir"); - char d; - if ((wd.length() > 2) && (wd.charAt(1) == ':') - && (wd.charAt(2) == '\\')) - d = wd.charAt(0); - else - throw new Exception("Current directory has no drive"); - ck("/foo/bar", d + ":\\foo\\bar"); - ck("\\foo\\bar", d + ":\\foo\\bar"); - ck("c:\\foo\\bar", "c:\\foo\\bar"); - ck("c:/foo/bar", "c:\\foo\\bar"); - ck("\\\\foo\\bar", "\\\\foo\\bar"); + private static Stream windowsSource() { + char drive = driveLetter(); + return Stream.of(Arguments.of("/foo/bar", drive + ":\\foo\\bar"), + Arguments.of("\\foo\\bar", drive + ":\\foo\\bar"), + Arguments.of("c:\\foo\\bar", "c:\\foo\\bar"), + Arguments.of("c:/foo/bar", "c:\\foo\\bar"), + Arguments.of("\\\\foo\\bar", "\\\\foo\\bar"), + Arguments.of("", USER_DIR), // empty path + Arguments.of("\\\\?\\foo", USER_DIR + "\\foo"), + Arguments.of("\\\\?\\C:\\Users\\x", "C:\\Users\\x"), + Arguments.of("\\\\?\\" + drive + ":", USER_DIR), + Arguments.of("\\\\?\\" + drive + ":bar", USER_DIR + "\\bar")); + } + + @EnabledOnOs(OS.WINDOWS) + @ParameterizedTest + @MethodSource("windowsSource") + public void windows(String path, String absolute) throws IOException { + File file = new File(path); + assertEquals(0, absolute.compareToIgnoreCase(file.getAbsolutePath())); + } - /* Tricky directory-relative case */ - d = Character.toLowerCase(d); + @EnabledOnOs(OS.WINDOWS) + @Test + public void windowsDriveRelative() throws IOException { + // Tricky directory-relative case + char d = Character.toLowerCase(driveLetter()); char z = 0; if (d != 'c') z = 'c'; else if (d != 'd') z = 'd'; if (z != 0) { File f = new File(z + ":."); if (f.exists()) { - String zwd = f.getCanonicalPath(); - ck(z + ":foo", zwd + "\\foo"); + String zUSER_DIR = f.getCanonicalPath(); + File path = new File(z + ":foo"); + String p = path.getAbsolutePath(); + String ans = zUSER_DIR + "\\foo"; + assertEquals(0, p.compareToIgnoreCase(ans)); } } - - /* Empty path */ - ck("", wd); } - private static void testUnix() throws Exception { - String wd = System.getProperty("user.dir"); - ck("foo", wd + "/foo"); - ck("foo/bar", wd + "/foo/bar"); - ck("/foo", "/foo"); - ck("/foo/bar", "/foo/bar"); - - /* Empty path */ - ck("", wd); + private static Stream unixSource() { + return Stream.of(Arguments.of("foo", USER_DIR + "/foo"), + Arguments.of("foo/bar", USER_DIR + "/foo/bar"), + Arguments.of("/foo", "/foo"), + Arguments.of("/foo/bar", "/foo/bar"), + Arguments.of("", USER_DIR)); } - public static void main(String[] args) throws Exception { - if (File.separatorChar == '\\') { - ignoreCase = true; - testWin32(); - } - if (File.separatorChar == '/') testUnix(); + @EnabledOnOs({OS.LINUX, OS.MAC}) + @ParameterizedTest + @MethodSource("unixSource") + public void unix(String path, String absolute) throws IOException { + assertEquals(absolute, new File(path).getAbsolutePath()); } - } diff --git a/test/jdk/java/io/File/GetCanonicalPath.java b/test/jdk/java/io/File/GetCanonicalPath.java index dfd0fa5ca..0abf25244 100644 --- a/test/jdk/java/io/File/GetCanonicalPath.java +++ b/test/jdk/java/io/File/GetCanonicalPath.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,21 +22,81 @@ */ /* @test - @bug 4899022 - @summary Look for erroneous representation of drive letter + * @bug 4899022 + * @requires (os.family == "windows") + * @summary Look for erroneous representation of drive letter + * @run junit GetCanonicalPath */ -import java.io.*; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.junit.jupiter.api.Assertions.*; public class GetCanonicalPath { - public static void main(String[] args) throws Exception { - if (File.separatorChar == '\\') { - testDriveLetter(); - } + private static Stream pathProvider() { + List list = new ArrayList(); + + File dir = new File(System.getProperty("user.dir", ".")); + char drive = dir.getPath().charAt(0); + + String pathname = drive + ":\\"; + list.add(Arguments.of(pathname, pathname)); + + list.add(Arguments.of(drive + ":", dir.toString())); + + String name = "foo"; + pathname = "\\\\?\\" + name; + list.add(Arguments.of(pathname, new File(dir, name).toString())); + pathname = "\\\\?\\" + drive + ":" + name; + list.add(Arguments.of(pathname, new File(dir, name).toString())); + + pathname = "foo\\bar\\gus"; + list.add(Arguments.of(pathname, new File(dir, pathname).toString())); + + pathname = drive + ":\\foo\\bar\\gus"; + list.add(Arguments.of(pathname, pathname)); + + pathname = "\\\\server\\share\\foo\\bar\\gus"; + list.add(Arguments.of(pathname, pathname)); + + pathname = "\\\\localhost\\" + drive + "$\\Users\\file.dat"; + list.add(Arguments.of(pathname, pathname)); + + list.add(Arguments.of("\\\\?\\" + drive + ":\\Users\\file.dat", + drive + ":\\Users\\file.dat")); + list.add(Arguments.of("\\\\?\\UNC\\localhost\\" + drive + "$\\Users\\file.dat", + "\\\\localhost\\" + drive + "$\\Users\\file.dat")); + + return list.stream(); + } + + @ParameterizedTest + @ValueSource(strings = {"\\\\?", "\\\\?\\UNC", "\\\\?\\UNC\\"}) + void badPaths(String pathname) { + assertThrows(IOException.class, () -> new File(pathname).getCanonicalPath()); + } + + @ParameterizedTest + @MethodSource("pathProvider") + void goodPaths(String pathname, String expected) throws IOException { + File file = new File(pathname); + String canonicalPath = file.getCanonicalPath(); + assertEquals(expected, canonicalPath); } - private static void testDriveLetter() throws Exception { + + @Test + void driveLetter() throws IOException { String path = new File("c:/").getCanonicalPath(); - if (path.length() > 3) - throw new RuntimeException("Drive letter incorrectly represented"); + assertFalse(path.length() > 3, "Drive letter incorrectly represented"); } } diff --git a/test/jdk/java/io/File/IsAbsolute.java b/test/jdk/java/io/File/IsAbsolute.java index 581d7bebf..cdeda917c 100644 --- a/test/jdk/java/io/File/IsAbsolute.java +++ b/test/jdk/java/io/File/IsAbsolute.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 1998, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,42 +22,46 @@ */ /* @test - @bug 4022397 - @summary General test for isAbsolute + * @bug 4022397 8287843 + * @summary General test for isAbsolute + * @run junit IsAbsolute */ -import java.io.*; +import java.io.File; +import java.io.IOException; +import org.junit.jupiter.api.condition.EnabledOnOs; +import org.junit.jupiter.api.condition.OS; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import static org.junit.jupiter.api.Assertions.*; public class IsAbsolute { - - private static void ck(String path, boolean ans) throws Exception { - File f = new File(path); - boolean x = f.isAbsolute(); - if (x != ans) - throw new Exception(path + ": expected " + ans + ", got " + x); - System.err.println(path + " ==> " + x); + @EnabledOnOs(OS.WINDOWS) + @ParameterizedTest + @ValueSource(strings = {"c:\\foo\\bar", "c:/foo/bar", "\\\\foo\\bar"}) + public void windowsAbsolute(String path) throws IOException { + assertTrue(new File(path).isAbsolute()); } - private static void testWin32() throws Exception { - ck("/foo/bar", false); - ck("\\foo\\bar", false); - ck("c:\\foo\\bar", true); - ck("c:/foo/bar", true); - ck("c:foo\\bar", false); - ck("\\\\foo\\bar", true); + @EnabledOnOs(OS.WINDOWS) + @ParameterizedTest + @ValueSource(strings = {"/foo/bar", "\\foo\\bar", "c:foo\\bar"}) + public void windowsNotAbsolute(String path) throws IOException { + assertFalse(new File(path).isAbsolute()); } - private static void testUnix() throws Exception { - ck("foo", false); - ck("foo/bar", false); - ck("/foo", true); - ck("/foo/bar", true); + @EnabledOnOs({OS.LINUX, OS.MAC}) + @ParameterizedTest + @ValueSource(strings = {"/foo", "/foo/bar"}) + public void unixAbsolute(String path) throws IOException { + assertTrue(new File(path).isAbsolute()); } - public static void main(String[] args) throws Exception { - if (File.separatorChar == '\\') testWin32(); - if (File.separatorChar == '/') testUnix(); + @EnabledOnOs({OS.LINUX, OS.MAC}) + @ParameterizedTest + @ValueSource(strings = {"foo", "foo/bar"}) + public void unixNotAbsolute(String path) throws IOException { + assertFalse(new File(path).isAbsolute()); } - } diff --git a/test/jdk/java/io/File/WindowsPrefixes.java b/test/jdk/java/io/File/WindowsPrefixes.java new file mode 100644 index 000000000..0997f1f45 --- /dev/null +++ b/test/jdk/java/io/File/WindowsPrefixes.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 8287843 + * @summary Basic test for Windows path prefixes + * @requires (os.family == "windows") + * @run junit WindowsPrefixes + */ + +import java.io.File; +import java.io.IOException; +import java.util.stream.Stream; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledOnOs; +import org.junit.jupiter.api.condition.OS; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.*; + +public class WindowsPrefixes { + + private static Stream paths() { + return Stream.of(Arguments.of(""), + Arguments.of("C:\\"), + Arguments.of("C:"), + Arguments.of("\\foo"), + Arguments.of("foo"), + Arguments.of("foo\\bar"), + Arguments.of("C:\\foo"), + Arguments.of("C:foo"), + Arguments.of("C:\\foo\\bar")); + } + + @ParameterizedTest + @MethodSource("paths") + public void getAbsolutePath(String path) throws IOException { + File file = new File(path); + File that = new File("\\\\?\\" + path); + assertEquals(file.getAbsolutePath(), that.getAbsolutePath()); + } + + @ParameterizedTest + @MethodSource("paths") + public void getCanonicalPath(String path) throws IOException { + File file = new File(path); + File that = new File("\\\\?\\" + path); + assertEquals(file.getCanonicalPath(), that.getCanonicalPath()); + } + + @ParameterizedTest + @MethodSource("paths") + public void getName(String path) throws IOException { + File file = new File(path); + File that = new File("\\\\?\\" + path); + assertEquals(file.getName(), that.getName()); + } + + @ParameterizedTest + @MethodSource("paths") + public void getParent(String path) throws IOException { + File file = new File(path); + File that = new File("\\\\?\\" + path); + assertEquals(file.getParent(), that.getParent()); + } + + @ParameterizedTest + @MethodSource("paths") + public void isAbsolute(String path) throws IOException { + File file = new File(path); + File that = new File("\\\\?\\" + path); + assertEquals(file.isAbsolute(), that.isAbsolute()); + } +} --