/* * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2024, Red Hat Inc. * 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. */ /* * @test * @bug 8332124 * @summary Test to verify jcmd accepts the "-help", "--help" and "-h" suboptions as a command argument * @library /test/lib * @modules java.base/jdk.internal.misc * java.management * @run main/othervm TestJcmdSubcommandHelp * */ import jdk.test.lib.process.OutputAnalyzer; public class TestJcmdSubcommandHelp { private static final String HELP_ONE_DASH = "-help"; private static final String HELP_TWO_DASH = "--help"; private static final String SINGLE_H = "-h"; private static final String CMD = "VM.metaspace"; private static final String ILLEGAL = "IllegalArgumentException: Unknown argument"; public static void main(String[] args) throws Exception { // Sanity check with empty input OutputAnalyzer output = JcmdBase.jcmd(); output.shouldContain("The following commands are available:"); // Sanity check with existing usage for "help " output = JcmdBase.jcmd("help", CMD); String expectedOutput = output.getOutput(); output.shouldNotContain("Unknown diagnostic command"); testExpectedUsage(HELP_ONE_DASH, expectedOutput); testExpectedUsage(HELP_TWO_DASH, expectedOutput); testExpectedUsage(SINGLE_H, expectedOutput); testIgnoreAdditionalArgs(HELP_ONE_DASH, expectedOutput); testIgnoreAdditionalArgs(HELP_TWO_DASH, expectedOutput); testIgnoreAdditionalArgs(SINGLE_H, expectedOutput); testIgnoreTrailingSpaces(HELP_ONE_DASH, expectedOutput); testIgnoreTrailingSpaces(HELP_TWO_DASH, expectedOutput); testIgnoreTrailingSpaces(SINGLE_H, expectedOutput); testSimilarCommand(HELP_ONE_DASH + "less", ILLEGAL); testSimilarCommand(HELP_TWO_DASH + "me", ILLEGAL); testSimilarCommand(SINGLE_H + "ello", ILLEGAL); } private static void testExpectedUsage(String helpOption, String expectedOutput) throws Exception { verifyOutput(new String[] {CMD, helpOption}, expectedOutput, "Expected jcmd to accept '%s' suboption as a command argument and issue the same help output.".formatted(helpOption)); } private static void testIgnoreAdditionalArgs(String helpOption, String expectedOutput) throws Exception { verifyOutput(new String[] {CMD, helpOption, "basic"}, expectedOutput, "Expected jcmd to accept '%s' suboption with additional arguments after help.".formatted(helpOption)); } private static void testIgnoreTrailingSpaces(String helpOption, String expectedOutput) throws Exception { verifyOutput(new String[] {CMD, "%s ".formatted(helpOption)}, expectedOutput, "Expected jcmd to accept '%s' suboption with trailing spaces".formatted(helpOption)); } private static void testSimilarCommand(String helpOption, String expectedOutput) throws Exception { verifyOutputContains(new String[] {CMD, helpOption}, expectedOutput, "Expected jcmd to NOT accept '%s' suboption with trailing content".formatted(helpOption)); } private static void verifyOutputContains(String[] args, String expectedOutput, String errorMessage) throws Exception { OutputAnalyzer output = JcmdBase.jcmd(args); String issuedOutput = output.getOutput(); if (!issuedOutput.contains(expectedOutput)) { printDifferingOutputs(expectedOutput, issuedOutput); throw new Exception(errorMessage); } } private static void verifyOutput(String[] args, String expectedOutput, String errorMessage) throws Exception { OutputAnalyzer output = JcmdBase.jcmd(args); String issuedOutput = output.getOutput(); if (!expectedOutput.equals(issuedOutput)) { printDifferingOutputs(expectedOutput, issuedOutput); throw new Exception(errorMessage); } } private static void printDifferingOutputs(String expectedOutput, String issuedOutput) { System.out.println("Expected output: "); System.out.println(expectedOutput); System.out.println("Issued output: "); System.out.println(issuedOutput); } }