blob: b75a03650782e0108252370da6587d236ab4ffde [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.core;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import junit.framework.TestCase;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
import org.eclipse.mylyn.commons.net.AuthenticationType;
import org.eclipse.mylyn.internal.tasks.core.TaskTask;
import org.eclipse.mylyn.internal.tasks.core.data.TextTaskAttachmentSource;
import org.eclipse.mylyn.internal.tasks.core.sync.SynchronizationSession;
import org.eclipse.mylyn.internal.trac.core.TracAttribute;
import org.eclipse.mylyn.internal.trac.core.TracAttributeMapper;
import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector;
import org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler;
import org.eclipse.mylyn.internal.trac.core.TracTaskMapper;
import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
import org.eclipse.mylyn.internal.trac.core.model.TracTicket;
import org.eclipse.mylyn.internal.trac.core.model.TracTicket.Key;
import org.eclipse.mylyn.internal.trac.core.util.TracUtil;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.ITaskAttachment;
import org.eclipse.mylyn.tasks.core.RepositoryStatus;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentHandler;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.core.data.TaskData;
import org.eclipse.mylyn.tasks.core.data.TaskMapper;
import org.eclipse.mylyn.tasks.core.data.TaskRelation;
import org.eclipse.mylyn.tasks.ui.TasksUi;
import org.eclipse.mylyn.trac.tests.support.TestFixture;
import org.eclipse.mylyn.trac.tests.support.TracTestConstants;
import org.eclipse.mylyn.trac.tests.support.TracTestUtil;
import org.eclipse.mylyn.trac.tests.support.XmlRpcServer.TestData;
/**
* @author Steffen Pingel
*/
public class TracTaskDataHandlerTest extends TestCase {
private TracRepositoryConnector connector;
private TaskRepository repository;
private TestData data;
private TracTaskDataHandler taskDataHandler;
private ITracClient client;
public TracTaskDataHandlerTest() {
}
@Override
protected void setUp() throws Exception {
super.setUp();
data = TestFixture.init010();
connector = (TracRepositoryConnector) TasksUi.getRepositoryConnector(TracCorePlugin.CONNECTOR_KIND);
taskDataHandler = connector.getTaskDataHandler();
}
protected void init(String url, Version version) {
repository = TracTestUtil.init(url, version);
client = connector.getClientManager().getTracClient(repository);
}
private SynchronizationSession createSession(ITask... tasks) {
SynchronizationSession session = new SynchronizationSession();
session.setNeedsPerformQueries(true);
session.setTaskRepository(repository);
session.setFullSynchronization(true);
session.setTasks(new HashSet<ITask>(Arrays.asList(tasks)));
return session;
}
public void testPreSynchronizationWeb096() throws Exception {
init(TracTestConstants.TEST_TRAC_096_URL, Version.TRAC_0_9);
ITask task = TracTestUtil.createTask(repository, data.offlineHandlerTicketId + "");
Set<ITask> tasks = new HashSet<ITask>();
tasks.add(task);
SynchronizationSession session = createSession();
session.setTasks(tasks);
assertEquals(null, repository.getSynchronizationTimeStamp());
connector.preSynchronization(session, null);
assertTrue(session.needsPerformQueries());
assertEquals(null, repository.getSynchronizationTimeStamp());
// bug 238043: assertEquals(Collections.emptySet(), session.getStaleTasks());
assertEquals(null, session.getStaleTasks());
int time = (int) (System.currentTimeMillis() / 1000) + 1;
repository.setSynchronizationTimeStamp(time + "");
connector.preSynchronization(session, null);
assertTrue(session.needsPerformQueries());
// bug 238043: assertEquals(Collections.emptySet(), session.getStaleTasks());
assertEquals(null, session.getStaleTasks());
}
public void testMarkStaleTasksXmlRpc010() throws Exception {
init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
markStaleTasks();
}
public void testMarkStaleTasksXmlRpc011() throws Exception {
init(TracTestConstants.TEST_TRAC_011_URL, Version.XML_RPC);
markStaleTasks();
}
private void markStaleTasks() throws Exception {
SynchronizationSession session;
TracTicket ticket = TracTestUtil.createTicket(client, "markStaleTasks");
ITask task = TracTestUtil.createTask(repository, ticket.getId() + "");
long lastModified = TracUtil.toTracTime(task.getModificationDate());
// an empty set should not cause contact to the repository
repository.setSynchronizationTimeStamp(null);
session = createSession(task);
connector.preSynchronization(session, null);
assertTrue(session.needsPerformQueries());
assertNull(repository.getSynchronizationTimeStamp());
repository.setSynchronizationTimeStamp(null);
session = createSession(task);
connector.preSynchronization(session, null);
assertTrue(session.needsPerformQueries());
assertEquals(Collections.singleton(task), session.getStaleTasks());
// always returns the ticket because time comparison mode is >=
repository.setSynchronizationTimeStamp(lastModified + "");
session = createSession(task);
connector.preSynchronization(session, null);
// TODO this was fixed so it returns false now but only if the
// query returns a single task
assertFalse(session.needsPerformQueries());
// bug 238043: assertEquals(Collections.emptySet(), session.getStaleTasks());
assertEquals(null, session.getStaleTasks());
repository.setSynchronizationTimeStamp((lastModified + 1) + "");
session = createSession(task);
connector.preSynchronization(session, null);
assertFalse(session.needsPerformQueries());
// bug 238043: assertEquals(Collections.emptySet(), session.getStaleTasks());
assertEquals(null, session.getStaleTasks());
// change ticket making sure it gets a new change time
Thread.sleep(1000);
ticket.putBuiltinValue(Key.DESCRIPTION, lastModified + "");
client.updateTicket(ticket, "comment", null);
repository.setSynchronizationTimeStamp((lastModified + 1) + "");
session = createSession(task);
connector.preSynchronization(session, null);
assertTrue(session.needsPerformQueries());
assertEquals(Collections.singleton(task), session.getStaleTasks());
}
public void testMarkStaleTasksNoTimeStampXmlRpc010() throws Exception {
init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
markStaleTasksNoTimeStamp();
}
public void testMarkStaleTasksNoTimeStampXmlRpc011() throws Exception {
init(TracTestConstants.TEST_TRAC_011_URL, Version.XML_RPC);
markStaleTasksNoTimeStamp();
}
private void markStaleTasksNoTimeStamp() throws Exception {
SynchronizationSession session;
ITask task = TracTestUtil.createTask(repository, data.offlineHandlerTicketId + "");
session = createSession(task);
repository.setSynchronizationTimeStamp(null);
connector.preSynchronization(session, null);
assertTrue(session.needsPerformQueries());
assertEquals(Collections.singleton(task), session.getStaleTasks());
session = createSession(task);
repository.setSynchronizationTimeStamp("");
connector.preSynchronization(session, null);
assertTrue(session.needsPerformQueries());
assertEquals(Collections.singleton(task), session.getStaleTasks());
session = createSession(task);
repository.setSynchronizationTimeStamp("0");
connector.preSynchronization(session, null);
assertTrue(session.needsPerformQueries());
assertEquals(Collections.singleton(task), session.getStaleTasks());
session = createSession(task);
repository.setSynchronizationTimeStamp("abc");
connector.preSynchronization(session, null);
assertTrue(session.needsPerformQueries());
assertEquals(Collections.singleton(task), session.getStaleTasks());
}
public void testNonNumericTaskId() {
try {
connector.getTaskData(repository, "abc", null);
fail("Expected CoreException");
} catch (CoreException e) {
}
}
public void testAttachmentChangesLastModifiedDate010() throws Exception {
init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
attachmentChangesLastModifiedDate();
}
public void testAttachmentChangesLastModifiedDate011() throws Exception {
init(TracTestConstants.TEST_TRAC_011_URL, Version.XML_RPC);
attachmentChangesLastModifiedDate();
}
private void attachmentChangesLastModifiedDate() throws Exception {
AbstractTaskAttachmentHandler attachmentHandler = connector.getTaskAttachmentHandler();
ITask task = TracTestUtil.createTask(repository, data.attachmentTicketId + "");
Date lastModified = task.getModificationDate();
// XXX the test case fails when comment == null
attachmentHandler.postContent(repository, task, new TextTaskAttachmentSource("abc"), "comment", null, null);
task = TracTestUtil.createTask(repository, data.attachmentTicketId + "");
Date newLastModified = task.getModificationDate();
assertTrue("Expected " + newLastModified + " to be more recent than " + lastModified,
newLastModified.after(lastModified));
}
public void testAttachmentUrlEncoding010() throws Exception {
init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
attachmentUrlEncoding();
}
public void testAttachmentUrlEncoding011() throws Exception {
init(TracTestConstants.TEST_TRAC_011_URL, Version.XML_RPC);
attachmentUrlEncoding();
}
private void attachmentUrlEncoding() throws Exception {
AbstractTaskAttachmentHandler attachmentHandler = connector.getTaskAttachmentHandler();
TracTicket ticket = TracTestUtil.createTicket(client, "attachment url test");
ITask task = TracTestUtil.createTask(repository, ticket.getId() + "");
attachmentHandler.postContent(repository, task, new TextTaskAttachmentSource("abc") {
@Override
public String getName() {
return "https%3A%2F%2Fbugs.eclipse.org%2Fbugs.xml.zip";
}
}, "comment", null, null);
task = TracTestUtil.createTask(repository, ticket.getId() + "");
List<ITaskAttachment> attachments = TracTestUtil.getTaskAttachments(task);
assertEquals(1, attachments.size());
assertEquals(repository.getUrl() + "/attachment/ticket/" + ticket.getId()
+ "/https%253A%252F%252Fbugs.eclipse.org%252Fbugs.xml.zip", attachments.get(0).getUrl());
}
public void testPostTaskDataInvalidCredentials010() throws Exception {
init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
postTaskDataInvalidCredentials();
}
public void testPostTaskDataInvalidCredentials011() throws Exception {
init(TracTestConstants.TEST_TRAC_011_URL, Version.XML_RPC);
postTaskDataInvalidCredentials();
}
private void postTaskDataInvalidCredentials() throws Exception {
ITask task = TracTestUtil.createTask(repository, data.offlineHandlerTicketId + "");
TaskData taskData = TasksUi.getTaskDataManager().getTaskData(task);
taskData.getRoot().getMappedAttribute(TaskAttribute.COMMENT_NEW).setValue("new comment");
repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials("foo", "bar"), false);
try {
taskDataHandler.postTaskData(repository, taskData, null, null);
} catch (CoreException expected) {
assertEquals(RepositoryStatus.ERROR_REPOSITORY_LOGIN, expected.getStatus().getCode());
}
assertEquals("new comment", taskData.getRoot().getMappedAttribute(TaskAttribute.COMMENT_NEW).getValue());
}
public void testCanInitializeTaskData() throws Exception {
init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
ITask task = new TaskTask(TracCorePlugin.CONNECTOR_KIND, "", "");
assertFalse(taskDataHandler.canInitializeSubTaskData(repository, task));
task.setAttribute(TracRepositoryConnector.TASK_KEY_SUPPORTS_SUBTASKS, Boolean.TRUE.toString());
assertTrue(taskDataHandler.canInitializeSubTaskData(repository, task));
task = TracTestUtil.createTask(repository, data.offlineHandlerTicketId + "");
TaskData taskData = taskDataHandler.getTaskData(repository, data.offlineHandlerTicketId + "", null);
assertFalse(taskDataHandler.canInitializeSubTaskData(repository, task));
taskData.getRoot().createAttribute(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY);
connector.updateTaskFromTaskData(repository, task, taskData);
assertTrue(taskDataHandler.canInitializeSubTaskData(repository, task));
task.setAttribute(TracRepositoryConnector.TASK_KEY_SUPPORTS_SUBTASKS, Boolean.FALSE.toString());
connector.updateTaskFromTaskData(repository, task, taskData);
assertTrue(taskDataHandler.canInitializeSubTaskData(repository, task));
}
public void testInitializeSubTaskDataInvalidParent() throws Exception {
init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
TaskData parentTaskData = taskDataHandler.getTaskData(repository, data.offlineHandlerTicketId + "",
new NullProgressMonitor());
try {
taskDataHandler.initializeSubTaskData(repository, parentTaskData, parentTaskData, null);
fail("expected CoreException");
} catch (CoreException expected) {
}
}
public void testInitializeSubTaskData() throws Exception {
init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
TaskData parentTaskData = taskDataHandler.getTaskData(repository, data.offlineHandlerTicketId + "", null);
TaskMapper parentTaskMapper = new TracTaskMapper(parentTaskData, null);
parentTaskMapper.setSummary("abc");
parentTaskMapper.setDescription("def");
String component = parentTaskData.getRoot()
.getMappedAttribute(TracAttribute.COMPONENT.getTracKey())
.getOptions()
.get(0);
parentTaskMapper.setComponent(component);
parentTaskData.getRoot().createAttribute(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY);
TaskData subTaskData = new TaskData(parentTaskData.getAttributeMapper(), TracCorePlugin.CONNECTOR_KIND, "", "");
subTaskData.getRoot().createAttribute(TracTaskDataHandler.ATTRIBUTE_BLOCKING);
taskDataHandler.initializeSubTaskData(repository, subTaskData, parentTaskData, new NullProgressMonitor());
TaskMapper subTaskMapper = new TracTaskMapper(subTaskData, null);
assertEquals("", subTaskMapper.getSummary());
assertEquals("", subTaskMapper.getDescription());
assertEquals(component, subTaskMapper.getComponent());
assertEquals(parentTaskData.getTaskId(), subTaskData.getRoot().getMappedAttribute(
TracTaskDataHandler.ATTRIBUTE_BLOCKING).getValue());
assertEquals("", parentTaskData.getRoot()
.getMappedAttribute(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY)
.getValue());
}
public void testGetSubTaskIds() throws Exception {
TaskData taskData = new TaskData(new TracAttributeMapper(new TaskRepository("", "")),
TracCorePlugin.CONNECTOR_KIND, "", "");
TaskAttribute blockedBy = taskData.getRoot().createAttribute(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY);
Collection<String> subTaskIds;
blockedBy.setValue("123 456");
subTaskIds = getSubTaskIds(taskData);
assertEquals(2, subTaskIds.size());
assertTrue(subTaskIds.contains("123"));
assertTrue(subTaskIds.contains("456"));
blockedBy.setValue("7,8");
subTaskIds = getSubTaskIds(taskData);
assertEquals(2, subTaskIds.size());
assertTrue(subTaskIds.contains("7"));
assertTrue(subTaskIds.contains("8"));
blockedBy.setValue(" 7 , 8, ");
subTaskIds = getSubTaskIds(taskData);
assertEquals(2, subTaskIds.size());
assertTrue(subTaskIds.contains("7"));
assertTrue(subTaskIds.contains("8"));
blockedBy.setValue("7");
subTaskIds = getSubTaskIds(taskData);
assertEquals(1, subTaskIds.size());
assertTrue(subTaskIds.contains("7"));
blockedBy.setValue("");
subTaskIds = getSubTaskIds(taskData);
assertEquals(0, subTaskIds.size());
blockedBy.setValue(" ");
subTaskIds = getSubTaskIds(taskData);
assertEquals(0, subTaskIds.size());
}
private Collection<String> getSubTaskIds(TaskData taskData) {
List<String> subTaskIds = new ArrayList<String>();
Collection<TaskRelation> relations = connector.getTaskRelations(taskData);
for (TaskRelation taskRelation : relations) {
subTaskIds.add(taskRelation.getTaskId());
}
return subTaskIds;
}
}