package org.eclipse.mylyn.versions.tasks.mapper.internal; /******************************************************************************* * Copyright (c) 2012 Research Group for Industrial Software (INSO), Vienna University of Technology. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Research Group for Industrial Software (INSO), Vienna University of Technology - initial API and implementation *******************************************************************************/ import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.LinkedList; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.mylyn.tasks.core.ITask; import org.eclipse.mylyn.tasks.tests.connector.MockTask; import org.eclipse.mylyn.versions.core.Change; import org.eclipse.mylyn.versions.core.ChangeSet; import org.eclipse.mylyn.versions.core.ScmRepository; import org.eclipse.mylyn.versions.core.ScmUser; import org.eclipse.mylyn.versions.tasks.mapper.generic.IChangeSetCollector; import org.eclipse.mylyn.versions.tasks.mapper.generic.IChangeSetIndexer; import org.eclipse.mylyn.versions.tasks.mapper.generic.IChangeSetSource; import org.junit.Before; import org.junit.Test; /** * * @author Kilian Matt * */ @SuppressWarnings("restriction") public class ChangeSetIndexerTest { protected static final String REPO_URL = "http://git.eclipse.org/c/mylyn/org.eclipse.mylyn.versions.git"; private ChangeSetIndexer indexer; @Before public void prepareIndex() { File dir = createTempDirectoryForIndex(); indexer = new ChangeSetIndexer(dir, createIndexerSource()); indexer.reindex(new NullProgressMonitor()); } @Test public void testSingleResult() throws CoreException{ ITask task = new MockTask(REPO_URL,"1"); task.setUrl(REPO_URL+"/1"); ExpectingChangeSetCollector collectors= new ExpectingChangeSetCollector(); collectors.expect("1", REPO_URL); assertEquals(1, indexer.search(task,REPO_URL, 5,collectors)); collectors.verifyAllExpectations(); } @Test public void testMultipleResults() throws CoreException{ ITask task = new MockTask(REPO_URL,"2"); task.setUrl(REPO_URL+"/1"); ExpectingChangeSetCollector collectors= new ExpectingChangeSetCollector(); collectors.expect("2", REPO_URL); collectors.expect("3", REPO_URL); assertEquals(2, indexer.search(task,REPO_URL, 5,collectors)); collectors.verifyAllExpectations(); } @Test public void testFindByTaskUrl() throws CoreException{ ITask task = new MockTask(REPO_URL,"4"); task.setUrl(REPO_URL+"/4"); ExpectingChangeSetCollector collectors= new ExpectingChangeSetCollector(); collectors.expect("4", REPO_URL); assertEquals(1, indexer.search(task,REPO_URL, 5,collectors)); collectors.verifyAllExpectations(); } @Test public void testComplexTaskKeys() throws CoreException{ ITask task = new MockTask(REPO_URL,"2131"); task.setTaskKey("SPR-9030"); task.setUrl(REPO_URL+"/1"); ExpectingChangeSetCollector collectors= new ExpectingChangeSetCollector(); collectors.expect("5", REPO_URL); collectors.expect("6", REPO_URL); assertEquals(2, indexer.search(task,REPO_URL, 5,collectors)); collectors.verifyAllExpectations(); } static class ExpectingChangeSetCollector implements IChangeSetCollector{ private List<Pair> expected=new LinkedList<Pair>(); void expect(String revision, String repositoryUrl){ this.expected.add(new Pair(revision,repositoryUrl)); } public void verifyAllExpectations() { if(expected.size()>0){ fail( expected.size() + " expected changesets not collected"); } } private static class Pair{ Pair(String rev, String repoUrl){ this.rev=rev; this.repoUrl=repoUrl; } final String rev; final String repoUrl; } @Override public void collect(String revision, String repositoryUrl) throws CoreException { if(expected.size()==0){ fail("unexpected changeset"); } Pair first = expected.remove(0); assertEquals(first.rev, revision); assertEquals(first.repoUrl, repositoryUrl); } } private ListChangeSetSource createIndexerSource() { ScmRepository repository=new ScmRepository(null, "", REPO_URL); ScmRepository otherRepo=new ScmRepository(null, "", "http://git.eclipse.org/c/mylyn/org.eclipse.mylyn.reviews.git"); ListChangeSetSource source = new ListChangeSetSource(Arrays.asList( new ChangeSet(new ScmUser("test", "Name", "test@eclipse.org"), new Date(), "1", "commit message 1", repository, new ArrayList<Change>()), new ChangeSet(new ScmUser("test", "Name", "test@eclipse.org"), new Date(), "1", "commit message 1", otherRepo, new ArrayList<Change>()), new ChangeSet(new ScmUser("test", "Name", "test@eclipse.org"), new Date(), "2", "commit message 2", repository, new ArrayList<Change>()), new ChangeSet(new ScmUser("test", "Name", "test@eclipse.org"), new Date(), "3", "commit message 2", repository, new ArrayList<Change>()), new ChangeSet(new ScmUser("test", "Name", "test@eclipse.org"), new Date(), "4", "another commit message with url http://git.eclipse.org/c/mylyn/org.eclipse.mylyn.versions.git/4 ", repository, new ArrayList<Change>()), new ChangeSet(new ScmUser("test", "Name", "test@eclipse.org"), new Date(), "5", "SPR-9030: Test", repository, new ArrayList<Change>()), new ChangeSet(new ScmUser("test", "Name", "test@eclipse.org"), new Date(), "6", "Fixed Bug (SPR-9030)", repository, new ArrayList<Change>()) )); return source; } class ListChangeSetSource implements IChangeSetSource { private List<ChangeSet> changesets; public ListChangeSetSource(List<ChangeSet> changesets){ this.changesets=changesets; } @Override public void fetchAllChangesets(IProgressMonitor monitor, IChangeSetIndexer indexer) throws CoreException { for(ChangeSet changeset : changesets){ indexer.index(changeset); } } } private File createTempDirectoryForIndex() { File dir = null; try { dir = File.createTempFile("test","dasd"); dir.delete(); dir.mkdir(); dir.deleteOnExit(); } catch (IOException e) { throw new RuntimeException(e); } return dir; } }