package com.hubspot.blazar.service; import static org.assertj.core.api.Fail.fail; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Optional; import com.google.common.collect.Sets; import com.google.inject.Inject; import com.hubspot.blazar.base.BuildOptions; import com.hubspot.blazar.base.BuildTrigger; import com.hubspot.blazar.base.GitInfo; import com.hubspot.blazar.base.InterProjectBuild; import com.hubspot.blazar.base.RepositoryBuild; import com.hubspot.blazar.data.service.InterProjectBuildService; import com.hubspot.blazar.data.service.RepositoryBuildService; public class TestUtils { private final InterProjectBuildService interProjectBuildService; private final RepositoryBuildService repositoryBuildService; private static final long BUILD_WAIT_TIME = 1000; private static final long BUILD_WAIT_MAX_COUNT = 10; public static final Logger LOG = LoggerFactory.getLogger(TestUtils.class); @Inject public TestUtils (InterProjectBuildService interProjectBuildService, RepositoryBuildService repositoryBuildService) { this.interProjectBuildService = interProjectBuildService; this.repositoryBuildService = repositoryBuildService; } public InterProjectBuild runInterProjectBuild(int rootModuleId, Optional<BuildTrigger> triggerOptional) throws InterruptedException { BuildTrigger trigger; if (triggerOptional.isPresent()) { trigger = triggerOptional.get(); } else { trigger = new BuildTrigger(BuildTrigger.Type.MANUAL, String.format("Test inter-project build root: %d", rootModuleId)); } LOG.info("Starting inter-project-build for id {}", rootModuleId); InterProjectBuild build = InterProjectBuild.getQueuedBuild(Sets.newHashSet(rootModuleId), trigger); long id = interProjectBuildService.enqueue(build); return waitForInterProjectBuild(interProjectBuildService.getWithId(id).get()); } public RepositoryBuild runDefaultRepositoryBuild(GitInfo gitInfo) throws InterruptedException { long id = repositoryBuildService.enqueue(gitInfo, BuildTrigger.forCommit("1111111111111111111111111111111111111111"), BuildOptions.defaultOptions()); RepositoryBuild build = repositoryBuildService.get(id).get(); return waitForRepositoryBuild(build); } public RepositoryBuild runAndWaitForRepositoryBuild(GitInfo gitInfo, BuildTrigger buildTrigger, BuildOptions buildOptions) { long id = repositoryBuildService.enqueue(gitInfo, buildTrigger, buildOptions); RepositoryBuild build = repositoryBuildService.get(id).get(); return waitForRepositoryBuild(build); } public InterProjectBuild waitForInterProjectBuild(InterProjectBuild build) { int count = 0; while (!build.getState().isFinished()) { if (count > BUILD_WAIT_MAX_COUNT) { fail(String.format("Build %s took more than 10s to complete", build)); } count++; try { LOG.debug("Waiting for {} to complete", build); Thread.sleep(BUILD_WAIT_TIME); } catch (InterruptedException e) { LOG.error("Got interrupted while waiting for build", e); Thread.interrupted(); } build = interProjectBuildService.getWithId(build.getId().get()).get(); } return build; } public RepositoryBuild waitForRepositoryBuild(RepositoryBuild build) { int count = 0; while (!build.getState().isComplete()) { if (count > BUILD_WAIT_MAX_COUNT) { fail(String.format("Build %s took more than 10s to complete", build)); } count++; try { LOG.debug("Waiting for {} to complete", build); Thread.sleep(BUILD_WAIT_TIME); } catch (InterruptedException e) { LOG.error("Got interrupted while waiting for build", e); Thread.interrupted(); } build = repositoryBuildService.get(build.getId().get()).get(); } return build; } }