blob: 2ca544eb9bbf0cd4543451466f7a697e2cdc9189 [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 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 v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// 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";
/** EISConnectionSpec class name used to connect to the NoSQL data source (used in MongoDB test setup). */
public static final String DB_SPEC_KEY = "db.spec";
/** EclipseLink logging level. */
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 <code>test.properties</code>.
* 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();
}
}
/**
* Get the property value from the {@link System} or from the properties file as a fall back option.
* @param key The name of the property.
* @return The {@link String} value of the property.
*/
public static String getProperty(final String key) {
final String property = System.getProperty(key);
return property != null ? property : JUnitTestCaseHelper.getPropertyFromFile(key);
}
/**
* Get the property value from the properties file.
* @param key The name of the property.
* @return The {@link String} value of the property.
*/
private static String getPropertyFromFile(final String key) {
if (propertiesFromFile == null) {
createPropertiesFromFile();
}
return (String) propertiesFromFile.get(key);
}
// No index corresponds to db.user, db.pwd,...
// index = 2 -> db2.user, db2.pwd,... etc
/**
* Create the database properties {@link Map}.
* @param dbIndex The properties set index to append to the {@code "db"} prefix.
* @return The database properties {@link Map} containing properties from the {@link System} or from the properties
* file as a fall back option.
*/
static Map<String, String> createDatabaseProperties(final String dbIndex) {
final boolean addLoggingLevel = dbIndex == null || dbIndex.length() == 0;
final String db_driver_key = insertIndex(DB_DRIVER_KEY, dbIndex);
final String db_url_key = insertIndex(DB_URL_KEY, dbIndex);
final String db_user_key = insertIndex(DB_USER_KEY, dbIndex);
final String db_pwd_key = insertIndex(DB_PWD_KEY, dbIndex);
final String db_platform_key = insertIndex(DB_PLATFORM_KEY, dbIndex);
final String dbDriver = getProperty(db_driver_key);
final String dbUrl = getProperty(db_url_key);
final String dbUser = getProperty(db_user_key);
final String dbPwd = getProperty(db_pwd_key);
final String platform = getProperty(db_platform_key);
final String logLevel = getProperty(LOGGING_LEVEL_KEY);
final Map<String, String> 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<String, String> defaultProperties = getDatabaseProperties();
String logLevel = 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<String, String> 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) {
property = getPropertyFromFile(SINGLE_DB);
}
if (property != null) {
if (property.toUpperCase().equals("FALSE")) {
shouldUseSingleDb = Boolean.FALSE;
}
}
}
return shouldUseSingleDb;
}
}