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}