// Copyright (C) 2016 The Android Open Source Project
//
// 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.gcconductor.evaluator;

import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import com.ericsson.gerrit.plugins.gcconductor.EvaluationTask;
import com.ericsson.gerrit.plugins.gcconductor.EvaluationTask.Factory;
import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.git.GitRepositoryManager;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.Repository;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class EvaluatorTest {
  private static final String REPOSITORY_PATH = "/path/someRepo.git";
  private static final String REPOSITORY_PATH_OTHER = "/path/otherRepo.git";
  private static final Project.NameKey NAME_KEY = Project.nameKey("testProject");

  @Mock private GitReferenceUpdatedListener.Event event;
  @Mock private GitRepositoryManager repoManager;
  @Mock private Repository repository;
  @Mock private Repository repositoryOther;
  @Mock private ScheduledThreadPoolExecutor executor;
  @Mock private EvaluatorConfig config;
  @Mock private Config gerritConfig;

  private Evaluator evaluator;
  private EvaluationTask taskSamePathCompleted;
  private EvaluationTask taskSamePathNotCompleted;
  private EvaluationTask taskDifferentPath;

  @Before
  public void createEvaluator() {
    when(event.getProjectName()).thenReturn(NAME_KEY.get());

    when(config.getExpireTimeRecheck()).thenReturn(0L);
    when(gerritConfig.getInt(
            "receive", null, "threadPoolSize", Runtime.getRuntime().availableProcessors()))
        .thenReturn(1);

    when(repository.getDirectory()).thenReturn(new File(REPOSITORY_PATH));
    when(repositoryOther.getDirectory()).thenReturn(new File(REPOSITORY_PATH_OTHER));

    taskSamePathCompleted = new EvaluationTask(null, null, null, REPOSITORY_PATH);
    taskSamePathNotCompleted = new EvaluationTask(null, null, null, REPOSITORY_PATH);
    taskDifferentPath = new EvaluationTask(null, null, null, REPOSITORY_PATH_OTHER);

    Factory eventTaskFactory = mock(Factory.class);
    when(eventTaskFactory.create(REPOSITORY_PATH))
        .thenReturn(taskSamePathNotCompleted)
        .thenReturn(taskSamePathCompleted);
    when(eventTaskFactory.create(REPOSITORY_PATH_OTHER)).thenReturn(taskDifferentPath);

    when(executor.submit(taskSamePathCompleted))
        .thenReturn(CompletableFuture.completedFuture(null));
    when(executor.submit(taskSamePathNotCompleted)).thenReturn(new CompletableFuture<>());
    when(executor.submit(taskDifferentPath)).thenReturn(CompletableFuture.completedFuture(null));

    evaluator = new Evaluator(executor, eventTaskFactory, repoManager, config, gerritConfig);
  }

  @Test
  public void onPostUploadShouldCreateTaskOnlyIfPreUploadCalled() {
    evaluator.onPreUpload(repository, null, null, null, null, null);
    evaluator.onPostUpload(null);
    verify(executor).submit(taskSamePathCompleted);
  }

  @Test
  public void onPostUploadShouldNotCreateTaskIfRepositoryIsNull() {
    File fileMock = mock(File.class);
    when(fileMock.getAbsolutePath()).thenReturn(null);
    when(repository.getDirectory()).thenReturn(fileMock);
    evaluator.onPreUpload(repository, null, null, null, null, null);
    evaluator.onPostUpload(null);
    verify(executor, never()).submit(taskSamePathCompleted);
  }

  @Test
  public void onPostUploadShouldNotCreateTaskRepoIsNull() {
    evaluator.onPreUpload(repository, null, null, null, null, null);
    evaluator.onPostUpload(null);
    evaluator.onPostUpload(null);
    verify(executor, times(1)).submit(taskSamePathCompleted);
  }

  @Test
  public void onPostUploadShouldCreateTaskExpired() {
    evaluator.onPreUpload(repository, null, null, null, null, null);
    evaluator.onPostUpload(null);
    evaluator.onPreUpload(repositoryOther, null, null, null, null, null);
    evaluator.onPostUpload(null);
    verify(executor, times(1)).submit(taskSamePathCompleted);
    verify(executor, times(1)).submit(taskDifferentPath);
  }

  @Test
  public void onPostUploadSameRepoShouldCreateSingleTaskOnly() {
    evaluator.onPreUpload(repository, null, null, null, null, null);
    evaluator.onPostUpload(null);
    evaluator.onPreUpload(repository, null, null, null, null, null);
    evaluator.onPostUpload(null);
    verify(executor, times(1)).submit(taskSamePathCompleted);
  }

  @Test
  public void onPostUploadCompletedTasksAreRemovedFromQueue() {
    evaluator.onPreUpload(repositoryOther, null, null, null, null, null);
    evaluator.onPostUpload(null);
    evaluator.onPreUpload(repositoryOther, null, null, null, null, null);
    evaluator.onPostUpload(null);
    verify(executor, times(2)).submit(taskDifferentPath);
  }

  @Test
  public void onPostUploadShouldNotCreateTaskNotExpired() {
    when(config.getExpireTimeRecheck()).thenReturn(1000L);
    Factory eventTaskFactory = mock(Factory.class);
    when(eventTaskFactory.create(REPOSITORY_PATH)).thenReturn(taskSamePathCompleted);
    evaluator = new Evaluator(executor, eventTaskFactory, repoManager, config, gerritConfig);
    evaluator.onPreUpload(repository, null, null, null, null, null);
    evaluator.onPostUpload(null);
    evaluator.onPreUpload(repository, null, null, null, null, null);
    evaluator.onPostUpload(null);
    verify(executor, times(1)).submit(taskSamePathCompleted);
  }

  @Test
  public void onGitReferenceUpdatedShouldCreateTaskExpired() throws Exception {
    when(repoManager.openRepository(NAME_KEY)).thenReturn(repository).thenReturn(repositoryOther);
    evaluator.onGitReferenceUpdated(event);
    evaluator.onGitReferenceUpdated(event);
    verify(executor, times(1)).submit(taskSamePathCompleted);
    verify(executor, times(1)).submit(taskDifferentPath);
  }

  @Test
  public void onGitReferenceUpdatedSameRepoShouldCreateSingleTaskOnly() throws Exception {
    when(repoManager.openRepository(NAME_KEY)).thenReturn(repository);
    evaluator.onGitReferenceUpdated(event);
    evaluator.onGitReferenceUpdated(event);
    verify(executor, times(1)).submit(taskSamePathCompleted);
  }

  @Test
  public void onGitReferenceUpdatedCompletedTasksAreRemovedFromQueue() throws Exception {
    when(repoManager.openRepository(NAME_KEY)).thenReturn(repositoryOther);
    evaluator.onGitReferenceUpdated(event);
    evaluator.onGitReferenceUpdated(event);
    verify(executor, times(2)).submit(taskDifferentPath);
  }

  @Test
  public void onGitReferenceUpdatedShouldNotCreateTaskNotExpired() throws Exception {
    when(repoManager.openRepository(NAME_KEY)).thenReturn(repository);
    when(config.getExpireTimeRecheck()).thenReturn(1000L);
    Factory eventTaskFactory = mock(Factory.class);
    when(eventTaskFactory.create(REPOSITORY_PATH)).thenReturn(taskSamePathCompleted);
    evaluator = new Evaluator(executor, eventTaskFactory, repoManager, config, gerritConfig);
    evaluator.onGitReferenceUpdated(event);
    evaluator.onGitReferenceUpdated(event);
    verify(executor, times(1)).submit(taskSamePathCompleted);
  }

  @Test
  public void onGitReferenceUpdatedThrowsRepositoryNotFoundException() throws Exception {
    doThrow(new RepositoryNotFoundException("")).when(repoManager).openRepository(NAME_KEY);
    evaluator.onGitReferenceUpdated(event);
    verify(executor, never()).submit(taskSamePathCompleted);
  }

  @Test
  public void onGitReferenceUpdatedThrowsIOException() throws Exception {
    doThrow(new IOException()).when(repoManager).openRepository(NAME_KEY);
    evaluator.onGitReferenceUpdated(event);
    verify(executor, never()).submit(taskSamePathCompleted);
  }
}
