001package io.ebean.test.config; 002 003import io.ebean.config.AutoConfigure; 004import io.ebean.config.DatabaseConfig; 005import io.ebean.datasource.DataSourceConfig; 006import io.ebean.test.config.platform.PlatformAutoConfig; 007import io.ebean.test.config.provider.ProviderAutoConfig; 008import org.slf4j.Logger; 009import org.slf4j.LoggerFactory; 010 011import java.util.Properties; 012 013/** 014 * Automatically configure ServerConfig for testing purposes. 015 * <p> 016 * Can setup and execute docker based databases and other containers. 017 * Can setup DataSource configuration (to match docker db setup). 018 * Can setup a CurrentUserProvider and CurrentTenantProvider for testing. 019 * Can setup a EncryptKeyManager for testing purposes with fixed key. 020 */ 021public class AutoConfigureForTesting implements AutoConfigure { 022 023 private static final Logger log = LoggerFactory.getLogger(AutoConfigureForTesting.class); 024 025 /** 026 * System property that can override the platform. mvn clean test -Ddb=sqlserver 027 */ 028 private final String environmentDb = System.getProperty("db"); 029 030 @Override 031 public void preConfigure(DatabaseConfig config) { 032 033 Properties properties = config.getProperties(); 034 if (isExtraServer(config, properties)) { 035 setupExtraDataSourceIfNecessary(config); 036 return; 037 } 038 039 String testPlatform = properties.getProperty("ebean.test.platform"); 040 log.debug("automatic testing config - with ebean.test.platform:{} environment db:{} name:{}", testPlatform, environmentDb, config.getName()); 041 042 if (RunOnceMarker.isRun()) { 043 setupPlatform(environmentDb, config); 044 } 045 } 046 047 @Override 048 public void postConfigure(DatabaseConfig config) { 049 setupProviders(config); 050 } 051 052 /** 053 * Check if this is not the primary server and return true if that is the case. 054 */ 055 private boolean isExtraServer(DatabaseConfig config, Properties properties) { 056 String extraDb = properties.getProperty("ebean.test.extraDb.dbName", properties.getProperty("ebean.test.extraDb")); 057 if (extraDb != null && extraDb.equals(config.getName())) { 058 config.setDefaultServer(false); 059 return true; 060 } 061 return false; 062 } 063 064 /** 065 * Setup the DataSource on the extra database if necessary. 066 */ 067 private void setupExtraDataSourceIfNecessary(DatabaseConfig config) { 068 DataSourceConfig dataSourceConfig = config.getDataSourceConfig(); 069 if (dataSourceConfig == null || dataSourceConfig.getUsername() == null) { 070 new PlatformAutoConfig(environmentDb, config) 071 .configExtraDataSource(); 072 } 073 } 074 075 /** 076 * Setup support for Who, Multi-Tenant and DB encryption if they are not already set. 077 */ 078 private void setupProviders(DatabaseConfig config) { 079 new ProviderAutoConfig(config).run(); 080 } 081 082 /** 083 * Setup the platform for testing including docker as needed and adjusting datasource config as needed. 084 */ 085 private void setupPlatform(String db, DatabaseConfig config) { 086 new PlatformAutoConfig(db, config).run(); 087 } 088}