package com.hubspot.blazar.util;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Collections;
import org.jukito.JukitoRunner;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kohsuke.github.GHCommit;
import org.kohsuke.github.GHRepository;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.hubspot.blazar.base.BuildOptions;
import com.hubspot.blazar.base.BuildTrigger;
import com.hubspot.blazar.base.CommitInfo;
import com.hubspot.blazar.base.GitInfo;
import com.hubspot.blazar.base.RepositoryBuild;
import com.hubspot.blazar.data.service.BranchService;
import com.hubspot.blazar.data.service.DependenciesService;
import com.hubspot.blazar.data.service.ModuleDiscoveryService;
import com.hubspot.blazar.data.service.ModuleService;
import com.hubspot.blazar.data.service.RepositoryBuildService;
import com.hubspot.blazar.discovery.ModuleDiscoveryHandler;
import com.hubspot.blazar.github.GitHubProtos.Commit;
@RunWith(JukitoRunner.class)
public class RepositoryBuildLauncherTest {
private final RepositoryBuildService repositoryBuildService = mock(RepositoryBuildService.class);
private final BranchService branchService = mock(BranchService.class);
private final ModuleService moduleService = mock(ModuleService.class);
private final DependenciesService dependenciesService = mock(DependenciesService.class);
private final ModuleDiscoveryService moduleDiscoveryService = mock(ModuleDiscoveryService.class);
private final ModuleDiscoveryHandler moduleDiscoveryHandler = mock(ModuleDiscoveryHandler.class);
private final GitHubHelper gitHubHelper = mock(GitHubHelper.class);
@Test
public void itUsesPreviousCommitWhenBuildIsPartOfInterProjectBuild() throws Exception {
GitInfo branch = new GitInfo(Optional.of(1), "git.example.com", "example", "repository", 1, "master", true, 0L, 1L);
String commitSha = "0000000000000000000000000000000000000000";
Commit commit = Commit.newBuilder().setId(commitSha).build();
CommitInfo commitInfo = new CommitInfo(commit, Optional.absent(), Collections.emptyList(), false);
RepositoryBuild previousBuild = RepositoryBuild.newBuilder(1, 1, RepositoryBuild.State.SUCCEEDED, BuildTrigger.forCommit(commitSha), BuildOptions.defaultOptions())
.setCommitInfo(Optional.of(commitInfo))
.build();
Optional<RepositoryBuild> previousBuildOptional = Optional.of(previousBuild);
BuildOptions ipbBuildOptions = new BuildOptions(ImmutableSet.of(1), BuildOptions.BuildDownstreams.NONE, false);
RepositoryBuild currentBuild = RepositoryBuild.queuedBuild(branch, BuildTrigger.forInterProjectBuild(1), 2, ipbBuildOptions);
RepositoryBuildLauncher launcher = new RepositoryBuildLauncher(repositoryBuildService, branchService, moduleService, dependenciesService, moduleDiscoveryService, moduleDiscoveryHandler, gitHubHelper);
when(gitHubHelper.commitInfoFor(any(), any(), any())).thenThrow(new IllegalStateException("Previous build is present this should not be called"));
when(gitHubHelper.shaFor(any(), any())).thenThrow(new IllegalStateException("Previous build is present this should not be called"));
CommitInfo result = launcher.calculateCommitInfoForBuild(branch, currentBuild, previousBuildOptional);
assertThat(result.getCurrent().getId()).isEqualTo(commitSha);
assertThat(result.getPrevious().isPresent()).isTrue();
assertThat(result.getPrevious().get().getId()).isEqualTo(commitSha);
}
@Test
public void itUsesNewCommitWhenBranchBuildIsNotPartOfAInterProjectBuild() throws Exception {
GitInfo branch = new GitInfo(Optional.of(1), "git.example.com", "example", "repository", 1, "master", true, 0L, 1L);
String initialCommitSha = "0000000000000000000000000000000000000000";
String secondCommitSha = "1111111111111111111111111111111111111111";
Commit initialCommit = Commit.newBuilder().setId(initialCommitSha).build();
Commit secondCommit = Commit.newBuilder().setId(secondCommitSha).build();
CommitInfo previousCommitInfo = new CommitInfo(initialCommit, Optional.absent(), Collections.emptyList(), false);
RepositoryBuild previousBuild = RepositoryBuild.newBuilder(1, 1, RepositoryBuild.State.SUCCEEDED, BuildTrigger.forCommit(initialCommitSha), BuildOptions.defaultOptions())
.setCommitInfo(Optional.of(previousCommitInfo))
.build();
Optional<RepositoryBuild> previousBuildOptional = Optional.of(previousBuild);
RepositoryBuild currentBuild = RepositoryBuild.queuedBuild(branch, BuildTrigger.forCommit(secondCommitSha), 2, BuildOptions.defaultOptions());
RepositoryBuildLauncher launcher = new RepositoryBuildLauncher(repositoryBuildService, branchService, moduleService, dependenciesService, moduleDiscoveryService, moduleDiscoveryHandler, gitHubHelper);
GHRepository repository = mock(GHRepository.class);
when(gitHubHelper.shaFor(any(), any())).thenReturn(Optional.of(secondCommitSha));
when(gitHubHelper.repositoryFor(any())).thenReturn(repository);
doAnswer(invocation -> {
String sha = (String) invocation.getArguments()[0];
return new GHCommit() {
@Override
public String getSHA1() {
return sha;
}
};
}).when(repository).getCommit(anyString());
doAnswer(invocation -> {
GHCommit commit = (GHCommit) invocation.getArguments()[0];
return Commit.newBuilder().setId(commit.getSHA1()).build();
}).when(gitHubHelper).toCommit(any());
// Test that the method was called with the expected arguments.
doAnswer(invocation -> {
Commit currentCommit = (Commit) invocation.getArguments()[1];
Optional<Commit> previousCommit = (Optional<Commit>) invocation.getArguments()[2];
return new CommitInfo(currentCommit, previousCommit, ImmutableList.of(currentCommit), false);
}).when(gitHubHelper).commitInfoFor(any(), any(), any());
CommitInfo result = launcher.calculateCommitInfoForBuild(branch, currentBuild, previousBuildOptional);
assertThat(result.getCurrent().getId()).isEqualTo(secondCommitSha);
assertThat(result.getPrevious().isPresent()).isTrue();
assertThat(result.getPrevious().get().getId()).isEqualTo(initialCommitSha);
assertThat(result.getNewCommits().isEmpty()).isFalse();
assertThat(result.getNewCommits()).isEqualTo(ImmutableList.of(secondCommit));
}
}