tikhomirov@668: /* tikhomirov@668: * Copyright (c) 2013 TMate Software Ltd tikhomirov@668: * tikhomirov@668: * This program is free software; you can redistribute it and/or modify tikhomirov@668: * it under the terms of the GNU General Public License as published by tikhomirov@668: * the Free Software Foundation; version 2 of the License. tikhomirov@668: * tikhomirov@668: * This program is distributed in the hope that it will be useful, tikhomirov@668: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@668: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@668: * GNU General Public License for more details. tikhomirov@668: * tikhomirov@668: * For information on how to redistribute this software under tikhomirov@668: * the terms of a license other than GNU General Public License tikhomirov@668: * contact TMate Software at support@hg4j.com tikhomirov@668: */ tikhomirov@668: package org.tmatesoft.hg.test; tikhomirov@668: tikhomirov@668: import static org.junit.Assert.*; tikhomirov@668: tikhomirov@668: import java.io.File; tikhomirov@668: import java.util.ArrayList; tikhomirov@668: import java.util.Arrays; tikhomirov@668: import java.util.Collections; tikhomirov@668: import java.util.HashMap; tikhomirov@668: import java.util.List; tikhomirov@668: import java.util.Map; tikhomirov@668: tikhomirov@668: import org.junit.Rule; tikhomirov@668: import org.junit.Test; tikhomirov@668: import org.tmatesoft.hg.core.Nodeid; tikhomirov@668: import org.tmatesoft.hg.internal.BundleGenerator; tikhomirov@668: import org.tmatesoft.hg.repo.HgBundle; tikhomirov@668: import org.tmatesoft.hg.repo.HgBundle.GroupElement; tikhomirov@668: import org.tmatesoft.hg.repo.HgInternals; tikhomirov@668: import org.tmatesoft.hg.repo.HgLookup; tikhomirov@668: import org.tmatesoft.hg.repo.HgRepository; tikhomirov@668: import org.tmatesoft.hg.repo.HgRuntimeException; tikhomirov@668: tikhomirov@668: /** tikhomirov@668: * tikhomirov@668: * @author Artem Tikhomirov tikhomirov@668: * @author TMate Software Ltd. tikhomirov@668: */ tikhomirov@668: public class TestBundle { tikhomirov@668: @Rule tikhomirov@668: public ErrorCollectorExt errorCollector = new ErrorCollectorExt(); tikhomirov@668: tikhomirov@668: @Test tikhomirov@668: public void testCreateBundle() throws Exception { tikhomirov@668: final HgRepository hgRepo = Configuration.get().own(); tikhomirov@668: BundleGenerator bg = new BundleGenerator(HgInternals.getImplementationRepo(hgRepo)); tikhomirov@668: ArrayList l = new ArrayList(); tikhomirov@668: l.add(Nodeid.fromAscii("9ef1fab9f5e3d51d70941121dc27410e28069c2d")); // 640 tikhomirov@668: l.add(Nodeid.fromAscii("2f33f102a8fa59274a27ebbe1c2903cecac6c5d5")); // 639 tikhomirov@668: l.add(Nodeid.fromAscii("d074971287478f69ab0a64176ce2284d8c1e91c3")); // 638 tikhomirov@668: File bundleFile = bg.create(l); tikhomirov@668: HgBundle b = new HgLookup().loadBundle(bundleFile); tikhomirov@668: // tikhomirov@668: DumbInspector insp = new DumbInspector(); tikhomirov@668: b.inspectChangelog(insp); tikhomirov@668: errorCollector.assertTrue(insp.clogEnter && insp.clogExit); tikhomirov@668: errorCollector.assertFalse(insp.csets.isEmpty()); tikhomirov@668: errorCollector.assertFalse(insp.manifestEnter || insp.manifestExit); tikhomirov@668: Collections.sort(l); tikhomirov@668: Collections.sort(insp.csets); tikhomirov@668: errorCollector.assertEquals(l, insp.csets); tikhomirov@668: errorCollector.assertEquals(0, insp.filesEnter); tikhomirov@668: errorCollector.assertEquals(0, insp.filesExit); tikhomirov@668: errorCollector.assertTrue(insp.manifests == null || insp.manifests.isEmpty()); tikhomirov@668: errorCollector.assertTrue(insp.files.isEmpty()); tikhomirov@668: // tikhomirov@668: insp = new DumbInspector(); tikhomirov@668: b.inspectFiles(insp); tikhomirov@668: errorCollector.assertFalse(insp.clogEnter && insp.clogExit); tikhomirov@668: errorCollector.assertFalse(insp.manifestEnter || insp.manifestExit); tikhomirov@668: // $ hg log -r 638:640 --debug | grep files tikhomirov@668: List affectedFiles = Arrays.asList("src/org/tmatesoft/hg/repo/HgDataFile.java", "COPYING", "build.gradle", ".hgtags"); tikhomirov@668: // "src/org/tmatesoft/hg/repo/HgBlameInspector.java" was deleted in r638 and hence not part of the bundle tikhomirov@668: ArrayList foundFiles = new ArrayList(insp.files.keySet()); tikhomirov@668: Collections.sort(affectedFiles); tikhomirov@668: Collections.sort(foundFiles); tikhomirov@668: errorCollector.assertEquals(affectedFiles, foundFiles); tikhomirov@668: errorCollector.assertEquals(affectedFiles.size(), insp.filesEnter); tikhomirov@668: errorCollector.assertEquals(affectedFiles.size(), insp.filesExit); tikhomirov@668: b.unlink(); tikhomirov@668: } tikhomirov@668: tikhomirov@668: private static class DumbInspector implements HgBundle.Inspector { tikhomirov@668: public boolean clogEnter, clogExit, manifestEnter, manifestExit; tikhomirov@668: public int filesEnter, filesExit; tikhomirov@668: public List csets, manifests; tikhomirov@668: public Map> files = new HashMap>(); tikhomirov@668: private List actual; tikhomirov@668: tikhomirov@668: public void changelogStart() throws HgRuntimeException { tikhomirov@668: assertFalse(clogEnter); tikhomirov@668: assertFalse(clogExit); tikhomirov@668: clogEnter = true; tikhomirov@668: actual = csets = new ArrayList(); tikhomirov@668: } tikhomirov@668: tikhomirov@668: public void changelogEnd() throws HgRuntimeException { tikhomirov@668: assertTrue(clogEnter); tikhomirov@668: assertFalse(clogExit); tikhomirov@668: clogExit = true; tikhomirov@668: actual = null; tikhomirov@668: } tikhomirov@668: tikhomirov@668: public void manifestStart() throws HgRuntimeException { tikhomirov@668: assertFalse(manifestEnter); tikhomirov@668: assertFalse(manifestExit); tikhomirov@668: manifestEnter = true; tikhomirov@668: actual = manifests = new ArrayList(); tikhomirov@668: } tikhomirov@668: tikhomirov@668: public void manifestEnd() throws HgRuntimeException { tikhomirov@668: assertTrue(manifestEnter); tikhomirov@668: assertFalse(manifestExit); tikhomirov@668: manifestExit = true; tikhomirov@668: actual = null; tikhomirov@668: } tikhomirov@668: tikhomirov@668: public void fileStart(String name) throws HgRuntimeException { tikhomirov@668: assertEquals(filesEnter, filesExit); tikhomirov@668: filesEnter++; tikhomirov@668: files.put(name, actual = new ArrayList()); tikhomirov@668: } tikhomirov@668: tikhomirov@668: public void fileEnd(String name) throws HgRuntimeException { tikhomirov@668: assertEquals(filesEnter, 1 + filesExit); tikhomirov@668: filesExit++; tikhomirov@668: actual = null; tikhomirov@668: } tikhomirov@668: tikhomirov@668: public boolean element(GroupElement element) throws HgRuntimeException { tikhomirov@668: actual.add(element.node()); tikhomirov@668: return true; tikhomirov@668: } tikhomirov@668: } tikhomirov@668: }