blob: 472ccebdec5895cfe7190750864cba6d7993a266 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2015 Tasktop Technologies and others.
* 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:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.gerrit.tests.core;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.instanceOf;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.junit.Assert.assertThat;
import java.io.File;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.mylyn.commons.sdk.util.UiTestUtil;
import org.eclipse.mylyn.gerrit.tests.support.GerritFixture;
import org.eclipse.mylyn.gerrit.tests.support.GerritHarness;
import org.eclipse.mylyn.internal.gerrit.core.GerritConnector;
import org.eclipse.mylyn.internal.gerrit.core.GerritCorePlugin;
import org.eclipse.mylyn.internal.gerrit.core.GerritQuery;
import org.eclipse.mylyn.internal.gerrit.core.GerritTaskSchema;
import org.eclipse.mylyn.internal.gerrit.core.client.GerritClient;
import org.eclipse.mylyn.internal.gerrit.core.client.GerritException;
import org.eclipse.mylyn.internal.gerrit.ui.GerritUiPlugin;
import org.eclipse.mylyn.internal.reviews.ui.RemoteUiFactoryProviderConfigurer;
import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
import org.eclipse.mylyn.internal.tasks.core.TaskList;
import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager;
import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.reviews.spi.edit.remote.AbstractRemoteEditFactoryProvider;
import org.eclipse.mylyn.reviews.spi.edit.remote.review.ReviewsRemoteEditFactoryProvider;
import org.eclipse.mylyn.reviews.ui.spi.remote.RemoteUiService;
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.core.data.TaskCommentMapper;
import org.eclipse.mylyn.tasks.core.data.TaskData;
import org.eclipse.mylyn.tasks.core.sync.SynchronizationJob;
import org.eclipse.mylyn.tasks.ui.TasksUi;
import org.eclipse.mylyn.tests.util.TestFixture;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.google.gerrit.reviewdb.ApprovalCategoryValue;
import com.google.gerrit.reviewdb.Project;
import junit.framework.TestCase;
/**
* @author Steffen Pingel
*/
public class GerritSynchronizationTest extends TestCase {
private GerritHarness harness;
private TaskRepository repository;
private TaskDataManager taskDataManager;
private TaskList taskList;
private GerritClient client;
@Override
@Before
public void setUp() throws Exception {
// RemoteFactoryProviderConfigurer configurer = new TestFactoryProviderConfigurer();
//
// GerritCorePlugin.getDefault().getConnector().setFactoryProviderConfigurer(configurer);
GerritUiPlugin.getDefault();
TasksUiPlugin.getDefault()
.getPreferenceStore()
.setValue(ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED, false);
// cancel any parallel query synchronization jobs
Job.getJobManager().cancel(ITasksCoreConstants.JOB_FAMILY_SYNCHRONIZATION);
TestFixture.resetTaskListAndRepositories();
harness = GerritFixture.current().harness();
repository = GerritFixture.current().singleRepository();
GerritCorePlugin.getDefault()
.getConnector()
.setFactoryProviderConfigurer(new RemoteUiFactoryProviderConfigurer());
client = GerritCorePlugin.getDefault().getConnector().getClient(repository);
AbstractRemoteEditFactoryProvider abstractRemoteEditFactoryProvider = (AbstractRemoteEditFactoryProvider) client
.getFactoryProvider();
GerritCorePlugin.getDefault()
.getConnector()
.getFactoryProviderConfigurer()
.configure(abstractRemoteEditFactoryProvider);
assertThat(abstractRemoteEditFactoryProvider.getService(), instanceOf(RemoteUiService.class));
taskList = TasksUiPlugin.getTaskList();
taskDataManager = TasksUiPlugin.getTaskDataManager();
harness.ensureOneReviewExists();
}
@After
@Override
public void tearDown() throws Exception {
harness.dispose();
TestFixture.resetTaskListAndRepositories();
TasksUiPlugin.getRepositoryModel().clear();
}
@Test
public void testSynchronizeBackgroundQueryTaskUpdated() throws Exception {
ITask task = createAndSynchronizeQuery(false);
String message = addComment(task);
RepositoryQuery query = taskList.getQueries().iterator().next();
synchronizeQuery(query, false);
assertHasNewComment(task, message);
}
@Test
public void testSynchronizeBackgroundTaskUpdated() throws Exception {
ITask task = createAndSynchronizeQuery(false);
String message = addComment(task);
synchronizeTask(task, false);
assertHasNewComment(task, message);
}
@Test
public void testSynchronizeQueryNewTask() throws Exception {
createAndSynchronizeQuery(true);
}
@Test
public void testSynchronizeQueryTaskUpdated() throws Exception {
ITask task = createAndSynchronizeQuery(true);
String message = addComment(task);
RepositoryQuery query = taskList.getQueries().iterator().next();
synchronizeQuery(query, true);
assertHasNewComment(task, message);
}
@Test
public void testSynchronizeTaskUpdated() throws Exception {
ITask task = createAndSynchronizeQuery(true);
String message = addComment(task);
synchronizeTask(task, true);
assertHasNewComment(task, message);
}
@Test
public void testGetFromChangeId() throws Exception {
ITask task = createAndSynchronizeQuery(true);
AbstractRepositoryConnector connector = TasksUi.getRepositoryConnector(repository.getConnectorKind());
GerritClient client = ((GerritConnector) connector).getClient(repository);
Project.NameKey project = new Project.NameKey(
taskDataManager.getTaskData(task).getRoot().getMappedAttribute(TaskAttribute.PRODUCT).getValue());
client.clearCachedBranches(project);
assertNull(client.getCachedBranches(project));
TaskData taskData = connector.getTaskData(repository, task.getTaskId(), new NullProgressMonitor());
assertEquals(task.getTaskId(), taskData.getTaskId());
assertNotNull(client.getCachedBranches(project));
TaskAttribute changeIdAttribute = taskData.getRoot()
.getAttribute(GerritTaskSchema.getDefault().CHANGE_ID.getKey());
assertNotNull(changeIdAttribute);
assertThat(task.getTaskId(), not(equalTo(changeIdAttribute.getValue())));
TaskData taskDataFromChangeId = connector.getTaskData(repository, changeIdAttribute.getValue(),
new NullProgressMonitor());
assertEquals(task.getTaskId(), taskDataFromChangeId.getTaskId());
assertEquals(taskData.getRoot().toString(), taskDataFromChangeId.getRoot().toString());
}
private String addComment(ITask task) throws GerritException {
taskDataManager.setTaskRead(task, true);
GerritClient client = GerritClient.create(null, harness.location());
String message = "new comment, time: " + System.currentTimeMillis(); //$NON-NLS-1$
client.publishComments(task.getTaskId(), 1, message, Collections.<ApprovalCategoryValue.Id> emptySet(), null);
return message;
}
private void assertHasNewComment(ITask task, String message) throws CoreException {
assertEquals(SynchronizationState.INCOMING, task.getSynchronizationState());
// validate that task data was fully synchronized
TaskData taskData = taskDataManager.getTaskData(task);
List<TaskAttribute> comments = taskData.getAttributeMapper().getAttributesByType(taskData,
TaskAttribute.TYPE_COMMENT);
TaskCommentMapper lastComment = TaskCommentMapper.createFrom(comments.get(comments.size() - 1));
assertEquals("Failure on " + GerritFixture.current().getRepositoryUrl() + "/" + task.getTaskId(), //$NON-NLS-1$
"Patch Set 1:\n\n" + message, lastComment.getText());
}
private ITask assertTaskListHasOneTask() throws CoreException {
assertTrue(taskList.getAllTasks().size() >= 1);
ITask task = taskList.getAllTasks().iterator().next();
assertEquals(repository.getUrl(), task.getRepositoryUrl());
assertTrue(taskDataManager.hasTaskData(task));
return task;
}
private ITask createAndSynchronizeQuery(boolean user) throws Exception {
IRepositoryQuery query = TasksUi.getRepositoryModel().createRepositoryQuery(repository);
query.setAttribute(GerritQuery.TYPE, GerritQuery.CUSTOM);
query.setAttribute(GerritQuery.QUERY_STRING, harness.defaultQuery());
taskList.addQuery((RepositoryQuery) query);
synchronizeQuery((RepositoryQuery) query, user);
ITask task = assertTaskListHasOneTask();
assertEquals(SynchronizationState.INCOMING_NEW, task.getSynchronizationState());
String filePath = client.getFactoryProvider().getDataLocator().getModelPath() + File.separator
+ "org.eclipse.mylyn.gerrit-" + ReviewsRemoteEditFactoryProvider.asFileName(repository.getUrl())
+ File.separator + "Review" + File.separator + task.getTaskId() + ".reviews";
File file = new File(filePath);
assertThat("File should exist at: " + filePath, file.exists(), is(true));
return task;
}
private void synchronizeQuery(RepositoryQuery query, boolean user) throws InterruptedException {
AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager()
.getRepositoryConnector(repository.getConnectorKind());
SynchronizationJob job = TasksUiPlugin.getTaskJobFactory().createSynchronizeQueriesJob(connector, repository,
Collections.singleton(query));
job.setUser(user);
job.schedule();
job.join();
// wait for any query synchronization jobs scheduled by job above
boolean synchronizing = true;
while (synchronizing) {
try {
Job.getJobManager().join(ITasksCoreConstants.JOB_FAMILY_SYNCHRONIZATION, null);
synchronizing = false;
} catch (InterruptedException e) {
// ignore interrupts caused by sync exec and spin the UI loop to process them
UiTestUtil.waitForDisplay();
}
}
}
private void synchronizeTask(ITask task, boolean user) throws InterruptedException {
SynchronizationJob job = TasksUiPlugin.getTaskJobFactory().createSynchronizeTasksJob(
TasksUi.getRepositoryConnector(repository.getConnectorKind()), repository, Collections.singleton(task));
job.setUser(user);
job.schedule();
boolean synchronizing = true;
while (synchronizing) {
try {
job.join();
synchronizing = false;
} catch (InterruptedException e) {
// ignore interrupts caused by sync exec and spin the UI loop to process them
UiTestUtil.waitForDisplay();
}
}
}
}