Mercurial > hg4j
diff test/org/tmatesoft/hg/test/TestFileFlags.java @ 477:9c9d09111aee
Tests for file flags(exec, link, regular)
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Thu, 12 Jul 2012 18:07:51 +0200 |
parents | |
children | 59b7c817bc4d |
line wrap: on
line diff
--- /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/ + * + * <p>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(); + } + } +}