diff --git a/src/java.base/share/classes/java/io/Console.java b/src/java.base/share/classes/java/io/Console.java index 0f83a72c23d..468d8f566d5 100644 --- a/src/java.base/share/classes/java/io/Console.java +++ b/src/java.base/share/classes/java/io/Console.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -608,7 +608,13 @@ public class Console implements Flushable @SuppressWarnings("removal") private static Console instantiateConsole(boolean istty) { try { - // Try loading providers + /* + * The JdkConsole provider used for Console instantiation can be specified + * with the system property "jdk.console", whose value designates the module + * name of the implementation, and which defaults to "java.base". If no + * providers are available, or instantiation failed, java.base built-in + * Console implementation is used. + */ PrivilegedAction pa = () -> { var consModName = System.getProperty("jdk.console", JdkConsoleProvider.DEFAULT_PROVIDER_MODULE_NAME); diff --git a/src/java.base/share/classes/jdk/internal/io/JdkConsoleProvider.java b/src/java.base/share/classes/jdk/internal/io/JdkConsoleProvider.java index 192c1745038..ae1992012de 100644 --- a/src/java.base/share/classes/jdk/internal/io/JdkConsoleProvider.java +++ b/src/java.base/share/classes/jdk/internal/io/JdkConsoleProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 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 @@ -28,18 +28,12 @@ import java.nio.charset.Charset; /** * Service provider interface for JdkConsole implementations. - * The provider used for instantiating JdkConsole instance can be - * specified with the system property "jdk.console", whose value - * designates the module name of the implementation, and which defaults - * to "jdk.internal.le" (jline). If no providers is available, - * or instantiation failed, java.base built-in Console implementation - * is used. */ public interface JdkConsoleProvider { /** * The module name of the JdkConsole default provider. */ - String DEFAULT_PROVIDER_MODULE_NAME = "jdk.internal.le"; + String DEFAULT_PROVIDER_MODULE_NAME = "java.base"; /** * {@return the Console instance, or {@code null} if not available} diff --git a/test/jdk/java/io/Console/ModuleSelectionTest.java b/test/jdk/java/io/Console/ModuleSelectionTest.java index c7e66d0c317..3ecf9a1a6fa 100644 --- a/test/jdk/java/io/Console/ModuleSelectionTest.java +++ b/test/jdk/java/io/Console/ModuleSelectionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 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 @@ -23,11 +23,11 @@ /** * @test - * @bug 8295803 + * @bug 8295803 8299689 * @summary Tests System.console() returns correct Console (or null) from the expected * module. * @modules java.base/java.io:+open - * @run main/othervm ModuleSelectionTest jdk.internal.le + * @run main/othervm ModuleSelectionTest java.base * @run main/othervm -Djdk.console=jdk.internal.le ModuleSelectionTest jdk.internal.le * @run main/othervm -Djdk.console=java.base ModuleSelectionTest java.base * @run main/othervm --limit-modules java.base ModuleSelectionTest java.base diff --git a/test/jdk/java/io/Console/RedirectTest.java b/test/jdk/java/io/Console/RedirectTest.java index 8b55bd488d7..d7aa6c64468 100644 --- a/test/jdk/java/io/Console/RedirectTest.java +++ b/test/jdk/java/io/Console/RedirectTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 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 @@ -28,33 +28,50 @@ import jdk.test.lib.process.ProcessTools; /** * @test - * @bug 8295803 + * @bug 8295803 8299689 * @summary Tests System.console() works with standard input redirection. * @library /test/lib + * @run main RedirectTest + * @run main/othervm -Djdk.console=jdk.internal.le RedirectTest */ public class RedirectTest { + private static final String SYSPROP = "jdk.console"; + public static void main(String... args) throws Throwable { if (args.length == 0) { // no arg will launch the child process that actually perform tests - var pb = ProcessTools.createTestJvm("RedirectTest", "dummy"); + var pb = ProcessTools.createTestJvm( + "-D" + SYSPROP + "=" + System.getProperty(SYSPROP, ""), + "RedirectTest", "dummy"); var input = new File(System.getProperty("test.src", "."), "input.txt"); pb.redirectInput(input); var oa = ProcessTools.executeProcess(pb); - var output = oa.asLines(); - var expected = Files.readAllLines(input.toPath()); - if (!output.equals(expected)) { - throw new RuntimeException(""" + if (oa.getExitValue() == 1) { + System.out.println("System.console() returns null. Ignoring the test."); + } else { + var output = oa.asLines(); + var expected = Files.readAllLines(input.toPath()); + if (!output.equals(expected)) { + throw new RuntimeException(""" Standard out had unexpected strings: Actual output: %s Expected output: %s """.formatted(output, expected)); + } else { + oa.shouldHaveExitValue(0); + System.out.println("Redirect succeeded."); + } } - oa.shouldHaveExitValue(0); } else { var con = System.console(); - String line; - while ((line = con.readLine()) != null) { - System.out.println(line); + if (con != null) { + String line; + while ((line = con.readLine()) != null) { + System.out.println(line); + } + } else { + // Exit with 1 + System.exit(1); } } }