dmitry@424: package jetbrains.buildServer.buildTriggers.vcs.mercurial; dmitry@424: dmitry@424: import com.intellij.openapi.diagnostic.Logger; dmitry@424: import jetbrains.buildServer.TempFiles; dmitry@424: import jetbrains.buildServer.agent.*; dmitry@493: import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.TestCommandSettingsFactory; dmitry@424: import jetbrains.buildServer.log.Log4jFactory; dmitry@424: import jetbrains.buildServer.vcs.*; dmitry@424: import org.jetbrains.annotations.NotNull; dmitry@424: import org.jmock.Expectations; dmitry@424: import org.jmock.Mockery; dmitry@424: import org.testng.annotations.AfterMethod; dmitry@424: import org.testng.annotations.BeforeMethod; dmitry@424: import org.testng.annotations.Test; dmitry@424: dmitry@424: import java.io.File; dmitry@424: import java.util.Date; dmitry@424: import java.util.HashMap; dmitry@424: dmitry@424: import static java.util.Arrays.asList; dmitry@443: import static jetbrains.buildServer.buildTriggers.vcs.mercurial.Util.copyRepository; dmitry@424: import static jetbrains.buildServer.buildTriggers.vcs.mercurial.VcsRootBuilder.vcsRoot; dmitry@424: dmitry@424: /** dmitry@424: * @author dmitry.neverov dmitry@424: */ dmitry@424: @Test dmitry@424: public class AgentMirrorCleanerTest { dmitry@424: dmitry@424: static { dmitry@424: Logger.setFactory(new Log4jFactory()); dmitry@424: } dmitry@424: dmitry@424: private TempFiles myTempFiles = new TempFiles(); dmitry@424: private Mockery myContext; dmitry@424: private MercurialAgentSideVcsSupport myVcsSupport; dmitry@424: private AgentMirrorCleaner myCleaner; dmitry@424: private BuildProgressLogger myLogger; dmitry@424: private File myWorkDir; dmitry@424: private int myBuildCounter; dmitry@424: private MirrorManager myMirrorManager; dmitry@424: dmitry@424: @BeforeMethod dmitry@424: public void setUp() throws Exception { dmitry@424: myContext = new Mockery(); dmitry@424: myWorkDir = myTempFiles.createTempDir(); dmitry@424: dmitry@424: final BuildAgentConfiguration agentConfig = myContext.mock(BuildAgentConfiguration.class); dmitry@424: myContext.checking(new Expectations() {{ dmitry@424: allowing(agentConfig).getCacheDirectory("mercurial"); will(returnValue(myTempFiles.createTempDir())); dmitry@424: allowing(agentConfig).getParametersResolver(); will(returnValue(new HgPathResolver())); dmitry@424: }}); dmitry@424: dmitry@424: AgentPluginConfigImpl pluginConfig = new AgentPluginConfigImpl(agentConfig); dmitry@424: AgentHgPathProvider hgPathProvider = new AgentHgPathProvider(agentConfig); dmitry@424: myMirrorManager = new MirrorManagerImpl(pluginConfig); dmitry@493: AgentRepoFactory repoFactory = new AgentRepoFactory(new TestCommandSettingsFactory()); dmitry@480: myVcsSupport = new MercurialAgentSideVcsSupport(pluginConfig, hgPathProvider, myMirrorManager, repoFactory); dmitry@429: myCleaner = new AgentMirrorCleaner(myMirrorManager); dmitry@424: myLogger = myContext.mock(BuildProgressLogger.class); dmitry@424: myContext.checking(new Expectations() {{ dmitry@424: allowing(myLogger).message(with(any(String.class))); dmitry@424: allowing(myLogger).warning(with(any(String.class))); dmitry@424: }}); dmitry@424: } dmitry@424: dmitry@424: @AfterMethod dmitry@424: public void tearDown() { dmitry@424: myTempFiles.cleanup(); dmitry@424: } dmitry@424: dmitry@424: dmitry@424: public void should_add_cleaners_only_for_roots_not_used_in_build() throws Exception { dmitry@424: //setup mirrors for 2 roots on an agent: dmitry@424: final File repo1 = myTempFiles.createTempDir(); dmitry@424: final File repo2 = myTempFiles.createTempDir(); dmitry@424: copyRepository(new File("mercurial-tests/testData/rep1"), repo1); dmitry@424: copyRepository(new File("mercurial-tests/testData/rep2"), repo2); dmitry@424: dmitry@424: final VcsRoot root1 = vcsRoot().withUrl(repo1.getAbsolutePath()).build(); dmitry@424: final VcsRoot root2 = vcsRoot().withUrl(repo2.getAbsolutePath()).build(); dmitry@424: //update will initialize mirrors dmitry@424: doUpdate(root1, "4:b06a290a363b", myWorkDir); dmitry@424: doUpdate(root2, "8:b6e2d176fe8e", new File(myWorkDir, "subdir")); dmitry@424: dmitry@424: final File mirrorDir1 = myMirrorManager.getMirrorDir(repo1.getAbsolutePath()); dmitry@424: final File mirrorDir2 = myMirrorManager.getMirrorDir(repo2.getAbsolutePath()); dmitry@424: final Date mirrorDir1LastUsedTime = new Date(myMirrorManager.getLastUsedTime(mirrorDir1)); dmitry@424: final Date mirrorDir2LastUsedTime = new Date(myMirrorManager.getLastUsedTime(mirrorDir2)); dmitry@424: dmitry@424: //run build which uses root1: dmitry@424: final DirectoryCleanersProviderContext ctx = myContext.mock(DirectoryCleanersProviderContext.class); dmitry@424: myContext.checking(new Expectations(){{ dmitry@424: AgentRunningBuild build = myContext.mock(AgentRunningBuild.class, "build" + myBuildCounter++); dmitry@424: allowing(build).getVcsRootEntries(); will(returnValue(asList(new VcsRootEntry(root1, CheckoutRules.DEFAULT)))); dmitry@424: allowing(ctx).getRunningBuild(); will(returnValue(build)); dmitry@424: }}); dmitry@424: dmitry@424: //cleaner should add cleaners only for roots which are not used in the running build dmitry@424: final DirectoryCleanersRegistry registry = myContext.mock(DirectoryCleanersRegistry.class); dmitry@424: myContext.checking(new Expectations() {{ dmitry@424: never(registry).addCleaner(with(mirrorDir1), with(mirrorDir1LastUsedTime)); dmitry@424: one(registry).addCleaner(with(mirrorDir2), with(mirrorDir2LastUsedTime)); dmitry@424: }}); dmitry@424: dmitry@424: myCleaner.registerDirectoryCleaners(ctx, registry); dmitry@424: myContext.assertIsSatisfied(); dmitry@424: } dmitry@424: dmitry@424: dmitry@424: private void doUpdate(@NotNull VcsRoot vcsRoot, @NotNull String toVersion, @NotNull File workDir) throws VcsException { dmitry@424: final AgentRunningBuild build = myContext.mock(AgentRunningBuild.class, "build" + myBuildCounter++); dmitry@424: myContext.checking(new Expectations() {{ dmitry@424: allowing(build).getBuildLogger(); will(returnValue(myLogger)); dmitry@424: allowing(build).getSharedConfigParameters(); will(returnValue(new HashMap() {{ dmitry@424: put("teamcity.hg.use.local.mirrors", "true"); dmitry@424: }})); dmitry@424: }}); dmitry@424: myVcsSupport.getUpdater(vcsRoot, CheckoutRules.DEFAULT, toVersion, workDir, build, false).process(IncludeRule.createDefaultInstance(), workDir); dmitry@424: } dmitry@424: dmitry@424: }