/*******************************************************************************
* Copyright (c) 2009, 2010 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 junit.framework.TestCase;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
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.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.commons.sdk.util.CommonTestUtil.PrivilegeLevel;
import org.eclipse.mylyn.tests.util.UrlBuilder;
/**
* @author Robert Elves
* @author Thomas Ehrnhoefer
* @author Frank Becker
* @author David Green
*/
public class BugzillaClientTest extends TestCase {
private BugzillaClient client;
private TaskRepository repository;
@Override
protected void setUp() throws Exception {
repository = BugzillaFixture.current().repository();
client = BugzillaFixture.current().client();
}
public void testRDFProductConfig() throws Exception {
RepositoryConfiguration config = client.getRepositoryConfiguration();
assertNotNull(config);
assertEquals(BugzillaFixture.current().getVersion().toUpperCase(), config.getInstallVersion()
.toString()
.toUpperCase());
if (BugzillaFixture.current() == BugzillaFixture.BUGS_3_6_CUSTOM_WF_AND_STATUS) {
assertEquals(10, config.getStatusValues().size());
} else if (BugzillaFixture.current().getBugzillaVersion().compareMajorMinorOnly(BugzillaVersion.BUGZILLA_4_0) < 0) {
assertEquals(7, config.getStatusValues().size());
} else {
assertEquals(5, config.getStatusValues().size());
}
if (config.getResolutions().contains("LATER")) {
assertEquals(8, config.getResolutions().size());
assertEquals(8, config.getPlatforms().size());
assertEquals(36, config.getOSs().size());
assertEquals(5, config.getPriorities().size());
} else {
assertEquals(6, config.getResolutions().size());
assertEquals(4, config.getPlatforms().size());
assertEquals(5, config.getOSs().size());
assertEquals(6, config.getPriorities().size());
}
assertEquals(7, config.getSeverities().size());
assertEquals(3, config.getProducts().size());
if (BugzillaFixture.current() == BugzillaFixture.BUGS_3_6_CUSTOM_WF_AND_STATUS) {
assertEquals(6, config.getOpenStatusValues().size());
assertEquals(1, 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.getKeywords().size());
assertEquals(2, config.getComponents("ManualTest").size());
assertEquals(4, config.getVersions("ManualTest").size());
assertEquals(4, config.getTargetMilestones("ManualTest").size());
assertEquals(2, config.getComponents("TestProduct").size());
assertEquals(4, config.getVersions("TestProduct").size());
assertEquals(4, config.getTargetMilestones("TestProduct").size());
assertEquals(2, config.getComponents("Scratch").size());
assertEquals(4, config.getVersions("Scratch").size());
assertEquals(4, config.getTargetMilestones("Scratch").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.VERSION.getKey()).setValue("1");
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 {
IRepositoryQuery query = new RepositoryQuery(BugzillaFixture.current().getConnectorKind(), "query");
UrlBuilder urlBuilder = UrlBuilder.build(BugzillaFixture.current().repository()).append("/buglist.cgi");
urlBuilder.parameter(
"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());
}
}