blob: 9b84eff4ff19bf913220c8b585ed873defd2e490 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.payara.tooling;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.logging.Level;
import java.util.regex.Pattern;
import org.netbeans.modules.payara.tooling.admin.CommandRestoreDomain;
import org.netbeans.modules.payara.tooling.admin.ResultString;
import org.netbeans.modules.payara.tooling.admin.ServerAdmin;
import org.netbeans.modules.payara.tooling.data.PayaraAdminInterface;
import org.netbeans.modules.payara.tooling.data.PayaraServer;
import org.netbeans.modules.payara.tooling.data.PayaraServerEntity;
import org.netbeans.modules.payara.tooling.data.PayaraVersion;
import org.netbeans.modules.payara.tooling.logging.Logger;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.fail;
/**
* Common Payara IDE SDK test.
* <p>
* @author Tomas Kraus, Peter Benedikovic
*/
public abstract class CommonTest {
////////////////////////////////////////////////////////////////////////////
// Class attributes //
////////////////////////////////////////////////////////////////////////////
/** Logger instance for this class. */
private static final Logger LOGGER = new Logger(CommonTest.class);
/** Payara test server name property. */
public static final String PFPROP_NAME = "name";
/** Payara test server host property. */
public static final String PFPROP_HOST = "host";
/** Payara test server port property. */
public static final String PFPROP_PORT = "port";
/** Payara test server admin port property. */
public static final String PFPROP_ADMIN_PORT = "adminPort";
/** Payara test server admin user property. */
public static final String PFPROP_ADMIN_USER = "adminUser";
/** Payara test server admin password property. */
public static final String PFPROP_ADMIN_PASSWORD = "adminPassword";
/** Payara test server domains folder property. */
public static final String PFPROP_DOMAINS_FOLDER = "domainsFolder";
/** Payara test server domain name property. */
public static final String PFPROP_DOMAIN_NAME = "domainName";
/** Payara test server url property. */
public static final String PFPROP_URL = "url";
/** Payara test server version property. */
public static final String PFPROP_VERSION = "version";
/** Payara test server administration interface property. */
public static final String PFPROP_ADMIN_INTERFACE = "adminInterface";
/** Payara test server server home property. */
public static final String PFPROP_HOME = "serverHome";
/** Payara test server server JVM command line arguments. */
public static final String PFPROP_JAVA_ARGS = "javaArgs";
/** Payara test server server bootstrap jar command line arguments. */
public static final String PFPROP_PAYARA_ARGS = "payaraArgs";
/** Test JDK Java home property. */
public static final String JDKPROP_HOME = "javaHome";
/** Test JDK property file. */
private static final String JDK_PROPERTES =
"src/test/java/org/netbeans/modules/payara/tooling/Java.properties";
/** Backup domain property. */
public static final String BACKUP_DOMAIN = "backupDomain";
/** Test JDK properties. */
private static volatile Properties jdkProperties;
/** Name of static method to retrieve Payara test server properties.*/
private static final String PAYARA_PROPERTES_METHOD
= "getPayaraProperty";
/** Payara test server property file. */
private static final String PAYARA_PROPERTES
= "src/test/java/org/netbeans/modules/payara/tooling/Payara.properties";
/** Regex expression to find Payara log message informing about
* basic startup.
* <p/>
* Example: Payara Server Open Source Edition 3.1.2 (23) startup time :
* Felix (2,201ms), startup services(4,351ms), total(6,552ms) */
private static final String STARTED_MESSAGE_REGEX
= ".*Server.*startup time.*";
/** Regex expression to find Payara log message informing about
* server shutdown.
* <p/>
* Example: Server shutdown initiated */
private static final String SHUTDOWN_MESSAGE_REGEX
= ".*Server shutdown initiated.*";
/** Pattern to find Payara log message informing about basic startup. */
protected static final Pattern STARTED_MESSAGE_PATTERN
= Pattern.compile(STARTED_MESSAGE_REGEX);
/** Pattern to find Payara log message informing about server shutdown.
*/
protected static final Pattern SHUTDOWN_MESSAGE_PATTERN
= Pattern.compile(SHUTDOWN_MESSAGE_REGEX);
/** Payara test server object. */
private static volatile PayaraServer payaraServer;
////////////////////////////////////////////////////////////////////////////
// Static methods //
////////////////////////////////////////////////////////////////////////////
/**
* Retrieve integer value stored as property.
* <p/>
* @param properties <code>Properties</code> container.
* @param propertyName Name of property to be retrieved.
* @return <code>int</code> value of property or <code>-1</code> if value
* could not be converted.
*/
private static int intProperty(Properties properties, String propertyName) {
final String METHOD = "intProperty";
String propertyString = properties.getProperty(propertyName);
int propertyValue;
if (propertyString == null) {
propertyValue = -1;
LOGGER.log(Level.WARNING, METHOD, "undefined", propertyName);
}
else {
try {
propertyValue = Integer.parseInt(propertyString);
} catch (NumberFormatException nfe) {
Logger.log(Level.WARNING,
"Cannot set " + propertyName + " property", nfe);
propertyValue = -1;
}
}
return propertyValue;
}
/**
* Get test JDK properties.
* <p>
* @return Test JDK properties.
*/
public static Properties jdkProperties() {
if (jdkProperties != null) {
return jdkProperties;
}
else {
synchronized(CommonTest.class) {
if (jdkProperties == null) {
jdkProperties = readProperties(JDK_PROPERTES);
}
}
return jdkProperties;
}
}
/**
* Get JDK property for tests.
* <p/>
* If the key is not found in this property list, the default property list,
* and its defaults, recursively, are then checked. The method returns
* <code>null</code> if the property is not found.
* <p/>
* @param key Property key.
* @return Value in JDK property list with the specified key value.
*/
public static String getJdkProperty(String key) {
return jdkProperties().getProperty(key);
}
/**
* Read properties from file. <p>
*
* @param propertiesFile Properties file.
* @return Payara test server properties.
*/
public static Properties readProperties(String propertiesFile) {
Properties properties = new Properties();
try {
properties.load(new FileInputStream(propertiesFile));
} catch (IOException ioe) {
Logger.log(Level.WARNING,
"Cannot read " + propertiesFile + " file", ioe);
}
return properties;
}
/**
* Get Payara test server properties from provided super class invoking
* it's <code>getPayaraProperty(String key)</code> static method.
* <p/>
* @param pClass Super class containing
* <code>getPayaraProperty(String key)</code> static method
* to be invoked.
* @param pMeth <code>getPayaraProperty(String key)</code> method already
* retrieved from super class object.
* @param key Property key.
* @return Value returned by super class
* <code>getPayaraProperty(String key)</code> method.
*/
private static String getPayaraProperty(
Class <? extends CommonTest> pClass, Method pMeth, String key) {
try {
return (String)pMeth.invoke(pClass, key);
} catch (IllegalAccessException | IllegalArgumentException
| InvocationTargetException iae) {
Logger.log(Level.WARNING, "Getting Payara property failed: ",
iae);
return null;
}
}
/**
* Get Payara test server properties from provided super class invoking
* it's <code>getPayaraProperty(String key)</code> static method
* and convert it to positive integer value if possible.
* <p/>
* @param pClass Super class containing
* <code>getPayaraProperty(String key)</code> static method
* to be invoked.
* @param pMeth <code>getPayaraProperty(String key)</code> method already
* retrieved from super class object.
* @param key Property key.
* @return Value returned by super class
* <code>getPayaraProperty(String key)</code> method converted
* to positive integer value or <code>-1</code> if value
* could not be converted or retrieved.
*/
private static int intPayaraProperty(Class <? extends CommonTest> pClass,
Method propertyMethod, String key) {
final String METHOD = "intPayaraProperty";
String propertyString = getPayaraProperty(pClass, propertyMethod,
key);
int propertyValue;
if (propertyString == null) {
propertyValue = -1;
LOGGER.log(Level.WARNING, METHOD, "undefined", key);
}
else {
try {
propertyValue = Integer.parseInt(propertyString);
} catch (NumberFormatException nfe) {
LOGGER.log(Level.WARNING, METHOD, "cantSet", key);
LOGGER.log(Level.WARNING, METHOD, "numberFormat", nfe);
propertyValue = -1;
}
}
return propertyValue;
}
/**
* Constructs <code>PayaraServer</code> object using Payara
* test server properties
* <p/>
* @param properties
* @return <code>PayaraServer</code> object initialized with Payara
* test server properties values.
*/
public static PayaraServer createPayaraServer(
Class <? extends CommonTest> pClass) {
final String METHOD = "createPayaraServer";
Method pMeth;
try {
pMeth = pClass.getMethod(PAYARA_PROPERTES_METHOD, String.class);
} catch (NoSuchMethodException | SecurityException nme) {
LOGGER.log(Level.WARNING, METHOD, "accessorFailed", nme);
return null;
}
PayaraServerEntity server = new PayaraServerEntity();
server.setName(getPayaraProperty(pClass, pMeth, PFPROP_NAME));
server.setHost(getPayaraProperty(pClass, pMeth, PFPROP_HOST));
server.setAdminUser(getPayaraProperty(pClass, pMeth,
PFPROP_ADMIN_USER));
server.setAdminPassword(getPayaraProperty(pClass, pMeth,
PFPROP_ADMIN_PASSWORD));
server.setDomainsFolder(getPayaraProperty(pClass, pMeth,
PFPROP_DOMAINS_FOLDER));
server.setDomainName(getPayaraProperty(pClass, pMeth,
PFPROP_DOMAIN_NAME));
server.setServerHome(getPayaraProperty(pClass, pMeth, PFPROP_HOME));
server.setUrl(getPayaraProperty(pClass, pMeth, PFPROP_URL));
server.setPort(intPayaraProperty(pClass, pMeth, PFPROP_PORT));
server.setAdminPort(intPayaraProperty(pClass, pMeth,
PFPROP_ADMIN_PORT));
PayaraVersion version = PayaraVersion.toValue(
getPayaraProperty(pClass, pMeth, PFPROP_VERSION));
if (version == null) {
LOGGER.log(Level.WARNING, METHOD, "unknownVersion", PFPROP_ADMIN_PORT);
}
server.setVersion(version);
PayaraAdminInterface adminInterface =
PayaraAdminInterface.toValue(
getPayaraProperty(pClass, pMeth, PFPROP_ADMIN_INTERFACE));
if (adminInterface == null) {
LOGGER.log(Level.WARNING, METHOD,
"unknownAdminInterface", PFPROP_ADMIN_INTERFACE);
}
server.setAdminInterface(adminInterface);
return server;
}
/**
* Constructs <code>PayaraServer</code> object using Payara
* test server properties
* <p/>
* @param properties
* @return <code>PayaraServer</code> object initialized with Payara
* test server properties values.
*/
public static PayaraServer createPayaraServer() {
return CommonTest.createPayaraServer(CommonTest.class);
}
/**
* Get Payara test server object with common values.
* <p>
* @return Payara test server object with common values.
*/
protected static PayaraServer payaraServer() {
if (payaraServer != null) {
return payaraServer;
}
else {
synchronized(CommonTest.class) {
if (payaraServer == null) {
payaraServer = createPayaraServer();
}
}
return payaraServer;
}
}
public static void restoreDomain(PayaraServer server, String backupFile) {
File domainBackupFile = new File(backupFile);
if (!domainBackupFile.exists() || !domainBackupFile.isFile()) {
throw new IllegalArgumentException("Wrong configuration of backup archive");
}
CommandRestoreDomain command = new CommandRestoreDomain(getJdkProperty(
JDKPROP_HOME), domainBackupFile);
try {
Future<ResultString> future = ServerAdmin.<ResultString>exec(
server, command);
try {
ResultString result = future.get(120, TimeUnit.SECONDS);
assertEquals(result.getState(), TaskState.COMPLETED);
} catch (InterruptedException ex) {
fail("restore domain interrupted", ex);
} catch (ExecutionException ex) {
fail("restore domain failed", ex);
} catch (TimeoutException ex) {
fail("restore domain timeout", ex);
}
} catch (PayaraIdeException e) {
fail("restore domain failed", e);
}
}
}