blob: 66a28db5a2e7014100aa5c7c44ef18ec4d60e55a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 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 java.util.Collections;
import java.util.List;
import junit.framework.TestCase;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.mylyn.gerrit.tests.support.GerritFixture;
import org.eclipse.mylyn.gerrit.tests.support.GerritHarness;
import org.eclipse.mylyn.internal.gerrit.core.GerritQuery;
import org.eclipse.mylyn.internal.gerrit.core.client.GerritClient;
import org.eclipse.mylyn.internal.gerrit.core.client.GerritException;
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.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;
/**
* @author Steffen Pingel
*/
public class GerritSynchronizationTest extends TestCase {
private GerritHarness harness;
private TaskRepository repository;
private TaskDataManager taskDataManager;
private TaskList taskList;
@Override
@Before
public void setUp() throws Exception {
TasksUiPlugin.getDefault()
.getPreferenceStore()
.setValue(ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED, false);
harness = GerritFixture.current().harness();
repository = GerritFixture.current().singleRepository();
taskList = TasksUiPlugin.getTaskList();
taskDataManager = TasksUiPlugin.getTaskDataManager();
}
@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);
synchronizeAllTasks(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);
synchronizeAllTasks(true);
assertHasNewComment(task, message);
}
@Test
public void testSynchronizeTaskUpdated() throws Exception {
ITask task = createAndSynchronizeQuery(true);
String message = addComment(task);
synchronizeTask(task, true);
assertHasNewComment(task, message);
}
private String addComment(ITask task) throws GerritException {
taskDataManager.setTaskRead(task, true);
GerritClient client = new GerritClient(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("Patch Set 1:\n\n" + message, lastComment.getText()); //$NON-NLS-1$
}
private ITask assertTaskListHasOneTask() throws CoreException {
assertEquals(1, taskList.getAllTasks().size());
ITask task = taskList.getAllTasks().iterator().next();
assertEquals(repository.getUrl(), task.getRepositoryUrl());
assertTrue(taskDataManager.hasTaskData(task));
return task;
}
private ITask createAndSynchronizeQuery(boolean user) throws InterruptedException, CoreException, GerritException {
IRepositoryQuery query = TasksUi.getRepositoryModel().createRepositoryQuery(repository);
query.setAttribute(GerritQuery.TYPE, GerritQuery.ALL_OPEN_CHANGES);
taskList.addQuery((RepositoryQuery) query);
synchronizeAllTasks(user);
ITask task = assertTaskListHasOneTask();
assertEquals(SynchronizationState.INCOMING_NEW, task.getSynchronizationState());
return task;
}
private void synchronizeAllTasks(boolean user) throws InterruptedException {
SynchronizationJob job = TasksUiPlugin.getTaskJobFactory().createSynchronizeRepositoriesJob(
Collections.singleton(repository));
job.setUser(user);
job.schedule();
job.join();
// wait for parallel query synchronization jobs
Job.getJobManager().join(ITasksCoreConstants.JOB_FAMILY_SYNCHRONIZATION, null);
}
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();
job.join();
}
}