/* * Copyright (c) 2003, 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. */ /* * A Super class for pluggable connectors used by * nsk/jdi/PlugConnectors tests */ package nsk.share.jdi; import com.sun.jdi.*; import com.sun.jdi.connect.*; import java.io.*; import java.util.*; public class PlugConnectors implements Connector { String plugConnectorName = "Undefined_PlugConnector_Name"; String plugConnectorDescription = "Undefined_PlugConnector_Description"; Transport plugConnectorTransport = new PlugConnectorsTransport(); Map plugConnectorDefaultArguments = new HashMap(); /* * Simple implementation of Connector.Argument */ public static class TestArgument implements Connector.Argument { String argName; String argLabel; String argDescription; String argStringValue; boolean argMustSpecify; public TestArgument( String argName, String argLabel, String argDescription, String argValue, boolean argMustSpecify) { this.argName = argName; this.argLabel = argLabel; this.argDescription = argDescription; this.argStringValue = argValue; this.argMustSpecify = argMustSpecify; } public String name() { return argName; } public String label() { return argLabel; } public String description() { return argDescription; } public String value() { return argStringValue; } public void setValue(String argValue) { this.argStringValue = argValue; } public boolean isValid(String argValue) { if ( argValue != null ) { if (argValue.length() > 0) { return true; } } return false; } public boolean mustSpecify() { return argMustSpecify; } } // end of TestArgument static class /* * Simple implementation of Connector.StringArgument */ public static class TestStringArgument extends TestArgument implements Connector.StringArgument { public TestStringArgument( String argName, String argLabel, String argDescription, String argValue, boolean argMustSpecify) { super(argName, argLabel, argDescription, argValue, argMustSpecify); } } // end of TestStringArgument static class /* * Simple implementation of Connector.IntegerArgument */ public static class TestIntegerArgument extends TestArgument implements Connector.IntegerArgument { int argIntValue; int minArgIntValue; int maxArgIntValue; public TestIntegerArgument(String argName, String argLabel, String argDescription, int argValue, int minArgIntValue, int maxArgIntValue, boolean argMustSpecify) { super(argName, argLabel, argDescription, "" + argValue, argMustSpecify); this.argIntValue = argValue; this.minArgIntValue = minArgIntValue; this.maxArgIntValue = maxArgIntValue; } public int intValue() { return argIntValue; } public boolean isValid(int value) { if ( value >= minArgIntValue && value <= maxArgIntValue ) { return true; } return false; } public boolean isValid(String stringValue) { int intValue; try { intValue = Integer.parseInt(stringValue); } catch (NumberFormatException exception) { return false; } return isValid(intValue); } public int max() { return maxArgIntValue; } public int min() { return minArgIntValue; } public void setValue(int value) { argIntValue = value; } public String stringValueOf(int value) { return "" + value; } } // end of TestIntegerArgument static class /* * Simple implementation of Connector.BooleanArgument */ public static class TestBooleanArgument extends TestArgument implements Connector.BooleanArgument { static final String argStringValueTrue = "true"; static final String argStringValueFalse = "false"; boolean argBooleanValue; public TestBooleanArgument(String argName, String argLabel, String argDescription, boolean argValue, boolean argMustSpecify) { super(argName, argLabel, argDescription, argValue ? argStringValueTrue : argStringValueFalse, argMustSpecify); this.argBooleanValue = argValue; } public boolean booleanValue() { return argBooleanValue; } public boolean isValid(String stringValue) { if ( argStringValueTrue.equals(stringValue) || argStringValueFalse.equals(stringValue) ) { return true; } return false; } public void setValue(boolean value) { argBooleanValue = value; } public String stringValueOf(boolean value) { if ( value ) { return argStringValueTrue; } return argStringValueFalse; } } // end of TestBooleanArgument static class /* * Simple implementation of Connector.SelectedArgument */ public static class TestSelectedArgument extends TestArgument implements Connector.SelectedArgument { List acceptableArgsList; public TestSelectedArgument( String argName, String argLabel, String argDescription, String argValue, List acceptableArgsList, boolean argMustSpecify) { super(argName, argLabel, argDescription, argValue, argMustSpecify); this.acceptableArgsList = acceptableArgsList; } public List choices() { return acceptableArgsList; } public boolean isValid(String stringValue) { return acceptableArgsList.contains(stringValue); } } // end of TestSelectedArgument static class public PlugConnectors( String plugConnectorName, String plugConnectorDescription, Transport plugConnectorTransport, Map plugConnectorDefaultArguments ) { this.plugConnectorName = plugConnectorName; this.plugConnectorDescription = plugConnectorDescription; this.plugConnectorTransport = plugConnectorTransport; this.plugConnectorDefaultArguments = plugConnectorDefaultArguments; } public String name() { return plugConnectorName; } public String description() { return plugConnectorDescription; } public Transport transport() { return plugConnectorTransport; } public Map defaultArguments() { return plugConnectorDefaultArguments; } public VirtualMachine launch(Map arguments) throws IOException, IllegalConnectorArgumentsException, VMStartException { String exceptionMessage = "## PlugConnectors: Connector name = '" + plugConnectorName + "';\nNon-authorized call of launch(...) method!"; if ( true ) { throw new RuntimeException(exceptionMessage); } return null; } public VirtualMachine attach(Map arguments) throws java.io.IOException, IllegalConnectorArgumentsException { String exceptionMessage = "## PlugConnectors: Connector name = '" + plugConnectorName + "';\nNon-authorized call of attach(...) method!"; if ( true ) { throw new RuntimeException(exceptionMessage); } return null; } public String startListening(Map arguments) throws java.io.IOException, IllegalConnectorArgumentsException { String exceptionMessage = "## PlugConnectors: Connector name = '" + plugConnectorName + "';\nNon-authorized call of startListening(...) method!"; if ( true ) { throw new RuntimeException(exceptionMessage); } return null; } public void stopListening(Map arguments) throws java.io.IOException, IllegalConnectorArgumentsException { String exceptionMessage = "## PlugConnectors: Connector name = '" + plugConnectorName + "';\nNon-authorized call of stopListening(...) method!"; if ( true ) { throw new RuntimeException(exceptionMessage); } } public VirtualMachine accept(Map arguments) throws java.io.IOException, IllegalConnectorArgumentsException { String exceptionMessage = "## PlugConnectors: Connector name = '" + plugConnectorName + "';\nNon-authorized call of accept(...) method!"; if ( true ) { throw new RuntimeException(exceptionMessage); } return null; } public boolean supportsMultipleConnections() { String exceptionMessage = "## PlugConnectors: Connector name = '" + plugConnectorName + "';\nNon-authorized call of supportsMultipleConnections() method!"; if ( true ) { throw new RuntimeException(exceptionMessage); } return false; } public static class PlugConnectorsTransport implements Transport { String transportName = "Undefined_Transport_Name"; public PlugConnectorsTransport() { } public PlugConnectorsTransport(String transportName) { this.transportName = transportName; } public String name() { return transportName; } } // end of PlugConnectorsTransport class // Auxiliary general purpose methods for pluggable connectors' tests. public static String compareConnectors( String errorLogPrefixHead, String errorLogPrefix, Connector referenceConnector, Connector checkedConnector) { String emptyString = ""; String errorMessage = emptyString; // check that connectors have the same name String referenceConnectorName = referenceConnector.name(); String checkedConnectorName = checkedConnector.name(); if ( ! referenceConnectorName.equals(checkedConnectorName) ) { errorMessage = errorMessage + errorLogPrefixHead + "Checked pluggable Connector has unexpected name:\n" + errorLogPrefix + "Expected Connector's name = '" + referenceConnectorName + "'\n" + errorLogPrefix + "Actual Connector's name = '" + checkedConnectorName + "'\n"; } // check that connectors have the same description String referenceConnectorDescription = referenceConnector.description(); String checkedConnectorDescription = checkedConnector.description(); if ( ! referenceConnectorDescription.equals(checkedConnectorDescription) ) { errorMessage = errorMessage + errorLogPrefixHead + "Checked pluggable Connector has unexpected description:\n" + errorLogPrefix + "Expected Connector's description = '" + referenceConnectorDescription + "'\n" + errorLogPrefix + "Actual Connector's description = '" + checkedConnectorDescription + "'\n"; } // check that connectors have the same transport name String referenceConnectorTransportName = referenceConnector.transport().name(); String checkedConnectorTransportName = checkedConnector.transport().name(); if ( ! referenceConnectorTransportName.equals(checkedConnectorTransportName) ) { errorMessage = errorMessage + errorLogPrefixHead + "Checked pluggable Connector has unexpected transport name:\n" + errorLogPrefix + "Expected Connector's transport name = '" + referenceConnectorTransportName + "'\n" + errorLogPrefix + "Actual Connector's transport name = '" + checkedConnectorTransportName + "'\n"; } // check that connectors have the same number of default arguments int referenceConnectorArgumentsNumber = referenceConnector.defaultArguments().size(); int checkedConnectorArgumentsNumber = checkedConnector.defaultArguments().size(); if ( referenceConnectorArgumentsNumber != checkedConnectorArgumentsNumber ) { errorMessage = errorMessage + errorLogPrefixHead + "Checked pluggable Connector has unexpected number of default arguments:\n" + errorLogPrefix + "Expected number of default arguments = '" + referenceConnectorArgumentsNumber + "'\n" + errorLogPrefix + "Actual number of default arguments = '" + checkedConnectorArgumentsNumber + "'\n"; } return errorMessage; } // end of compareConnectors(...) method public static String compareConnectorArguments( String errorLogPrefixHead, String errorLogPrefix, Connector.Argument referenceArgument, Connector.Argument checkedArgument) { String emptyString = ""; String errorMessage = emptyString; if ( referenceArgument == null ) { errorMessage = errorLogPrefixHead + "Reference connector's argument is null!\n"; } if ( checkedArgument == null ) { errorMessage = errorMessage + errorLogPrefixHead + "Checked connector's argument is null!\n"; } if ( ! errorMessage.equals(emptyString) ) { return errorMessage; } String referenceArgumentName = referenceArgument.name(); String checkedArgumentName = checkedArgument.name(); if ( ! referenceArgumentName.equals(checkedArgumentName) ) { errorMessage = errorLogPrefixHead + "Checked connector's argument has unexpected name:\n" + errorLogPrefix + "Expected connector's argument name = '" + referenceArgumentName + "'\n" + errorLogPrefix + "Actual connector's argument name = '" + checkedArgumentName + "'"; return errorMessage; } String referenceArgumentLabel = referenceArgument.label(); String checkedArgumentLabel = checkedArgument.label(); if ( ! referenceArgumentLabel.equals(checkedArgumentLabel) ) { errorMessage = errorLogPrefixHead + "Checked connector's argument has unexpected label:\n" + errorLogPrefix + "Expected connector's argument label = '" + referenceArgumentLabel + "'\n" + errorLogPrefix + "Actual connector's argument label = '" + checkedArgumentLabel + "'"; return errorMessage; } String referenceArgumentDescription = referenceArgument.description(); String checkedArgumentDescription = checkedArgument.description(); if ( ! referenceArgumentDescription.equals(checkedArgumentDescription) ) { errorMessage = errorLogPrefixHead + "Checked connector's argument has unexpected description:\n" + errorLogPrefix + "Expected connector's argument description = '" + referenceArgumentDescription + "'\n" + errorLogPrefix + "Actual connector's argument description = '" + checkedArgumentDescription + "'"; return errorMessage; } String referenceArgumentValue = referenceArgument.value(); String checkedArgumentValue = checkedArgument.value(); if ( ! referenceArgumentValue.equals(checkedArgumentValue) ) { errorMessage = errorLogPrefixHead + "Checked connector's argument has unexpected value:\n" + errorLogPrefix + "Expected connector's argument value = '" + referenceArgumentValue + "'\n" + errorLogPrefix + "Actual connector's argument value = '" + checkedArgumentValue + "'"; return errorMessage; } boolean referenceArgumentMustSpecify = referenceArgument.mustSpecify(); boolean checkedArgumentMustSpecify = checkedArgument.mustSpecify(); if ( referenceArgumentMustSpecify != checkedArgumentMustSpecify ) { errorMessage = errorLogPrefixHead + "Checked connector's argument has unexpected 'mustSpecify' property:\n" + errorLogPrefix + "Expected connector's argument 'mustSpecify' property = '" + referenceArgumentMustSpecify + "'\n" + errorLogPrefix + "Actual connector's argument 'mustSpecify' property = '" + checkedArgumentMustSpecify + "'"; return errorMessage; } if ( referenceArgument instanceof Connector.IntegerArgument ) { int referenceArgumentMin = ((Connector.IntegerArgument)referenceArgument).min(); int checkedArgumentMin = ((Connector.IntegerArgument)checkedArgument).min(); if ( referenceArgumentMin != checkedArgumentMin ) { errorMessage = errorLogPrefixHead + "Checked connector's integer argument has unexpected min value:\n" + errorLogPrefix + "Expected connector's argument min value = " + referenceArgumentMin + "\n" + errorLogPrefix + "Actual connector's argument min value = " + checkedArgumentMin + "\n"; } int referenceArgumentMax = ((Connector.IntegerArgument)referenceArgument).max(); int checkedArgumentMax = ((Connector.IntegerArgument)checkedArgument).max(); if ( referenceArgumentMax != checkedArgumentMax ) { errorMessage = errorMessage + errorLogPrefixHead + "Checked connector's integer argument has unexpected max value:\n" + errorLogPrefix + "Expected connector's argument max value = " + referenceArgumentMax + "\n" + errorLogPrefix + "Actual connector's argument max value = " + checkedArgumentMax + "\n"; } } if ( referenceArgument instanceof Connector.SelectedArgument ) { List referenceArgumentChoices = ((Connector.SelectedArgument)referenceArgument).choices(); List checkedArgumentChoices = ((Connector.SelectedArgument)checkedArgument).choices(); int referenceArgumentChoicesSize = referenceArgumentChoices.size(); int checkedArgumentChoicesSize = checkedArgumentChoices.size(); if ( referenceArgumentChoicesSize != checkedArgumentChoicesSize) { errorMessage = errorMessage + errorLogPrefixHead + "Checked connector's Selected argument has unexpected choices' size:\n" + errorLogPrefix + "Expected size = '" + referenceArgumentChoicesSize + "'\n" + errorLogPrefix + "Actual size = " + checkedArgumentChoicesSize; return errorMessage; } for (int i=0; i < referenceArgumentChoicesSize; i++) { String referenceArgumentChoice = (String)(referenceArgumentChoices.get(i)); if ( ! checkedArgumentChoices.contains(referenceArgumentChoice) ) { errorMessage = errorMessage + errorLogPrefixHead + "Checked connector's Selected argument has NOT expected choices' element:\n" + errorLogPrefix + "Expected choices' element = '" + referenceArgumentChoice + "'\n"; } String checkedArgumentChoice = (String)(checkedArgumentChoices.get(i)); if ( ! referenceArgumentChoices.contains(checkedArgumentChoice) ) { errorMessage = errorMessage + errorLogPrefixHead + "Checked connector's Selected argument has unexpected choices' element:\n" + errorLogPrefix + "Unexpected choices' element = '" + checkedArgumentChoice + "'\n"; } } } return errorMessage; } // end of compareConnectorArguments(...) method public static Connector.Argument getConnectorDefaultArgument( Connector connector, String argumentName) { Connector.Argument foundArgument = null; Map connectorDefaultArguments = connector.defaultArguments(); Object[] defaultArgumentsArray = connectorDefaultArguments.values().toArray(); for (int i=0; i < defaultArgumentsArray.length; i++) { Connector.Argument connectorArgument = (Connector.Argument)defaultArgumentsArray[i]; if ( argumentName.equals(connectorArgument.name()) ) { foundArgument = connectorArgument; break; } } return foundArgument; } } // end of PlugConnectors class