blob: f292e801f603f18b443a35a81040fe8708be4fa3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2010 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.support;
import java.net.Proxy;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.runtime.Assert;
import org.eclipse.mylyn.commons.net.IProxyProvider;
import org.eclipse.mylyn.commons.net.WebLocation;
import org.eclipse.mylyn.commons.net.WebUtil;
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.commons.sdk.util.FixtureConfiguration;
import org.eclipse.mylyn.commons.sdk.util.TestConfiguration;
import org.eclipse.mylyn.internal.trac.core.TracClientFactory;
import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector;
import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tests.util.TestFixture;
/**
* Initializes Trac repositories to a defined state. This is done once per test run, since cleaning and initializing the
* repository for each test method would take too long.
*
* @author Steffen Pingel
*/
public class TracFixture extends TestFixture {
public static String TAG_MISC = "misc";
public static final String TAG_TEST = "test";
private static TracFixture current;
public static TracFixture current() {
if (current == null) {
current = TestConfiguration.getDefault().discoverDefault(TracFixture.class, "trac");
current.activate();
}
return current;
}
private final Version accessMode;
private final String version;
private final Set<String> tags;
private final boolean excluded;
public TracFixture(Version accessMode, String url, String version, String info) {
super(TracCorePlugin.CONNECTOR_KIND, url);
Assert.isNotNull(accessMode);
Assert.isNotNull(info);
this.accessMode = accessMode;
this.version = version;
this.tags = new HashSet<String>();
this.excluded = info.startsWith("Test");
setInfo("Trac", version, info);
}
public TracFixture(FixtureConfiguration configuration) {
this(Version.fromVersion(configuration.getProperties().get("version")), configuration.getUrl(),
configuration.getVersion(), configuration.getInfo());
if (configuration.getTags() != null) {
this.tags.addAll(configuration.getTags());
}
}
@Override
public TracFixture activate() {
current = this;
setUpFramework();
return this;
}
@Override
protected TestFixture getDefault() {
return TestConfiguration.getDefault().discoverDefault(TracFixture.class, "trac");
}
public ITracClient connect() throws Exception {
return connect(repositoryUrl);
}
public ITracClient connectXmlRpc(PrivilegeLevel level) throws Exception {
UserCredentials credentials = CommonTestUtil.getCredentials(level);
return connect(repositoryUrl, credentials.getUserName(), credentials.getPassword(),
getDefaultProxy(repositoryUrl), Version.XML_RPC);
}
private Proxy getDefaultProxy(String url) {
return WebUtil.getProxyForUrl(url);
}
public ITracClient connect(String url) throws Exception {
return connect(url, getDefaultProxy(url), PrivilegeLevel.USER);
}
public ITracClient connect(String url, Proxy proxy, PrivilegeLevel level) throws Exception {
UserCredentials credentials = CommonTestUtil.getCredentials(level);
return connect(url, credentials.getUserName(), credentials.getPassword(), proxy);
}
public ITracClient connect(String url, String username, String password) throws Exception {
return connect(url, username, password, getDefaultProxy(url));
}
public ITracClient connect(String url, String username, String password, Proxy proxy) throws Exception {
return connect(url, username, password, proxy, accessMode);
}
public ITracClient connect(String url, String username, String password, final Proxy proxy, Version version)
throws Exception {
WebLocation location = new WebLocation(url, username, password, new IProxyProvider() {
public Proxy getProxyForHost(String host, String proxyType) {
return proxy;
}
});
return TracClientFactory.createClient(location, version);
}
public Version getAccessMode() {
return accessMode;
}
public String getVersion() {
return version;
}
public boolean isXmlRpcEnabled() {
return Version.XML_RPC.name().equals(getAccessMode());
}
public TaskRepository singleRepository(TracRepositoryConnector connector) {
connector.getClientManager().writeCache();
TaskRepository repository = super.singleRepository();
// XXX avoid failing test due to stale client
connector.getClientManager().clearClients();
connector.getClientManager().readCache();
return repository;
}
@Override
public TaskRepository singleRepository() {
return singleRepository(connector());
}
@Override
protected void configureRepository(TaskRepository repository) {
repository.setTimeZoneId(ITracClient.TIME_ZONE);
repository.setCharacterEncoding(ITracClient.CHARSET);
repository.setVersion(accessMode.name());
}
@Override
protected void resetRepositories() {
TracCorePlugin.getDefault().getConnector().getClientManager().clearClients();
}
@Override
public TracRepositoryConnector connector() {
return (TracRepositoryConnector) super.connector();
}
public TracHarness createHarness() {
return new TracHarness(this);
}
@Override
public boolean hasTag(String tag) {
return tags.contains(tag);
}
public boolean requiresAuthentication() {
return getInfo().contains("AllBasicAuth");
}
@Override
public boolean isExcluded() {
return super.isExcluded() || excluded;
}
public void waitToGuaranteeTaskUpdate() {
if (getVersion().compareTo("0.12") < 0) {
// Trac 0.11 can fail with database errors if subsequent task updates happen too quickly
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}