# HG changeset patch # User jgeorge # Date 1515650735 -19800 # Node ID fdef4da95080b831c88bf6fae02527bed34dacfb # Parent a58c1924e03739bdbe3c0005f9ae39d865bb79e9 8193352: SA: Test for the clhsdb 'thread' and 'threads' commands Summary: Test for the clhsdb 'thread' and 'threads' commands. Avoids an incorrect 'Couldn't find thread -a' being printed. Reviewed-by: sspitsyn, sballal diff -r a58c1924e037 -r fdef4da95080 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/CommandProcessor.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/CommandProcessor.java Tue Jan 09 13:58:30 2018 -0500 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/CommandProcessor.java Thu Jan 11 11:35:35 2018 +0530 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2018, 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 @@ -1607,7 +1607,9 @@ if (!all) return; } } - out.println("Couldn't find thread " + name); + if (!all) { + out.println("Couldn't find thread " + name); + } } } }, diff -r a58c1924e037 -r fdef4da95080 test/hotspot/jtreg/serviceability/sa/ClhsdbThread.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbThread.java Thu Jan 11 11:35:35 2018 +0530 @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018, 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.util.HashMap; +import java.util.List; +import java.util.Map; +import jdk.test.lib.apps.LingeredApp; + +/* + * @test + * @bug 8193352 + * @summary Test clhsdb 'thread' and 'threads' commands + * @library /test/lib + * @run main/othervm ClhsdbThread + */ + +public class ClhsdbThread { + + public static void main(String[] args) throws Exception { + System.out.println("Starting ClhsdbThread test"); + + LingeredApp theApp = null; + try { + ClhsdbLauncher test = new ClhsdbLauncher(); + theApp = LingeredApp.startApp(); + System.out.println("Started LingeredApp with pid " + theApp.getPid()); + + List cmds = List.of("thread", "thread -a", "threads"); + + Map> expStrMap = new HashMap<>(); + // Check for the presence of the usage string + expStrMap.put("thread", List.of( "Usage: thread { -a | id }")); + expStrMap.put("thread -a", List.of( + "State: BLOCKED", + "Stack in use by Java", + "Base of Stack", + "Last_Java_SP:", + "Address")); + expStrMap.put("threads", List.of( + "Finalizer", + "Signal Dispatcher", + "Common-Cleaner", + "Stack in use by Java:", + "State:", + "Base of Stack:", + "main")); + Map> unExpStrMap = new HashMap<>(); + unExpStrMap.put( + "thread -a", + List.of("Couldn't find thread -a")); + + String consolidatedOutput = test.run( + theApp.getPid(), + cmds, + expStrMap, + unExpStrMap); + + if (consolidatedOutput == null) { + // Output could be null due to attach permission issues. + System.out.println( + "Output is empty. Probably due to attach permission issues."); + LingeredApp.stopApp(theApp); + return; + } + + // Test the thread command now. Obtain from the + // output of the previous 'threads' command. The word before + // the token 'Finalizer' should denote the thread id of the + // 'Finalizer' thread. + + String[] snippets = consolidatedOutput.split("Finalizer"); + String[] wordTokens = snippets[0].split(" "); + String threadIdObtained = wordTokens[wordTokens.length - 1]; + + // Weed out newlines and blurb before that. + if (threadIdObtained.contains("\n")) { + String[] threadIdTokens = threadIdObtained.split("\n"); + threadIdObtained = threadIdTokens[threadIdTokens.length - 1]; + } + + expStrMap = new HashMap<>(); + System.out.println("Thread Id obtained is: " + threadIdObtained); + + String cmd = "thread " + threadIdObtained; + expStrMap.put(cmd, List.of( + "Base of Stack:", + "State:", + "Last_Java_SP")); + cmds = List.of(cmd); + test.run(theApp.getPid(), cmds, expStrMap, null); + } catch (Exception ex) { + throw new RuntimeException("Test ERROR " + ex, ex); + } finally { + LingeredApp.stopApp(theApp); + } + System.out.println("Test PASSED"); + } +}