blob: 832876b6b1054a24d94822e7e864bfd38552cd25 [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.support;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.eclipse.mylyn.internal.trac.core.client.TracXmlRpcClient;
/**
* @author Steffen Pingel
*/
public class XmlRpcServer {
public abstract class AbstractTracItem {
public abstract void delete() throws Exception;
void itemCreated() {
data.items.add(this);
}
void itemDeleted() {
data.items.remove(this);
}
}
/**
* Represents a Trac type with multiple attributes such as a milestone.
*/
public class ModelEnum extends AbstractTracItem {
private final String[] attributes;
private final String id;
private final String module;
public ModelEnum(String module, String id, String... attributes) {
this.module = module;
this.id = id;
this.attributes = attributes;
}
public ModelEnum create(Object... params) throws Exception {
call(module + ".create", id, toMap(params));
itemCreated();
return this;
}
@Override
public void delete() throws Exception {
call(module + ".delete", id);
itemDeleted();
}
public void deleteAll() throws Exception {
String[] ids = getAll();
for (String id : ids) {
call(module + ".delete", id);
}
}
public ModelEnum deleteAndCreate(Object... params) throws Exception {
if (Arrays.asList(getAll()).contains(id)) {
delete();
}
return create(params);
}
@SuppressWarnings("rawtypes")
public Object[] get() throws Exception {
Hashtable values = (Hashtable) call(module + ".get", id);
Object[] result = new Object[values.size()];
for (int i = 0; i < result.length && i < attributes.length; i++) {
result[i] = values.get(attributes[i]);
}
return result;
}
public String[] getAll() throws Exception {
return Arrays.asList((Object[]) call(module + ".getAll")).toArray(new String[0]);
}
private Hashtable<String, Object> toMap(Object... params) {
Hashtable<String, Object> attrs = new Hashtable<String, Object>();
for (int i = 0; i < attributes.length && i < params.length; i++) {
attrs.put(attributes[i], params[i]);
}
return attrs;
}
public ModelEnum update(Object... params) throws Exception {
call(module + ".update", id, toMap(params));
return this;
}
}
/**
* Records changes to the repository.
*/
public class TestData {
// all created items
List<AbstractTracItem> items = new ArrayList<AbstractTracItem>();
// all created tickets
public List<Ticket> tickets = new ArrayList<Ticket>();
/**
* Undo all changes.
*/
public void cleanup() throws Exception {
while (!items.isEmpty()) {
items.get(0).delete();
}
}
}
/**
* Represents a Trac ticket.
*/
public class Ticket extends AbstractTracItem {
private Integer id;
public Ticket(Integer id) {
this.id = id;
}
public Ticket create(String summary, String description) throws Exception {
this.id = (Integer) call("ticket.create", summary, description, new Hashtable<String, Object>());
if (id == null) {
throw new RuntimeException("Could not create ticket: " + summary);
}
itemCreated();
return this;
}
@Override
public void delete() throws Exception {
call("ticket.delete", id);
itemDeleted();
}
public void deleteAll() throws Exception {
Integer[] ids = getAll();
for (Integer id : ids) {
call("ticket.delete", id);
}
}
public Object getValue(String key) throws Exception {
return getValues().get(key);
}
public Map<?, ?> getValues() throws Exception {
return (Map<?, ?>) ((Object[]) call("ticket.get", id))[3];
}
public Integer[] getAll() throws Exception {
return Arrays.asList((Object[]) call("ticket.query", "order=id")).toArray(new Integer[0]);
}
public int getId() {
return id;
}
@Override
protected void itemCreated() {
super.itemCreated();
data.tickets.add(this);
}
@Override
protected void itemDeleted() {
super.itemDeleted();
data.tickets.remove(this);
}
public Ticket update(String comment, String key, String value) throws Exception {
Hashtable<String, Object> attrs = new Hashtable<String, Object>();
attrs.put(key, value);
call("ticket.update", id, comment, attrs);
return this;
}
}
/**
* Represents a Trac type that has a single attribute such as a priority.
*/
public class TicketEnum extends AbstractTracItem {
private final String id;
private final String module;
public TicketEnum(String module, String id) {
this.module = module;
this.id = id;
}
public TicketEnum create(String param) throws Exception {
call(module + ".create", id, param);
itemCreated();
return this;
}
@Override
public void delete() throws Exception {
call(module + ".delete", id);
itemDeleted();
}
public void deleteAll() throws Exception {
String[] ids = getAll();
for (String id : ids) {
call(module + ".delete", id);
}
}
public TicketEnum deleteAndCreate(String param) throws Exception {
if (Arrays.asList(getAll()).contains(id)) {
delete();
}
return create(param);
}
public String get() throws Exception {
return (String) call(module + ".get", id);
}
public String[] getAll() throws Exception {
return Arrays.asList((Object[]) call(module + ".getAll")).toArray(new String[0]);
}
public TicketEnum update(String param) throws Exception {
call(module + ".update", id, param);
return this;
}
}
private final XmlRpcClient client;
private final TestData data;
public XmlRpcServer(TracXmlRpcClient client) throws Exception {
this.client = client.getClient();
this.data = new TestData();
}
private Object call(String method, Object... parameters) throws XmlRpcException, IOException {
Vector<Object> params = new Vector<Object>(parameters.length);
for (Object parameter : parameters) {
params.add(parameter);
}
Object result = client.execute(method, params);
if (result instanceof XmlRpcException) {
throw (XmlRpcException) result;
}
return result;
}
public TestData getData() {
return data;
}
public Ticket ticket() throws Exception {
return new Ticket(null);
}
public Ticket ticket(int id) throws Exception {
return new Ticket(id);
}
public ModelEnum ticketComponent(String id) throws Exception {
return new ModelEnum("ticket.component", id, "owner", "description");
}
public ModelEnum ticketMilestone(String id) throws Exception {
return new ModelEnum("ticket.milestone", id, "due", "completed", "description");
}
public TicketEnum ticketPriority(String id) throws Exception {
return new TicketEnum("ticket.priority", id);
}
public TicketEnum ticketSeverity(String id) throws Exception {
return new TicketEnum("ticket.severity", id);
}
public TicketEnum ticketStatus(String id) throws Exception {
return new TicketEnum("ticket.status", id);
}
public TicketEnum ticketType(String id) throws Exception {
return new TicketEnum("ticket.type", id);
}
public ModelEnum ticketVersion(String id) throws Exception {
return new ModelEnum("ticket.version", id, "time", "description");
}
}