/******************************************************************************* * Copyright (c) 2006, 2009 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: * 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) { } } }