Mercurial > hg4j
diff test/org/tmatesoft/hg/test/TestIncoming.java @ 202:706bcc7cfee4
Basic test for HgIncomingCommand. Fix RepositoryComparator for cases when whole repository is unknown. Respect freshly initialized (empty) repositories in general.
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Tue, 26 Apr 2011 02:50:06 +0200 |
parents | |
children | 66fd2c73c56f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/org/tmatesoft/hg/test/TestIncoming.java Tue Apr 26 02:50:06 2011 +0200 @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2011 TMate Software Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * For information on how to redistribute this software under + * the terms of a license other than GNU General Public License + * contact TMate Software at support@hg4j.com + */ +package org.tmatesoft.hg.test; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.tmatesoft.hg.internal.RequiresFile.*; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; + +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.tmatesoft.hg.core.HgChangeset; +import org.tmatesoft.hg.core.HgIncomingCommand; +import org.tmatesoft.hg.core.HgLogCommand; +import org.tmatesoft.hg.core.Nodeid; +import org.tmatesoft.hg.internal.Internals; +import org.tmatesoft.hg.repo.HgLookup; +import org.tmatesoft.hg.repo.HgRemoteRepository; +import org.tmatesoft.hg.repo.HgRepository; + +/** + * + * @author Artem Tikhomirov + * @author TMate Software Ltd. + */ +public class TestIncoming { + + @Rule + public ErrorCollectorExt errorCollector = new ErrorCollectorExt(); + + public static void main(String[] args) throws Throwable { + Configuration.get().remoteServers("http://localhost:8000/"); + TestIncoming t = new TestIncoming(); + t.testSimple(); + t.errorCollector.verify(); + } + + public TestIncoming() { +// Configuration.get().remoteServers("http://localhost:8000/"); + } + + @Test + public void testSimple() throws Exception { + int x = 0; + HgLookup lookup = new HgLookup(); + for (HgRemoteRepository hgRemote : Configuration.get().allRemote()) { + File dest = initEmptyTempRepo("test-incoming-" + x++); + HgRepository localRepo = lookup.detect(dest); + // Idea: + // hg in, hg4j in, compare + // hg pull total/2 + // hg in, hg4j in, compare + List<Nodeid> incoming = runAndCompareIncoming(localRepo, hgRemote); + Assert.assertTrue("Need remote repository of reasonable size to test incoming command for partially filled case", incoming.size() > 5); + // + Nodeid median = incoming.get(incoming.size() / 2); + System.out.println("About to pull up to revision " + median.shortNotation()); + new ExecHelper(new OutputParser.Stub(), dest).run("hg", "pull", "-r", median.toString(), hgRemote.getLocation()); + // + // shall re-read repository to pull up new changes + localRepo = lookup.detect(dest); + runAndCompareIncoming(localRepo, hgRemote); + } + } + + private List<Nodeid> runAndCompareIncoming(HgRepository localRepo, HgRemoteRepository hgRemote) throws Exception { + // need new command instance as subsequence exec[Lite|Full] on the same command would yield same result, + // regardless of the pull in between. + HgIncomingCommand cmd = new HgIncomingCommand(localRepo); + cmd.against(hgRemote); + HgLogCommand.CollectHandler collector = new HgLogCommand.CollectHandler(); + LogOutputParser outParser = new LogOutputParser(true); + ExecHelper eh = new ExecHelper(outParser, new File(localRepo.getLocation())); + cmd.executeFull(collector); + eh.run("hg", "incoming", "--debug", hgRemote.getLocation()); + List<Nodeid> liteResult = cmd.executeLite(null); + report(collector, outParser, liteResult); + return liteResult; + } + + private void report(HgLogCommand.CollectHandler collector, LogOutputParser outParser, List<Nodeid> liteResult) { + TestHistory.report("hg in - against blank repo", collector.getChanges(), outParser.getResult(), false, errorCollector); + // + ArrayList<Nodeid> expected = new ArrayList<Nodeid>(outParser.getResult().size()); + for (LogOutputParser.Record r : outParser.getResult()) { + Nodeid nid = Nodeid.fromAscii(r.changesetNodeid); + expected.add(nid); + } + checkNodeids("hg vs execLite:", liteResult, expected, errorCollector); + // + expected = new ArrayList<Nodeid>(outParser.getResult().size()); + for (HgChangeset cs : collector.getChanges()) { + expected.add(cs.getNodeid()); + } + checkNodeids("execFull vs execLite:", liteResult, expected, errorCollector); + } + + static void checkNodeids(String what, List<Nodeid> liteResult, List<Nodeid> expected, ErrorCollectorExt errorCollector) { + HashSet<Nodeid> set = new HashSet<Nodeid>(liteResult); + for (Nodeid nid : expected) { + boolean removed = set.remove(nid); + errorCollector.checkThat(what + " Missing " + nid.shortNotation() + " in HgIncomingCommand.execLite result", removed, equalTo(true)); + } + errorCollector.checkThat(what + " Superfluous cset reported by HgIncomingCommand.execLite", set.isEmpty(), equalTo(true)); + } + + static File initEmptyTempRepo(String dirName) throws IOException { + File dest = new File(Configuration.get().getTempDir(), dirName); + if (dest.exists()) { + TestClone.rmdir(dest); + } + dest.mkdirs(); + Internals implHelper = new Internals(); + implHelper.setStorageConfig(1, STORE | FNCACHE | DOTENCODE); + implHelper.initEmptyRepository(new File(dest, ".hg")); + return dest; + } +}