blob: 3726dea6a3e61af73f599cc8db95b0840769fd34 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2009 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.test.internal.performance;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Status;
import org.eclipse.test.internal.performance.data.Dim;
import org.eclipse.test.internal.performance.db.Variations;
import org.eclipse.test.performance.Dimension;
/**
* @since 3.1
*/
public class PerformanceTestPlugin extends Plugin {
public static final String CONFIG = "config"; //$NON-NLS-1$
public static final String BUILD = "build"; //$NON-NLS-1$
private static final String DEFAULT_DB_NAME = "perfDB"; //$NON-NLS-1$
private static final String DEFAULT_DB_USER = "guest"; //$NON-NLS-1$
private static final String DEFAULT_DB_PASSWORD = "guest"; //$NON-NLS-1$
private static final String DB_NAME = "dbname"; //$NON-NLS-1$
private static final String DB_USER = "dbuser"; //$NON-NLS-1$
private static final String DB_PASSWD = "dbpasswd"; //$NON-NLS-1$
/*
* New properties
*/
private static final String ECLIPSE_PERF_DBLOC = "eclipse.perf.dbloc"; //$NON-NLS-1$
public static final String ECLIPSE_PERF_ASSERTAGAINST = "eclipse.perf.assertAgainst"; //$NON-NLS-1$
private static final String ECLIPSE_PERF_CONFIG = "eclipse.perf.config"; //$NON-NLS-1$
private static final String ECLIPSE_PERF_DEFAULT_DIM = "eclipse.perf.default.dim"; //$NON-NLS-1$
private static final String ECLIPSE_PERF_RESULTS_DIMENSIONS = "eclipse.perf.results.dimensions"; //$NON-NLS-1$
private static final String ECLIPSE_PERF_CONFIGS_DESCRIPTOR = "eclipse.perf.configs.descriptor"; //$NON-NLS-1$
/**
* Supported dimensions.
* <p>
* Currently all the dimensions accessible through this interface:
* <ul>
* <li>{@link Dimension#KERNEL_TIME}</li>
* <li>{@link Dimension#CPU_TIME}</li>
* <li>{@link Dimension#WORKING_SET}</li>
* <li>{@link Dimension#ELAPSED_PROCESS}</li>
* <li>{@link Dimension#USED_JAVA_HEAP}</li>
* <li>{@link Dimension#WORKING_SET_PEAK}</li>
* <li>{@link Dimension#KERNEL_TIME}</li>
* </ul>
* </p>
*/
private static final Dim[] SUPPORTED_DIMENSIONS = { InternalDimensions.KERNEL_TIME, InternalDimensions.CPU_TIME, InternalDimensions.WORKING_SET, InternalDimensions.ELAPSED_PROCESS, InternalDimensions.USED_JAVA_HEAP,
InternalDimensions.WORKING_SET_PEAK, InternalDimensions.COMITTED, };
/**
* Identifiers of the supported dimensions.
*/
private static final int[] SUPPORTED_DIMENSIONS_ID = new int[SUPPORTED_DIMENSIONS.length];
static {
int length = SUPPORTED_DIMENSIONS.length;
for (int i = 0; i < length; i++) {
SUPPORTED_DIMENSIONS_ID[i] = SUPPORTED_DIMENSIONS[i].getId();
}
}
/**
* Default machines names.
*/
private static final String DEFAULT_CONFIG_DESCRIPTORS = ""; //$NON-NLS-1$
/**
* Default dimension use for performance results.
*/
private static final Dim DEFAULT_DIMENSION = InternalDimensions.ELAPSED_PROCESS;
/**
* The dimensions which are put in the generated performance results pages.
*/
private static final Dim[] DEFAULT_RESULTS_DIMENSIONS = { InternalDimensions.ELAPSED_PROCESS, InternalDimensions.CPU_TIME, };
/**
* The plug-in ID
*/
public static final String PLUGIN_ID = "org.eclipse.test.performance"; //$NON-NLS-1$
/** Status code describing an internal error */
public static final int INTERNAL_ERROR = 1;
/**
* The shared instance.
*/
private static PerformanceTestPlugin fgPlugin;
/**
* The constructor.
*/
public PerformanceTestPlugin() {
super();
fgPlugin = this;
}
/*
* Returns the shared instance.
*/
public static PerformanceTestPlugin getDefault() {
return fgPlugin;
}
/*
* -Declipse.perf.dbloc=net://localhost
*/
public static String getDBLocation() {
String dbloc = System.getProperty(ECLIPSE_PERF_DBLOC);
if (dbloc != null) {
logInfo("System property " + ECLIPSE_PERF_DBLOC + " found to equal " + dbloc + " in getDBLocation"); //$NON-NLS-1$ //$NON-NLS-2$
Variations keys = new Variations();
keys.parsePairs(ECLIPSE_PERF_DBLOC + '=' + dbloc);
return keys.getProperty(ECLIPSE_PERF_DBLOC);
}
return null;
}
public static String getDBName() {
String dbloc = System.getProperty(ECLIPSE_PERF_DBLOC);
if (dbloc != null) {
logInfo("System property " + ECLIPSE_PERF_DBLOC + " found to equal " + dbloc + " in getDBName"); //$NON-NLS-1$ //$NON-NLS-2$
Variations keys = new Variations();
keys.parsePairs(ECLIPSE_PERF_DBLOC + '=' + dbloc);
return keys.getProperty(DB_NAME, DEFAULT_DB_NAME);
}
return DEFAULT_DB_NAME;
}
public static String getDBUser() {
String dbloc = System.getProperty(ECLIPSE_PERF_DBLOC);
if (dbloc != null) {
logInfo("System property " + ECLIPSE_PERF_DBLOC + " found to equal " + dbloc + " in getDBUser"); //$NON-NLS-1$ //$NON-NLS-2$
Variations keys = new Variations();
keys.parsePairs(ECLIPSE_PERF_DBLOC + '=' + dbloc);
return keys.getProperty(DB_USER, DEFAULT_DB_USER);
}
return DEFAULT_DB_USER;
}
/**
* Returns the default dimension used for performance results.
*
* @return The default {@link Dimension} or <code>null</code> if the specified default dimension does not match any known
* dimensions name.
*/
public static Dimension getDefaultDimension() {
String defaultDim = System.getProperty(ECLIPSE_PERF_DEFAULT_DIM);
if (defaultDim == null)
return DEFAULT_DIMENSION;
Dimension dimension = getDimension(defaultDim);
Assert.isNotNull(dimension, "Invalid default dimension found in system property '" + ECLIPSE_PERF_DEFAULT_DIM + "': " + defaultDim); //$NON-NLS-1$ //$NON-NLS-2$
return dimension;
}
/**
* Returns the dimensions displayed in the performance results.
*
* @return The list of {@link Dimension} which will be displayed in the generated results data pages.
*/
public static Dimension[] getResultsDimensions() {
String resultsDimension = System.getProperty(ECLIPSE_PERF_RESULTS_DIMENSIONS);
if (resultsDimension == null)
return DEFAULT_RESULTS_DIMENSIONS;
StringTokenizer tokenizer = new StringTokenizer(resultsDimension, ","); //$NON-NLS-1$
List<Dimension> list = new ArrayList<>();
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken().trim();
Dimension dimension = getDimension(token);
if (dimension == null) {
try {
dimension = getDimension(Integer.parseInt(token));
} catch (NumberFormatException e) {
// skip
}
if (dimension == null) {
System.err.println("Skip invalid results dimension found in system property '" + ECLIPSE_PERF_RESULTS_DIMENSIONS + "': " + resultsDimension); //$NON-NLS-1$ //$NON-NLS-2$
continue;
}
}
list.add(dimension);
}
int size = list.size();
if (size == 0) {
System.err.println("No valid dimension was found in system property '" + ECLIPSE_PERF_RESULTS_DIMENSIONS + "'!"); //$NON-NLS-1$ //$NON-NLS-2$
System.err.println("=> default results dimensions will be used instead!"); //$NON-NLS-1$
return DEFAULT_RESULTS_DIMENSIONS;
}
Dimension[] dimensions = new Dimension[size];
list.toArray(dimensions);
return dimensions;
}
/**
* Returns the names of the dimensions which may be used in the performance results.
*
* @return The list of the dimension names
*/
public static List<String> getDimensions() {
List<String> dimensions = new ArrayList<>();
for (Dim element : SUPPORTED_DIMENSIONS) {
dimensions.add(element.getName());
}
return dimensions;
}
/**
* Return the dimension corresponding to the given id.
*
* @param id
* The id of the searched dimension.
* @return The {@link Dimension} or <code>null</code> if none is found.
*/
public static Dimension getDimension(int id) {
int length = SUPPORTED_DIMENSIONS.length;
for (int i = 0; i < length; i++) {
if (SUPPORTED_DIMENSIONS[i].getId() == id) {
return SUPPORTED_DIMENSIONS[i];
}
}
return null;
}
/**
* Return the dimension corresponding to the given id.
*
* @param name
* The name of the searched dimension.
* @return The {@link Dimension} or <code>null</code> if none is found.
*/
public static Dimension getDimension(String name) {
int length = SUPPORTED_DIMENSIONS.length;
for (int i = 0; i < length; i++) {
if (SUPPORTED_DIMENSIONS[i].getName().equals(name)) {
return SUPPORTED_DIMENSIONS[i];
}
}
return null;
}
/**
* Return the descriptors of the configurations used for the performances.
*
* @return An array of 2 strings, the former is the name of the configuration and the latter its description.
*/
public static String[][] getConfigDescriptors() {
String descriptors = System.getProperty(ECLIPSE_PERF_CONFIGS_DESCRIPTOR, DEFAULT_CONFIG_DESCRIPTORS);
StringTokenizer tokenizer = new StringTokenizer(descriptors, ",;"); //$NON-NLS-1$
List<String[]> list = new ArrayList<>();
while (tokenizer.hasMoreTokens()) {
String[] config = new String[2];
config[0] = tokenizer.nextToken().trim(); // config name
config[1] = tokenizer.nextToken().trim(); // config description
list.add(config);
}
String[][] configDescriptors = new String[list.size()][];
list.toArray(configDescriptors);
return configDescriptors;
}
public static String getDBPassword() {
String dbloc = System.getProperty(ECLIPSE_PERF_DBLOC);
if (dbloc != null) {
logInfo("System property " + ECLIPSE_PERF_DBLOC + " found to equal " + dbloc + " in getDBPassword"); //$NON-NLS-1$ //$NON-NLS-2$
Variations keys = new Variations();
keys.parsePairs(ECLIPSE_PERF_DBLOC + '=' + dbloc);
return keys.getProperty(DB_PASSWD, DEFAULT_DB_PASSWORD);
}
return DEFAULT_DB_PASSWORD;
}
/*
* -Declipse.perf.config=<varname1>=<varval1>;<varname2>=<varval2>;...;<varnameN>=<varvalN>
*/
public static Variations getVariations() {
Variations keys = new Variations();
String configKey = System.getProperty(ECLIPSE_PERF_CONFIG);
if (configKey != null)
keys.parsePairs(configKey);
return keys;
}
/*
* -Declipse.perf.assertAgainst=<varname1>=<varval1>;<varname2>=<varval2>;...;<varnameN>=<varvalN> Returns null if assertAgainst
* property isn't defined.
*/
public static Variations getAssertAgainst() {
String assertKey = System.getProperty(ECLIPSE_PERF_ASSERTAGAINST);
if (assertKey != null) {
Variations keys = getVariations();
if (keys == null)
keys = new Variations();
keys.parsePairs(assertKey);
return keys;
}
return null;
}
// logging
public static void logError(String message) {
if (message == null)
message = ""; //$NON-NLS-1$
log(new Status(IStatus.ERROR, PLUGIN_ID, INTERNAL_ERROR, message, null));
}
public static void logWarning(String message) {
if (message == null)
message = ""; //$NON-NLS-1$
log(new Status(IStatus.WARNING, PLUGIN_ID, IStatus.OK, message, null));
}
public static void logInfo(String message) {
if (message == null)
message = ""; //$NON-NLS-1$
log(new Status(IStatus.INFO, PLUGIN_ID, IStatus.OK, message, null));
}
public static void log(Throwable e) {
log(new Status(IStatus.ERROR, PLUGIN_ID, INTERNAL_ERROR, "Internal Error", e)); //$NON-NLS-1$
}
public static void log(IStatus status) {
if (fgPlugin != null) {
fgPlugin.getLog().log(status);
} else {
switch (status.getSeverity()) {
case IStatus.ERROR:
System.err.println("Error: " + status.getMessage()); //$NON-NLS-1$
break;
case IStatus.WARNING:
System.err.println("Warning: " + status.getMessage()); //$NON-NLS-1$
break;
default:
break;
}
Throwable exception = status.getException();
if (exception != null)
exception.printStackTrace(System.err);
}
}
}