blob: 198eca9940be7d529900f218df7908147dd528f9 [file] [log] [blame]
package com.ericsson.gerrit.plugins.gcconductor.executor;
import static com.ericsson.gerrit.plugins.gcconductor.CommonConfig.DB_NAME_KEY;
import static com.ericsson.gerrit.plugins.gcconductor.CommonConfig.DB_PASS_KEY;
import static com.ericsson.gerrit.plugins.gcconductor.CommonConfig.DB_URL_KEY;
import static com.ericsson.gerrit.plugins.gcconductor.CommonConfig.DB_URL_OPTIONS_KEY;
import static com.ericsson.gerrit.plugins.gcconductor.CommonConfig.DB_USERNAME_KEY;
import static com.ericsson.gerrit.plugins.gcconductor.CommonConfig.DEFAULT_DB_NAME;
import static com.ericsson.gerrit.plugins.gcconductor.CommonConfig.DEFAULT_DB_PASSWORD;
import static com.ericsson.gerrit.plugins.gcconductor.CommonConfig.DEFAULT_DB_URL;
import static com.ericsson.gerrit.plugins.gcconductor.CommonConfig.DEFAULT_DB_USERNAME;
import static com.ericsson.gerrit.plugins.gcconductor.CommonConfig.LOOSE_DEFAULT;
import static com.ericsson.gerrit.plugins.gcconductor.CommonConfig.LOOSE_KEY;
import static com.ericsson.gerrit.plugins.gcconductor.CommonConfig.PACKED_DEFAULT;
import static com.ericsson.gerrit.plugins.gcconductor.CommonConfig.PACKED_KEY;
import static com.ericsson.gerrit.plugins.gcconductor.executor.ExecutorConfig.CORE_SECTION;
import static com.ericsson.gerrit.plugins.gcconductor.executor.ExecutorConfig.DB_SECTION;
import static com.ericsson.gerrit.plugins.gcconductor.executor.ExecutorConfig.DEFAULT_DELAY;
import static com.ericsson.gerrit.plugins.gcconductor.executor.ExecutorConfig.DEFAULT_EXECUTORS;
import static com.ericsson.gerrit.plugins.gcconductor.executor.ExecutorConfig.DEFAULT_INITIAL_DELAY;
import static com.ericsson.gerrit.plugins.gcconductor.executor.ExecutorConfig.DEFAULT_INTERVAL;
import static com.ericsson.gerrit.plugins.gcconductor.executor.ExecutorConfig.DEFAULT_REPOS_PATH;
import static com.ericsson.gerrit.plugins.gcconductor.executor.ExecutorConfig.DELAY_KEY;
import static com.ericsson.gerrit.plugins.gcconductor.executor.ExecutorConfig.EMPTY;
import static com.ericsson.gerrit.plugins.gcconductor.executor.ExecutorConfig.EVALUATION_SECTION;
import static com.ericsson.gerrit.plugins.gcconductor.executor.ExecutorConfig.EXECUTOR_KEY;
import static com.ericsson.gerrit.plugins.gcconductor.executor.ExecutorConfig.INTERVAL_KEY;
import static com.ericsson.gerrit.plugins.gcconductor.executor.ExecutorConfig.PICK_OWN_HOST_KEY;
import static com.ericsson.gerrit.plugins.gcconductor.executor.ExecutorConfig.REPOS_PATH_KEY;
import static com.ericsson.gerrit.plugins.gcconductor.executor.ExecutorConfig.START_TIME_KEY;
import static com.google.common.truth.Truth.assertThat;
import static java.util.concurrent.TimeUnit.DAYS;
import static java.util.concurrent.TimeUnit.HOURS;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.MINUTES;
import java.time.LocalDateTime;
import java.time.Month;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.concurrent.TimeUnit;
import org.eclipse.jgit.lib.Config;
import org.junit.Before;
import org.junit.Test;
public class ExecutorConfigTest {
private static final String CUSTOM_REPOS_PATH = "/other/path/to/repos";
private static final String CUSTOM_DB_URL = "customDbUrl/";
private static final String CUSTOM_DB_NAME = "customDbName";
private static final String URL_OPTIONS = "urlOptions";
private static final String CUSTOM_DB_USER = "customDbUser";
private static final String CUSTOM_DB_PASS = "customDbPass";
private static final int CUSTOM_DELAY = 5;
private static final int CUSTOM_EXECUTORS = 10;
private static final int CUSTOM_PACKED = 41;
private static final int CUSTOM_LOOSE = 401;
private static final int ONE_DAY_AS_MS = 86_400_000;
// Friday June 13, 2014 10:00 UTC
private static final ZonedDateTime NOW =
LocalDateTime.of(2014, Month.JUNE, 13, 10, 0, 0).atOffset(ZoneOffset.UTC).toZonedDateTime();
private Config config;
private ExecutorConfig executorConfig;
@Before
public void setUp() {
config = new Config();
}
@Test
public void shouldSetDefaultValues() {
executorConfig = new ExecutorConfig(config);
assertThat(executorConfig.getDatabaseUrl()).isEqualTo(DEFAULT_DB_URL);
assertThat(executorConfig.getDatabaseName()).isEqualTo(DEFAULT_DB_NAME);
assertThat(executorConfig.getDatabaseUrlOptions()).isEqualTo(EMPTY);
assertThat(executorConfig.getUsername()).isEqualTo(DEFAULT_DB_USERNAME);
assertThat(executorConfig.getPassword()).isEqualTo(DEFAULT_DB_PASSWORD);
assertThat(executorConfig.getDelay()).isEqualTo(DEFAULT_DELAY);
assertThat(executorConfig.getExecutors()).isEqualTo(DEFAULT_EXECUTORS);
assertThat(executorConfig.isPickOwnHostOnly()).isEqualTo(true);
assertThat(executorConfig.getLooseThreshold()).isEqualTo(LOOSE_DEFAULT);
assertThat(executorConfig.getPackedThreshold()).isEqualTo(PACKED_DEFAULT);
assertThat(executorConfig.getRepositoriesPath()).isEqualTo(DEFAULT_REPOS_PATH);
assertThat(executorConfig.getInterval()).isEqualTo(DEFAULT_INTERVAL);
assertThat(executorConfig.getInitialDelay()).isEqualTo(DEFAULT_INITIAL_DELAY);
}
@Test
public void shouldReadValuesFromConfig() {
config.setString(DB_SECTION, null, DB_URL_KEY, CUSTOM_DB_URL);
config.setString(DB_SECTION, null, DB_NAME_KEY, CUSTOM_DB_NAME);
config.setString(DB_SECTION, null, DB_URL_OPTIONS_KEY, URL_OPTIONS);
config.setString(DB_SECTION, null, DB_USERNAME_KEY, CUSTOM_DB_USER);
config.setString(DB_SECTION, null, DB_PASS_KEY, CUSTOM_DB_PASS);
config.setInt(CORE_SECTION, null, DELAY_KEY, CUSTOM_DELAY);
config.setInt(CORE_SECTION, null, EXECUTOR_KEY, CUSTOM_EXECUTORS);
config.setBoolean(CORE_SECTION, null, PICK_OWN_HOST_KEY, false);
config.setInt(EVALUATION_SECTION, null, LOOSE_KEY, CUSTOM_LOOSE);
config.setInt(EVALUATION_SECTION, null, PACKED_KEY, CUSTOM_PACKED);
config.setString(EVALUATION_SECTION, null, REPOS_PATH_KEY, CUSTOM_REPOS_PATH);
config.setString(EVALUATION_SECTION, null, INTERVAL_KEY, "1 day");
config.setString(EVALUATION_SECTION, null, START_TIME_KEY, "Sun 00:00");
executorConfig = new ExecutorConfig(config);
assertThat(executorConfig.getDatabaseUrl()).isEqualTo(CUSTOM_DB_URL);
assertThat(executorConfig.getDatabaseName()).isEqualTo(CUSTOM_DB_NAME);
assertThat(executorConfig.getDatabaseUrlOptions()).isEqualTo(URL_OPTIONS);
assertThat(executorConfig.getUsername()).isEqualTo(CUSTOM_DB_USER);
assertThat(executorConfig.getPassword()).isEqualTo(CUSTOM_DB_PASS);
assertThat(executorConfig.getDelay()).isEqualTo(CUSTOM_DELAY);
assertThat(executorConfig.getExecutors()).isEqualTo(CUSTOM_EXECUTORS);
assertThat(executorConfig.isPickOwnHostOnly()).isEqualTo(false);
assertThat(executorConfig.getLooseThreshold()).isEqualTo(CUSTOM_LOOSE);
assertThat(executorConfig.getPackedThreshold()).isEqualTo(CUSTOM_PACKED);
assertThat(executorConfig.getRepositoriesPath()).isEqualTo(CUSTOM_REPOS_PATH);
assertThat(executorConfig.getInterval()).isEqualTo(ONE_DAY_AS_MS);
assertThat(executorConfig.getInitialDelay()).isAtLeast(1L);
}
@Test
public void shouldParseTimeOnly() {
config.setString(EVALUATION_SECTION, null, INTERVAL_KEY, "1 hour");
config.setString(EVALUATION_SECTION, null, START_TIME_KEY, "15:00");
executorConfig = new ExecutorConfig(config);
assertThat(executorConfig.getInitialDelay()).isAtLeast(1L);
}
@Test
public void shouldUseDefaultValuesIfConfigInvalid() {
config.setString(EVALUATION_SECTION, null, INTERVAL_KEY, "1 x");
config.setString(EVALUATION_SECTION, null, START_TIME_KEY, "123 ab:cd");
executorConfig = new ExecutorConfig(config);
assertThat(executorConfig.getInterval()).isEqualTo(DEFAULT_INTERVAL);
assertThat(executorConfig.getInitialDelay()).isEqualTo(DEFAULT_INITIAL_DELAY);
}
@Test
public void checkInitialDelayGivesExpectedTime() {
assertThat(initialDelayFor("11:00", "1h")).isEqualTo(ms(1, HOURS));
assertThat(initialDelayFor("05:30", "1h")).isEqualTo(ms(30, MINUTES));
assertThat(initialDelayFor("13:59", "1h")).isEqualTo(ms(59, MINUTES));
assertThat(initialDelayFor("11:00", "1d")).isEqualTo(ms(1, HOURS));
assertThat(initialDelayFor("05:30", "1d")).isEqualTo(ms(19, HOURS) + ms(30, MINUTES));
assertThat(initialDelayFor("Sat 10:00", "1d")).isEqualTo(ms(1, DAYS));
assertThat(initialDelayFor("Mon 09:00", "1d")).isEqualTo(ms(23, HOURS));
assertThat(initialDelayFor("11:00", "1w")).isEqualTo(ms(1, HOURS));
assertThat(initialDelayFor("05:30", "1w"))
.isEqualTo(ms(7, DAYS) - ms(4, HOURS) - ms(30, MINUTES));
assertThat(initialDelayFor("Fri 11:00", "1w")).isEqualTo(ms(1, HOURS));
assertThat(initialDelayFor("Mon 11:00", "1w")).isEqualTo(ms(3, DAYS) + ms(1, HOURS));
}
private long initialDelayFor(String startTime, String interval) {
config.setString(EVALUATION_SECTION, null, INTERVAL_KEY, interval);
config.setString(EVALUATION_SECTION, null, START_TIME_KEY, startTime);
executorConfig = new ExecutorConfig(config);
return executorConfig.initialDelay(startTime, NOW, executorConfig.getInterval());
}
private long ms(int cnt, TimeUnit unit) {
return MILLISECONDS.convert(cnt, unit);
}
}