blob: d338f3c32606f89bd476f1577543f6360daf0e4a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2009 Steffen Pingel and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Steffen Pingel - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.trac.tests.client;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.Proxy.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import junit.framework.TestCase;
import org.apache.commons.lang.RandomStringUtils;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.mylyn.commons.repositories.core.auth.UserCredentials;
import org.eclipse.mylyn.commons.sdk.util.CommonTestUtil;
import org.eclipse.mylyn.commons.sdk.util.CommonTestUtil.PrivilegeLevel;
import org.eclipse.mylyn.internal.trac.core.TracAttribute;
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.client.TracException;
import org.eclipse.mylyn.internal.trac.core.client.TracLoginException;
import org.eclipse.mylyn.internal.trac.core.client.TracPermissionDeniedException;
import org.eclipse.mylyn.internal.trac.core.client.TracRemoteException;
import org.eclipse.mylyn.internal.trac.core.model.TracSearch;
import org.eclipse.mylyn.internal.trac.core.model.TracSearchFilter;
import org.eclipse.mylyn.internal.trac.core.model.TracSearchFilter.CompareOperator;
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.model.TracTicketField;
import org.eclipse.mylyn.internal.trac.core.model.TracVersion;
import org.eclipse.mylyn.trac.tests.support.TracFixture;
import org.eclipse.mylyn.trac.tests.support.TracHarness;
import org.eclipse.mylyn.trac.tests.support.TracTestUtil;
/**
* Test cases for classes that implement {@link ITracClient}.
*
* @author Steffen Pingel
*/
public class TracClientTest extends TestCase {
private ITracClient client;
private TracFixture fixture;
private TracHarness harness;
public TracClientTest() {
}
@Override
protected void setUp() throws Exception {
fixture = TracFixture.current();
harness = fixture.createHarness();
client = fixture.connect();
}
@Override
protected void tearDown() throws Exception {
harness.dispose();
}
public void testGetTicket() throws Exception {
TracTicket expectedTicket = harness.createTicket("getTicket");
TracTicket ticket = client.getTicket(expectedTicket.getId(), null);
TracTestUtil.assertTicketEquals(client.getAccessMode(), expectedTicket, ticket);
}
public void testGetTicketInvalidId() throws Exception {
try {
client.getTicket(Integer.MAX_VALUE, null);
fail("Expected TracException");
} catch (TracException e) {
}
}
public void testGetTicketUmlaute() throws Exception {
TracTicket ticket = harness.newTicket("test html entities: \u00E4\u00F6\u00FC");
ticket.putBuiltinValue(Key.DESCRIPTION, "\u00C4\u00D6\u00DC\n\nmulti\nline\n\n'''bold'''\n");
ticket = harness.createTicket(ticket);
ticket = client.getTicket(ticket.getId(), null);
assertEquals("test html entities: \u00E4\u00F6\u00FC", ticket.getValue(Key.SUMMARY));
if (client.getAccessMode() == Version.XML_RPC) {
assertEquals("\u00C4\u00D6\u00DC\n\nmulti\nline\n\n'''bold'''\n", ticket.getValue(Key.DESCRIPTION));
} else {
assertEquals(null, ticket.getValue(Key.DESCRIPTION));
}
}
public void testProxy() throws Exception {
client = fixture.connect(fixture.getRepositoryUrl(), "", "", new Proxy(Type.HTTP, new InetSocketAddress(
"invalidhostname", 8080)));
try {
client.validate(new NullProgressMonitor());
fail("Expected IOException");
} catch (TracException e) {
}
}
public void testSearchAll() throws Exception {
harness.createTicket("searchAllTickets");
TracSearch search = new TracSearch();
List<TracTicket> result = new ArrayList<TracTicket>();
client.search(search, result, null);
assertTrue(!result.isEmpty());
}
public void testSearchEmpty() throws Exception {
TracSearch search = new TracSearch();
search.addFilter("milestone", "does not exist");
List<TracTicket> result = new ArrayList<TracTicket>();
client.search(search, result, null);
assertEquals(0, result.size());
}
public void testSearchExactMatch() throws Exception {
String uniqueTag = RandomStringUtils.randomAlphanumeric(6);
String summary = "searchExactMatch " + uniqueTag;
TracTicket ticket = harness.createTicketWithMilestone(summary, "milestone1");
TracSearch search = new TracSearch();
search.addFilter("milestone", "milestone1");
search.addFilter("summary", summary);
List<TracTicket> result = new ArrayList<TracTicket>();
client.search(search, result, null);
assertEquals(1, result.size());
TracTestUtil.assertTicketEquals(ticket, result.get(0));
assertEquals("milestone1", result.get(0).getValue(Key.MILESTONE));
assertEquals(summary, result.get(0).getValue(Key.SUMMARY));
}
public void testSearchMilestone1() throws Exception {
String uniqueTag = RandomStringUtils.randomAlphanumeric(6);
TracTicket ticket = harness.createTicketWithMilestone("searchMilestone1" + uniqueTag, "milestone1");
harness.createTicketWithMilestone("searchMilestone1" + uniqueTag, "milestone2");
TracSearch search = new TracSearch();
search.addFilter(new TracSearchFilter("summary", CompareOperator.CONTAINS, uniqueTag));
search.addFilter("milestone", "milestone1");
search.addFilter("milestone", "milestone1");
List<TracTicket> result = new ArrayList<TracTicket>();
client.search(search, result, null);
assertEquals(1, result.size());
TracTestUtil.assertTicketEquals(ticket, result.get(0));
}
public void testSearchMilestone2() throws Exception {
String uniqueTag = RandomStringUtils.randomAlphanumeric(6);
TracTicket ticket1 = harness.createTicketWithMilestone("searchMilestone2 " + uniqueTag, "milestone1");
TracTicket ticket2 = harness.createTicketWithMilestone("searchMilestone2 " + uniqueTag, "milestone1");
TracTicket ticket3 = harness.createTicketWithMilestone("searchMilestone2 " + uniqueTag, "milestone2");
TracSearch search = new TracSearch();
search.addFilter(new TracSearchFilter("summary", CompareOperator.CONTAINS, uniqueTag));
search.addFilter("milestone", "milestone1");
search.addFilter("milestone", "milestone2");
search.setOrderBy("id");
List<TracTicket> result = new ArrayList<TracTicket>();
client.search(search, result, null);
assertEquals(3, result.size());
TracTestUtil.assertTicketEquals(ticket1, result.get(0));
TracTestUtil.assertTicketEquals(ticket2, result.get(1));
TracTestUtil.assertTicketEquals(ticket3, result.get(2));
}
public void testSearchMilestoneAmpersand() throws Exception {
if (!harness.hasMilestone("mile&stone")) {
// ignore test
return;
}
TracTicket ticket = harness.createTicketWithMilestone("searchMilestoneAmpersand", "mile&stone");
TracSearch search = new TracSearch();
search.addFilter("milestone", "mile&stone");
search.setOrderBy("id");
List<TracTicket> result = new ArrayList<TracTicket>();
try {
client.search(search, result, null);
assertEquals(1, result.size());
TracTestUtil.assertTicketEquals(ticket, result.get(0));
} catch (TracRemoteException e) {
if ("'Query filter requires field and constraints separated by a \"=\"' while executing 'ticket.query()'".equals(e.getMessage())
&& (fixture.getVersion().equals("0.10") || fixture.getVersion().equals("0.11"))) {
// ignore upstream problem, see bug 162094
} else {
throw e;
}
}
}
public void testStatusClosed() throws Exception {
TracTicket ticket = harness.createTicket("statusClosed");
ticket.putBuiltinValue(Key.STATUS, "closed");
ticket.putBuiltinValue(Key.RESOLUTION, "fixed");
harness.udpateTicket(ticket);
ticket = client.getTicket(ticket.getId(), null);
assertEquals("closed", ticket.getValue(Key.STATUS));
assertEquals("fixed", ticket.getValue(Key.RESOLUTION));
}
public void testUpdateAttributesAnonymous() throws Exception {
if (fixture.requiresAuthentication()) {
return;
}
client = fixture.connect(fixture.getRepositoryUrl(), "", "");
assertNull(client.getMilestones());
try {
client.updateAttributes(new NullProgressMonitor(), true);
if (fixture.getAccessMode() == Version.XML_RPC) {
fail("Expected anonymous access to be denied");
}
} catch (TracPermissionDeniedException e) {
if (fixture.getAccessMode() == Version.XML_RPC) {
return; // expected exception, done here
}
throw e;
}
TracVersion[] versions = client.getVersions();
assertEquals(2, versions.length);
Arrays.sort(versions, new Comparator<TracVersion>() {
public int compare(TracVersion o1, TracVersion o2) {
return o1.getName().compareTo(o2.getName());
}
});
assertEquals("1.0", versions[0].getName());
assertEquals("2.0", versions[1].getName());
}
public void testUpdateAttributesChangedTicketFields() throws Exception {
if (fixture.getAccessMode() == Version.TRAC_0_9) {
// field information is not available in web mode
return;
}
client = fixture.connect(fixture.getRepositoryUrl());
client.updateAttributes(new NullProgressMonitor(), true);
// modify field to bogus value
TracTicketField field = client.getTicketFieldByName(TracAttribute.MILESTONE.getTracKey());
field.setDefaultValue("modified default value");
// updating should reset modified field
client.updateAttributes(new NullProgressMonitor(), true);
field = client.getTicketFieldByName(TracAttribute.MILESTONE.getTracKey());
assertEquals("", field.getDefaultValue());
}
public void testValidate() throws Exception {
UserCredentials credentials = CommonTestUtil.getCredentials(PrivilegeLevel.USER);
// standard connect
client.validate(new NullProgressMonitor());
// invalid url
client = TracFixture.current().connect("http://non.existant/repository");
try {
client.validate(new NullProgressMonitor());
fail("Expected TracException");
} catch (TracException e) {
}
String url = TracFixture.current().getRepositoryUrl();
// invalid password
client = TracFixture.current().connect(url, credentials.getUserName(), "wrongpassword");
try {
client.validate(new NullProgressMonitor());
fail("Expected TracLoginException");
} catch (TracLoginException e) {
}
// invalid username
client = TracFixture.current().connect(url, "wrongusername", credentials.getPassword());
try {
client.validate(new NullProgressMonitor());
fail("Expected TracLoginException");
} catch (TracLoginException e) {
}
}
public void testValidateAnonymousLogin() throws Exception {
if (fixture.requiresAuthentication()) {
return;
}
client = fixture.connect(fixture.getRepositoryUrl(), "", "");
try {
client.validate(new NullProgressMonitor());
if (fixture.getAccessMode() == Version.XML_RPC) {
fail("Expected anonymous access to be denied");
}
} catch (TracPermissionDeniedException e) {
if (fixture.getAccessMode() == Version.TRAC_0_9) {
fail("Expected anonymous access to be allowed");
}
}
}
public void testValidateAnyPage() throws Exception {
client = fixture.connect("http://mylyn.eclipse.org/");
try {
client.validate(new NullProgressMonitor());
fail("Expected TracException");
} catch (TracException e) {
}
}
}