package org.tmatesoft.svn.test;
import java.util.HashMap;
import java.util.Map;
import junit.framework.Assert;
import org.junit.Test;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNLock;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.BasicAuthenticationManager;
import org.tmatesoft.svn.core.auth.SVNAuthentication;
import org.tmatesoft.svn.core.auth.SVNUserNameAuthentication;
import org.tmatesoft.svn.core.internal.io.fs.FSCommitter;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.wc2.SvnOperationFactory;
public class AutoUnlockTest {
@Test
public void testAutoUnlock() throws Exception {
final TestOptions options = TestOptions.getInstance();
final SvnOperationFactory svnOperationFactory = new SvnOperationFactory();
final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testAutoUnlock", options);
try {
final SVNURL url = sandbox.createSvnRepository();
final CommitBuilder commitBuilder = new CommitBuilder(url);
commitBuilder.addDirectory("directory");
commitBuilder.addFile("directory/file.txt", "contents".getBytes());
commitBuilder.commit();
// lock by user 1
final SVNRepository svnRepository = svnOperationFactory.getRepositoryPool().createRepository(url, true);
svnRepository.setAuthenticationManager(new BasicAuthenticationManager(new SVNAuthentication[] { new SVNUserNameAuthentication("user1", false, url, false), }));
Map<String, Long> pathsToRevisions = new HashMap<String, Long>();
pathsToRevisions.put("directory/file.txt", 1l);
svnRepository.lock(pathsToRevisions, null, false, null);
SVNLock lock = svnRepository.getLock("directory/file.txt");
Assert.assertNotNull(lock);
Assert.assertNotNull(lock.getID());
Assert.assertEquals("user1", lock.getOwner());
// will fail.
final CommitBuilder commitBuilder2 = new CommitBuilder(url);
commitBuilder2.setAuthenticationManager(new BasicAuthenticationManager(new SVNAuthentication[] { new SVNUserNameAuthentication("user2", false, url, false), }));
try {
commitBuilder2.changeFile("directory/file.txt", "new contents".getBytes());
commitBuilder2.commit();
Assert.fail();
} catch (SVNException e) {
}
lock = svnRepository.getLock("directory/file.txt");
Assert.assertNotNull(lock);
Assert.assertNotNull(lock.getID());
Assert.assertEquals("user1", lock.getOwner());
// now
FSCommitter.setAutoUnlock(true);
final CommitBuilder commitBuilder3 = new CommitBuilder(url);
commitBuilder3.changeFile("directory/file.txt", "new contents".getBytes());
commitBuilder3.commit();
lock = svnRepository.getLock("directory/file.txt");
Assert.assertNull(lock);
} finally {
FSCommitter.setAutoUnlock(false);
svnOperationFactory.dispose();
sandbox.dispose();
}
}
@Test
public void testRemoveLockInDeletedDirectory() throws Exception {
final TestOptions options = TestOptions.getInstance();
final SvnOperationFactory svnOperationFactory = new SvnOperationFactory();
final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testRemoveLockInDeletedDirectory", options);
SVNRepository svnRepository = null;
try {
final SVNURL url = sandbox.createSvnRepository();
final CommitBuilder commitBuilder1 = new CommitBuilder(url);
commitBuilder1.addDirectory("directory");
commitBuilder1.addFile("directory/file.txt", "contents".getBytes());
commitBuilder1.commit();
svnRepository = SVNRepositoryFactory.create(url);
svnRepository.setAuthenticationManager(new BasicAuthenticationManager("username", "password"));
final Map<String, Long> pathsToRevisions = new HashMap<String, Long>();
pathsToRevisions.put("directory/file.txt", 1l);
svnRepository.lock(pathsToRevisions, "locked", false, null);
FSCommitter.setAutoUnlock(true);
final CommitBuilder commitBuilder2 = new CommitBuilder(url);
commitBuilder2.replaceDirectoryByCopying("directory", "directory");
commitBuilder2.changeFile("directory/file.txt", "changed contents".getBytes());
commitBuilder2.commit();
final SVNLock lock = svnRepository.getLock("directory/file.txt");
Assert.assertNull(lock);
} finally {
if (svnRepository != null) {
svnRepository.closeSession();
}
FSCommitter.setAutoUnlock(false);
svnOperationFactory.dispose();
sandbox.dispose();
}
}
private String getTestName() {
return "AutoUnlockTest";
}
}