diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 4e6b06af55d..7eba4d76fa9 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -609,7 +609,6 @@ sun/security/smartcardio/TestMultiplePresent.java 8039280 generic- sun/security/smartcardio/TestPresent.java 8039280 generic-all sun/security/smartcardio/TestTransmit.java 8039280 generic-all com/sun/crypto/provider/Cipher/DES/PerformanceTest.java 8039280 generic-all -com/sun/security/auth/callback/TextCallbackHandler/Default.java 8039280 generic-all com/sun/security/sasl/gsskerb/AuthOnly.java 8039280 generic-all com/sun/security/sasl/gsskerb/ConfSecurityLayer.java 8039280 generic-all com/sun/security/sasl/gsskerb/NoSecurityLayer.java 8039280 generic-all diff --git a/test/jdk/TEST.groups b/test/jdk/TEST.groups index c4a2bbaf5ca..1a5288e75b5 100644 --- a/test/jdk/TEST.groups +++ b/test/jdk/TEST.groups @@ -624,7 +624,6 @@ jdk_security_manual_no_input = \ com/sun/crypto/provider/Cipher/DES/PerformanceTest.java \ com/sun/crypto/provider/Cipher/AEAD/GCMIncrementByte4.java \ com/sun/crypto/provider/Cipher/AEAD/GCMIncrementDirect4.java \ - com/sun/security/auth/callback/TextCallbackHandler/Default.java \ com/sun/security/sasl/gsskerb/AuthOnly.java \ com/sun/security/sasl/gsskerb/ConfSecurityLayer.java \ com/sun/security/sasl/gsskerb/NoSecurityLayer.java \ diff --git a/test/jdk/com/sun/security/auth/callback/TextCallbackHandler/Default.java b/test/jdk/com/sun/security/auth/callback/TextCallbackHandler/Default.java index 606a1ad5e0e..1fb3350c8f7 100644 --- a/test/jdk/com/sun/security/auth/callback/TextCallbackHandler/Default.java +++ b/test/jdk/com/sun/security/auth/callback/TextCallbackHandler/Default.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -23,31 +23,48 @@ /* * @test + * @library /test/lib /java/security/testlibrary * @bug 4470717 * @summary fix default handling and other misc - * @run main/manual Default + * @run main/othervm Default */ import com.sun.security.auth.callback.TextCallbackHandler; +import jdk.test.lib.Asserts; + import javax.security.auth.callback.*; +import java.io.*; public class Default { - public static void main(String args[]) throws Exception { - TextCallbackHandler h = new TextCallbackHandler(); - NameCallback nc = new NameCallback("Name: ", "charlie"); - ConfirmationCallback cc = new ConfirmationCallback - ("Correct?", - ConfirmationCallback.INFORMATION, - ConfirmationCallback.YES_NO_OPTION, - ConfirmationCallback.NO); + public static void main(String args[]) throws Exception { + InputStream in = System.in; + PrintStream err = System.err; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final String defaultName = "charlie"; + final String simulatedInput = "-1\n-1\n"; + HumanInputStream humanInputStream = new HumanInputStream(simulatedInput); - Callback[] callbacks = { nc, cc }; - h.handle(callbacks); + try (PrintStream prints = new PrintStream(baos)) { + System.setIn(humanInputStream); + System.setErr(prints); + NameCallback nameCallback = new NameCallback("Name: ", defaultName); + ConfirmationCallback confirmationCallback = new ConfirmationCallback( + "Correct?", + ConfirmationCallback.INFORMATION, + ConfirmationCallback.YES_NO_OPTION, + ConfirmationCallback.NO); + new TextCallbackHandler().handle(new Callback[]{nameCallback, confirmationCallback}); - if (cc.getSelectedIndex() == ConfirmationCallback.YES) { - System.out.println("yes"); - } else { - System.out.println("no"); + Asserts.assertEquals(nameCallback.getDefaultName(), defaultName); + Asserts.assertEquals(confirmationCallback.getSelectedIndex(), ConfirmationCallback.NO); + + } finally { + System.setIn(in); + System.setErr(err); } - } + + // check that the default name and confirmation were visible in the output + Asserts.assertTrue(baos.toString().contains(String.format("Name: [%s]", defaultName))); + Asserts.assertTrue(baos.toString().contains("1. No [default]")); + } } diff --git a/test/jdk/java/security/testlibrary/HumanInputStream.java b/test/jdk/java/security/testlibrary/HumanInputStream.java new file mode 100644 index 00000000000..50e5dd0bcc8 --- /dev/null +++ b/test/jdk/java/security/testlibrary/HumanInputStream.java @@ -0,0 +1,192 @@ +/* + * 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.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +/** + * HumanInputStream tries to act like a human sitting in front of a computer + * terminal typing on the keyboard while a program is running. + *
+ * The program may call InputStream.read() and BufferedReader.readLine() in + * various places. a call to B.readLine() will try to buffer as much input as + * possible. Thus, a trivial InputStream will find it impossible to feed + * anything to I.read() after a B.readLine() call. + *
+ * This is why HumanInputStream was created, which will only send a single line
+ * to B.readLine(), no more, no less, and the next I.read() can have a chance
+ * to read the exact character right after "\n".
+ *
+ */
+
+public class HumanInputStream extends InputStream {
+ byte[] src;
+ int pos;
+ int length;
+ boolean inLine;
+ int stopIt;
+
+ public HumanInputStream(String input) {
+ src = input.getBytes();
+ pos = 0;
+ length = src.length;
+ stopIt = 0;
+ inLine = false;
+ }
+
+ // the trick: when called through read(byte[], int, int),
+ // return -1 twice after "\n"
+
+ @Override public int read() throws IOException {
+ int re;
+ if(pos < length) {
+ re = src[pos];
+ if(inLine) {
+ if(stopIt > 0) {
+ stopIt--;
+ re = -1;
+ } else {
+ if(re == '\n') {
+ stopIt = 2;
+ }
+ pos++;
+ }
+ } else {
+ pos++;
+ }
+ } else {
+ re = -1; //throws new IOException("NO MORE TO READ");
+ }
+ return re;
+ }
+ @Override public int read(byte[] buffer, int offset, int len) {
+ inLine = true;
+ try {
+ return super.read(buffer, offset, len);
+ } catch(Exception e) {
+ throw new RuntimeException("HumanInputStream error");
+ } finally {
+ inLine = false;
+ }
+ }
+ @Override public int available() {
+ if (pos < length) return 1;
+ return 0;
+ }
+
+ // test part
+ static void assertTrue(boolean bool) {
+ if (!bool)
+ throw new RuntimeException();
+ }
+
+ public static void test() throws Exception {
+ class Tester {
+ HumanInputStream is;
+ BufferedReader reader;
+ Tester(String s) {
+ is = new HumanInputStream(s);
+ reader = new BufferedReader(new InputStreamReader(is));
+ }
+
+ // three kinds of test method
+ // 1. read byte by byte from InputStream
+ void testStreamReadOnce(int expection) throws Exception {
+ assertTrue(is.read() == expection);
+ }
+ void testStreamReadMany(String expectation) throws Exception {
+ char[] keys = expectation.toCharArray();
+ for (char key : keys) {
+ assertTrue(is.read() == key);
+ }
+ }
+ // 2. read a line with a newly created Reader
+ void testReaderReadline(String expectation) throws Exception {
+ String s = new BufferedReader(new InputStreamReader(is)).readLine();
+ if(s == null) assertTrue(expectation == null);
+ else assertTrue(s.equals(expectation));
+ }
+ // 3. read a line with the old Reader
+ void testReaderReadline2(String expectation) throws Exception {
+ String s = reader.readLine();
+ if(s == null) assertTrue(expectation == null);
+ else assertTrue(s.equals(expectation));
+ }
+ }
+
+ Tester test;
+
+ test = new Tester("111\n222\n\n444\n\n");
+ test.testReaderReadline("111");
+ test.testReaderReadline("222");
+ test.testReaderReadline("");
+ test.testReaderReadline("444");
+ test.testReaderReadline("");
+ test.testReaderReadline(null);
+
+ test = new Tester("111\n222\n\n444\n\n");
+ test.testReaderReadline2("111");
+ test.testReaderReadline2("222");
+ test.testReaderReadline2("");
+ test.testReaderReadline2("444");
+ test.testReaderReadline2("");
+ test.testReaderReadline2(null);
+
+ test = new Tester("111\n222\n\n444\n\n");
+ test.testReaderReadline2("111");
+ test.testReaderReadline("222");
+ test.testReaderReadline2("");
+ test.testReaderReadline2("444");
+ test.testReaderReadline("");
+ test.testReaderReadline2(null);
+
+ test = new Tester("1\n2");
+ test.testStreamReadMany("1\n2");
+ test.testStreamReadOnce(-1);
+
+ test = new Tester("12\n234");
+ test.testStreamReadOnce('1');
+ test.testReaderReadline("2");
+ test.testStreamReadOnce('2');
+ test.testReaderReadline2("34");
+ test.testReaderReadline2(null);
+
+ test = new Tester("changeit\n");
+ test.testStreamReadMany("changeit\n");
+ test.testReaderReadline(null);
+
+ test = new Tester("changeit\nName\nCountry\nYes\n");
+ test.testStreamReadMany("changeit\n");
+ test.testReaderReadline("Name");
+ test.testReaderReadline("Country");
+ test.testReaderReadline("Yes");
+ test.testReaderReadline(null);
+
+ test = new Tester("Me\nHere\n");
+ test.testReaderReadline2("Me");
+ test.testReaderReadline2("Here");
+ }
+}
diff --git a/test/jdk/sun/security/tools/keytool/KeyToolTest.java b/test/jdk/sun/security/tools/keytool/KeyToolTest.java
index b17f7b7d999..7b5f4d5556e 100644
--- a/test/jdk/sun/security/tools/keytool/KeyToolTest.java
+++ b/test/jdk/sun/security/tools/keytool/KeyToolTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -23,6 +23,7 @@
/*
* @test
+ * @library /java/security/testlibrary
* @bug 6251120 8231950 8242151
* @summary Testing keytool
*
@@ -1865,172 +1866,4 @@ class TestException extends Exception {
public TestException(String e) {
super(e);
}
-}
-
-/**
- * HumanInputStream tries to act like a human sitting in front of a computer
- * terminal typing on the keyboard while the keytool program is running.
- *
- * keytool has called InputStream.read() and BufferedReader.readLine() in
- * various places. a call to B.readLine() will try to buffer as much input as
- * possible. Thus, a trivial InputStream will find it impossible to feed
- * anything to I.read() after a B.readLine() call.
- *
- * This is why i create HumanInputStream, which will only send a single line
- * to B.readLine(), no more, no less, and the next I.read() can have a chance
- * to read the exact character right after "\n".
- *
- * I don't know why HumanInputStream works.
- */
-class HumanInputStream extends InputStream {
- byte[] src;
- int pos;
- int length;
- boolean inLine;
- int stopIt;
-
- public HumanInputStream(String input) {
- src = input.getBytes();
- pos = 0;
- length = src.length;
- stopIt = 0;
- inLine = false;
- }
-
- // the trick: when called through read(byte[], int, int),
- // return -1 twice after "\n"
-
- @Override public int read() throws IOException {
- int re;
- if(pos < length) {
- re = src[pos];
- if(inLine) {
- if(stopIt > 0) {
- stopIt--;
- re = -1;
- } else {
- if(re == '\n') {
- stopIt = 2;
- }
- pos++;
- }
- } else {
- pos++;
- }
- } else {
- re = -1;//throw new IOException("NO MORE TO READ");
- }
- //if (re < 32) System.err.printf("[%02d]", re);
- //else System.err.printf("[%c]", (char)re);
- return re;
- }
- @Override public int read(byte[] buffer, int offset, int len) {
- inLine = true;
- try {
- int re = super.read(buffer, offset, len);
- return re;
- } catch(Exception e) {
- throw new RuntimeException("HumanInputStream error");
- } finally {
- inLine = false;
- }
- }
- @Override public int available() {
- if(pos < length) return 1;
- return 0;
- }
-
- // test part
- static void assertTrue(boolean bool) {
- if(!bool)
- throw new RuntimeException();
- }
-
- public static void test() throws Exception {
-
- class Tester {
- HumanInputStream is;
- BufferedReader reader;
- Tester(String s) {
- is = new HumanInputStream(s);
- reader = new BufferedReader(new InputStreamReader(is));
- }
-
- // three kinds of test method
- // 1. read byte by byte from InputStream
- void testStreamReadOnce(int expection) throws Exception {
- assertTrue(is.read() == expection);
- }
- void testStreamReadMany(String expection) throws Exception {
- char[] keys = expection.toCharArray();
- for(int i=0; i