blob: 7b881e10cf87c6ffadd31ccd48491e31a47480ef [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2010 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.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.core.resources.IProject;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.team.internal.ccvs.core.CVSProjectSetCapability;
import org.eclipse.team.internal.ccvs.core.CVSRepositoryLocationMatcher;
import org.eclipse.team.internal.ccvs.core.ICVSRepositoryLocation;
import org.eclipse.team.internal.ccvs.core.connection.CVSRepositoryLocation;
import org.eclipse.team.internal.ccvs.core.util.KnownRepositories;
import org.eclipse.team.internal.ccvs.ui.ConfigureRepositoryLocationsDialog;
/**
* This class tests an algorithm which suggests alternative repository locations
* when importing a project set.
*/
public class CVSProjectSetImportTest extends TestCase {
private KnownRepositories knownRepositories;
private ICVSRepositoryLocation[] savedRepositories;
public CVSProjectSetImportTest() {
super();
}
public CVSProjectSetImportTest(String name) {
super(name);
}
public static Test suite() {
return new TestSuite(CVSProjectSetImportTest.class);
}
protected void setUp() throws Exception {
super.setUp();
knownRepositories = KnownRepositories.getInstance();
savedRepositories = knownRepositories.getRepositories();
// dispose all known repositories
for (ICVSRepositoryLocation savedRepository : savedRepositories) {
knownRepositories.disposeRepository(savedRepository);
}
}
// Tests of the Alternative Map. The map contains suggested, alternative
// repositories. It's used to create combo-boxes on the Import Project Set
// dialog.
public void testEmptyInfoMap() {
IProject[] projects = new IProject[] { null };
Map infoMap = new HashMap();
Map alternativeMap = CVSRepositoryLocationMatcher
.prepareSuggestedRepositoryLocations(projects, infoMap);
assertNull(alternativeMap);
assertEquals(0, knownRepositories.getRepositories().length);
}
public void testEmptyReferenceStrings() throws Exception {
_testPrepareSuggestedRepositoryLocations(new String[] {}, new String[] {}, new String[][] { {} });
// There is nothing we can suggest.
}
public void testMalformedReferenceString() throws Exception {
_testPrepareSuggestedRepositoryLocations(new String[] {},
new String[] { "Hi, I'm a malformed reference string." }, new String[][] { {} });
}
public void testUnknownSingleReferenceString() throws Exception {
_testPrepareSuggestedRepositoryLocations(
new String[] {},
new String[] { "1.0,:pserver:dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh" },
new String[][] { { ":pserver:dev.eclipse.org:/cvsroot/eclipse" } });
}
public void testSelectionForUnknownSingleReferenceString() throws Exception {
_testDialogDefaultSelection(
new String[] {},
new String[] { "1.0,:pserver:dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh" },
new String[] { ":pserver:dev.eclipse.org:/cvsroot/eclipse" });
}
public void testKnownSingleReferenceString() throws Exception {
_testPrepareSuggestedRepositoryLocations(
new String[] { ":pserver:dev.eclipse.org:/cvsroot/eclipse" },
new String[] { "1.0,:pserver:dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh" },
new String[][] { {} });
}
// test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=199108
public void testSingleKnownRepositoryWithUsername() throws Exception {
_testPrepareSuggestedRepositoryLocations(
new String[] { ":pserver:joe@dev.eclipse.org:/cvsroot/eclipse" },
new String[] {
"1.0,:pserver:dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh",
"1.0,:extssh:dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.tests.cvs.core,org.eclipse.team.tests.cvs.core" },
new String[][] {
{ ":pserver:joe@dev.eclipse.org:/cvsroot/eclipse" },
{ ":extssh:dev.eclipse.org:/cvsroot/eclipse",
":pserver:joe@dev.eclipse.org:/cvsroot/eclipse" } });
}
public void testSingleKnownRepositoryMatchesTwoReferenceStrings() throws Exception {
_testPrepareSuggestedRepositoryLocations(
new String[] { ":pserver:joe@dev.eclipse.org:/cvsroot/eclipse" },
new String[] {
"1.0,:pserver:dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh",
"1.0,:pserver:dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.tests.cvs.core,org.eclipse.team.tests.cvs.core" },
new String[][] {
{ ":pserver:joe@dev.eclipse.org:/cvsroot/eclipse" },
{ ":pserver:joe@dev.eclipse.org:/cvsroot/eclipse" } });
}
public void testOneMatchingReferenceString() throws Exception {
_testPrepareSuggestedRepositoryLocations(
new String[] { ":pserver:joe@dev.eclipse.org:/cvsroot/eclipse" },
new String[] {
"1.0,:pserver:dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh",
"1.0,:extssh:dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.tests.cvs.core,org.eclipse.team.tests.cvs.core" },
new String[][] {
{ ":pserver:joe@dev.eclipse.org:/cvsroot/eclipse" },
{ ":extssh:dev.eclipse.org:/cvsroot/eclipse",
":pserver:joe@dev.eclipse.org:/cvsroot/eclipse" } });
}
public void testTwoMatchingKnownRepositories() throws Exception {
_testPrepareSuggestedRepositoryLocations(
new String[] { ":pserver:joe@dev.eclipse.org:/cvsroot/eclipse",
":pserver:ann@dev.eclipse.org:/cvsroot/eclipse" },
new String[] { "1.0,:pserver:dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh" },
new String[][] { {
":pserver:ann@dev.eclipse.org:/cvsroot/eclipse",
":pserver:joe@dev.eclipse.org:/cvsroot/eclipse" } });
}
public void testThreeKindsOfSuggestions() throws Exception {
_testPrepareSuggestedRepositoryLocations(
new String[] { ":pserver:dev.eclipse.org:/cvsroot/eclipse",
":pserver:localhost:/cvsroot/project" },
new String[] { "1.0,:extssh:dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh" },
new String[][] { {
":extssh:dev.eclipse.org:/cvsroot/eclipse",
":pserver:dev.eclipse.org:/cvsroot/eclipse",
":pserver:localhost:/cvsroot/project" } });
}
public void testOneCompatibleOfTwoKnown() throws Exception {
_testPrepareSuggestedRepositoryLocations(
new String[] { ":pserver:dev.eclipse.org:/cvsroot/eclipse",
":pserver:joe@dev.eclipse.org:/cvsroot/TECHNOLOGY" },
new String[] { "1.0,:extssh:joe@dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh" },
new String[][] { {
":extssh:joe@dev.eclipse.org:/cvsroot/eclipse",
":pserver:dev.eclipse.org:/cvsroot/eclipse",
":pserver:joe@dev.eclipse.org:/cvsroot/TECHNOLOGY" } });
}
public void testTwoUnknownOneCompatibleReferenceStrings() throws Exception {
_testPrepareSuggestedRepositoryLocations(
new String[] { ":extssh:dev.eclipse.org:/cvsroot/eclipse" },
new String[] {
"1.0,:ext:dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh",
"1.0,:pserver:dev.eclipse.org:/cvsroot/TECHNOLOGY,org.eclipse.team.tests.cvs.core,org.eclipse.team.tests.cvs.core" },
new String[][] {
{ ":ext:dev.eclipse.org:/cvsroot/eclipse",
":extssh:dev.eclipse.org:/cvsroot/eclipse" },
{ ":pserver:dev.eclipse.org:/cvsroot/TECHNOLOGY",
":extssh:dev.eclipse.org:/cvsroot/eclipse" } });
}
public void testSelectionForTwoUnknownOneCompatibleReferenceStrings()
throws Exception {
_testDialogDefaultSelection(
new String[] { ":extssh:dev.eclipse.org:/cvsroot/eclipse" },
new String[] {
"1.0,:ext:dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh",
"1.0,:pserver:dev.eclipse.org:/cvsroot/TECHNOLOGY,org.eclipse.team.tests.cvs.core,org.eclipse.team.tests.cvs.core" },
new String[] { ":extssh:dev.eclipse.org:/cvsroot/eclipse",
":pserver:dev.eclipse.org:/cvsroot/TECHNOLOGY" });
}
public void testSelectionForOneCompatibleOfTwoKnown() throws Exception {
_testDialogDefaultSelection(
new String[] { ":pserver:dev.eclipse.org:/cvsroot/eclipse",
":pserver:joe@dev.eclipse.org:/cvsroot/technology" },
new String[] { "1.0,:extssh:joe@dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh" },
new String[] { ":pserver:dev.eclipse.org:/cvsroot/eclipse" });
}
public void testCompatibleSuggestionsOrder() throws Exception {
_testPrepareSuggestedRepositoryLocations(
new String[] { ":pserver:dev.eclipse.org:/cvsroot/eclipse",
":extssh:dev.eclipse.org:/cvsroot/eclipse",
":ext:dev.eclipse.org:/cvsroot/eclipse" },
new String[] { "1.0,:pserverssh2:dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh" },
new String[][] { {
":pserverssh2:dev.eclipse.org:/cvsroot/eclipse",
":extssh:dev.eclipse.org:/cvsroot/eclipse",
":pserver:dev.eclipse.org:/cvsroot/eclipse",
":ext:dev.eclipse.org:/cvsroot/eclipse" } });
}
public void testSelectionForCompatibleSuggestionsOrder() throws Exception {
_testDialogDefaultSelection(
new String[] { ":ext:dev.eclipse.org:/cvsroot/eclipse",
":extssh:dev.eclipse.org:/cvsroot/eclipse",
":pserver:dev.eclipse.org:/cvsroot/eclipse" },
new String[] { "1.0,:pserverssh2:dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.tests.cvs.core,org.eclipse.team.tests.cvs.core" },
new String[] { ":extssh:dev.eclipse.org:/cvsroot/eclipse" });
}
public void testCompatibleSuggestionsOrder2() throws Exception {
_testPrepareSuggestedRepositoryLocations(
new String[] { ":ext:dev.eclipse.org:/cvsroot/eclipse",
":extssh:dev.eclipse.org:/cvsroot/eclipse",
":pserver:dev.eclipse.org:/cvsroot/eclipse" },
new String[] {
"1.0,:pserver:dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh",
"1.0,:pserverssh2:dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.tests.cvs.core,org.eclipse.team.tests.cvs.core" },
new String[][] {
{ ":pserver:dev.eclipse.org:/cvsroot/eclipse" },
{ ":pserverssh2:dev.eclipse.org:/cvsroot/eclipse",
":extssh:dev.eclipse.org:/cvsroot/eclipse",
":pserver:dev.eclipse.org:/cvsroot/eclipse",
":ext:dev.eclipse.org:/cvsroot/eclipse" } });
}
public void testSelectionForOnlyOneReferenceStringNeedsAdditionalInfo()
throws Exception {
_testDialogDefaultSelection(
new String[] { ":pserver:dev.eclipse.org:/cvsroot/eclipse" },
new String[] {
"1.0,:pserver:dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.tests.cvs.core,org.eclipse.team.tests.cvs.core",
"1.0,:extssh:dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.tests.cvs.core,org.eclipse.team.tests.cvs.core" },
new String[] { null,
":pserver:dev.eclipse.org:/cvsroot/eclipse" });
}
public void testSelectionForUnknownReferenceString() throws Exception {
_testDialogDefaultSelection(
new String[] { ":pserver:LOCALHOST:/cvsroot/path" },
new String[] { "1.0,:pserver:dev.eclipse.org:/cvsroot/eclipse,org.eclipse.team.tests.cvs.core,org.eclipse.team.tests.cvs.core" },
new String[] { ":pserver:dev.eclipse.org:/cvsroot/eclipse" });
}
/**
* The main method to test the
* <code>CVSProjectSetCapability.isAdditionalRepositoryInformationRequired</code>
* method.
*
* @param knownLocations
* Array of known repositories as strings. The format used:
* <p>
* <code>:method:[[user][:password]@]hostname[:[port]]/path/to/repository</code>
* </p>
* @param referenceStrings
* Array of reference strings as they would exist in a project
* set. The valid format is:
* <p>
* <code>1.0,:method:[[user][:password]@]hostname[:[port]]/path/to/repository,project.name,module.name[,tagname]</code>
* </p>
* @param expectedSuggestions
* Two-dimensional array of expected suggestions. Each entry of
* the array will be matched against actual suggestion from the
* alternative map.
* @throws Exception
*/
private void _testPrepareSuggestedRepositoryLocations(String[] knownLocations,
String[] referenceStrings, String[][] expectedSuggestions) throws Exception {
for (String knownLocation : knownLocations) {
knownRepositories.addRepository(CVSRepositoryLocation.fromString(knownLocation), false);
}
Map infoMap = new HashMap(referenceStrings.length);
IProject[] projects = CVSProjectSetCapability.asProjects(
referenceStrings, infoMap);
Map/* <IProject, List<ICVSRepositoryLocation>> */suggestedRepositoryLocations = CVSRepositoryLocationMatcher
.prepareSuggestedRepositoryLocations(projects, infoMap);
if (suggestedRepositoryLocations != null) {
for (int i = 0; i < referenceStrings.length; i++) {
StringTokenizer st = new StringTokenizer(referenceStrings[i],
",");
st.nextToken(); // skip "1.0"
String locationString = st.nextToken();
CVSRepositoryLocation referenceLocation = CVSRepositoryLocation
.fromString(locationString);
List suggestedList = (List) suggestedRepositoryLocations
.get(referenceLocation);
if (suggestedList == null) {
isItReallyAPerfectMatch(referenceLocation);
assertEquals(0, expectedSuggestions[i].length);
} else {
assertEquals(expectedSuggestions[i].length, suggestedList
.size());
for (int j = 0; j < expectedSuggestions[i].length; j++) {
ICVSRepositoryLocation actualSuggestion = (ICVSRepositoryLocation) suggestedList
.get(j);
ICVSRepositoryLocation expectedSuggestion = CVSRepositoryLocation
.fromString(expectedSuggestions[i][j]);
assertEquals(expectedSuggestion, actualSuggestion);
}
}
}
}
assertEquals(knownLocations.length,
knownRepositories.getRepositories().length);
}
private static void assertEquals(ICVSRepositoryLocation expected,
ICVSRepositoryLocation actual) {
if (expected == actual)
return;
assertTrue("expected:<" + expected + "> but was:<" + actual + ">.",
expected.equals(actual));
assertEquals("expected:<" + expected + "> but was:<" + actual + ">.",
expected.getLocation(true), actual.getLocation(true));
}
/**
* Test the dialog default selection - preselection of a compatible location
* if such exists. Match pick using the connection method. Starting from
* extssh, followed by pserver and finally ext. If a compatible location is
* not available select the location from the project set (position 0).
*
* @param knownLocations
* Array of known repositories as strings. The format used:
* <p>
* <code>:method:[[user][:password]@]hostname[:[port]]/path/to/repository</code>
* </p>
* @param referenceStrings
* Array of reference strings as they would exist in a project
* set. The valid format is:
* <p>
* <code>1.0,:method:[[user][:password]@]hostname[:[port]]/path/to/repository,project.name,module.name[,tagname]</code>
* </p>
* @param expectedSelections
* Array of expected suggestions. Each entry of the array will be
* matched against actual suggestion from the alternative map.
* @throws Exception
*/
private void _testDialogDefaultSelection(String[] knownLocations,
String[] referenceStrings, String[] expectedSelections)
throws Exception {
// set up values to test
for (String knownLocation : knownLocations) {
knownRepositories.addRepository(CVSRepositoryLocation.fromString(knownLocation), false);
}
Map infoMap = new HashMap(referenceStrings.length);
IProject[] projects = CVSProjectSetCapability.asProjects(
referenceStrings, infoMap);
Map alternativeMap = CVSRepositoryLocationMatcher
.prepareSuggestedRepositoryLocations(projects, infoMap);
assertFalse(alternativeMap.isEmpty());
// prepare the dialog
Display display = Display.getCurrent();
Shell shell = new Shell(display);
ConfigureRepositoryLocationsDialog dialog = new ConfigureRepositoryLocationsDialog(
shell, alternativeMap);
dialog.setBlockOnOpen(false);
dialog.open();
Map selected = dialog.getSelected();
for (int i = 0; i < referenceStrings.length; i++) {
StringTokenizer st = new StringTokenizer(referenceStrings[i], ",");
st.nextToken(); // skip "1.0"
CVSRepositoryLocation referenceLocation = CVSRepositoryLocation
.fromString(st.nextToken());
ICVSRepositoryLocation selectedAlternativeRepository = (ICVSRepositoryLocation) selected
.get(referenceLocation);
if (expectedSelections[i] == null) {
isItReallyAPerfectMatch(referenceLocation);
} else {
ICVSRepositoryLocation expectedSelection = CVSRepositoryLocation
.fromString(expectedSelections[i]);
assertEquals(expectedSelection, selectedAlternativeRepository);
}
}
// clean up after myself
dialog.getShell().dispose();
dialog.close();
dialog = null;
}
private void isItReallyAPerfectMatch(
ICVSRepositoryLocation referenceLocation) {
// It looks that we'd found a (single!) perfect match for
// referenceLocation, let's double check if this is true.
ICVSRepositoryLocation[] repositories = knownRepositories
.getRepositories();
boolean matchFound = false;
for (ICVSRepositoryLocation rl : repositories) {
if (CVSRepositoryLocationMatcher.isMatching(referenceLocation, rl)) {
assertFalse("There should be only one perfect match.",
matchFound);
matchFound = true;
}
}
assertTrue(matchFound);
}
}