8215568: Refactor SA clhsdb tests to use ClhsdbLauncher

Refactoring the SA tests which test clhsdb commands to use ClhsdbLauncher for uniformity and ease of maintainence

Reviewed-by: jcbeyler, dholmes
This commit is contained in:
Jini George 2019-02-05 00:43:38 +05:30
parent 6f437c6c9a
commit 9c09bb98d4
21 changed files with 170 additions and 477 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2018, 2019, 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
@ -171,7 +171,7 @@ public class ClhsdbCDSCore {
"_nofast_getfield",
"_nofast_putfield",
"Constant Pool of",
"public static void main(java.lang.String[])",
"public static void main\\(java.lang.String\\[\\]\\)",
"Bytecode",
"invokevirtual",
"checkcast",

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2018, 2019, 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
@ -95,7 +95,7 @@ public class ClhsdbCDSJstackPrintAll {
"_nofast_getfield",
"_nofast_putfield",
"Constant Pool of",
"public static void main(java.lang.String[])",
"public static void main\\(java.lang.String\\[\\]\\)",
"Bytecode",
"invokevirtual",
"checkcast",

View File

@ -27,7 +27,6 @@ import java.util.List;
import java.util.Map;
import jdk.test.lib.apps.LingeredApp;
import jdk.test.lib.Platform;
import jdk.test.lib.Utils;
import jtreg.SkippedException;

View File

@ -62,7 +62,7 @@ public class ClhsdbInspect {
"instance of Oop for java/lang/Class");
tokensMap.put("Method*=", "Type is Method");
tokensMap.put("(a java.lang.ref.ReferenceQueue$Lock)",
"instance of Oop for java/lang/ref/ReferenceQueue$Lock");
"instance of Oop for java/lang/ref/ReferenceQueue\\$Lock");
String[] lines = jstackOutput.split("\\R");

View File

@ -72,14 +72,15 @@ public class ClhsdbJdis {
Map<String, List<String>> expStrMap = new HashMap<>();
expStrMap.put(cmdStr, List.of(
"public static void main(java.lang.String[])",
"public static void main\\(java\\.lang\\.String\\[\\]\\)",
"Holder Class",
"public class jdk.test.lib.apps.LingeredApp @",
"public class jdk\\.test\\.lib\\.apps\\.LingeredApp @",
"Bytecode",
"line bci bytecode",
"Exception Table",
"start bci end bci handler bci catch type",
"Constant Pool of [public class jdk.test.lib.apps.LingeredApp @"));
"Constant Pool of \\[public class jdk\\.test\\.lib\\.apps\\.LingeredApp @"));
test.run(theApp.getPid(), cmds, expStrMap, null);
} catch (SkippedException e) {

View File

@ -26,7 +26,6 @@ import java.util.List;
import java.util.Map;
import jdk.test.lib.apps.LingeredApp;
import jdk.test.lib.Platform;
import jtreg.SkippedException;
/**
@ -57,11 +56,11 @@ public class ClhsdbJstack {
Map<String, List<String>> expStrMap = new HashMap<>();
expStrMap.put("jstack -v", List.of(
"No deadlocks found",
"Common-Cleaner",
"Common\\-Cleaner",
"Signal Dispatcher",
"java.lang.ref.Finalizer$FinalizerThread.run",
"java.lang.ref.Finalizer\\$FinalizerThread.run",
"java.lang.ref.Reference",
"Method*",
"Method\\*",
"LingeredApp.main"));
test.run(theApp.getPid(), cmds, expStrMap, null);

View File

@ -145,7 +145,7 @@ public class ClhsdbLauncher {
List<String> expectedStr = expectedStrMap.get(cmd);
if (expectedStr != null) {
for (String exp : expectedStr) {
out.shouldContain(exp);
out.shouldMatch(exp);
}
}
}
@ -154,7 +154,7 @@ public class ClhsdbLauncher {
List<String> unExpectedStr = unExpectedStrMap.get(cmd);
if (unExpectedStr != null) {
for (String unExp : unExpectedStr) {
out.shouldNotContain(unExp);
out.shouldNotMatch(unExp);
}
}
}

View File

@ -26,7 +26,6 @@ import java.util.List;
import java.util.Map;
import jdk.test.lib.apps.LingeredApp;
import jdk.test.lib.Platform;
import jtreg.SkippedException;
/**

View File

@ -56,11 +56,11 @@ public class ClhsdbPrintAll {
expStrMap.put("printall", List.of(
"aload_0",
"Constant Pool of",
"public static void main(java.lang.String[])",
"public static void main\\(java.lang.String\\[\\]\\)",
"Bytecode",
"[enum] class Song [signature Ljava/lang/Enum<LSong;>;]",
"Method java.lang.Object clone()",
"public static Song[] values()",
"\\[enum\\] class Song \\[signature Ljava/lang/Enum\\<LSong;\\>;\\]",
"Method java.lang.Object clone\\(\\)",
"public static Song\\[\\] values\\(\\)",
"invokevirtual",
"checkcast",
"Field Song HAVANA",

View File

@ -26,7 +26,6 @@ import java.util.List;
import java.util.Map;
import jdk.test.lib.apps.LingeredApp;
import jdk.test.lib.Platform;
import jtreg.SkippedException;
/**
@ -71,7 +70,7 @@ public class ClhsdbPrintStatics {
expStrMap.put("printstatics Threads", List.of(
"Static fields of Threads",
"_number_of_threads", "_number_of_non_daemon_threads",
"JavaThread* Threads"));
"JavaThread\\* Threads"));
expStrMap.put("printstatics Universe", List.of(
"Static fields of Universe",
"uintptr_t Universe::_verify_oop_mask",

View File

@ -26,7 +26,6 @@ import java.util.List;
import java.util.Map;
import jdk.test.lib.apps.LingeredApp;
import jdk.test.lib.Platform;
import jtreg.SkippedException;
/**

View File

@ -79,7 +79,7 @@ public class ClhsdbRegionDetailsScanOopsForG1 {
// words[0] and words[1] represent the start and end addresses
String cmd = "scanoops " + words[0] + " " + words[1];
expStrMap = new HashMap<>();
expStrMap.put(cmd, List.of("[Ljava/lang/String"));
expStrMap.put(cmd, List.of("\\[Ljava/lang/String"));
test.run(theApp.getPid(), List.of(cmd), expStrMap, null);
} catch (SkippedException e) {
throw e;

View File

@ -80,7 +80,7 @@ public class ClhsdbScanOops {
expStrMap.put(cmd, List.of
("java/lang/Object", "java/lang/Class", "java/lang/Thread",
"java/lang/String", "[B", "[I"));
"java/lang/String", "\\[B", "\\[I"));
// Test the 'type' option also
// scanoops <start addr> <end addr> java/lang/String

View File

@ -58,16 +58,16 @@ public class ClhsdbSource {
Map<String, List<String>> expStrMap = new HashMap<>();
expStrMap.put("source clhsdb_cmd_file", List.of(
"No deadlocks found",
"Common-Cleaner",
"Common\\-Cleaner",
"Signal Dispatcher",
"java.lang.ref.Finalizer$FinalizerThread.run",
"java.lang.ref.Finalizer\\$FinalizerThread.run",
"java.lang.ref.Reference",
"Method*",
"Method\\*",
"LingeredApp.main",
"Available commands:",
"attach pid | exec core",
"intConstant [ name [ value ] ]",
"type [ type [ name super isOop isInteger isUnsigned size ] ]"));
"attach pid \\| exec core",
"intConstant \\[ name \\[ value \\] \\]",
"type \\[ type \\[ name super isOop isInteger isUnsigned size \\] \\]"));
Map<String, List<String>> unExpStrMap = new HashMap<>();
unExpStrMap.put("source clhsdb_cmd_file", List.of(

View File

@ -51,7 +51,7 @@ public class ClhsdbThread {
Map<String, List<String>> expStrMap = new HashMap<>();
// Check for the presence of the usage string
expStrMap.put("thread", List.of( "Usage: thread { -a | id }"));
expStrMap.put("thread", List.of( "Usage: thread \\{ \\-a \\| id \\}"));
expStrMap.put("thread -a", List.of(
"State: BLOCKED",
"Stack in use by Java",
@ -69,7 +69,7 @@ public class ClhsdbThread {
Map<String, List<String>> unExpStrMap = new HashMap<>();
unExpStrMap.put(
"thread -a",
List.of("Couldn't find thread -a"));
List.of("Couldn't find thread \\-a"));
String consolidatedOutput = test.run(
theApp.getPid(),

View File

@ -26,7 +26,6 @@ import java.util.List;
import java.util.Map;
import jdk.test.lib.apps.LingeredApp;
import jdk.test.lib.Platform;
import jtreg.SkippedException;
/**

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2017, 2019, 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
@ -22,19 +22,12 @@
*/
import java.util.ArrayList;
import java.util.Scanner;
import java.util.List;
import java.io.File;
import java.io.IOException;
import java.util.stream.Collectors;
import java.io.OutputStream;
import jdk.test.lib.apps.LingeredApp;
import jdk.test.lib.JDKToolLauncher;
import jdk.test.lib.Platform;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.Utils;
import jdk.test.lib.Asserts;
import java.util.Map;
import java.util.HashMap;
import jtreg.SkippedException;
/**
* @test
@ -45,117 +38,39 @@ import jdk.test.lib.Asserts;
public class TestClhsdbJstackLock {
private static final String JSTACK_OUT_FILE = "jstack_out.txt";
private static void verifyJStackOutput() throws Exception {
Exception unexpected = null;
File jstackFile = new File(JSTACK_OUT_FILE);
Asserts.assertTrue(jstackFile.exists() && jstackFile.isFile(),
"File with jstack output not created: " +
jstackFile.getAbsolutePath());
try {
Scanner scanner = new Scanner(jstackFile);
boolean classLockOwnerFound = false;
boolean classLockWaiterFound = false;
boolean objectLockOwnerFound = false;
boolean primitiveLockOwnerFound = false;
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println(line);
if (line.contains("missing reason for ")) {
unexpected = new RuntimeException("Unexpected msg: missing reason for ");
break;
}
if (line.matches("^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Class for LingeredAppWithLock\\)$")) {
classLockOwnerFound = true;
}
if (line.matches("^\\s+- waiting to lock <0x[0-9a-f]+> \\(a java\\.lang\\.Class for LingeredAppWithLock\\)$")) {
classLockWaiterFound = true;
}
if (line.matches("^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Thread\\)$")) {
objectLockOwnerFound = true;
}
if (line.matches("^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Class for int\\)$")) {
primitiveLockOwnerFound = true;
}
}
if (!classLockOwnerFound || !classLockWaiterFound ||
!objectLockOwnerFound || !primitiveLockOwnerFound) {
unexpected = new RuntimeException(
"classLockOwnerFound = " + classLockOwnerFound +
", classLockWaiterFound = " + classLockWaiterFound +
", objectLockOwnerFound = " + objectLockOwnerFound +
", primitiveLockOwnerFound = " + primitiveLockOwnerFound);
}
if (unexpected != null) {
throw unexpected;
}
} catch (Exception ex) {
throw new RuntimeException("Test ERROR " + ex, ex);
} finally {
jstackFile.delete();
}
}
private static void startClhsdbForLock(long lingeredAppPid) throws Exception {
Process p;
JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("jhsdb");
launcher.addToolArg("clhsdb");
launcher.addToolArg("--pid");
launcher.addToolArg(Long.toString(lingeredAppPid));
ProcessBuilder pb = new ProcessBuilder();
pb.command(launcher.getCommand());
System.out.println(pb.command().stream().collect(Collectors.joining(" ")));
try {
p = pb.start();
} catch (Exception attachE) {
throw new Error("Couldn't start jhsdb or attach to LingeredApp : " + attachE);
}
// Issue the 'jstack' input at the clhsdb prompt.
OutputStream input = p.getOutputStream();
String str = "jstack > " + JSTACK_OUT_FILE + "\nquit\n";
try {
input.write(str.getBytes());
input.flush();
} catch (IOException ioe) {
throw new Error("Problem issuing the jstack command: " + str, ioe);
}
OutputAnalyzer output = new OutputAnalyzer(p);
try {
p.waitFor();
} catch (InterruptedException ie) {
p.destroyForcibly();
throw new Error("Problem awaiting the child process: " + ie, ie);
}
output.shouldHaveExitValue(0);
}
public static void main (String... args) throws Exception {
LingeredApp app = null;
System.out.println("Starting TestClhsdbJstackLock test");
LingeredAppWithLock app = null;
try {
ClhsdbLauncher test = new ClhsdbLauncher();
List<String> vmArgs = new ArrayList<String>(Utils.getVmOptions());
app = new LingeredAppWithLock();
LingeredApp.startApp(vmArgs, app);
System.out.println ("Started LingeredApp with pid " + app.getPid());
startClhsdbForLock(app.getPid());
verifyJStackOutput();
System.out.println ("Started LingeredAppWithLock with pid " + app.getPid());
List<String> cmds = List.of("jstack");
Map<String, List<String>> expStrMap = new HashMap<>();
Map<String, List<String>> unExpStrMap = new HashMap<>();
expStrMap.put("jstack", List.of(
"^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Class for LingeredAppWithLock\\)$",
"^\\s+- waiting to lock <0x[0-9a-f]+> \\(a java\\.lang\\.Class for LingeredAppWithLock\\)$",
"^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Thread\\)$",
"^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Class for int\\)$"));
unExpStrMap.put("jstack", List.of(
"missing reason for "));
test.run(app.getPid(), cmds, expStrMap, unExpStrMap);
} catch (SkippedException se) {
throw se;
} catch (Exception ex) {
throw new RuntimeException("Test ERROR " + ex, ex);
} finally {
LingeredApp.stopApp(app);
}
System.out.println("Test PASSED");
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2017, 2019, 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,14 +23,11 @@
import java.util.ArrayList;
import java.util.List;
import java.io.IOException;
import java.util.stream.Collectors;
import java.io.OutputStream;
import jdk.test.lib.apps.LingeredApp;
import jdk.test.lib.JDKToolLauncher;
import jdk.test.lib.Platform;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.Utils;
import java.util.Map;
import java.util.HashMap;
import jtreg.SkippedException;
/**
* @test
@ -44,96 +41,45 @@ import jdk.test.lib.Utils;
public class TestIntConstant {
private static void testClhsdbForIntConstant(
long lingeredAppPid,
String commandString,
String[] expectedOutputStrings) throws Exception {
Process p;
JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("jhsdb");
launcher.addToolArg("clhsdb");
launcher.addToolArg("--pid");
launcher.addToolArg(Long.toString(lingeredAppPid));
ProcessBuilder pb = new ProcessBuilder();
pb.command(launcher.getCommand());
pb.redirectError(ProcessBuilder.Redirect.INHERIT);
System.out.println(
pb.command().stream().collect(Collectors.joining(" ")));
try {
p = pb.start();
} catch (Exception attachE) {
throw new Error("Couldn't start jhsdb or attach to LingeredApp : " + attachE);
}
// Issue the 'intConstant' inputs at the clhsdb prompt.
OutputStream input = p.getOutputStream();
try {
input.write((commandString + "\n").getBytes());
input.write("quit\n".getBytes());
input.flush();
} catch (IOException ioe) {
throw new Error("Problem issuing the intConstant command: " +
commandString + ioe);
}
OutputAnalyzer output = new OutputAnalyzer(p);
System.out.println("Awaiting process completion");
try {
p.waitFor();
} catch (InterruptedException ie) {
p.destroyForcibly();
throw new Error("Problem awaiting the child process: " + ie);
}
output.shouldHaveExitValue(0);
System.out.println(output.getOutput());
for (String expectedOutputString: expectedOutputStrings) {
output.shouldContain(expectedOutputString);
}
}
public static void testIntConstant() throws Exception {
public static void main (String... args) throws Exception {
System.out.println("Starting TestIntConstant test");
LingeredApp app = null;
try {
List<String> vmArgs = new ArrayList<String>();
vmArgs.addAll(Utils.getVmOptions());
ClhsdbLauncher test = new ClhsdbLauncher();
List<String> vmArgs = new ArrayList<String>(Utils.getVmOptions());
app = LingeredApp.startApp(vmArgs);
System.out.println ("Started LingeredApp with pid " + app.getPid());
List<String> cmds = List.of("intConstant",
"intConstant _temp_constant 45",
"intConstant _temp_constant");
Map<String, List<String>> expStrMap = new HashMap<>();
// Strings to check for in the output of 'intConstant'. The
// 'intConstant' command prints out entries from the
// 'gHotSpotVMIntConstants', which is a table of integer constants,
// with names and the values derived from enums and #define preprocessor
// macros in hotspot.
String[] defaultOutputStrings =
{"CollectedHeap::G1 4",
expStrMap.put("intConstant", List.of(
"CollectedHeap::G1 4",
"RUNNABLE 2",
"Deoptimization::Reason_class_check 4",
"InstanceKlass::_misc_is_unsafe_anonymous 32",
"Generation::ParNew 1",
"_thread_uninitialized 0"};
String[] tempConstantString = {"intConstant _temp_constant 45"};
testClhsdbForIntConstant(app.getPid(), "intConstant", defaultOutputStrings);
testClhsdbForIntConstant(
app.getPid(),
"intConstant _temp_constant 45\nintConstant _temp_constant",
tempConstantString);
} finally {
LingeredApp.stopApp(app);
}
}
public static void main (String... args) throws Exception {
try {
testIntConstant();
} catch (Exception e) {
throw new Error("Test failed with " + e);
"_thread_uninitialized 0"));
expStrMap.put("intConstant _temp_constant", List.of(
"intConstant _temp_constant 45"));
test.run(app.getPid(), cmds, expStrMap, null);
} catch (SkippedException se) {
throw se;
} catch (Exception ex) {
throw new RuntimeException("Test ERROR " + ex, ex);
} finally {
LingeredApp.stopApp(app);
}
System.out.println("Test PASSED");
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2017, 2019, 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
@ -22,19 +22,12 @@
*/
import java.util.ArrayList;
import java.util.Scanner;
import java.util.List;
import java.io.File;
import java.io.IOException;
import java.util.stream.Collectors;
import java.io.OutputStream;
import java.util.Map;
import java.util.HashMap;
import jdk.test.lib.apps.LingeredApp;
import jdk.test.lib.JDKToolLauncher;
import jdk.test.lib.Platform;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.Utils;
import jdk.test.lib.Asserts;
import jtreg.SkippedException;
/**
* @test
@ -47,119 +40,40 @@ import jdk.test.lib.Asserts;
public class TestPrintMdo {
private static final String PRINTMDO_OUT_FILE = "printmdo_out.txt";
private static void verifyPrintMdoOutput() throws Exception {
Exception unexpected = null;
File printMdoFile = new File(PRINTMDO_OUT_FILE);
Asserts.assertTrue(printMdoFile.exists() && printMdoFile.isFile(),
"File with printmdo output not created: " +
printMdoFile.getAbsolutePath());
try {
Scanner scanner = new Scanner(printMdoFile);
String unexpectedMsg =
"One or more of 'VirtualCallData', 'CounterData', " +
"'ReceiverTypeData', 'bci', 'MethodData' " +
"or 'java/lang/Object' not found";
boolean knownClassFound = false;
boolean knownProfileDataTypeFound = false;
boolean knownTokensFound = false;
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
line = line.trim();
System.out.println(line);
if (line.contains("missing reason for ")) {
unexpected = new RuntimeException("Unexpected msg: missing reason for ");
break;
}
if (line.contains("VirtualCallData") ||
line.contains("CounterData") ||
line.contains("ReceiverTypeData")) {
knownProfileDataTypeFound = true;
}
if (line.contains("bci") ||
line.contains("MethodData")) {
knownTokensFound = true;
}
if (line.contains("java/lang/Object")) {
knownClassFound = true;
}
}
if ((knownClassFound == false) ||
(knownTokensFound == false) ||
(knownProfileDataTypeFound == false)) {
unexpected = new RuntimeException(unexpectedMsg);
}
if (unexpected != null) {
throw unexpected;
}
} catch (Exception ex) {
throw new RuntimeException("Test ERROR " + ex, ex);
} finally {
printMdoFile.delete();
}
}
private static void startClhsdbForPrintMdo(long lingeredAppPid) throws Exception {
Process p;
JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("jhsdb");
launcher.addToolArg("clhsdb");
launcher.addToolArg("--pid");
launcher.addToolArg(Long.toString(lingeredAppPid));
ProcessBuilder pb = new ProcessBuilder();
pb.command(launcher.getCommand());
System.out.println(
pb.command().stream().collect(Collectors.joining(" ")));
try {
p = pb.start();
} catch (Exception attachE) {
throw new Error("Couldn't start jhsdb or attach to LingeredApp : " + attachE);
}
// Issue the 'printmdo' input at the clhsdb prompt.
OutputStream input = p.getOutputStream();
String str = "printmdo -a > " + PRINTMDO_OUT_FILE + "\nquit\n";
try {
input.write(str.getBytes());
input.flush();
} catch (IOException ioe) {
throw new Error("Problem issuing the printmdo command: " + str, ioe);
}
OutputAnalyzer output = new OutputAnalyzer(p);
try {
p.waitFor();
} catch (InterruptedException ie) {
p.destroyForcibly();
throw new Error("Problem awaiting the child process: " + ie, ie);
}
output.shouldHaveExitValue(0);
}
public static void main (String... args) throws Exception {
System.out.println("Starting TestPrintMdo test");
LingeredApp app = null;
try {
ClhsdbLauncher test = new ClhsdbLauncher();
List<String> vmArgs = new ArrayList<String>();
vmArgs.add("-XX:+ProfileInterpreter");
vmArgs.addAll(Utils.getVmOptions());
app = LingeredApp.startApp(vmArgs);
System.out.println ("Started LingeredApp with pid " + app.getPid());
startClhsdbForPrintMdo(app.getPid());
verifyPrintMdoOutput();
List<String> cmds = List.of("printmdo -a");
Map<String, List<String>> expStrMap = new HashMap<>();
Map<String, List<String>> unExpStrMap = new HashMap<>();
expStrMap.put("printmdo -a", List.of(
"VirtualCallData",
"CounterData",
"ReceiverTypeData",
"bci",
"MethodData",
"java/lang/Object"));
unExpStrMap.put("printmdo -a", List.of(
"missing reason for "));
test.run(app.getPid(), cmds, expStrMap, unExpStrMap);
} catch (SkippedException se) {
throw se;
} catch (Exception ex) {
throw new RuntimeException("Test ERROR " + ex, ex);
} finally {
LingeredApp.stopApp(app);
}
System.out.println("Test PASSED");
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2017, 2019, 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,14 +23,11 @@
import java.util.ArrayList;
import java.util.List;
import java.io.IOException;
import java.util.stream.Collectors;
import java.io.OutputStream;
import java.util.Map;
import java.util.HashMap;
import jdk.test.lib.apps.LingeredApp;
import jdk.test.lib.JDKToolLauncher;
import jdk.test.lib.Platform;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.Utils;
import jtreg.SkippedException;
/**
* @test
@ -44,84 +41,41 @@ import jdk.test.lib.Utils;
public class TestType {
private static void testClhsdbForType(
long lingeredAppPid,
String commandString,
String[] expectedOutputStrings) throws Exception {
Process p;
JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("jhsdb");
launcher.addToolArg("clhsdb");
launcher.addToolArg("--pid");
launcher.addToolArg(Long.toString(lingeredAppPid));
ProcessBuilder pb = new ProcessBuilder();
pb.command(launcher.getCommand());
System.out.println(
pb.command().stream().collect(Collectors.joining(" ")));
try {
p = pb.start();
} catch (Exception attachE) {
throw new Error("Couldn't start jhsdb or attach to LingeredApp : " + attachE);
}
// Issue the 'type' commands at the clhsdb prompt.
OutputStream input = p.getOutputStream();
try {
input.write((commandString + "\n").getBytes());
input.write("quit\n".getBytes());
input.flush();
} catch (IOException ioe) {
throw new Error("Problem issuing the 'type' command ", ioe);
}
OutputAnalyzer output = new OutputAnalyzer(p);
try {
p.waitFor();
} catch (InterruptedException ie) {
p.destroyForcibly();
throw new Error("Problem awaiting the child process: " + ie);
}
output.shouldHaveExitValue(0);
System.out.println(output.getOutput());
for (String expectedOutputString: expectedOutputStrings) {
output.shouldContain(expectedOutputString);
}
}
public static void main (String... args) throws Exception {
LingeredApp app = null;
System.out.println("Starting TestType test");
LingeredApp app = null;
try {
List<String> vmArgs = new ArrayList<String>();
vmArgs.addAll(Utils.getVmOptions());
ClhsdbLauncher test = new ClhsdbLauncher();
List<String> vmArgs = new ArrayList<String>(Utils.getVmOptions());
app = LingeredApp.startApp(vmArgs);
System.out.println ("Started LingeredApp with pid " + app.getPid());
List<String> cmds = List.of("type", "type InstanceKlass");
Map<String, List<String>> expStrMap = new HashMap<>();
// Strings to check for in the output of 'type'. The 'type'
// command prints out entries from 'gHotSpotVMTypes', which
// is a table containing the hotspot types, their supertypes,
// sizes, etc, which are of interest to the SA.
String[] defaultOutputStrings =
{"type G1CollectedHeap CollectedHeap",
"type ConstantPoolCache MetaspaceObj",
"type ConstantPool Metadata",
"type CompilerThread JavaThread",
"type CardGeneration Generation",
"type ArrayKlass Klass",
"type InstanceKlass Klass"};
expStrMap.put("type", List.of(
"type G1CollectedHeap CollectedHeap",
"type ConstantPoolCache MetaspaceObj",
"type ConstantPool Metadata",
"type CompilerThread JavaThread",
"type CardGeneration Generation",
"type ArrayKlass Klass",
"type InstanceKlass Klass"));
// String to check for in the output of "type InstanceKlass"
String[] instanceKlassOutputString = {"type InstanceKlass Klass"};
app = LingeredApp.startApp(vmArgs);
System.out.println ("Started LingeredApp with pid " + app.getPid());
testClhsdbForType(app.getPid(), "type", defaultOutputStrings);
testClhsdbForType(app.getPid(),
"type InstanceKlass",
instanceKlassOutputString);
expStrMap.put("type InstanceKlass", List.of("type InstanceKlass Klass"));
test.run(app.getPid(), cmds, expStrMap, null);
} catch (SkippedException se) {
throw se;
} catch (Exception ex) {
throw new RuntimeException("Test ERROR " + ex, ex);
} finally {
LingeredApp.stopApp(app);
}
System.out.println("Test PASSED");
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2017, 2019, 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
@ -25,13 +25,10 @@ import sun.hotspot.code.Compiler;
import java.util.ArrayList;
import java.util.List;
import java.io.IOException;
import java.util.stream.Collectors;
import java.io.OutputStream;
import java.util.Map;
import java.util.HashMap;
import jdk.test.lib.apps.LingeredApp;
import jdk.test.lib.JDKToolLauncher;
import jdk.test.lib.Platform;
import jdk.test.lib.process.OutputAnalyzer;
import jtreg.SkippedException;
/**
* @test
@ -62,72 +59,40 @@ public class TestUniverse {
private static void testClhsdbForUniverse(long lingeredAppPid,
String gc) throws Exception {
Process p;
JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("jhsdb");
launcher.addToolArg("clhsdb");
launcher.addToolArg("--pid");
launcher.addToolArg(Long.toString(lingeredAppPid));
ClhsdbLauncher launcher = new ClhsdbLauncher();
List<String> cmds = List.of("universe");
Map<String, List<String>> expStrMap = new HashMap<>();
List<String> expStrings = new ArrayList<String>();
expStrings.add("Heap Parameters");
ProcessBuilder pb = new ProcessBuilder();
pb.command(launcher.getCommand());
System.out.println(
pb.command().stream().collect(Collectors.joining(" ")));
try {
p = pb.start();
} catch (Exception attachE) {
throw new Error("Couldn't start jhsdb or attach to LingeredApp : " + attachE);
}
// Issue the 'universe' command at the clhsdb prompt.
OutputStream input = p.getOutputStream();
try {
input.write("universe\n".getBytes());
input.write("quit\n".getBytes());
input.flush();
} catch (IOException ioe) {
throw new Error("Problem issuing the 'universe' command ", ioe);
}
OutputAnalyzer output = new OutputAnalyzer(p);
try {
p.waitFor();
} catch (InterruptedException ie) {
p.destroyForcibly();
throw new Error("Problem awaiting the child process: " + ie, ie);
}
if (gc.contains("UseZGC")) {
output.shouldContain("ZHeap");
expStrings.add("ZHeap");
}
output.shouldHaveExitValue(0);
System.out.println(output.getOutput());
output.shouldContain("Heap Parameters");
if (gc.contains("G1GC")) {
output.shouldContain("garbage-first heap");
output.shouldContain("region size");
output.shouldContain("G1 Young Generation:");
output.shouldContain("regions =");
expStrings.add("garbage-first heap");
expStrings.add("region size");
expStrings.add("G1 Young Generation:");
expStrings.add("regions =");
}
if (gc.contains("UseConcMarkSweepGC")) {
output.shouldContain("Gen 1: concurrent mark-sweep generation");
expStrings.add("Gen 1: concurrent mark-sweep generation");
}
if (gc.contains("UseSerialGC")) {
output.shouldContain("Gen 1: old");
expStrings.add("Gen 1: old");
}
if (gc.contains("UseParallelGC")) {
output.shouldContain("ParallelScavengeHeap");
output.shouldContain("PSYoungGen");
output.shouldContain("eden");
expStrings.add("ParallelScavengeHeap");
expStrings.add("PSYoungGen");
expStrings.add("eden");
}
if (gc.contains("UseEpsilonGC")) {
output.shouldContain("Epsilon heap");
output.shouldContain("reserved");
output.shouldContain("committed");
output.shouldContain("used");
expStrings.add("Epsilon heap");
expStrings.add("reserved");
expStrings.add("committed");
expStrings.add("used");
}
expStrMap.put("universe", expStrings);
launcher.run(lingeredAppPid, cmds, expStrMap, null);
}
public static void test(String gc) throws Exception {
@ -145,8 +110,8 @@ public class TestUniverse {
}
}
public static void main (String... args) throws Exception {
System.out.println("Starting TestUniverse test");
try {
test("-XX:+UseG1GC");
test("-XX:+UseParallelGC");
@ -158,7 +123,11 @@ public class TestUniverse {
}
test("-XX:+UseEpsilonGC");
}
} catch (SkippedException se) {
throw se;
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
throw new Error("Test failed with " + e);
}
}