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