| /******************************************************************************* |
| * Copyright (c) 2009, 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.bugzilla.tests.core; |
| |
| import java.net.InetSocketAddress; |
| import java.net.Proxy; |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.NullProgressMonitor; |
| import org.eclipse.mylyn.bugzilla.tests.AbstractBugzillaTest; |
| import org.eclipse.mylyn.bugzilla.tests.support.BugzillaFixture; |
| import org.eclipse.mylyn.commons.net.AbstractWebLocation; |
| import org.eclipse.mylyn.commons.net.AuthenticationCredentials; |
| import org.eclipse.mylyn.commons.net.AuthenticationType; |
| import org.eclipse.mylyn.commons.sdk.util.CommonTestUtil.PrivilegeLevel; |
| import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute; |
| import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttributeMapper; |
| import org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient; |
| import org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector; |
| import org.eclipse.mylyn.internal.bugzilla.core.BugzillaVersion; |
| import org.eclipse.mylyn.internal.bugzilla.core.RepositoryConfiguration; |
| import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery; |
| import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryLocation; |
| import org.eclipse.mylyn.tasks.core.IRepositoryQuery; |
| import org.eclipse.mylyn.tasks.core.RepositoryResponse; |
| import org.eclipse.mylyn.tasks.core.RepositoryStatus; |
| import org.eclipse.mylyn.tasks.core.TaskRepository; |
| import org.eclipse.mylyn.tasks.core.data.TaskAttribute; |
| import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper; |
| import org.eclipse.mylyn.tasks.core.data.TaskData; |
| import org.eclipse.mylyn.tasks.core.data.TaskDataCollector; |
| import org.eclipse.mylyn.tests.util.UrlBuilder; |
| |
| /** |
| * @author Robert Elves |
| * @author Thomas Ehrnhoefer |
| * @author Frank Becker |
| * @author David Green |
| */ |
| public class BugzillaClientTest extends AbstractBugzillaTest { |
| |
| public void testRDFProductConfig() throws Exception { |
| if (BugzillaVersion.BUGZILLA_4_4.compareTo(BugzillaFixture.current().getBugzillaVersion()) == 0 |
| || BugzillaVersion.BUGZILLA_HEAD.compareTo(BugzillaFixture.current().getBugzillaVersion()) == 0) { |
| // FIXME: need fix of bug#372600 |
| return; |
| } |
| RepositoryConfiguration config = client.getRepositoryConfiguration(); |
| assertNotNull(config); |
| assertEquals(0, config.getInstallVersion() |
| .compareMajorMinorOnly(new BugzillaVersion(BugzillaFixture.current().getVersion()))); |
| if (BugzillaFixture.current().isCustomWorkflowAndStatus()) { |
| assertEquals(8, config.getOptionValues(BugzillaAttribute.BUG_STATUS).size()); |
| } else if (BugzillaFixture.current() |
| .getBugzillaVersion() |
| .compareMajorMinorOnly(BugzillaVersion.BUGZILLA_4_0) < 0) { |
| assertEquals(7, config.getOptionValues(BugzillaAttribute.BUG_STATUS).size()); |
| } else { |
| assertEquals(5, config.getOptionValues(BugzillaAttribute.BUG_STATUS).size()); |
| } |
| if (config.getOptionValues(BugzillaAttribute.RESOLUTION).contains("LATER")) { |
| assertEquals(8, config.getOptionValues(BugzillaAttribute.RESOLUTION).size()); |
| assertEquals(8, config.getOptionValues(BugzillaAttribute.REP_PLATFORM).size()); |
| assertEquals(36, config.getOptionValues(BugzillaAttribute.OP_SYS).size()); |
| assertEquals(5, config.getOptionValues(BugzillaAttribute.PRIORITY).size()); |
| } else { |
| if (BugzillaVersion.BUGZILLA_4_0 |
| .compareMajorMinorOnly(new BugzillaVersion(BugzillaFixture.current().getVersion())) > 0) { |
| assertEquals(6, config.getOptionValues(BugzillaAttribute.RESOLUTION).size()); |
| } else { |
| assertEquals(5, config.getOptionValues(BugzillaAttribute.RESOLUTION).size()); |
| } |
| assertEquals(4, config.getOptionValues(BugzillaAttribute.REP_PLATFORM).size()); |
| assertEquals(5, config.getOptionValues(BugzillaAttribute.OP_SYS).size()); |
| assertEquals(6, config.getOptionValues(BugzillaAttribute.PRIORITY).size()); |
| } |
| assertEquals(7, config.getOptionValues(BugzillaAttribute.BUG_SEVERITY).size()); |
| assertEquals(3, config.getOptionValues(BugzillaAttribute.PRODUCT).size()); |
| if (BugzillaFixture.current().isCustomWorkflowAndStatus()) { |
| assertEquals(5, config.getOpenStatusValues().size()); |
| assertEquals(3, config.getClosedStatusValues().size()); |
| } else if (BugzillaFixture.current() |
| .getBugzillaVersion() |
| .compareMajorMinorOnly(BugzillaVersion.BUGZILLA_4_0) < 0) { |
| assertEquals(4, config.getOpenStatusValues().size()); |
| assertEquals(3, config.getClosedStatusValues().size()); |
| } else { |
| assertEquals(3, config.getOpenStatusValues().size()); |
| assertEquals(2, config.getClosedStatusValues().size()); |
| } |
| assertEquals(2, config.getOptionValues(BugzillaAttribute.KEYWORDS).size()); |
| assertEquals(2, config.getProductOptionValues(BugzillaAttribute.COMPONENT, "ManualTest").size()); |
| assertEquals(4, config.getProductOptionValues(BugzillaAttribute.VERSION, "ManualTest").size()); |
| assertEquals(4, config.getProductOptionValues(BugzillaAttribute.TARGET_MILESTONE, "ManualTest").size()); |
| assertEquals(1, config.getProductOptionValues(BugzillaAttribute.COMPONENT, "TestProduct").size()); |
| assertEquals(1, config.getProductOptionValues(BugzillaAttribute.VERSION, "TestProduct").size()); |
| assertEquals(1, config.getProductOptionValues(BugzillaAttribute.TARGET_MILESTONE, "TestProduct").size()); |
| assertEquals(2, config.getProductOptionValues(BugzillaAttribute.COMPONENT, "Product with Spaces").size()); |
| assertEquals(4, config.getProductOptionValues(BugzillaAttribute.VERSION, "Product with Spaces").size()); |
| assertEquals(4, |
| config.getProductOptionValues(BugzillaAttribute.TARGET_MILESTONE, "Product with Spaces").size()); |
| } |
| |
| public void testValidate() throws Exception { |
| TaskRepository repository = BugzillaFixture.current().repository(); |
| AbstractWebLocation location = BugzillaFixture.current().location(); |
| client = new BugzillaClient(location, repository, BugzillaFixture.current().connector()); |
| client.validate(new NullProgressMonitor()); |
| } |
| |
| public void testValidateInvalidProxy() throws Exception { |
| TaskRepository repository = BugzillaFixture.current().repository(); |
| AbstractWebLocation location = BugzillaFixture.current().location(PrivilegeLevel.USER, |
| new Proxy(Proxy.Type.HTTP, new InetSocketAddress("localhost", 12356))); |
| |
| client = new BugzillaClient(location, repository, BugzillaFixture.current().connector()); |
| try { |
| client.validate(new NullProgressMonitor()); |
| fail("invalid proxy did not cause connection error"); |
| } catch (Exception e) { |
| // ignore |
| } |
| } |
| |
| public void testValidateAnonymous() throws Exception { |
| TaskRepository repository = BugzillaFixture.current().repository(); |
| AuthenticationCredentials anonymousCreds = new AuthenticationCredentials("", ""); |
| repository.setCredentials(AuthenticationType.REPOSITORY, anonymousCreds, false); |
| TaskRepositoryLocation location = new TaskRepositoryLocation(repository); |
| |
| client = new BugzillaClient(location, repository, BugzillaFixture.current().connector()); |
| client.validate(new NullProgressMonitor()); |
| } |
| |
| public void testValidateAnonymousPlusHTTP() throws Exception { |
| TaskRepository repository = BugzillaFixture.current().repository(); |
| AuthenticationCredentials anonymousCreds = new AuthenticationCredentials("", ""); |
| repository.setCredentials(AuthenticationType.REPOSITORY, anonymousCreds, false); |
| repository.setCredentials(AuthenticationType.HTTP, new AuthenticationCredentials("YYYYYYYY", "XXXXXXXX"), |
| false); |
| TaskRepositoryLocation location = new TaskRepositoryLocation(repository); |
| |
| client = new BugzillaClient(location, repository, BugzillaFixture.current().connector()); |
| try { |
| client.validate(new NullProgressMonitor()); |
| } catch (CoreException e) { |
| assertEquals("Expected login error, got: " + e.getMessage(), RepositoryStatus.ERROR_REPOSITORY_LOGIN, |
| e.getStatus().getCode()); |
| } |
| } |
| |
| public void testValidateUser() throws Exception { |
| TaskRepository repository = BugzillaFixture.current().repository(); |
| TaskRepositoryLocation location = new TaskRepositoryLocation(repository); |
| |
| client = new BugzillaClient(location, repository, BugzillaFixture.current().connector()); |
| client.validate(new NullProgressMonitor()); |
| } |
| |
| public void testValidateUserPlusHTTP() throws Exception { |
| TaskRepository repository = BugzillaFixture.current().repository(); |
| repository.setCredentials(AuthenticationType.HTTP, new AuthenticationCredentials("YYYYYYYY", "XXXXXXXX"), |
| false); |
| TaskRepositoryLocation location = new TaskRepositoryLocation(repository); |
| |
| client = new BugzillaClient(location, repository, BugzillaFixture.current().connector()); |
| try { |
| client.validate(new NullProgressMonitor()); |
| } catch (Exception e) { |
| assertEquals("Unable to login to " + repository.getUrl() |
| + ".\n\n\n The username or password you entered is not valid.\n\n" |
| + "Please validate credentials via Task Repositories view.", e.getMessage()); |
| } |
| } |
| |
| public void testCommentQuery() throws Exception { |
| BugzillaRepositoryConnector connector = BugzillaFixture.current().connector(); |
| BugzillaAttributeMapper mapper = new BugzillaAttributeMapper(repository, connector); |
| TaskData newData = new TaskData(mapper, BugzillaFixture.current().getConnectorKind(), |
| BugzillaFixture.current().getRepositoryUrl(), ""); |
| |
| assertTrue(connector.getTaskDataHandler().initializeTaskData(repository, newData, null, |
| new NullProgressMonitor())); |
| newData.getRoot().getMappedAttribute(TaskAttribute.SUMMARY).setValue("testCommentQuery()"); |
| newData.getRoot().getMappedAttribute(TaskAttribute.PRODUCT).setValue("TestProduct"); |
| newData.getRoot().getMappedAttribute(TaskAttribute.COMPONENT).setValue("TestComponent"); |
| newData.getRoot().getMappedAttribute(BugzillaAttribute.OP_SYS.getKey()).setValue("All"); |
| long timestamp = System.currentTimeMillis(); |
| newData.getRoot().getMappedAttribute(TaskAttribute.DESCRIPTION).setValue("" + timestamp); |
| RepositoryResponse response = client.postTaskData(newData, new NullProgressMonitor()); |
| |
| String bugid = response.getTaskId(); |
| RepositoryQuery query = new RepositoryQuery(BugzillaFixture.current().getConnectorKind(), "123"); |
| query.setRepositoryUrl(BugzillaFixture.current().getRepositoryUrl()); |
| if (BugzillaFixture.current().getBugzillaVersion().compareMajorMinorOnly(BugzillaVersion.BUGZILLA_4_0) < 0) { |
| query.setUrl("?long_desc_type=allwordssubstr&long_desc=" + timestamp + "&bug_status=NEW&"); |
| } else { |
| query.setUrl("?long_desc_type=allwordssubstr&long_desc=" + timestamp + "&bug_status=CONFIRMED&"); |
| } |
| |
| final Set<TaskData> returnedData = new HashSet<TaskData>(); |
| |
| TaskDataCollector collector = new TaskDataCollector() { |
| |
| @Override |
| public void accept(TaskData taskData) { |
| returnedData.add(taskData); |
| } |
| }; |
| |
| client.getSearchHits(query, collector, mapper, new NullProgressMonitor()); |
| assertEquals(1, returnedData.size()); |
| assertEquals(bugid, returnedData.iterator().next().getTaskId()); |
| } |
| |
| /** |
| * test for bug 335278: enhance search result handler to handle additional attributes |
| */ |
| public void testQueryRealName_Bug335278() throws Exception { |
| String taskId = harness.enhanceSearchTaskExists(); |
| if (taskId == null) { |
| taskId = harness.createEnhanceSearchTask(); |
| } |
| |
| IRepositoryQuery query = new RepositoryQuery(BugzillaFixture.current().getConnectorKind(), "query"); |
| UrlBuilder urlBuilder = UrlBuilder.build(BugzillaFixture.current().repository()).append("/buglist.cgi"); |
| |
| urlBuilder.parameter("short_desc=test%20EnhanceSearch&columnlist", |
| "bug_severity,priority,assigned_to,bug_status,resolution,short_desc,changeddate,reporter,assigned_to_realname,reporter_realname,product,component"); |
| query.setUrl(urlBuilder.toString()); |
| |
| final Set<TaskData> returnedData = new HashSet<TaskData>(); |
| TaskDataCollector collector = new TaskDataCollector() { |
| |
| @Override |
| public void accept(TaskData taskData) { |
| returnedData.add(taskData); |
| } |
| }; |
| TaskAttributeMapper mapper = BugzillaFixture.current() |
| .connector() |
| .getTaskDataHandler() |
| .getAttributeMapper(BugzillaFixture.current().repository()); |
| |
| client.getSearchHits(query, collector, mapper, new NullProgressMonitor()); |
| |
| assertTrue(returnedData.size() > 0); |
| for (TaskData taskData : returnedData) { |
| TaskAttribute reporterName = taskData.getRoot().getAttribute(BugzillaAttribute.REPORTER_NAME.getKey()); |
| TaskAttribute assignedToName = taskData.getRoot().getAttribute(BugzillaAttribute.ASSIGNED_TO_NAME.getKey()); |
| assertHasValue(reporterName); |
| assertHasValue(assignedToName); |
| } |
| } |
| |
| private void assertHasValue(TaskAttribute attribute) { |
| assertNotNull(attribute); |
| assertNotNull(attribute.getValue()); |
| assertTrue(attribute.getValue().trim().length() > 0); |
| } |
| |
| public void testLeadingZeros() throws Exception { |
| String taskNumber = "0002"; |
| TaskData taskData = BugzillaFixture.current().getTask(taskNumber, client); |
| assertNotNull(taskData); |
| assertNotNull(taskData); |
| TaskAttribute idAttribute = taskData.getRoot().getAttribute(BugzillaAttribute.BUG_ID.getKey()); |
| assertNotNull(idAttribute); |
| assertEquals("2", idAttribute.getValue()); |
| } |
| |
| } |