/* * SvnKitSpringTest.java * Copyright (c) 1998-2008, The University of Sheffield. * * This code is from the GATE project (http://gate.ac.uk/) and is free * software licenced under the GNU General Public License version 3. It is * distributed without any warranty. For more details see COPYING.txt in the * top level directory (or at http://gatewiki.sf.net/COPYING.txt). * * Hamish Cunningham, 9th Jan 2007 */ package gate.versioning.svnkit; import java.io.File; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.util.Map; import junit.framework.TestCase; import org.apache.log4j.Logger; import org.codehaus.groovy.grails.commons.ApplicationHolder; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; import org.springframework.core.io.FileSystemResource; import org.tmatesoft.svn.core.SVNCommitInfo; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.wc.SVNRevision; import org.tmatesoft.svn.core.wc.SVNStatus; import org.tmatesoft.svn.core.wc.SVNStatusType; import org.tmatesoft.svn.examples.wc.WorkingCopy; /** * SVNKit tests running from Spring. */ public class SvnKitSpringTest extends TestCase { /** Spring bean factory / context. */ ApplicationContext factory = ApplicationHolder.getApplication().getMainContext(); /** Spring file system context, to find stuff in the test dir */ FileSystemXmlApplicationContext fsContext = new FileSystemXmlApplicationContext(null, factory); /** The sandbox manager. */ SandboxManager sMgr = (SandboxManager) factory.getBean("sandboxManager"); /** Logger */ static Logger log = Logger.getLogger("gate.versioning.svnkit"); /** Create the test case */ public SvnKitSpringTest(String testName) { super(testName); } // some constants String testDirName = "test/scratch/svn-kit-spring-test"; String repDirName = "test/scratch/svn-kit-spring-test/test-svnrep"; String importDirName = "test/scratch/svn-kit-spring-test/import-dir"; String importFileName = "test/scratch/svn-kit-spring-test/import-dir/import-file.txt"; String coDirName = "test/scratch/svn-kit-spring-test/working-copy"; String importFileText = "This is an example file."; File testDirFile = new File(testDirName); File importDirFile = new File(importDirName); File coDirFile = new File(coDirName); /** Set up a repository, import something and check out a copy. */ public void setUp() throws Exception { log.info("============= SvnKitSpringTest.setup() ======================"); // delete any existing test directory log.info("deleting " + testDirName); if(testDirFile.exists()) gate.util.Files.rmdir(testDirFile); // create an SVN repository (also creates the test directory) log.info("creating rep " + repDirName); FileSystemResource repDirRes = (FileSystemResource) fsContext.getResource(repDirName); SVNURL repositoryURL = sMgr.createLocalRepository(repDirRes.getFile()); SVNURL trunkURL = repositoryURL.appendPath("trunk", false); log.info("trunk is: " + trunkURL); // create an import dir and populate the repository with some stuff log.info("creating import dir and file " + importFileName); WorkingCopy.createLocalDir( importDirFile, new File[] { new File(importFileName) }, new String[] { importFileText } ); Sandbox tmpSandbox = new Sandbox("","",sMgr.getConfigDir()); log.info("importing dir " + importDirName); SVNCommitInfo commitInfo = tmpSandbox.importDirectory( importDirFile, trunkURL, "test", true ); // check out a copy Sandbox sandbox = new Sandbox("","",sMgr.getConfigDir()); sandbox.checkout(trunkURL, SVNRevision.HEAD, coDirFile, true); log.info("============================================================="); } // setUp() /** * Test the API in the way the interactions with the other beans will work. */ public void testVersioning() throws Exception { log.info("============= SvnKitSpringTest.springVersioning() ==========="); boolean status; // ask spring for a resource representing the checked out working copy // from setUp() FileSystemResource sbRes = (FileSystemResource) fsContext.getResource(coDirName); assertTrue(coDirName + " is not a dir", sbRes.getFile().isDirectory()); // isSandboxDir FileSystemResource tdRes = (FileSystemResource) fsContext.getResource(testDirName); status = sMgr.isSandboxDir(tdRes.getFile()); assertTrue(testDirName + " is a sandbox but shouldn't be", ! status); status = sMgr.isSandboxDir(sbRes.getFile()); assertTrue(coDirName + " is not a sandbox", status); // add the sandbox to the manager log.info("adding sandbox for " + coDirName); status = sMgr.addSandbox(sbRes.getFile(),"",""); assertTrue("sandbox add failed", status); assertEquals("wrong number of sandboxes", 1, sMgr.getSandboxList().size()); // adding it again should do nothing log.info("adding again"); status = sMgr.addSandbox(sbRes.getFile(),"",""); assertTrue("sandbox add succeeded", ! status); assertEquals( "wrong number of sandboxes (B)", 1, sMgr.getSandboxList().size() ); // forget, add again log.info("forgetting"); sMgr.forgetSandbox(sbRes.getFile()); assertEquals( "wrong number of sandboxes (C)", 0, sMgr.getSandboxList().size() ); status = sMgr.addSandbox(sbRes.getFile(),"",""); assertTrue("sandbox add failed (B)", status); // get the sandbox log.info("getting"); Sandbox sb = sMgr.getSandbox(sMgr.getSandboxId(sbRes.getFile())); assertNotNull("sandbox is null", sb); // get the sandbox map log.info("getting the sandbox map"); Map<String, Sandbox> sbMap = sMgr.getSandboxMap(); assertNotNull("sandbox map is null", sbMap); assertEquals( "wrong number of sandboxes (C)", 1, sMgr.getSandboxMap().size() ); sb = sbMap.get(sMgr.getSandboxId(sbRes.getFile())); assertNotNull("sandbox is null (b)", sb); // do status SVNStatus svnStatus = sb.doStatus(sbRes.getFile(), true); log.debug("getFile().getName() = " + svnStatus.getFile().getName()); SVNStatusType contentsStatus = svnStatus.getContentsStatus(); logStatus(contentsStatus); // add a file and do status File testFile = new File(sbRes.getFile(), "test.txt"); FileWriter fos = null; try { fos = new FileWriter(testFile); fos.write("lsdsldflsdfl\n"); } catch (FileNotFoundException fnfe) { log.error("the file '" + testFile.getAbsolutePath() + "' not found", fnfe); } catch (IOException ioe) { log.error("error writing file '" + testFile.getAbsolutePath() + "'", ioe); } finally { if (fos != null) try { fos.close(); } catch (IOException ioe) { } } sb.addEntry(testFile); svnStatus = sb.doStatus(testFile, true); contentsStatus = svnStatus.getContentsStatus(); logStatus(contentsStatus); SVNCommitInfo[] commInfo = sb.commit(new File[] {testFile}, false, "added"); assertEquals("Wrong number of SVNCommitInfos returned by commit", 1, commInfo.length); long committedRevision = commInfo[0].getNewRevision(); log.debug("committed to revision " + committedRevision); svnStatus = sb.doStatus(testFile, true); contentsStatus = svnStatus.getContentsStatus(); logStatus(contentsStatus); long currentRevision = svnStatus.getRevision().getNumber(); log.debug("current revision = " + currentRevision); long updatedRevision = sb.update(testFile, SVNRevision.HEAD, true); log.debug("updated to revision " + updatedRevision); log.info("============================================================="); } // testVersioning() public void logStatus(SVNStatusType contentsStatus) { if(contentsStatus == SVNStatusType.STATUS_MODIFIED) { log.debug("contentStatus=MODIFIED"); } else if(contentsStatus == SVNStatusType.STATUS_CONFLICTED) { log.debug("contentStatus=CONFLICTED"); } else if(contentsStatus == SVNStatusType.STATUS_DELETED) { log.debug("contentStatus=DELETED"); } else if(contentsStatus == SVNStatusType.STATUS_ADDED) { log.debug("contentStatus=ADDED"); } else if(contentsStatus == SVNStatusType.STATUS_UNVERSIONED) { log.debug("contentStatus=UNVERSIONED"); } else if(contentsStatus == SVNStatusType.STATUS_EXTERNAL) { log.debug("contentStatus=EXTERNAL"); } else if(contentsStatus == SVNStatusType.STATUS_IGNORED) { log.debug("contentStatus=IGNORED"); } else if(contentsStatus == SVNStatusType.STATUS_MISSING) { log.debug("contentStatus=MISSING"); } else if(contentsStatus == SVNStatusType.STATUS_INCOMPLETE) { log.debug("contentStatus=INCOMPLETE"); } else if(contentsStatus == SVNStatusType.STATUS_OBSTRUCTED) { log.debug("contentStatus=OBSTRUCTED"); } else if(contentsStatus == SVNStatusType.STATUS_REPLACED) { log.debug("contentStatus=REPLACED"); } else if(contentsStatus == SVNStatusType.STATUS_NONE) { log.debug("contentStatus=NONE"); } else if(contentsStatus == SVNStatusType.STATUS_NORMAL) { log.debug("contentStatus=NORMAL"); } } // logStatus(SVNStatusType) } // SvnKitSpringTest