// Copyright (C) 2015 Ericsson
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.ericsson.gerrit.plugins.eventslog;

import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.CONFIG_CONN_TIME;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.CONFIG_COPY_LOCAL;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.CONFIG_DRIVER;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.CONFIG_EVICT_IDLE_TIME;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.CONFIG_LOCAL_PATH;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.CONFIG_MAX_AGE;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.CONFIG_MAX_TRIES;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.CONFIG_PASSWORD;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.CONFIG_RETURN_LIMIT;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.CONFIG_URL;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.CONFIG_URL_OPTIONS;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.CONFIG_USERNAME;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.CONFIG_WAIT_TIME;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_CONN_TIME;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_COPY_LOCAL;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_DRIVER;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_EVICT_IDLE_TIME;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_MAX_AGE;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_MAX_TRIES;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_RETURN_LIMIT;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_WAIT_TIME;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;

import com.google.common.base.Joiner;
import com.google.gerrit.server.config.PluginConfig;
import com.google.gerrit.server.config.PluginConfigFactory;
import com.google.gerrit.server.config.SitePaths;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

import java.io.IOException;
import java.nio.file.Files;

@RunWith(MockitoJUnitRunner.class)
public class EventsLogConfigTest {
  private static final String PLUGIN_NAME = "eventsLog";
  private static final int CUSTOM_EVICT_IDLE_TIME = 10000;

  private SitePaths site;
  private EventsLogConfig config;
  private String defaultLocalStorePath;
  private String defaultUrl;
  private String localStorePath;
  private String[] urlOptions = new String[] {"DB_CLOSE_DELAY=10"};

  @Mock
  private PluginConfigFactory cfgFactoryMock;
  @Mock
  private PluginConfig configMock;

  @Rule
  public TemporaryFolder gerrit_site = new TemporaryFolder();

  @Before
  public void setUp() throws IOException {
    site = new SitePaths(gerrit_site.getRoot().toPath());
    Files.createDirectories(site.etc_dir);
    defaultLocalStorePath = site.site_path.toString() + "/events-db/";
    defaultUrl = "jdbc:h2:" + site.data_dir.toString() + "/db";
    when(cfgFactoryMock.getFromGerritConfig(PLUGIN_NAME, true))
        .thenReturn(configMock);
  }

  private void setUpDefaults() {
    when(configMock.getBoolean(CONFIG_COPY_LOCAL, DEFAULT_COPY_LOCAL))
        .thenReturn(DEFAULT_COPY_LOCAL);
    when(configMock.getInt(CONFIG_MAX_AGE, DEFAULT_MAX_AGE))
        .thenReturn(DEFAULT_MAX_AGE);
    when(configMock.getInt(CONFIG_MAX_TRIES, DEFAULT_MAX_TRIES))
        .thenReturn(DEFAULT_MAX_TRIES);
    when(configMock.getInt(CONFIG_RETURN_LIMIT, DEFAULT_RETURN_LIMIT))
        .thenReturn(DEFAULT_RETURN_LIMIT);
    when(configMock.getInt(CONFIG_CONN_TIME, DEFAULT_CONN_TIME))
        .thenReturn(DEFAULT_CONN_TIME);
    when(configMock.getInt(CONFIG_WAIT_TIME, DEFAULT_WAIT_TIME))
        .thenReturn(DEFAULT_WAIT_TIME);
    when(configMock.getString(CONFIG_DRIVER, DEFAULT_DRIVER))
        .thenReturn(DEFAULT_DRIVER);
    when(configMock.getString(CONFIG_URL, defaultUrl)).thenReturn(defaultUrl);
    when(configMock.getString(CONFIG_LOCAL_PATH, defaultLocalStorePath))
        .thenReturn(defaultLocalStorePath);
    when(configMock.getStringList(CONFIG_URL_OPTIONS))
        .thenReturn(new String[] {});
    when(configMock.getString(CONFIG_USERNAME)).thenReturn(null);
    when(configMock.getString(CONFIG_PASSWORD)).thenReturn(null);
    when(configMock.getInt(CONFIG_EVICT_IDLE_TIME, DEFAULT_EVICT_IDLE_TIME))
        .thenReturn(DEFAULT_EVICT_IDLE_TIME);
  }

  private void setUpCustom() {
    localStorePath = "~/gerrit/events-db/";
    when(configMock.getBoolean(CONFIG_COPY_LOCAL, DEFAULT_COPY_LOCAL))
        .thenReturn(true);
    when(configMock.getInt(CONFIG_MAX_AGE, DEFAULT_MAX_AGE)).thenReturn(20);
    when(configMock.getInt(CONFIG_MAX_TRIES, DEFAULT_MAX_TRIES)).thenReturn(5);
    when(configMock.getInt(CONFIG_RETURN_LIMIT, DEFAULT_RETURN_LIMIT))
        .thenReturn(10000);
    when(configMock.getInt(CONFIG_CONN_TIME, DEFAULT_CONN_TIME))
        .thenReturn(5000);
    when(configMock.getInt(CONFIG_WAIT_TIME, DEFAULT_WAIT_TIME))
        .thenReturn(5000);
    when(configMock.getString(CONFIG_DRIVER, DEFAULT_DRIVER))
        .thenReturn("org.h2.Driver2");
    when(configMock.getString(CONFIG_URL, defaultUrl))
        .thenReturn("jdbc:h2:~/gerrit/db");
    when(configMock.getString(CONFIG_LOCAL_PATH, defaultLocalStorePath))
        .thenReturn(localStorePath);
    when(configMock.getStringList(CONFIG_URL_OPTIONS)).thenReturn(urlOptions);
    when(configMock.getString(CONFIG_USERNAME)).thenReturn("testUsername");
    when(configMock.getString(CONFIG_PASSWORD)).thenReturn("testPassword");
    when(configMock.getInt(CONFIG_EVICT_IDLE_TIME, DEFAULT_EVICT_IDLE_TIME))
        .thenReturn(CUSTOM_EVICT_IDLE_TIME);

  }

  @Test
  public void shouldReturnDefaultsWhenMissingConfig() {
    setUpDefaults();
    config = new EventsLogConfig(cfgFactoryMock, site, PLUGIN_NAME);
    assertThat(config.getCopyLocal()).isFalse();
    assertThat(config.getMaxAge()).isEqualTo(30);
    assertThat(config.getMaxTries()).isEqualTo(3);
    assertThat(config.getReturnLimit()).isEqualTo(5000);
    assertThat(config.getConnectTime()).isEqualTo(1000);
    assertThat(config.getWaitTime()).isEqualTo(1000);
    assertThat(config.getLocalStoreDriver()).isEqualTo(DEFAULT_DRIVER);
    assertThat(config.getLocalStorePath().toString() + "/")
        .isEqualTo(defaultLocalStorePath);
    assertThat(config.getStoreDriver()).isEqualTo(DEFAULT_DRIVER);
    assertThat(config.getStoreUrl()).isEqualTo(defaultUrl);
    assertThat(config.getUrlOptions()).isEmpty();
    assertThat(config.getStoreUsername()).isNull();
    assertThat(config.getStorePassword()).isNull();
    assertThat(config.getEvictIdleTime()).isEqualTo(DEFAULT_EVICT_IDLE_TIME);
  }

  @Test
  public void shouldReturnConfigValues() {
    setUpCustom();
    config = new EventsLogConfig(cfgFactoryMock, site, PLUGIN_NAME);
    assertThat(config.getCopyLocal()).isTrue();
    assertThat(config.getMaxAge()).isEqualTo(20);
    assertThat(config.getMaxTries()).isEqualTo(5);
    assertThat(config.getReturnLimit()).isEqualTo(10000);
    assertThat(config.getConnectTime()).isEqualTo(5000);
    assertThat(config.getWaitTime()).isEqualTo(5000);
    assertThat(config.getLocalStoreDriver()).isEqualTo(DEFAULT_DRIVER);
    assertThat(config.getLocalStorePath().toString() + "/")
        .isEqualTo(localStorePath);
    assertThat(config.getStoreDriver()).isEqualTo("org.h2.Driver2");
    assertThat(config.getStoreUrl()).isEqualTo("jdbc:h2:~/gerrit/db");
    assertThat(config.getUrlOptions())
        .isEqualTo(Joiner.on(";").join(urlOptions));
    assertThat(config.getStoreUsername()).isEqualTo("testUsername");
    assertThat(config.getStorePassword()).isEqualTo("testPassword");
    assertThat(config.getEvictIdleTime()).isEqualTo(CUSTOM_EVICT_IDLE_TIME);
  }
}
