From e488bc642c5c8f9a575cd31ad6db0d738baf80be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotrek=20=C5=BBygie=C5=82o?= Date: Sat, 14 Dec 2019 17:50:05 +0100 Subject: [PATCH 1/3] Extract methods to find debug options and test them Fixes #4386 --- .../enterprise/admin/launcher/GFLauncher.java | 45 ++++++------ .../launcher/GFLauncherExtractPortTest.java | 60 ++++++++++++++++ .../GFLauncherExtractSuspendTest.java | 68 +++++++++++++++++++ 3 files changed, 153 insertions(+), 20 deletions(-) create mode 100644 nucleus/admin/launcher/src/test/java/com/sun/enterprise/admin/launcher/GFLauncherExtractPortTest.java create mode 100644 nucleus/admin/launcher/src/test/java/com/sun/enterprise/admin/launcher/GFLauncherExtractSuspendTest.java diff --git a/nucleus/admin/launcher/src/main/java/com/sun/enterprise/admin/launcher/GFLauncher.java b/nucleus/admin/launcher/src/main/java/com/sun/enterprise/admin/launcher/GFLauncher.java index 5d9637232ef..63b063645a0 100644 --- a/nucleus/admin/launcher/src/main/java/com/sun/enterprise/admin/launcher/GFLauncher.java +++ b/nucleus/admin/launcher/src/main/java/com/sun/enterprise/admin/launcher/GFLauncher.java @@ -364,32 +364,37 @@ public final boolean needsManualUpgrade() { private void parseDebug() { // look for an option of this form: // -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9009 + // or + // -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9009 // and extract the suspend and port values for (String opt : debugOptions) { - if (!opt.startsWith("-Xrunjdwp:")) - continue; - String[] attrs = opt.substring(10).split(","); - for (String attr : attrs) { - if (attr.startsWith("address=")) { - try { - debugPort = Integer.parseInt(attr.substring(8)); - } - catch (NumberFormatException ex) { - debugPort = -1; - } - } - if (attr.startsWith("suspend=")) { - try { - debugSuspend = attr.substring(8).equalsIgnoreCase("y"); - } - catch (Exception ex) { - debugSuspend = false; - } - } + if (opt.startsWith("-Xrunjdwp:") || opt.startsWith("-agentlib:jdwp")) { + debugPort = extractDebugPort(opt); + debugSuspend = extractDebugSuspend(opt); } } } + static int extractDebugPort(String option) { + Pattern portRegex = Pattern.compile(".*address=(?\\d*).*"); + Matcher m = portRegex.matcher(option); + if (!m.matches()) { + return -1; + } + try { + String addressGroup = m.group("port"); + return Integer.parseInt(addressGroup); + } catch (NumberFormatException nfex) { + return -1; + } + } + + static boolean extractDebugSuspend(String option) { + Pattern suspendRegex = Pattern.compile(".*suspend=[yY](?:,.*|$)"); + Matcher m = suspendRegex.matcher(option); + return m.matches(); + } + private void setLogFilename(MiniXmlParser parser) { // Check if launching an instance to get appropriate logFilename diff --git a/nucleus/admin/launcher/src/test/java/com/sun/enterprise/admin/launcher/GFLauncherExtractPortTest.java b/nucleus/admin/launcher/src/test/java/com/sun/enterprise/admin/launcher/GFLauncherExtractPortTest.java new file mode 100644 index 00000000000..e1775e1cd09 --- /dev/null +++ b/nucleus/admin/launcher/src/test/java/com/sun/enterprise/admin/launcher/GFLauncherExtractPortTest.java @@ -0,0 +1,60 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2019 Payara Foundation and/or its affiliates. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common Development + * and Distribution License("CDDL") (collectively, the "License"). You + * may not use this file except in compliance with the License. You can + * obtain a copy of the License at + * https://github.com/payara/Payara/blob/master/LICENSE.txt + * See the License for the specific + * language governing permissions and limitations under the License. + * + * When distributing the software, include this License Header Notice in each + * file and include the License file at glassfish/legal/LICENSE.txt. + * + * GPL Classpath Exception: + * The Payara Foundation designates this particular file as subject to the "Classpath" + * exception as provided by the Payara Foundation in the GPL Version 2 section of the License + * file that accompanied this code. + * + * Modifications: + * If applicable, add the following below the License Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyright [year] [name of copyright owner]" + * + * Contributor(s): + * If you wish your version of this file to be governed by only the CDDL or + * only the GPL Version 2, indicate your decision by adding "[Contributor] + * elects to include this software in this distribution under the [CDDL or GPL + * Version 2] license." If you don't indicate a single choice of license, a + * recipient has the option to distribute your version of this file under + * either the CDDL, the GPL Version 2 or to extend the choice of license to + * its licensees as provided above. However, if you add GPL Version 2 code + * and therefore, elected the GPL Version 2 license, then the option applies + * only if the new code is made subject to such option by the copyright + * holder. + */ +package com.sun.enterprise.admin.launcher; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class GFLauncherExtractPortTest { + @Test + public void shouldExtractPortNumberFromDebugOption() { + int port = GFLauncher.extractDebugPort("-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9876"); + + assertEquals(9876, port); + } + + @Test + public void shouldNotFindPortNumberInOption() { + int port = GFLauncher.extractDebugPort("-agentlib:jdwp=transport=dt_socket,server=y,suspend=n"); + + assertEquals(-1, port); + } +} diff --git a/nucleus/admin/launcher/src/test/java/com/sun/enterprise/admin/launcher/GFLauncherExtractSuspendTest.java b/nucleus/admin/launcher/src/test/java/com/sun/enterprise/admin/launcher/GFLauncherExtractSuspendTest.java new file mode 100644 index 00000000000..c87c100ab4e --- /dev/null +++ b/nucleus/admin/launcher/src/test/java/com/sun/enterprise/admin/launcher/GFLauncherExtractSuspendTest.java @@ -0,0 +1,68 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2019 Payara Foundation and/or its affiliates. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common Development + * and Distribution License("CDDL") (collectively, the "License"). You + * may not use this file except in compliance with the License. You can + * obtain a copy of the License at + * https://github.com/payara/Payara/blob/master/LICENSE.txt + * See the License for the specific + * language governing permissions and limitations under the License. + * + * When distributing the software, include this License Header Notice in each + * file and include the License file at glassfish/legal/LICENSE.txt. + * + * GPL Classpath Exception: + * The Payara Foundation designates this particular file as subject to the "Classpath" + * exception as provided by the Payara Foundation in the GPL Version 2 section of the License + * file that accompanied this code. + * + * Modifications: + * If applicable, add the following below the License Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyright [year] [name of copyright owner]" + * + * Contributor(s): + * If you wish your version of this file to be governed by only the CDDL or + * only the GPL Version 2, indicate your decision by adding "[Contributor] + * elects to include this software in this distribution under the [CDDL or GPL + * Version 2] license." If you don't indicate a single choice of license, a + * recipient has the option to distribute your version of this file under + * either the CDDL, the GPL Version 2 or to extend the choice of license to + * its licensees as provided above. However, if you add GPL Version 2 code + * and therefore, elected the GPL Version 2 license, then the option applies + * only if the new code is made subject to such option by the copyright + * holder. + */ +package com.sun.enterprise.admin.launcher; + +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class GFLauncherExtractSuspendTest { + @Test + public void shouldExtractSuspendDebugNOption() { + boolean suspend = GFLauncher.extractDebugSuspend("-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9876"); + + assertFalse(suspend); + } + + @Test + public void shouldExtractSuspendDebugYOption() { + boolean suspend = GFLauncher.extractDebugSuspend("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=9876"); + + assertTrue(suspend); + } + + @Test + public void shouldDefaultToFalseIfNoSuspendOption() { + boolean suspend = GFLauncher.extractDebugSuspend("-agentlib:jdwp=transport=dt_socket,server=y,address=9876"); + + assertFalse(suspend); + } +} From a1a566f77bacd244a83c46c1f0b115c0fc8a3d6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotrek=20=C5=BBygie=C5=82o?= Date: Sat, 14 Dec 2019 21:51:50 +0100 Subject: [PATCH 2/3] Extract predicate method --- .../enterprise/admin/launcher/GFLauncher.java | 6 +- .../launcher/GFLauncherJdwpCheckerTest.java | 74 +++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 nucleus/admin/launcher/src/test/java/com/sun/enterprise/admin/launcher/GFLauncherJdwpCheckerTest.java diff --git a/nucleus/admin/launcher/src/main/java/com/sun/enterprise/admin/launcher/GFLauncher.java b/nucleus/admin/launcher/src/main/java/com/sun/enterprise/admin/launcher/GFLauncher.java index 63b063645a0..41ec3eafbc1 100644 --- a/nucleus/admin/launcher/src/main/java/com/sun/enterprise/admin/launcher/GFLauncher.java +++ b/nucleus/admin/launcher/src/main/java/com/sun/enterprise/admin/launcher/GFLauncher.java @@ -368,13 +368,17 @@ private void parseDebug() { // -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9009 // and extract the suspend and port values for (String opt : debugOptions) { - if (opt.startsWith("-Xrunjdwp:") || opt.startsWith("-agentlib:jdwp")) { + if (isJdwpOption(opt)) { debugPort = extractDebugPort(opt); debugSuspend = extractDebugSuspend(opt); } } } + static boolean isJdwpOption(String option) { + return option.startsWith("-Xrunjdwp:") || option.startsWith("-agentlib:jdwp"); + } + static int extractDebugPort(String option) { Pattern portRegex = Pattern.compile(".*address=(?\\d*).*"); Matcher m = portRegex.matcher(option); diff --git a/nucleus/admin/launcher/src/test/java/com/sun/enterprise/admin/launcher/GFLauncherJdwpCheckerTest.java b/nucleus/admin/launcher/src/test/java/com/sun/enterprise/admin/launcher/GFLauncherJdwpCheckerTest.java new file mode 100644 index 00000000000..db2840decfe --- /dev/null +++ b/nucleus/admin/launcher/src/test/java/com/sun/enterprise/admin/launcher/GFLauncherJdwpCheckerTest.java @@ -0,0 +1,74 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2019 Payara Foundation and/or its affiliates. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common Development + * and Distribution License("CDDL") (collectively, the "License"). You + * may not use this file except in compliance with the License. You can + * obtain a copy of the License at + * https://github.com/payara/Payara/blob/master/LICENSE.txt + * See the License for the specific + * language governing permissions and limitations under the License. + * + * When distributing the software, include this License Header Notice in each + * file and include the License file at glassfish/legal/LICENSE.txt. + * + * GPL Classpath Exception: + * The Payara Foundation designates this particular file as subject to the "Classpath" + * exception as provided by the Payara Foundation in the GPL Version 2 section of the License + * file that accompanied this code. + * + * Modifications: + * If applicable, add the following below the License Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyright [year] [name of copyright owner]" + * + * Contributor(s): + * If you wish your version of this file to be governed by only the CDDL or + * only the GPL Version 2, indicate your decision by adding "[Contributor] + * elects to include this software in this distribution under the [CDDL or GPL + * Version 2] license." If you don't indicate a single choice of license, a + * recipient has the option to distribute your version of this file under + * either the CDDL, the GPL Version 2 or to extend the choice of license to + * its licensees as provided above. However, if you add GPL Version 2 code + * and therefore, elected the GPL Version 2 license, then the option applies + * only if the new code is made subject to such option by the copyright + * holder. + */ +package com.sun.enterprise.admin.launcher; + +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class GFLauncherJdwpCheckerTest { + + // Pre-1.5 java option: + // https://download.oracle.com/otn_hosted_doc/jdeveloper/904preview/jdk14doc/docs/tooldocs/solaris/jdb.html + // still supported in OpenJDK 11 + @Test + public void shouldRecognizeXOption() { + boolean isJdwp = GFLauncher.isJdwpOption("-Xrunjdwp:transport=dt_socket,server=y,suspend=n"); + + assertTrue(isJdwp); + } + + // Since 1.5 java option: + // https://docs.oracle.com/javase/1.5.0/docs/tooldocs/solaris/java.html + @Test + public void shouldRecognizeAgentlibOption() { + boolean isJdwp = GFLauncher.isJdwpOption("-agentlib:jdwp=transport=dt_socket,server=y,suspend=n"); + + assertTrue(isJdwp); + } + + @Test + public void shouldRecognizeAsNonJdwpOption() { + boolean isJdwp = GFLauncher.isJdwpOption("-agentlib:hprof=transport=dt_socket,server=y,suspend=n"); + + assertFalse(isJdwp); + } +} From 285289a9684e5bcd9f3e712076bd5bafe190168e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotrek=20=C5=BBygie=C5=82o?= Date: Sat, 14 Dec 2019 23:59:57 +0100 Subject: [PATCH 3/3] Update (c) year --- .../main/java/com/sun/enterprise/admin/launcher/GFLauncher.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nucleus/admin/launcher/src/main/java/com/sun/enterprise/admin/launcher/GFLauncher.java b/nucleus/admin/launcher/src/main/java/com/sun/enterprise/admin/launcher/GFLauncher.java index 41ec3eafbc1..b937e1770fa 100644 --- a/nucleus/admin/launcher/src/main/java/com/sun/enterprise/admin/launcher/GFLauncher.java +++ b/nucleus/admin/launcher/src/main/java/com/sun/enterprise/admin/launcher/GFLauncher.java @@ -1,7 +1,7 @@ /* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * - * Copyright (c) 2008-2015 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008-2019 Oracle and/or its affiliates. All rights reserved. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common Development