package net.jsunit.model; import net.jsunit.XmlRenderable; import net.jsunit.utility.SystemUtility; import org.jdom.Document; import org.jdom.Element; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; public class TestRunResult extends AbstractResult implements XmlRenderable, Comparable<TestRunResult>, Iterable<BrowserResult> { public static final String NAME = "testRunResult"; private List<BrowserResult> browserResults = new ArrayList<BrowserResult>(); private String url; private String osName; private String ipAddress; private String hostname; private boolean unresponsive = false; public TestRunResult() { } public TestRunResult(String url) { this.url = url; } public TestRunResult(URL baseURL) { this(baseURL.toString()); } public void addBrowserResult(BrowserResult browserResult) { browserResults.add(browserResult); } public Element asXml() { Element root = new Element(NAME); root.setAttribute("type", _getResultType().name()); if (url != null) root.setAttribute("url", url); if (hasPlatformType()) addPlatformType(root); if (hasProperties()) { Element properties = new Element("properties"); addProperties(properties); root.addContent(properties); } for (BrowserResult browserResult : browserResults) root.addContent(browserResult.asXml()); return root; } private void addPlatformType(Element root) { PlatformType type = PlatformType.resolve(osName); root.addContent(type.asXml()); } private boolean hasPlatformType() { return osName != null; } private boolean hasProperties() { return osName != null || ipAddress != null || hostname != null; } private void addProperties(Element element) { if (osName != null) addProperty(element, "os", osName); if (ipAddress != null) addProperty(element, "ipAddress", ipAddress); if (hostname != null) addProperty(element, "hostname", hostname); } private void addProperty(Element element, String name, String value) { Element property = new Element("property"); property.setAttribute("name", name); property.setAttribute("value", value); element.addContent(property); } protected List<? extends Result> getChildren() { return browserResults; } public void setUnresponsive() { unresponsive = true; } public boolean wasUnresponsive() { return unresponsive; } public String getUrl() { return url; } public ResultType _getResultType() { if (unresponsive) return ResultType.UNRESPONSIVE; else return super._getResultType(); } public void setOsName(String osName) { this.osName = osName; } public void setIpAddress(String ipAddress) { this.ipAddress = ipAddress; } public void setHostname(String hostname) { this.hostname = hostname; } public void setUrl(String url) { this.url = url; } public String getOsName() { return osName; } public String getIpAddress() { return ipAddress; } public String getHostname() { return hostname; } public int compareTo(TestRunResult other) { if (url == null || other.getUrl() == null) return 0; return url.compareTo(other.getUrl()); } public void initializeProperties() { setOsName(SystemUtility.osString()); setHostname(SystemUtility.hostname()); setIpAddress(SystemUtility.ipAddress()); } protected void addMyErrorStringTo(StringBuffer buffer) { buffer.append(" "); buffer.append(getDisplayString()); buffer.append("\n"); } protected void addChildErrorStringTo(Result child, StringBuffer buffer) { if (!child.wasSuccessful()) { child.addErrorStringTo(buffer); if (url != null) { if (!buffer.toString().endsWith("\n")) { buffer.append("\n"); } buffer.append(" The result log is at "); BrowserResult childBrowserResult = (BrowserResult) child; buffer.append(childBrowserResult.getLogUrl(url)); } } } public String getDisplayString() { boolean hasURL = url != null; StringBuffer buffer = new StringBuffer(); if (hasURL) buffer.append(url); else buffer.append("localhost"); buffer.append(" (IP address: "); if (ipAddress != null) buffer.append(ipAddress); else buffer.append("unknown"); buffer.append(", host name: "); if (hostname != null) buffer.append(hostname); else buffer.append("unknown"); buffer.append(", OS: "); if (osName != null) buffer.append(osName); else buffer.append("unknown"); buffer.append(")"); return buffer.toString(); } public List<BrowserResult> _getBrowserResults() { return browserResults; } public BrowserResult[] getBrowserResults() { return browserResults.toArray(new BrowserResult[browserResults.size()]); } public void setBrowserResults(BrowserResult[] results) { browserResults = Arrays.asList(results); } public Document asXmlDocument() { return new Document(asXml()); } public boolean hasPlatformType(PlatformType platformType) { return getOsName() != null && getOsName().toLowerCase().indexOf(platformType.getDisplayName().toLowerCase()) != -1; } public Iterator<BrowserResult> iterator() { return _getBrowserResults().iterator(); } public BrowserResult findBrowserResultMatching(BrowserSpecification spec) { for (BrowserResult browserResult : this) if (spec.matches(browserResult)) return browserResult; return null; } }