/******************************************************************************* * Copyright (c) 2009, 2010 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.equinox.p2.tests; import java.io.File; import java.io.FileOutputStream; import java.net.URI; import java.util.*; import org.eclipse.ant.core.AntRunner; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.URIUtil; import org.eclipse.equinox.internal.p2.persistence.XMLWriter; import org.eclipse.equinox.p2.core.ProvisionException; import org.eclipse.equinox.p2.metadata.IArtifactKey; import org.eclipse.equinox.p2.metadata.IInstallableUnit; import org.eclipse.equinox.p2.query.IQueryResult; import org.eclipse.equinox.p2.query.IQueryable; import org.eclipse.equinox.p2.repository.artifact.ArtifactKeyQuery; import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository; public class AbstractAntProvisioningTest extends AbstractProvisioningTest { protected static final String TYPE_ARTIFACT = "A"; protected static final String TYPE_METADATA = "M"; protected static final String TYPE_BOTH = null; private static final String TARGET = "target"; private static final String ROOT = "project"; private static final String NAME = "name"; private static final String DEFAULT_TARGET = "default"; private static final String DEFAULT_NAME = "default"; AntTaskElement root, target; File buildScript, logLocation; public void setUp() throws Exception { super.setUp(); buildScript = new File(getTestFolder(getName()), "build_" + getName() + ".xml"); logLocation = new File(getTestFolder(getName()), "log_" + getName() + ".log"); createBuildScript(); } public void tearDown() throws Exception { // Delete the build script delete(buildScript.getParentFile()); delete(logLocation.getParentFile()); super.tearDown(); } /* * Run the specified buildscript */ protected void runAntTask(File buildFile) { try { runAntTaskWithExceptions(buildFile); } catch (CoreException e) { fail(rootCause(e)); } } private void runAntTaskWithExceptions(File buildFile) throws CoreException { AntRunner ant = new AntRunner(); ant.setArguments("-logfile \"" + logLocation + "\""); ant.setBuildFileLocation(buildFile.getAbsolutePath()); ant.addBuildLogger("org.apache.tools.ant.XmlLogger"); ant.run(); } /* * Run the build script described programmatically */ protected void runAntTask() { try { runAntTaskWithExceptions(); } catch (CoreException e) { fail(rootCause(e)); } } protected void runAntTaskWithExceptions() throws CoreException { try { writeBuildScript(); } catch (Exception e) { fail("Error writing build script", e); } runAntTaskWithExceptions(buildScript); } /* * Adds an Ant Task to the build script */ protected void addTask(AntTaskElement task) { target.addElement(task); } /* * Create and return an repository element for this address and type */ protected AntTaskElement getRepositoryElement(URI address, String kind) { return getRepositoryElement(address, kind, null, null, null, null); } protected AntTaskElement getIUElement(String name, String version) { AntTaskElement iuElement = new AntTaskElement("iu"); iuElement.addAttribute("id", name); if (version != null) iuElement.addAttribute("version", version); return iuElement; } protected AntTaskElement getRepositoryElement(URI address, String kind, String name, String format, Boolean compressed, Boolean append) { AntTaskElement repo = new AntTaskElement("repository"); repo.addAttributes(new String[] {"location", URIUtil.toUnencodedString(address)}); if (kind != null) repo.addAttributes(new String[] {"kind", kind}); if (name != null) repo.addAttributes(new String[] {"name", name}); if (format != null) repo.addAttributes(new String[] {"format", format}); if (compressed != null) repo.addAttributes(new String[] {"compressed", compressed.toString()}); if (append != null) repo.addAttributes(new String[] {"append", append.toString()}); return repo; } /* * Create an element from the specified information */ protected AntTaskElement createIUElement(IInstallableUnit iu) { return createIUElement(iu.getId(), iu.getVersion().toString()); } /* * Create an element from the specified information */ protected AntTaskElement createIUElement(String id, String version) { AntTaskElement iuElement = new AntTaskElement("iu"); iuElement.addAttribute("id", id); iuElement.addAttribute("version", version); return iuElement; } /* * Create the base elements of the build script */ private void createBuildScript() { root = new AntTaskElement(ROOT); root.addAttributes(new String[] {NAME, ROOT, DEFAULT_TARGET, DEFAULT_NAME}); target = new AntTaskElement(TARGET); target.addAttributes(new String[] {NAME, DEFAULT_NAME}); root.addElement(target); } /* * Write the build script to disk */ private void writeBuildScript() throws Exception { FileOutputStream outputStream = null; try { outputStream = new FileOutputStream(buildScript); XMLWriter writer = new XMLWriter(outputStream, null); writeElement(writer, root); writer.flush(); } finally { if (outputStream != null) outputStream.close(); } } /* * Write an element to the buildscript */ private void writeElement(XMLWriter writer, AntTaskElement task) { // Properties ought to occur in key-value pairs assertTrue("Task " + task + " should have an even number of properties", (task.attributes.size() % 2) == 0); // Start tag writer.start(task.name); // write properties for (Iterator iter = task.attributes.iterator(); iter.hasNext();) writer.attribute((String) iter.next(), (String) iter.next()); // write sub elements if applicable for (Iterator iter = task.elements.iterator(); iter.hasNext();) writeElement(writer, (AntTaskElement) iter.next()); // close tag writer.end(); } // Class which can be used to represent elements in a task protected class AntTaskElement { public String name; public List attributes = new ArrayList(); public List elements = new ArrayList(); public AntTaskElement(String name) { this.name = name; } public AntTaskElement(String name, String[] attributes) { this.name = name; if (attributes != null && attributes.length > 0) { if (attributes.length % 2 != 0) throw new IllegalStateException(); this.attributes.addAll(Arrays.asList(attributes)); } } public void addAttribute(String attribute, String value) { attributes.add(attribute); attributes.add(value); } public void addAttributes(String[] propertyArray) { attributes.addAll(Arrays.asList(propertyArray)); } public void addElement(AntTaskElement element) { elements.add(element); } public String toString() { return name; } } protected static Throwable rootCause(Throwable e) { if (e.getCause() != null) return rootCause(e.getCause()); return e; } protected static void fail(Throwable e) { fail("An exception occurred while running the task", e); } protected void assertLogContains(String content) { try { assertLogContainsLine(logLocation, content); } catch (Exception e) { fail("Error asserting log contents.", e); } } protected static void assertIUContentEquals(String message, IQueryable source, IQueryable destination) { assertContains(message, source, destination); assertContains(message, destination, source); } protected void assertArtifactKeyContentEquals(String message, IQueryResult ius, URI artifactRepositoryLocation) { try { IArtifactRepository repo = getArtifactRepositoryManager().loadRepository(artifactRepositoryLocation, null); List fromIUs = getArtifactKeys(ius); Iterator fromRepo = repo.query(ArtifactKeyQuery.ALL_KEYS, null).iterator(); assertContains(message, fromIUs, fromRepo); assertContains(message, fromRepo, fromIUs); } catch (ProvisionException e) { fail("Failed to load repository", e); } } protected static List getArtifactKeys(IQueryResult ius) { List keys = new ArrayList(); for (Iterator iter = ius.iterator(); iter.hasNext();) keys.addAll(iter.next().getArtifacts()); return keys; } }