blob: d71bc8eca422c6f83e5426ec3916582c38f37b1e [file] [log] [blame]
package org.eclipse.team.tests.ccvs.core.cvsresources;
/*
* (c) Copyright IBM Corp. 2000, 2002.
* All Rights Reserved.
*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.team.ccvs.core.*;
import org.eclipse.team.ccvs.core.CVSProviderPlugin;
import org.eclipse.team.ccvs.core.CVSTag;
import org.eclipse.team.ccvs.core.ICVSFolder;
import org.eclipse.team.ccvs.core.ICVSResource;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.internal.ccvs.core.CVSException;
import org.eclipse.team.internal.ccvs.core.resources.ICVSFile;
import org.eclipse.team.internal.ccvs.core.resources.LocalFile;
import org.eclipse.team.internal.ccvs.core.resources.LocalFolder;
import org.eclipse.team.internal.ccvs.core.resources.LocalResource;
import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo;
import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo;
import org.eclipse.team.internal.ccvs.core.util.SyncFileUtil;
import org.eclipse.team.tests.ccvs.core.CVSTestSetup;
import org.eclipse.team.tests.ccvs.core.EclipseTest;
public class SynchronizerTest extends EclipseTest {
public SynchronizerTest() {
super();
}
public SynchronizerTest(String name) {
super(name);
}
public static Test suite() {
TestSuite suite = new TestSuite(SynchronizerTest.class);
return new CVSTestSetup(suite);
}
protected File getSyncFile(File parent, String syncFileName) {
return new File(SyncFileUtil.getCVSSubdirectory(parent), syncFileName);
}
protected void appendLineToFile(File file, String line) throws IOException {
BufferedReader fileReader;
List fileContentStore = new ArrayList();
if (!file.exists()) {
return;
}
String l;
fileReader = new BufferedReader(new FileReader(file));
while ((l = fileReader.readLine()) != null) {
fileContentStore.add(l);
}
fileReader.close();
String[] content = (String[]) fileContentStore.toArray(new String[fileContentStore.size()]);
String[] newContent;
newContent = new String[content.length + 1];
System.arraycopy(content,0,newContent,0,content.length);
newContent[content.length] = line;
file.delete();
BufferedWriter fileWriter;
fileWriter = new BufferedWriter(new FileWriter(file));
for (int i = 0; i<newContent.length; i++) {
fileWriter.write(newContent[i]);
fileWriter.newLine();
}
fileWriter.close();
}
public void testFolderSync() throws CoreException, CVSException {
IProject project = getUniqueTestProject("testFolderSync");
IResource[] resources = buildResources(project, new String[] {"a.txt", "folder1/", "folder1/b.txt", "folder2/", "folder2/c.txt"}, true);
ensureExistsInFileSystem(resources);
IFolder folder1 = project.getFolder("folder1");
IFolder folder2 = project.getFolder("folder2");
File folder1File = folder1.getLocation().toFile();
File folder2File = folder2.getLocation().toFile();
File projectFile = project.getLocation().toFile();
ICVSResource cvsProject = new LocalFolder(projectFile);
// 1.
try {
CVSProviderPlugin.getSynchronizer().setFolderSync(new File("dummy"), new FolderSyncInfo("repo", "root", null, false));
fail();
} catch(Exception e) {
}
// 2.
FolderSyncInfo info = new FolderSyncInfo("repo", "root", null, false);
CVSProviderPlugin.getSynchronizer().setFolderSync(projectFile, info);
assertTrue(CVSProviderPlugin.getSynchronizer().getFolderSync(projectFile).equals(info));
assertTrue(CVSProviderPlugin.getSynchronizer().members(projectFile).length == 0);
// 3.
info = new FolderSyncInfo("repo", "root", new CVSTag("v1", CVSTag.BRANCH), true);
CVSProviderPlugin.getSynchronizer().setFolderSync(folder1File, info);
assertTrue(CVSProviderPlugin.getSynchronizer().getFolderSync(folder1File).equals(info));
assertTrue(CVSProviderPlugin.getSynchronizer().members(projectFile).length == 1);
// 4.
CVSProviderPlugin.getSynchronizer().setFolderSync(folder2File, info);
assertTrue(CVSProviderPlugin.getSynchronizer().getFolderSync(folder2File).equals(info));
assertTrue(CVSProviderPlugin.getSynchronizer().members(projectFile).length == 2);
}
public void testDeleteListener() throws CoreException, CVSException, TeamException {
IProject project = createProject("testDeleteListener", new String[] {"a.txt", "folder1/", "folder1/b.txt"});
IFolder folder1 = project.getFolder("folder1");
IFile file1 = folder1.getFile("b.txt");
ICVSFolder cvsFolder = new LocalFolder(folder1.getLocation().toFile());
ICVSFolder cvsProject = new LocalFolder(project.getLocation().toFile());
ICVSFile cvsfile = new LocalFile(file1.getLocation().toFile());
// 1. delete of a folder deletes sync info deep
FolderSyncInfo info = cvsFolder.getFolderSyncInfo();
assertTrue(info!=null);
folder1.delete(true, new NullProgressMonitor());
assertTrue(cvsFolder.getFolderSyncInfo()==null);
assertTrue(cvsfile.getSyncInfo()==null);
// 2. rename of a project deletes cached sync info of source project
project.move(new Path("movedProject"), true, new NullProgressMonitor());
assertTrue(cvsProject.getFolderSyncInfo()==null);
}
public void testResourceSync() throws CVSException, CoreException, TeamException {
IProject project = createProject("testResourceSync", new String[] {"a.txt", "folder1/", "folder1/b.txt"});
IFolder folder1 = project.getFolder("folder1");
IFile file1 = project.getFile("a.txt");
IFile newFile = folder1.getFile("c.txt");
IFolder newFolder = project.getFolder("folder2");
ICVSFolder cvsFolder = new LocalFolder(folder1.getLocation().toFile());
ICVSFolder cvsNewFolder = new LocalFolder(newFolder.getLocation().toFile());
ICVSFile cvsFile = new LocalFile(file1.getLocation().toFile());
ICVSFile cvsNewFile = new LocalFile(newFile.getLocation().toFile());
ICVSFolder cvsProject = new LocalFolder(project.getLocation().toFile());
// 1.
assertTrue(!cvsProject.isManaged());
assertTrue(cvsProject.isCVSFolder());
assertTrue(cvsFile.getSyncInfo()!=null);
assertTrue(cvsFolder.getSyncInfo()!=null);
assertTrue(cvsNewFile.getSyncInfo()==null);
assertTrue(cvsNewFolder.getSyncInfo()==null);
// 2.
ResourceSyncInfo folderInfo = new ResourceSyncInfo(cvsNewFolder.getName());
ResourceSyncInfo fileInfo = new ResourceSyncInfo(cvsNewFile.getName(), "1.1", "timestamp", "-kb", null, null);
cvsNewFile.setSyncInfo(fileInfo);
cvsNewFolder.setSyncInfo(folderInfo);
assertTrue(cvsNewFile.getSyncInfo().equals(fileInfo));
assertTrue(cvsNewFolder.getSyncInfo().equals(folderInfo));
save(cvsProject);
assertTrue(cvsNewFile.getSyncInfo().equals(fileInfo));
assertTrue(cvsNewFolder.getSyncInfo().equals(folderInfo));
}
public void testReload() throws CVSException, CoreException, TeamException, IOException {
IProject project = createProject("testReload", new String[] {"a.txt", "folder1/", "folder1/b.txt", "folder2/", "folder2/folder2a/", "folder2/folder2a/b.txt", "folder3/b.txt"});
File projectFile = project.getLocation().toFile();
IFile newFile = project.getFile("b.txt");
newFile.create(getRandomContents(), true, null);
IFolder folder1 = project.getFolder("folder1");
IFolder newFolder = project.getFolder("newFolder");
newFolder.create(true, true, null);
ICVSFolder cvsProject = new LocalFolder(project.getLocation().toFile());
ICVSFile cvsNewFile = new LocalFile(newFile.getLocation().toFile());
ICVSFolder cvsNewFolder = new LocalFolder(newFolder.getLocation().toFile());
ICVSFolder cvsFolder = new LocalFolder(folder1.getLocation().toFile());
// 1. update entry from outside of synchronizer then reload
assertTrue(cvsNewFile.getSyncInfo()==null);
assertTrue(cvsNewFolder.getSyncInfo()==null);
assertTrue(cvsFolder.getFolderSyncInfo()!=null);
ResourceSyncInfo fileInfo = new ResourceSyncInfo("/b.txt/1.1/Thu Aug 30 15:31:40 2001/-kb/", null, null);
ResourceSyncInfo folderInfo = new ResourceSyncInfo("newFolder");
folder1.delete(true, true, null);
appendLineToFile(getSyncFile(project.getLocation().toFile(), SyncFileUtil.ENTRIES), fileInfo.getEntryLine(true));
appendLineToFile(getSyncFile(project.getLocation().toFile(), SyncFileUtil.ENTRIES), folderInfo.getEntryLine(true));
reload(cvsProject);
assertTrue(cvsNewFile.getSyncInfo().equals(fileInfo));
assertTrue(cvsNewFolder.getSyncInfo().equals(folderInfo));
assertTrue(cvsFolder.getFolderSyncInfo()==null);
assertTrue(new LocalFile(new File(folder1.getLocation().toFile(), "b.txt")).getSyncInfo()==null);
// 2. delete multiple directory hierarchy and reload should delete everything from cache
IFolder folder2 = project.getFolder("folder2");
IFolder folder2a = folder2.getFolder("folder2a");
ICVSFolder folder2aFile = new LocalFolder(folder2a.getLocation().toFile());
ICVSFolder folder2File = new LocalFolder(folder2.getLocation().toFile());
folder2File.unmanage();
assertTrue(folder2File.exists());
assertTrue(folder2File.getSyncInfo()==null);
assertTrue(folder2aFile.getSyncInfo()==null);
assertTrue(folder2File.getFolderSyncInfo()==null);
assertTrue(folder2File.getFolderSyncInfo()==null);
}
protected void reload(ICVSResource resource) throws CVSException {
CVSProviderPlugin.getSynchronizer().reload(((LocalResource)resource).getLocalFile(), new NullProgressMonitor());
}
protected void save(ICVSResource resource) throws CVSException {
CVSProviderPlugin.getSynchronizer().save(((LocalResource)resource).getLocalFile(), new NullProgressMonitor());
}
}