Package org.tmatesoft.hg.test

Source Code of org.tmatesoft.hg.test.TestIncoming

/*
* Copyright (c) 2011-2013 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 java.io.File;
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.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://hg.serpentine.com/tutorial/hello/");
//    Configuration.get().remoteServers("ssh://localhost/hg/hgtest-annotate-merge/");
//    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 = RepoUtils.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, localRepo.getWorkingDir());
    cmd.executeFull(collector);
    eh.run("hg", "incoming", "--debug", hgRemote.getLocation());
    List<Nodeid> liteResult = cmd.executeLite();
    report(collector, outParser, liteResult, errorCollector);
    return liteResult;
  }
 
  static void report(HgLogCommand.CollectHandler collector, LogOutputParser outParser, List<Nodeid> liteResult, ErrorCollectorExt errorCollector) {
    TestHistory.report("hg vs execFull", 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 execLite result", removed, equalTo(true));
    }
    errorCollector.checkThat(what + " Superfluous cset reported by execLite", set.isEmpty(), equalTo(true));
  }
}
TOP

Related Classes of org.tmatesoft.hg.test.TestIncoming

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.