# HG changeset patch # User Artem Tikhomirov # Date 1342109271 -7200 # Node ID 9c9d09111aeeccc568dbd1bfe7ed886a99501e3b # Parent c02b5710d9acc4b9fd9fa422c9d87b750f799255 Tests for file flags(exec, link, regular) diff -r c02b5710d9ac -r 9c9d09111aee build.xml --- a/build.xml Thu Jul 12 18:07:12 2012 +0200 +++ b/build.xml Thu Jul 12 18:07:51 2012 +0200 @@ -97,6 +97,8 @@ + + diff -r c02b5710d9ac -r 9c9d09111aee cmdline/org/tmatesoft/hg/console/Main.java --- a/cmdline/org/tmatesoft/hg/console/Main.java Thu Jul 12 18:07:12 2012 +0200 +++ b/cmdline/org/tmatesoft/hg/console/Main.java Thu Jul 12 18:07:51 2012 +0200 @@ -107,7 +107,6 @@ Main m = new Main(args); // m.checkWalkFileRevisions(); // m.checkSubProgress(); -// m.checkFileFlags(); // m.buildFileLog(); // m.testConsoleLog(); // m.testTreeTraversal(); @@ -172,20 +171,6 @@ s2.done(); } - private void checkFileFlags() throws Exception { - // ~/hg/test-flags repo - // TODO transform to a test once I keep test-flags in test-repos.jar - // JAR can't keep symlinks. Perhaps, a solution would be to keep repo without WC and - // perform an `hg up` before use - HgDataFile link = hgRepo.getFileNode("file-link"); - HgDataFile exec = hgRepo.getFileNode("file-exec"); - HgDataFile file = hgRepo.getFileNode("regular-file"); - System.out.println("Link: " + link.getFlags(TIP)); - System.out.println("Exec: " + exec.getFlags(TIP)); - System.out.println("File: " + file.getFlags(TIP)); - } - - private void buildFileLog() throws Exception { final long start = System.nanoTime(); HgLogCommand cmd = new HgLogCommand(hgRepo); diff -r c02b5710d9ac -r 9c9d09111aee test-data/test-repos.jar Binary file test-data/test-repos.jar has changed diff -r c02b5710d9ac -r 9c9d09111aee test/org/tmatesoft/hg/test/ErrorCollectorExt.java --- a/test/org/tmatesoft/hg/test/ErrorCollectorExt.java Thu Jul 12 18:07:12 2012 +0200 +++ b/test/org/tmatesoft/hg/test/ErrorCollectorExt.java Thu Jul 12 18:07:51 2012 +0200 @@ -52,6 +52,10 @@ }); } + public void assertFalse(final boolean value) { + assertTrue(!value); + } + public void assertTrue(final boolean value) { assertTrue(null, value); } diff -r c02b5710d9ac -r 9c9d09111aee test/org/tmatesoft/hg/test/TestFileFlags.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/org/tmatesoft/hg/test/TestFileFlags.java Thu Jul 12 18:07:51 2012 +0200 @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2012 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.junit.Assert.*; +import static org.tmatesoft.hg.repo.HgRepository.TIP; + +import java.io.File; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.tmatesoft.hg.internal.Internals; +import org.tmatesoft.hg.internal.RelativePathRewrite; +import org.tmatesoft.hg.repo.HgDataFile; +import org.tmatesoft.hg.repo.HgInternals; +import org.tmatesoft.hg.repo.HgManifest.Flags; +import org.tmatesoft.hg.repo.HgRepository; +import org.tmatesoft.hg.util.FileInfo; +import org.tmatesoft.hg.util.FileWalker; +import org.tmatesoft.hg.util.Path; +import org.tmatesoft.hg.util.PathRewrite; + +/** + * {junit-test-repos}/test-flags/ + * + *

Node, JAR can't keep symlinks. Solution would be to keep + * repo without WC and perform an `hg co -C` before use if we + * need files from working copy. + * + * @author Artem Tikhomirov + * @author TMate Software Ltd. + */ +public class TestFileFlags { + @Rule + public ErrorCollectorExt errorCollector = new ErrorCollectorExt(); + + private HgRepository repo; + + @Test + public void testFlagsInManifest() { + HgDataFile link = repo.getFileNode("file-link"); + HgDataFile exec = repo.getFileNode("file-exec"); + HgDataFile file = repo.getFileNode("regular-file"); + assertEquals(Flags.Link, link.getFlags(TIP)); + assertEquals(Flags.Exec, exec.getFlags(TIP)); + assertEquals(Flags.RegularFile, file.getFlags(TIP)); + } + + @Test + public void testFlagsInWorkingCopy() throws Exception { + File repoRoot = repo.getWorkingDir(); + Path.Source pathSrc = new Path.SimpleSource(new PathRewrite.Composite(new RelativePathRewrite(repoRoot), repo.getToRepoPathHelper())); + FileWalker fw = new FileWalker(HgInternals.getContext(repo), repoRoot, pathSrc); + + if (Internals.runningOnWindows()) { + System.out.println("Executing tests on Windows, no actual file flags in working area are checked"); + assertFalse(fw.supportsExecFlag()); + assertFalse(fw.supportsLinkFlag()); + return; + } else { + assertTrue(fw.supportsExecFlag()); + assertTrue(fw.supportsLinkFlag()); + } + ExecHelper eh = new ExecHelper(new OutputParser.Stub(true), repo.getWorkingDir()); + eh.run("hg", "checkout", "-C"); + + boolean exec, link, file; + exec = link = file = false; + while (fw.hasNext()) { + fw.next(); + FileInfo fi = fw.file(); + String fn = fw.name().toString(); + if (fn.equals("file-link")) { + link = true; + errorCollector.assertTrue("Symlink shall exist despite the fact it points to nowhere", fi.exists()); + errorCollector.assertFalse(fi.isExecutable()); + errorCollector.assertTrue(fi.isSymlink()); + } else if (fn.equals("file-exec")) { + exec = true; + errorCollector.assertTrue(fi.isExecutable()); + errorCollector.assertFalse(fi.isSymlink()); + } else if (fn.equals("regular-file")) { + file = true; + errorCollector.assertFalse(fi.isExecutable()); + errorCollector.assertFalse(fi.isSymlink()); + } + } + errorCollector.assertTrue("Missing executable file in WC", exec); + errorCollector.assertTrue("Missing symlink in WC", link); + errorCollector.assertTrue("Missing regular file in WC", file); + } + + @Before + public void assignRepo() throws Exception { + repo = Configuration.get().find("test-flags"); + } + + @After + public void cleanFiles() { + File link = new File(repo.getWorkingDir(), "file-link"); + File exec = new File(repo.getWorkingDir(), "file-exec"); + File file = new File(repo.getWorkingDir(), "regular-file"); + if (link.exists()) { + link.deleteOnExit(); + } + if (exec.exists()) { + exec.deleteOnExit(); + } + if (file.exists()) { + file.deleteOnExit(); + } + } +} diff -r c02b5710d9ac -r 9c9d09111aee test/org/tmatesoft/hg/test/TestPhases.java --- a/test/org/tmatesoft/hg/test/TestPhases.java Thu Jul 12 18:07:12 2012 +0200 +++ b/test/org/tmatesoft/hg/test/TestPhases.java Thu Jul 12 18:07:51 2012 +0200 @@ -48,7 +48,8 @@ PhasesHelper ph = new PhasesHelper(repo, null); initAndCheck(ph, expected); final long end = System.nanoTime(); - System.out.printf("Without ParentWalker (simulates log command for single file): %d ms\n", (end - start)/1000); + // μ == \u03bc + System.out.printf("Without ParentWalker (simulates log command for single file): %,d μs\n", (end - start)/1000); } @Test @@ -62,7 +63,7 @@ PhasesHelper ph = new PhasesHelper(repo, pw); initAndCheck(ph, expected); final long end = System.nanoTime(); - System.out.printf("With ParentWalker(simulates log command for whole repo): %d ms (pw init: %,d ns)\n", (end - start1)/1000, start2 - start1); + System.out.printf("With ParentWalker(simulates log command for whole repo): %,d μs (pw init: %,d ns)\n", (end - start1)/1000, start2 - start1); } private HgPhase[] initAndCheck(PhasesHelper ph, HgPhase[] expected) {