blob: da985998cf8696ba2f514322c5fa81cc045cd774 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Oracle - initial API and implementation from Oracle TopLink
******************************************************************************/
package org.eclipse.persistence.testing.framework.junit;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.eclipse.persistence.config.PersistenceUnitProperties;
public class JUnitTestCaseHelper {
public static final String DB = "db";
public static final String DB_DRIVER_KEY = "db.driver";
public static final String DB_URL_KEY = "db.url";
public static final String DB_USER_KEY = "db.user";
public static final String DB_PWD_KEY = "db.pwd";
public static final String DB_PLATFORM_KEY = "db.platform";
public static final String LOGGING_LEVEL_KEY = "eclipselink.logging.level";
public static final String TEST_PROPERTIES_FILE_KEY = "test.properties";
public static final String TEST_PROPERTIES_FILE_DEFAULT = "test.properties";
public static Map propertiesMap = null;
public static Map persistencePropertiesTestMap = new HashMap();
public static Properties propertiesFromFile = null;
// Maps puName to properties
// "composite-advanced" -> Map,
// "xml-composite-advanced" -> Map
public static Map<String, Map> puPropertiesMap = new HashMap();
// Maps dbIndex to properties
// "2" -> Map,
// "3" -> Map
public static Map<String, Map> dbPropertiesMap = new HashMap();
/**
* If this property is set to "true" either in System properties or property file then
* db properties corresponding to dbIndex that was not found will be substituted for default properties.
* If ALL of the properties db2.user, db2.pwd, db2.url, db2.driver, db2.platform are not found
* then they are overridden with default properties (produced by getDatabaseProperties());
* If ALL of the properties db3.user, db3.pwd, db3.url, db3.driver, db3.platform are not found
* then they are overridden with default properties (produced by getDatabaseProperties());
* Setting the property to "true" allows to run session test on a single data base (it will be used by all member sessions).
**/
public static final String SINGLE_DB = "single.db";
public static Boolean shouldUseSingleDb;
static {
// These following properties used for property processing testing.
// Some (or all) of them may override persistence properties.
// Used by EntityManagerJUnitTestSuite.testPersistenceProperties()
persistencePropertiesTestMap.put(PersistenceUnitProperties.JDBC_READ_CONNECTIONS_SHARED, "false");
persistencePropertiesTestMap.put(PersistenceUnitProperties.JDBC_WRITE_CONNECTIONS_INITIAL, "0");
persistencePropertiesTestMap.put(PersistenceUnitProperties.JDBC_WRITE_CONNECTIONS_MIN, "4");
persistencePropertiesTestMap.put(PersistenceUnitProperties.JDBC_WRITE_CONNECTIONS_MAX, "9");
persistencePropertiesTestMap.put(PersistenceUnitProperties.JDBC_READ_CONNECTIONS_MIN, "4");
persistencePropertiesTestMap.put(PersistenceUnitProperties.JDBC_READ_CONNECTIONS_MAX, "4");
persistencePropertiesTestMap.put(PersistenceUnitProperties.BATCH_WRITING_SIZE, "150");
//persistencePropertiesTestMap.put(PersistenceUnitProperties.BATCH_WRITING, "ExaLogic");
//persistencePropertiesTestMap.put(PersistenceUnitProperties.PROFILER, "oracle.toplink.exalogic.tuning.TuningAgent");
}
/**
* Get common properties (including database properties) from System, for unavailable ones, read from test.properties file.
* The location of properties file can be given by system property <tt>test.properties</tt>.
* The default location is "test.properties" file in current directory.
*/
public static Map<String, String> getDatabaseProperties() {
if (propertiesMap == null) {
propertiesMap = createDatabaseProperties(null);
propertiesMap.putAll(persistencePropertiesTestMap);
}
return propertiesMap;
}
public static Map<String, String> getDatabaseProperties(String puName) {
Map puProperties = null;
if (puName != null && puName.length() > 0) {
puProperties = puPropertiesMap.get(puName);
if (puProperties == null) {
if (puName.equals("composite-advanced") || puName.equals("xml-composite-advanced") || puName.equals("xml-extended-composite-advanced")) {
String prefix = puName;
if (puName.equals("xml-extended-composite-advanced")) {
prefix = "xml-composite-advanced";
}
String[] sessions = {"member_1", "member_2", "member_3"};
for(int i=0; i < sessions.length; i++) {
sessions[i] = prefix + "-" + sessions[i];
}
puProperties = createCompositeProperties(sessions);
}
if (puProperties != null) {
puPropertiesMap.put(puName, puProperties);
}
}
}
if (puProperties != null) {
return puProperties;
} else {
return getDatabaseProperties();
}
}
// No index corresponds to db.user, db.pwd,...
// index = 2 -> db2.user, db2.pwd,... etc
static Map<String, String> createDatabaseProperties(String dbIndex) {
boolean addLoggingLevel = dbIndex == null || dbIndex.length() == 0;
String db_driver_key = insertIndex(DB_DRIVER_KEY, dbIndex);
String db_url_key = insertIndex(DB_URL_KEY, dbIndex);
String db_user_key = insertIndex(DB_USER_KEY, dbIndex);
String db_pwd_key = insertIndex(DB_PWD_KEY, dbIndex);
String db_platform_key = insertIndex(DB_PLATFORM_KEY, dbIndex);
String dbDriver = System.getProperty(db_driver_key);
String dbUrl = System.getProperty(db_url_key);
String dbUser = System.getProperty(db_user_key);
String dbPwd = System.getProperty(db_pwd_key);
String platform = System.getProperty(db_platform_key);
String logLevel = System.getProperty(LOGGING_LEVEL_KEY);
//if not all of these properties available from System, read unavailable ones from test.properties file
if ((dbDriver == null) || (dbUrl == null) || (dbUser == null) || (dbPwd == null) || (platform == null) || (logLevel == null))
{
if (propertiesFromFile == null) {
createPropertiesFromFile();
}
if (dbDriver == null) {
dbDriver = (String) propertiesFromFile.get(db_driver_key);
}
if (dbUrl == null) {
dbUrl = (String) propertiesFromFile.get(db_url_key);
}
if (dbUser == null) {
dbUser = (String) propertiesFromFile.get(db_user_key);
}
if (dbPwd == null) {
dbPwd = (String) propertiesFromFile.get(db_pwd_key);
}
if (platform == null) {
platform = (String) propertiesFromFile.get(db_platform_key);
}
if (addLoggingLevel) {
if (logLevel == null) {
logLevel = (String) propertiesFromFile.get(PersistenceUnitProperties.LOGGING_LEVEL);
}
}
}
Map properties = new HashMap();
if (dbDriver != null) {
properties.put(PersistenceUnitProperties.JDBC_DRIVER, dbDriver);
}
if (dbUrl != null) {
properties.put(PersistenceUnitProperties.JDBC_URL, dbUrl);
}
if (dbUser != null) {
properties.put(PersistenceUnitProperties.JDBC_USER, dbUser);
}
if (dbPwd != null) {
properties.put(PersistenceUnitProperties.JDBC_PASSWORD, dbPwd);
}
if (platform != null) {
properties.put(PersistenceUnitProperties.TARGET_DATABASE, platform);
}
if (addLoggingLevel) {
if (logLevel != null) {
properties.put(PersistenceUnitProperties.LOGGING_LEVEL, logLevel);
}
}
return properties;
}
public static Map createCompositeProperties(String[] sessions) {
Map properties = new HashMap();
Map compositeMap = new HashMap();
properties.put(PersistenceUnitProperties.COMPOSITE_UNIT_PROPERTIES, compositeMap);
Map defaultProperties = getDatabaseProperties();
String logLevel = (String)defaultProperties.get(PersistenceUnitProperties.LOGGING_LEVEL);
if (logLevel != null) {
properties.put(PersistenceUnitProperties.LOGGING_LEVEL, logLevel);
}
// the first session uses db.user, db.pwd ...
compositeMap.put(sessions[0], defaultProperties);
for (int i = 1; i < sessions.length; i++) {
String dbIndex = Integer.toString(i + 1);
// the second session uses db2.user, db2.pwd ...
Map sessionProperties = getDatabasePropertiesForIndex(dbIndex);
if (sessionProperties.isEmpty() && shouldUseSingleDb()) {
// if non of these properties defined, then use firstSessionProperties
sessionProperties = defaultProperties;
}
if (!sessionProperties.isEmpty()) {
compositeMap.put(sessions[i], sessionProperties);
}
}
return properties;
}
public static String insertIndex(String key, String index) {
if (index == null || index.length() == 0) {
return key;
} else {
String suffix = key.substring(DB.length(), key.length());
return DB + index + suffix;
}
}
public static Map<String, String> getDatabasePropertiesForIndex(String dbIndex) {
if (dbIndex != null && dbIndex.length() > 0) {
Map dbProperties = dbPropertiesMap.get(dbIndex);
if (dbProperties == null) {
dbProperties = createDatabaseProperties(dbIndex);
dbPropertiesMap.put(dbIndex, dbProperties);
}
return dbProperties;
} else {
throw new RuntimeException("dbIndex is null or an empty String");
}
}
@SuppressWarnings("deprecation")
public static void createPropertiesFromFile() {
propertiesFromFile = new Properties();
File testPropertiesFile
= new File(System.getProperty(TEST_PROPERTIES_FILE_KEY, TEST_PROPERTIES_FILE_DEFAULT));
URL url = null;
if (testPropertiesFile.exists()) {
try {
url = testPropertiesFile.toURL();
} catch (MalformedURLException exception) {
throw new RuntimeException("Error loading " + testPropertiesFile.getName() + ".", exception);
}
} else {
// Load as a resource if from a jar.
url = JUnitTestCaseHelper.class.getResource("/" + System.getProperty(TEST_PROPERTIES_FILE_KEY, TEST_PROPERTIES_FILE_DEFAULT));
}
if (url != null){
try{
propertiesFromFile.load(url.openStream());
} catch (java.io.IOException exception){
throw new RuntimeException("Error loading " + testPropertiesFile.getName() + ".", exception);
}
}
}
public static boolean shouldUseSingleDb() {
if (shouldUseSingleDb == null) {
shouldUseSingleDb = Boolean.TRUE;
String property = System.getProperty(SINGLE_DB);
if (property == null) {
if (propertiesFromFile == null) {
createPropertiesFromFile();
}
property = (String) propertiesFromFile.get(SINGLE_DB);
}
if (property != null) {
if (property.toUpperCase().equals("FALSE")) {
shouldUseSingleDb = Boolean.FALSE;
}
}
}
return shouldUseSingleDb;
}
}