blob: cea7238a497a75365d6af740a9386f438e968ed5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.tests.ccvs.ui;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.swt.widgets.Display;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.internal.ccvs.core.CVSException;
import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;
import org.eclipse.team.internal.core.subscribers.ActiveChangeSet;
import org.eclipse.team.internal.core.subscribers.ActiveChangeSetManager;
import org.eclipse.team.internal.core.subscribers.ChangeSet;
import org.eclipse.team.internal.core.subscribers.IChangeSetChangeListener;
import org.eclipse.team.tests.ccvs.core.EclipseTest;
import junit.framework.Test;
/**
* Tests for CVS commit sets
*/
public class CommitSetTests extends EclipseTest {
private List<ChangeSet> addedSets = new ArrayList<>();
private List<ChangeSet> removedSets = new ArrayList<>();
private IChangeSetChangeListener listener = new IChangeSetChangeListener() {
@Override
public void setAdded(ChangeSet set) {
addedSets.add(set);
}
@Override
public void setRemoved(ChangeSet set) {
removedSets.add(set);
}
@Override
public void nameChanged(ChangeSet set) {
// TODO Auto-generated method stub
}
@Override
public void defaultSetChanged(ChangeSet oldDefault, ChangeSet set) {
// TODO Auto-generated method stub
}
@Override
public void resourcesChanged(ChangeSet set, IPath[] paths) {
// TODO Auto-generated method stub
}
};
public static Test suite() {
return suite(CommitSetTests.class);
}
public CommitSetTests() {
super();
}
public CommitSetTests(String name) {
super(name);
}
/**
* Create a commit set and verify that it was created and contains the supplied files
* @param title the title of the new set
* @param files the files for the new set
* @return the newly create commit set
* @throws TeamException
*/
protected ActiveChangeSet createCommitSet(String title, IFile[] files, boolean manageSet) throws CoreException {
assertIsModified(getName(), files);
ActiveChangeSetManager manager = CVSUIPlugin.getPlugin().getChangeSetManager();
ActiveChangeSet set = manager.createSet(title, files);
assertEquals("Not all files were added to the set", files.length, set.getResources().length);
if (manageSet) {
manager.add(set);
waitForSetAddedEvent(set);
}
return set;
}
/**
* Commit the files in the given set to the repository
* and ensure that the files are in the proper state
* @param set the commit set
* @throws CVSException
*/
protected void commit(ActiveChangeSet set) throws CoreException {
boolean isManaged = setIsManaged(set);
commitResources(set.getResources(), IResource.DEPTH_ZERO);
if (isManaged) {
// Committing the set should remove it from the manager
waitForSetRemovedEvent(set);
}
}
private boolean setIsManaged(ActiveChangeSet set) {
return CVSUIPlugin.getPlugin().getChangeSetManager().contains(set);
}
private void waitForSetAddedEvent(ActiveChangeSet set) {
int count = 0;
while (count < 5) {
if (addedSets.contains(set)) {
addedSets.remove(set);
return;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// keep going
}
count++;
}
fail("Did not receive expected set added event");
}
private void waitForSetRemovedEvent(ActiveChangeSet set) {
int count = 0;
while (count < 5) {
if (removedSets.contains(set)) {
removedSets.remove(set);
return;
}
try {
while (Display.getCurrent().readAndDispatch()) {}
Thread.sleep(1000);
} catch (InterruptedException e) {
// keep going
}
count++;
}
fail("Did not receive expected set removed event");
}
@Override
protected void setUp() throws Exception {
super.setUp();
CVSUIPlugin.getPlugin().getChangeSetManager().addListener(listener);
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
CVSUIPlugin.getPlugin().getChangeSetManager().removeListener(listener);
}
/**
* Test a simple commit of a commit set. The set being committed is not managed.
* @throws CoreException
* @throws IOException
* @throws TeamException
*/
public void testSimpleCommit() throws TeamException, CoreException, IOException {
IProject project = createProject(new String[] { "changed.txt", "deleted.txt", "folder1/", "folder1/a.txt" });
setContentsAndEnsureModified(project.getFile("changed.txt"));
deleteResources(project, new String[] { "deleted.txt" }, false /* don't commit */);
addResources(project, new String[] { "added.txt" }, false /* don't commit */);
IFile[] files = new IFile[] {
project.getFile("changed.txt"),
project.getFile("deleted.txt"),
project.getFile("added.txt")};
ActiveChangeSet set = createCommitSet("testSimpleCommit", files, false /* do not manage the set */);
commit(set);
assertLocalStateEqualsRemote(project);
}
/**
* Test a managed commit of a commit set. The set being committed is managed
* and should be removed once the commit succeeds.
* @throws CoreException
* @throws IOException
* @throws TeamException
*/
public void testManagedCommit() throws TeamException, CoreException, IOException {
IProject project = createProject(new String[] { "changed.txt", "deleted.txt", "folder1/", "folder1/a.txt" });
setContentsAndEnsureModified(project.getFile("changed.txt"));
deleteResources(project, new String[] { "deleted.txt" }, false /* don't commit */);
addResources(project, new String[] { "added.txt" }, false /* don't commit */);
IFile[] files = new IFile[] {
project.getFile("changed.txt"),
project.getFile("deleted.txt"),
project.getFile("added.txt")};
ActiveChangeSet set = createCommitSet("testSimpleCommit", files, true /* manage the set */);
commit(set);
assertLocalStateEqualsRemote(project);
}
}