From 25ad86234a7cd6e606b273f3e63351aa07c567a3 Mon Sep 17 00:00:00 2001 From: Naoto Sato Date: Fri, 7 Jun 2024 16:22:02 +0000 Subject: [PATCH] 8332161: Test restoring echo in the Console implementation (java.base) Reviewed-by: joehw, prappo --- test/jdk/java/io/Console/RestoreEchoTest.java | 96 +++++++++++++++++++ test/jdk/java/io/Console/restoreEcho.exp | 58 +++++++++++ 2 files changed, 154 insertions(+) create mode 100644 test/jdk/java/io/Console/RestoreEchoTest.java create mode 100644 test/jdk/java/io/Console/restoreEcho.exp diff --git a/test/jdk/java/io/Console/RestoreEchoTest.java b/test/jdk/java/io/Console/RestoreEchoTest.java new file mode 100644 index 00000000000..78d36faa537 --- /dev/null +++ b/test/jdk/java/io/Console/RestoreEchoTest.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2024, 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. + */ + +import java.io.Console; +import java.nio.file.Files; +import java.nio.file.Paths; + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledOnOs; +import org.junit.jupiter.api.condition.OS; +import static org.junit.jupiter.api.Assertions.*; + + +/** + * @test + * @bug 8332161 + * @summary Tests JdkConsoleImpl restores the echo state after readPassword() call + * @library /test/lib + * @run junit RestoreEchoTest + */ +public class RestoreEchoTest { + + @Test + @EnabledOnOs({OS.LINUX, OS.MAC}) + public void testRestoreEcho() throws Throwable { + // check "expect" command availability + var expect = Paths.get("/usr/bin/expect"); + if (!Files.exists(expect) || !Files.isExecutable(expect)) { + Assumptions.abort("'" + expect + "' not found"); + } + + expectRunner("-echo"); + expectRunner("echo"); + } + + private static void expectRunner(String initialEcho) throws Throwable { + // invoking "expect" command + var testSrc = System.getProperty("test.src", "."); + var testClasses = System.getProperty("test.classes", "."); + var jdkDir = System.getProperty("test.jdk"); + OutputAnalyzer output = ProcessTools.executeProcess( + "expect", + "-n", + testSrc + "/restoreEcho.exp", + initialEcho, + jdkDir + "/bin/java", + "-Djdk.console=java.base", + "-classpath", testClasses, + "RestoreEchoTest"); + output.reportDiagnosticSummary(); + assertEquals(0, output.getExitValue()); + } + + public static void main(String... args) throws Throwable { + if (!"java.base".equals(System.getProperty("jdk.console"))) { + throw new RuntimeException("Test failed. jdk.console is not java.base"); + } + + Console con = System.console(); + if (con == null) { + throw new RuntimeException("Test failed. System.console() returned null"); + } + + // testing readLine() + String input = con.readLine("prompt: "); + con.printf("input is %s%n", input); + + // testing readPassword() + input = String.valueOf(con.readPassword("password prompt: ")); + con.printf("password is %s%n", input); + } +} diff --git a/test/jdk/java/io/Console/restoreEcho.exp b/test/jdk/java/io/Console/restoreEcho.exp new file mode 100644 index 00000000000..5a194b07a7d --- /dev/null +++ b/test/jdk/java/io/Console/restoreEcho.exp @@ -0,0 +1,58 @@ +# +# Copyright (c) 2024, 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. +# + +set initialEcho [lindex $argv 0] +set java [lrange $argv 1 end] +set rlprompt "prompt: " +set rpprompt "password prompt: " +set rlinput "InPuT" +set rpinput "PaSsWoRd" +set rlexpected "input is $rlinput" +set rpexpected "password is $rpinput" +set stty_init $initialEcho +set timeout 10 + +proc test {prompt input echoStat expected} { + expect "$prompt" + send -- "$input\n" + if {$echoStat == "echo"} { + expect "$input" + } + expect "$expected" + + if {$expect_out(0,string) != $expected} { + send_error "Expected: $expected\n" + send_error "Received: $expect_out(0,string)" + exit 1 + } +} + +spawn sh -c "[list {*}$java] && stty -a" + +# readLine() - input is displayed depending on initialEcho value +test "$rlprompt" "$rlinput" "$initialEcho" "$rlexpected" +# readPassword() - input is not displayed +test "$rpprompt" "$rpinput" "-echo" "$rpexpected" +# See if the initialEcho is restored with `stty -a` +expect -- " $initialEcho " +expect eof