tools/javac/launcher/SourceLauncherTest.java fails on Windows

XMLWordPrintable

    • b19
    • generic
    • windows

        On Windows the test tools/javac/launcher/SourceLauncherTest.java fails.
        This is due to a perennial problem, and manifests when a file is created with a Windows reserved names, please see the following:
        https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN#file_and_directory_names

        The error is this:
        https://hg.openjdk.java.net/jdk/jdk/file/c1f532e5f910/test/langtools/tools/javac/launcher/SourceLauncherTest.java#l428

        Exception running test testNoSourceOnClassPath: java.nio.file.NoSuchFileException: testNoSourceOnClassPath\auxSrc\Aux.java
        java.nio.file.NoSuchFileException: testNoSourceOnClassPath\auxSrc\Aux.java
                at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:85)
                at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
                at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108)
                at java.base/sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:235)
                at java.base/java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:478)
                at java.base/java.nio.file.Files.newOutputStream(Files.java:219)
                at java.base/java.nio.file.Files.newBufferedWriter(Files.java:2919)
                at java.base/java.nio.file.Files.newBufferedWriter(Files.java:2962)
                at toolbox.ToolBox$JavaSource.write(ToolBox.java:636)
                at toolbox.ToolBox.writeJavaFiles(ToolBox.java:565)
                at SourceLauncherTest.testNoSourceOnClassPath(SourceLauncherTest.java:269)
                at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
                at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                at java.base/java.lang.reflect.Method.invoke(Method.java:566)
                at toolbox.TestRunner.runTests(TestRunner.java:89)
                at SourceLauncherTest.main(SourceLauncherTest.java:63)
                at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
                at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                at java.base/java.lang.reflect.Method.invoke(Method.java:566)
                at com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:127)
                at java.base/java.lang.Thread.run(Thread.java:834)

        Here is an example using java source launcher:

        $ cat Test.java
        import java.io.*;
        import java.nio.file.*;
        public class Test {
            public static void main(String... args) throws Exception {
        if (args == null || args.length < 1) {
                    throw new Error("Usage: need one pathspec argument");
        }
                Path file = Path.of(args[0]);
        Files.createDirectories(file.getParent());
        try (BufferedWriter out = Files.newBufferedWriter(file)) {
                    out.write("An auk or alcid is a bird of the family of Alcidae.");
        }
            }
        }

        $ BLAH/images/jdk/bin/java Test.java foo/Aux.java
        Exception in thread "main" java.nio.file.NoSuchFileException: foo\Aux.java
                at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:85)
                at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
                at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108)
                at java.base/sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:235)
                at java.base/java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:478)
                at java.base/java.nio.file.Files.newOutputStream(Files.java:219)
                at java.base/java.nio.file.Files.newBufferedWriter(Files.java:2919)
                at java.base/java.nio.file.Files.newBufferedWriter(Files.java:2962)
                at Test.main(Test.java:16)

        $ BLAH/images/jdk/bin/java Test.java foo/Auk.java
        $ cat foo/Auk.java
        An auk or alcid is a bird of the family of Alcidae.


        So changing the name from Aux.java or class Aux to Auk will work for the test. I am not sure why javac did not catch this please see JDK-6241975.

        I discovered this with jdk11.0.8 and why hasn't anyone else encountered this issue ?

        My suggestion is to enhance toolbox and other test helpers to check for these reserved keywords and warn the developer up front.

        Running on Windows Server 2016.

              Assignee:
              Jonathan Gibbons
              Reporter:
              Kumar Srinivasan
              Votes:
              0 Vote for this issue
              Watchers:
              6 Start watching this issue

                Created:
                Updated:
                Resolved: