From: <ju...@us...> - 2008-08-28 17:06:37
|
Revision: 6995 http://smartfrog.svn.sourceforge.net/smartfrog/?rev=6995&view=rev Author: julgui Date: 2008-08-28 17:06:32 +0000 (Thu, 28 Aug 2008) Log Message: ----------- Updated directly to latest version. No merge. Modified Paths: -------------- branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/AbstractTestSuite.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/LogListener.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/RunnerConfiguration.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/TestContextInjector.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/TestListener.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/TestRunner.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/TestRunnerImpl.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/TestSuite.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/testsuite.sf branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/AbstractListenerImpl.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/BufferingListenerImpl.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/ChainListener.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/ChainListenerImpl.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/ConsoleListenerImpl.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/NullListenerImpl.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/StatisticsTestListenerImpl.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/components.sf branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/html/HtmlTestListenerComponent.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/html/HtmlTestListenerFactory.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/html/OneHostHtmlListener.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/xml/AbstractXmlListenerComponent.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/xml/XmlListenerComponent.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/xml/XmlListenerFactory.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/xml/XmlTestIndex.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/xml/XmlTestIndexImpl.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/xml/components.sf Added Paths: ----------- branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/antxml/ branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/antxml/AntXmlListener.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/antxml/AntXmlTestListenerComponent.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/antxml/XMLConstants.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/antxml/components.sf branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/antxml/junitreport.sf branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/xml/FileListener.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/xml/OneHostXMLListener.java branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/xml/ResultSet.java Modified: branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/AbstractTestSuite.java =================================================================== --- branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/AbstractTestSuite.java 2008-08-28 16:44:30 UTC (rev 6994) +++ branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/AbstractTestSuite.java 2008-08-28 17:06:32 UTC (rev 6995) @@ -19,36 +19,33 @@ */ package org.smartfrog.services.xunit.base; +import org.smartfrog.services.xunit.serial.Statistics; +import org.smartfrog.sfcore.common.SmartFrogDeploymentException; import org.smartfrog.sfcore.common.SmartFrogException; -import org.smartfrog.sfcore.common.SmartFrogInitException; -import org.smartfrog.sfcore.common.SmartFrogDeploymentException; import org.smartfrog.sfcore.common.SmartFrogRuntimeException; import org.smartfrog.sfcore.prim.Prim; -import org.smartfrog.sfcore.prim.PrimImpl; +import org.smartfrog.sfcore.prim.TerminationRecord; +import org.smartfrog.sfcore.utils.ComponentHelper; import org.smartfrog.sfcore.workflow.conditional.ConditionCompound; -import org.smartfrog.sfcore.utils.ComponentHelper; -import org.smartfrog.services.xunit.serial.Statistics; +import java.net.InetAddress; import java.rmi.RemoteException; -import java.util.List; -import java.util.ArrayList; -import java.net.InetAddress; /** * This is an abstract base class for test suites. * Its key feature is that it provides a thread local context variable that can be used to retrieve the current * context of a running test. * - * Because it extends ConditionCompound, it has the event workflow lifecycle, and the + * Because it extends ConditionCompound, it has the event workflow lifecycle * created 10-Oct-2006 11:39:29 */ public abstract class AbstractTestSuite extends ConditionCompound implements TestSuite { - private static final ThreadLocal<RunnerConfiguration> configurationContext =new ThreadLocal<RunnerConfiguration>(); + private static ThreadLocal<RunnerConfiguration> configurationContext; - private static final ThreadLocal<Prim> testSuiteContext =new ThreadLocal<Prim>(); + private static ThreadLocal<Prim> testSuiteContext; /** * Statistics about this test */ @@ -62,6 +59,20 @@ */ protected ComponentHelper helper; + /** + * Error Text + * </p> + * {@value} + */ + public static final String ERROR_OVERWRITING_CONTEXT = "Overwriting an existing thread-local configuration context.\n" + +"Multiple thread runners may be active in the same thread\n" + +"or the tests are themselves deploying tests."; + /** + * Error Text + * {@value} + */ + public static final String ERROR_OVERWRITING_SELF = "The component is overwriting its own configuration"; + protected AbstractTestSuite() throws RemoteException { } @@ -112,7 +123,22 @@ setHostname(host.getHostName()); } + /** + * Deregisters from all current registrations. + * + * @param status Termination Record + */ + @Override + public synchronized void sfTerminateWith(TerminationRecord status) { + //reset the state in this thread + getConfigurationContext().set(null); + resetTestSuiteContext(); + super.sfTerminateWith(status); + + } + + /** * bind to the configuration. A null parameter means 'stop binding' * * @param configuration config to bind to @@ -122,43 +148,48 @@ public void bind(RunnerConfiguration configuration) throws RemoteException, SmartFrogException { boolean overwriting=false; boolean overwritingourselves=false; - synchronized(configurationContext) { - RunnerConfiguration current = configurationContext.get(); + synchronized(getConfigurationContext()) { + RunnerConfiguration current = getConfigurationContext().get(); if(current !=null && configuration!=null) { overwriting=true; overwritingourselves= current == configuration; } - configurationContext.set(configuration); + getConfigurationContext().set(configuration); //set or reset the test suite context if(configuration!=null) { - if (testSuiteContext.get() != null) { + if (getTestSuiteContext().get() != null) { overwriting = true; } - testSuiteContext.set(this); + getTestSuiteContext().set(this); } else { - testSuiteContext.set(null); + resetTestSuiteContext(); } } if (overwriting) { //warn that something got overwritten. It is probably harmless, but can //cause interesting behaviour - sfLog().info("Overwriting an existing thread-local configuration context.\n" - +"Multiple thread runners may be active in the same thread\n" - +"or the tests are themselves deploying tests."); + sfLog().info(ERROR_OVERWRITING_CONTEXT); if(overwritingourselves) { - sfLog().info("The component is overwriting its own configuration"); + sfLog().info(ERROR_OVERWRITING_SELF); } } } + /** + * Reset our test suite context + */ + private void resetTestSuiteContext() { + getTestSuiteContext().set(null); + } + /** * Get the thread local configuration. * @return the configuration (may be null) */ public static RunnerConfiguration getConfiguration() { - return configurationContext.get(); + return getConfigurationContext().get(); } /** @@ -166,7 +197,7 @@ * @return the configuration (may be null) */ public static Prim getTestSuite() { - return testSuiteContext.get(); + return getTestSuiteContext().get(); } @@ -196,40 +227,6 @@ } /** - * flatten a string list, validating type as we go. recurses as much as we - * need to. At its most efficient if no flattening is needed. - * - * @param src source list - * @param name name of the list, for reporting errors - * @return a flatter list - * @throws SmartFrogInitException if there is an element that is not of the right type - */ - public List<String> flattenStringList(List src, String name) - throws SmartFrogException { - if (src == null) { - return new ArrayList<String>(0); - } - List<String> dest = new ArrayList<String>(src.size()); - for(Object element:src) { - if (element instanceof List) { - List<String> l2 = flattenStringList((List) element, name); - for (String s:l2) { - dest.add(s); - } - } else if (!(element instanceof String)) { - throw new SmartFrogInitException("An element in " - + - name + - " is not string or a list: " + - element.toString() + " class=" + element.getClass()); - } else { - dest.add((String) element); - } - } - return dest; - } - - /** * Get the test listener factory from this configuration * @return the test listener factory */ @@ -259,18 +256,18 @@ /** * Create a new listener from the current factory. - * @param name name of the suite + * @param suiteName name of the suite * @return a new listener - * @throws SmartFrogRuntimeException if needed + * @throws SmartFrogException if needed * @throws RemoteException on network trouble */ - protected TestListener listen(String name) throws RemoteException, SmartFrogException { + protected TestListener listen(String suiteName) throws RemoteException, SmartFrogException { TestListenerFactory listenerFactory = getTestListenerFactory(); TestListener newlistener = listenerFactory.listen(this, getHostname(), sfDeployedProcessName(), - name, + suiteName, System.currentTimeMillis()); return newlistener; } @@ -286,4 +283,26 @@ throws SmartFrogRuntimeException, RemoteException { getStats().updateResultAttributes(this, finished); } + + /** + * Get the current configuration; create it if needed + * @return the configuration context thread local + */ + private static synchronized ThreadLocal<RunnerConfiguration> getConfigurationContext() { + if(configurationContext==null) { + configurationContext=new ThreadLocal<RunnerConfiguration>(); + } + return configurationContext; + } + + /** + * Get the current test suite context; create it if needed + * @return the test suite context thread local + */ + private static synchronized ThreadLocal<Prim> getTestSuiteContext() { + if (testSuiteContext == null) { + testSuiteContext = new ThreadLocal<Prim>(); + } + return testSuiteContext; + } } Modified: branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/LogListener.java =================================================================== --- branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/LogListener.java 2008-08-28 16:44:30 UTC (rev 6994) +++ branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/LogListener.java 2008-08-28 17:06:32 UTC (rev 6995) @@ -25,6 +25,7 @@ import java.rmi.RemoteException; /** + * Interface for anything listening to log events * created 18-May-2006 15:40:02 */ @@ -33,7 +34,7 @@ /** * Log an event * @param event what happened - * @throws java.rmi.RemoteException + * @throws RemoteException on network trouble */ void log(LogEntry event) throws RemoteException; Modified: branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/RunnerConfiguration.java =================================================================== --- branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/RunnerConfiguration.java 2008-08-28 16:44:30 UTC (rev 6994) +++ branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/RunnerConfiguration.java 2008-08-28 17:06:32 UTC (rev 6995) @@ -26,7 +26,8 @@ import java.util.Properties; /** - * This is the configuration to run created 17-May-2004 17:22:03 The clone policy creates a shallow clone, and retains + * This is the configuration to run. + * The clone policy creates a shallow clone, and retains * the same listener */ Modified: branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/TestContextInjector.java =================================================================== --- branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/TestContextInjector.java 2008-08-28 16:44:30 UTC (rev 6994) +++ branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/TestContextInjector.java 2008-08-28 17:06:32 UTC (rev 6995) @@ -28,14 +28,27 @@ public interface TestContextInjector { + + /** + * Attribute + * {@value} + */ String ATTR_PRIM = "prim"; + /** + * Attribute + * {@value} + */ String ATTR_LISTENER = "listener"; + /** + * Attribute + * {@value} + */ String ATTR_PROPERTIES = "properties"; /** * Set the context of a test. * - * @param context + * @param context the name to value context */ - void setTestContext(HashMap context); + void setTestContext(HashMap<String, Object> context); } Modified: branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/TestListener.java =================================================================== --- branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/TestListener.java 2008-08-28 16:44:30 UTC (rev 6994) +++ branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/TestListener.java 2008-08-28 17:06:32 UTC (rev 6995) @@ -42,7 +42,8 @@ * end this test suite. After calling this, caller should discard * all references; they may no longer be valid. * <i>No further methods may be called</i> - * + * @throws RemoteException network problems + * @throws SmartFrogException other problems */ void endSuite() throws RemoteException, SmartFrogException; Modified: branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/TestRunner.java =================================================================== --- branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/TestRunner.java 2008-08-28 16:44:30 UTC (rev 6994) +++ branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/TestRunner.java 2008-08-28 17:06:32 UTC (rev 6995) @@ -26,61 +26,75 @@ import java.rmi.RemoteException; /** - * This is the public testrunner interface - * created 15-Apr-2004 11:51:44 + * This is the public testrunner interface created 15-Apr-2004 11:51:44 */ -public interface TestRunner extends Remote , TestResultAttributes - { +public interface TestRunner extends Remote, TestResultAttributes { /** * should deploy fail if there is an error? + * <p/> + * {@value} */ String ATTR_FAILONERROR = "failOnError"; - /** - * name of the keepgoing attr - */ - String ATTR_KEEPGOING = "keepGoing"; + /** + * name of the keepgoing attr. + * <p/> + * {@value} + */ + String ATTR_KEEPGOING = "keepGoing"; - /** - * name of the listener - */ - String ATTR_LISTENER = "listener"; + /** + * reference to the listener. + * <p/> + * {@value} + */ + String ATTR_LISTENER = "listener"; - /** - * boolean: run tests on startup + /** + * boolean: run tests on startup. + * <p/> + * {@value} */ - String ATTR_RUN_TESTS_ON_STARTUP="runTests"; + String ATTR_RUN_TESTS_ON_STARTUP = "runTests"; - /** - * Name of a single test to run - */ - String ATTR_SINGLE_TEST="singleTest"; + /** + * Name of a single test to run. + * <p/> + * {@value} + */ + String ATTR_SINGLE_TEST = "singleTest"; - /** - * the test log - */ - String ATTR_TESTLOG = "testLog"; + /** + * the test log <p/> {@value} + * <p/> + * {@value} + */ + String ATTR_TESTLOG = "testLog"; - /** - * thread priority; 1 to 9 - */ - String ATTR_THREAD_PRIORITY = "threadPriority"; + /** + * thread priority; 1 to 9. + * <p/> {@value} + */ + String ATTR_THREAD_PRIORITY = "threadPriority"; - /** - * time in seconds that a single test can take - */ - String ATTR_TIMEOUT_SECONDS="timeout"; + /** + * time in seconds that a single test can take. + * <p/> + * {@value} + */ + String ATTR_TIMEOUT_SECONDS = "timeout"; - /** - * Get the listener factory - * @return the factory - * @throws RemoteException - */ + /** + * Get the listener factory + * + * @return the factory + * @throws RemoteException network problems + */ TestListenerFactory getListenerFactory() throws RemoteException; @@ -89,22 +103,25 @@ /** * run the test + * * @return true if the tests were started - * @throws RemoteException + * @throws RemoteException network problems */ boolean startTests() throws RemoteException, SmartFrogException; /** * Get test execution statistics + * * @return stats - * @throws RemoteException + * @throws RemoteException network problems */ Statistics getStatistics() throws RemoteException; - /** - * test for being finished - * @return true if we have finished - * @throws RemoteException - */ + /** + * test for being finished + * + * @return true if we have finished + * @throws RemoteException network problems + */ boolean isFinished() throws RemoteException; } Modified: branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/TestRunnerImpl.java =================================================================== --- branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/TestRunnerImpl.java 2008-08-28 16:44:30 UTC (rev 6994) +++ branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/TestRunnerImpl.java 2008-08-28 17:06:32 UTC (rev 6995) @@ -30,6 +30,8 @@ import org.smartfrog.sfcore.reference.Reference; import org.smartfrog.sfcore.utils.ComponentHelper; import org.smartfrog.sfcore.utils.ShouldDetachOrTerminate; +import org.smartfrog.sfcore.utils.SmartFrogThread; +import org.smartfrog.sfcore.workflow.eventbus.EventCompoundImpl; import org.smartfrog.services.xunit.serial.Statistics; import org.smartfrog.services.xunit.serial.ThrowableTraceInfo; import org.smartfrog.services.xunit.log.TestListenerLog; @@ -48,7 +50,7 @@ * has been written for TestBlock instances. */ -public class TestRunnerImpl extends CompoundImpl implements TestRunner, +public class TestRunnerImpl extends EventCompoundImpl implements TestRunner, Runnable, TestBlock { private Log log; @@ -95,7 +97,7 @@ /** * thread to run the tests */ - private Thread worker = null; + private SmartFrogThread worker = null; /** * keeper of statistics @@ -107,9 +109,13 @@ */ private RunnerConfiguration configuration = new RunnerConfiguration(); + /** Error text {@value} */ public static final String ERROR_TESTS_IN_PROGRESS = "Component is already running tests"; + /** Error text {@value} */ public static final String TESTS_FAILED = "Tests Failed"; - private static final String TEST_WAS_INTERRUPTED = "Test was interrupted"; + /** Error text {@value} */ + public static final String TEST_WAS_INTERRUPTED = "Test was interrupted"; + private Prim listenerPrim; /** * constructor @@ -120,11 +126,20 @@ helper = new ComponentHelper(this); } - private synchronized Thread getWorker() { + + /** + * {@inheritDoc} + * @return false, always + */ + @Override + protected boolean isOldNotationSupported() { + return false; + } + private synchronized SmartFrogThread getWorker() { return worker; } - private synchronized void setWorker(Thread worker) { + private synchronized void setWorker(SmartFrogThread worker) { this.worker = worker; } @@ -166,18 +181,21 @@ */ public synchronized void sfStart() throws SmartFrogException, RemoteException { - //this will deploy all our children, including the test suites + // super.sfStart(); + //create and deploy all the children + synchCreateChildren(); + //now start working with them name = sfCompleteName(); - Object o = sfResolve(ATTR_LISTENER, - configuration.getListenerFactory(), + listenerPrim = sfResolve(ATTR_LISTENER, + (Prim)configuration.getListenerFactory(), true); - if (!(o instanceof TestListenerFactory)) { + if (!(listenerPrim instanceof TestListenerFactory)) { throw new SmartFrogException("The attribute " + ATTR_LISTENER - + "must refer to an implementation of TestListenerFactory"); + + " must refer to an implementation of TestListenerFactory"); } - TestListenerFactory listenerFactory = (TestListenerFactory) o; + TestListenerFactory listenerFactory = (TestListenerFactory) listenerPrim; String listenerName = ((Prim) listenerFactory).sfResolve( TestListenerFactory.ATTR_NAME, "", @@ -255,7 +273,7 @@ if (getWorker() != null) { throw new SmartFrogException(ERROR_TESTS_IN_PROGRESS); } - Thread thread = new Thread(this); + SmartFrogThread thread = new SmartFrogThread(this); thread.setName("tester"); thread.setPriority(threadPriority); log.info("Starting new tester at priority " + threadPriority); @@ -333,9 +351,7 @@ private boolean executeBatchTests() throws RemoteException, SmartFrogException, InterruptedException { boolean successful = true; - Enumeration e = sfChildren(); - while (e.hasMoreElements()) { - Object child = e.nextElement(); + for (Prim child:sfChildList()) { if (child instanceof TestSuite) { TestSuite suiteComponent = (TestSuite) child; successful &= executeTestSuite(suiteComponent); @@ -406,7 +422,7 @@ * * @param testSuite test suite to patch * @throws RemoteException network trouble - * @throws SmartFrogException other problems + * @throws SmartFrogRuntimeException other problems */ private synchronized void updateResultAttributes(Prim testSuite) throws SmartFrogRuntimeException, RemoteException { @@ -468,8 +484,8 @@ /** * Get test execution statistics * - * @return stats - * @throws java.rmi.RemoteException + * @return statistics + * @throws RemoteException */ public Statistics getStatistics() throws RemoteException { return statistics; Modified: branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/TestSuite.java =================================================================== --- branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/TestSuite.java 2008-08-28 16:44:30 UTC (rev 6994) +++ branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/TestSuite.java 2008-08-28 17:06:32 UTC (rev 6995) @@ -38,38 +38,51 @@ * Non-marked up text description * {@value} */ - public static final String ATTR_DESCRIPTION = "description"; + public String ATTR_DESCRIPTION = "description"; /** * A list of URLs to link to * {@value} */ - public static final String ATTR_LINKS = "links"; + public String ATTR_LINKS = "links"; /** * {@value} */ - public static final String ATTR_NAME = "name"; + public String ATTR_NAME = "name"; /** * list in name, value pairs [[name,value],[n2,v2]] * {@value} */ - public static final String ATTR_SYSPROPS="properties"; + public String ATTR_SYSPROPS="properties"; /** * A list of text tags to describe the test suite * {@value} */ - public static final String ATTR_TAGS = "tags"; + public String ATTR_TAGS = "tags"; /** + * A list of URLs to track back on + * {@value} + */ + public String ATTR_TRACKBACKS = "trackbacks"; + + + /** + * A list of issues, such as defect IDs + * {@value} + */ + public String ATTR_ISSUES = "issues"; + + /** * The name of another test suite that must have succeeded * before this test runs. If this component failed to deploy or * succeed, then this test suite is skipped. */ - public static final String ATTR_MUST_SUCCEED = "mustSucceed"; + public String ATTR_MUST_SUCCEED = "mustSucceed"; /** * bind to the configuration. A null parameter means 'stop binding' Modified: branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/testsuite.sf =================================================================== --- branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/testsuite.sf 2008-08-28 16:44:30 UTC (rev 6994) +++ branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/base/testsuite.sf 2008-08-28 17:06:32 UTC (rev 6995) @@ -32,9 +32,16 @@ description extends OptionalString { description "Non-marked up text description"; } - links extends OptionalVector { + links extends Vector { description "A list of URLs to link to"; } + trackbacks extends Vector { + description "A list of URLs to track back on "; + } + issues extends Vector { + description "A list of issues, such as defect IDs"; + } + } @@ -44,7 +51,10 @@ TestSuite extends EventCompound { testSuiteSchema extends TestSuiteSchema; sfShouldTerminate false; - + links []; + issues []; + tags []; + trackbacks []; } Modified: branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/AbstractListenerImpl.java =================================================================== --- branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/AbstractListenerImpl.java 2008-08-28 16:44:30 UTC (rev 6994) +++ branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/AbstractListenerImpl.java 2008-08-28 17:06:32 UTC (rev 6995) @@ -36,12 +36,18 @@ public abstract class AbstractListenerImpl extends PrimImpl implements TestListener { - public AbstractListenerImpl() throws RemoteException { + /** + * Constructor for children to extend + * @throws RemoteException network problems + */ + protected AbstractListenerImpl() throws RemoteException { } /** - * end this test suite. After calling this, caller should discard all references; they may no longer be valid. <i>No + * end this test suite. + * <p/> + * After calling this, caller should discard all references; they may no longer be valid. <i>No * further methods may be called</i> * @throws RemoteException network problems * @throws SmartFrogException other problems @@ -98,7 +104,7 @@ * Log an event * * @param event what happened - * @throws RemoteException + * @throws RemoteException network problems */ public void log(LogEntry event) throws RemoteException { Modified: branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/BufferingListenerImpl.java =================================================================== --- branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/BufferingListenerImpl.java 2008-08-28 16:44:30 UTC (rev 6994) +++ branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/BufferingListenerImpl.java 2008-08-28 17:06:32 UTC (rev 6995) @@ -33,13 +33,20 @@ import java.util.List; /** - * This class buffers received messages Date: 27-Jun-2004 Time: 21:26:28 + * This class buffers received messages. + * <p/> + * Created Date: 27-Jun-2004 Time: 21:26:28 */ public class BufferingListenerImpl extends AbstractListenerImpl implements BufferingListener { + /** + * create a new instance + * @throws RemoteException network problems + */ public BufferingListenerImpl() throws RemoteException { + events = new ArrayList<TestInfo>(); errors = new ArrayList<TestInfo>(); failures = new ArrayList<TestInfo>(); starts = new ArrayList<TestInfo>(); @@ -47,10 +54,19 @@ messages = new ArrayList<LogEntry>(); } - private List<TestInfo> errors, failures, starts, ends; + /** + * Lists of different results + */ + private List<TestInfo> events, errors, failures, starts, ends; + /** + * logged messages + */ private List<LogEntry> messages; + /** + * Count of started/finished sessions + */ private int sessionStartCount, sessionEndCount; @@ -101,7 +117,7 @@ } /** - * get the number of end + * get the number of ended tests * * @return the end count * @throws RemoteException for network trouble Modified: branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/ChainListener.java =================================================================== --- branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/ChainListener.java 2008-08-28 16:44:30 UTC (rev 6994) +++ branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/ChainListener.java 2008-08-28 17:06:32 UTC (rev 6995) @@ -54,7 +54,7 @@ /** * Run through every factory and create a listener from each one, adding each * returned instance to the listener factory. - * @param factories + * @param factories a list of listener factories * @param suite the test suite that is about to run. May be null, * especially during testing. * @param hostname name of host @@ -98,9 +98,7 @@ * {@inheritDoc} */ public void endSuite() throws RemoteException, SmartFrogException { - Iterator i=iterator(); - while (i.hasNext()) { - TestListener testListener = (TestListener) i.next(); + for(TestListener testListener:this) { testListener.endSuite(); } } @@ -110,10 +108,7 @@ */ public void addError(TestInfo test) throws RemoteException, SmartFrogException { - - Iterator i = iterator(); - while (i.hasNext()) { - TestListener testListener = (TestListener) i.next(); + for (TestListener testListener : this) { testListener.addError(test); } } @@ -123,9 +118,7 @@ */ public void addFailure(TestInfo test) throws RemoteException, SmartFrogException { - Iterator i = iterator(); - while (i.hasNext()) { - TestListener testListener = (TestListener) i.next(); + for (TestListener testListener : this) { testListener.addFailure(test); } @@ -136,9 +129,7 @@ */ public void endTest(TestInfo test) throws RemoteException, SmartFrogException { - Iterator i = iterator(); - while (i.hasNext()) { - TestListener testListener = (TestListener) i.next(); + for (TestListener testListener : this) { testListener.endTest(test); } } @@ -148,9 +139,7 @@ */ public void startTest(TestInfo test) throws RemoteException, SmartFrogException { - Iterator i = iterator(); - while (i.hasNext()) { - TestListener testListener = (TestListener) i.next(); + for (TestListener testListener : this) { testListener.startTest(test); } } @@ -159,12 +148,9 @@ * {@inheritDoc} */ public void log(LogEntry event) throws RemoteException { - Iterator i = iterator(); - while (i.hasNext()) { - TestListener testListener = (TestListener) i.next(); + for (TestListener testListener : this) { testListener.log(event); } - } } Modified: branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/ChainListenerImpl.java =================================================================== --- branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/ChainListenerImpl.java 2008-08-28 16:44:30 UTC (rev 6994) +++ branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/ChainListenerImpl.java 2008-08-28 17:06:32 UTC (rev 6995) @@ -23,9 +23,9 @@ import org.smartfrog.services.xunit.base.TestListenerFactory; import org.smartfrog.services.xunit.base.TestSuite; import org.smartfrog.sfcore.common.SmartFrogException; -import org.smartfrog.sfcore.logging.Log; import org.smartfrog.sfcore.prim.PrimImpl; -import org.smartfrog.sfcore.utils.ComponentHelper; +import org.smartfrog.sfcore.prim.Prim; +import org.smartfrog.sfcore.compound.CompoundImpl; import java.rmi.RemoteException; import java.util.ArrayList; @@ -37,7 +37,7 @@ * created 21-Apr-2006 11:27:58 */ -public class ChainListenerImpl extends PrimImpl implements TestListenerFactory { +public class ChainListenerImpl extends CompoundImpl implements TestListenerFactory { /** * The name of a factory @@ -60,9 +60,8 @@ * heartbeat. Subclasses can override to provide additional deployment * behavior. * - * @throws SmartFrogException - * error while deploying - * @throws java.rmi.RemoteException In case of network/rmi error + * @throws SmartFrogException error while deploying + * @throws RemoteException In case of network/rmi error */ public synchronized void sfDeploy() throws SmartFrogException, RemoteException { @@ -73,8 +72,7 @@ * Can be called to start components. Subclasses should override to provide * functionality Do not block in this call, but spawn off any main loops! * - * @throws SmartFrogException - * failure while starting + * @throws SmartFrogException failure while starting * @throws RemoteException In case of network/rmi error */ public synchronized void sfStart() throws SmartFrogException, @@ -87,6 +85,13 @@ TestListenerFactory factory = (TestListenerFactory) elt; factories.add(factory); } + //the children are live, so let's add them to the listener list. + for (Prim child : sfChildList()) { + if (child instanceof TestListenerFactory) { + factories.add((TestListenerFactory) child); + } + } + } /** Modified: branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/ConsoleListenerImpl.java =================================================================== --- branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/ConsoleListenerImpl.java 2008-08-28 16:44:30 UTC (rev 6994) +++ branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/ConsoleListenerImpl.java 2008-08-28 17:06:32 UTC (rev 6995) @@ -46,6 +46,10 @@ private PrintStream outputstream = System.out; + /** + * create an instance of the console listener + * @throws RemoteException network problems + */ public ConsoleListenerImpl() throws RemoteException { } @@ -53,7 +57,7 @@ /** * set a new output stream * - * @param out + * @param out the output stream */ public void setOutputStream(PrintStream out) { outputstream = out; @@ -62,7 +66,7 @@ /** * get the current output stream * - * @return + * @return the output stream */ public PrintStream getOutputstream() { return outputstream; @@ -82,7 +86,7 @@ /** * Print a line - * @param line + * @param line line to print */ public void println(String line) { outputstream.println(line); @@ -123,9 +127,9 @@ } println(fault.getClassname()); println(fault.getMessage()); - StackTraceElement stack[] = fault.getStack(); - for (int i = 0; i < stack.length; i++) { - println(stack[i].toString()); + StackTraceElement[] stack = fault.getStack(); + for (StackTraceElement aStack : stack) { + println(aStack.toString()); } flush(); //recurse Modified: branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/NullListenerImpl.java =================================================================== --- branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/NullListenerImpl.java 2008-08-28 16:44:30 UTC (rev 6994) +++ branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/NullListenerImpl.java 2008-08-28 17:06:32 UTC (rev 6995) @@ -28,6 +28,9 @@ /** * Dump all listened to events into the void. + * <p> + * The factory returns the same instance of the class every time, the null listener itself, + * which discards all events */ public class NullListenerImpl extends AbstractListenerImpl implements TestListenerFactory { Modified: branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/StatisticsTestListenerImpl.java =================================================================== --- branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/StatisticsTestListenerImpl.java 2008-08-28 16:44:30 UTC (rev 6994) +++ branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/StatisticsTestListenerImpl.java 2008-08-28 17:06:32 UTC (rev 6995) @@ -33,7 +33,7 @@ * All events are otherwise lost. */ -public class StatisticsTestListenerImpl extends AbstractListenerImpl implements StatisticsTestListener{ +public class StatisticsTestListenerImpl extends AbstractListenerImpl implements StatisticsTestListener { public StatisticsTestListenerImpl() throws RemoteException { } @@ -56,17 +56,11 @@ return this; } - private Statistics stats=new Statistics(); - - /** - * end this test suite. After calling this, caller should discard - * all references; they may no longer be valid. - * <i>No further methods may be called</i> + * The statistics */ - public void endSuite() { + private Statistics stats=new Statistics(); - } /** * An error occurred. @@ -91,13 +85,8 @@ /** * A test started. + * @param test test info */ - /** - * - * @param test - * @throws RemoteException - * @throws SmartFrogException - */ public void startTest(TestInfo test) { stats.incTestsStarted(); } Added: branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/antxml/AntXmlListener.java =================================================================== --- branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/antxml/AntXmlListener.java (rev 0) +++ branches/core-branch-osgi/components/xunit/src/org/smartfrog/services/xunit/listeners/antxml/AntXmlListener.java 2008-08-28 17:06:32 UTC (rev 6995) @@ -0,0 +1,506 @@ +/* (C) Copyright 2004-2008 Hewlett-Packard Development Company, LP + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + For more information: www.smartfrog.org + + */ + + +package org.smartfrog.services.xunit.listeners.antxml; + +import nu.xom.Attribute; +import nu.xom.Document; +import nu.xom.Element; +import nu.xom.Serializer; +import org.smartfrog.services.xunit.listeners.xml.FileListener; +import org.smartfrog.services.xunit.serial.LogEntry; +import org.smartfrog.services.xunit.serial.Statistics; +import org.smartfrog.services.xunit.serial.TestInfo; +import org.smartfrog.services.xunit.serial.ThrowableTraceInfo; +import org.smartfrog.services.filesystem.FileSystem; +import org.smartfrog.sfcore.common.SmartFrogException; +import org.smartfrog.sfcore.logging.LogSF; +import org.smartfrog.sfcore.logging.LogFactory; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.rmi.RemoteException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + + +/** + * This class listens to tests on a single host. The XML Listener forwards stuff + * to it. It is not a component; it is a utility class that components use, so + * as to log different test suites to different files. + * <p/> + */ +public class AntXmlListener implements FileListener, XMLConstants { + + private Document document; + + private LogSF log; + + /** + * file we save to + */ + private File destFile; + + /** + * name of host + */ + private String hostname; + /** + * name of the process + */ + private String processname; + /** + * name of the test suite + */ + private String suitename; + /** + * when did the test start + */ + private Date startTime; + /** + * when did the test finish + */ + private Date finishTime; + + /** + * store summary stats here, rather than duplicate code + */ + private Statistics stats = new Statistics(); + + /** + * This is built up as we go along + */ + private Element root, stdout, stderr; + private SimpleDateFormat dateFormat; + + + public AntXmlListener(String hostname, + File destFile, + String processname, + String suitename, + Date startTime) throws RemoteException { + this.destFile = destFile; + this.hostname = hostname; + this.processname = processname; + this.suitename = suitename; + this.startTime = startTime; + log = LogFactory.getLog(getClass()); + } + + + /** + * get the filename of this + * + * @return the filename used + * + * @throws RemoteException network trouble + */ + public String getFilename() throws RemoteException { + return destFile.getAbsolutePath(); + } + + /** + * Open the listener. This can be a no-op, or it can open a file and throw + * An exception on demand + * + * @throws IOException for IO trouble + * @throws RemoteException network trouble + */ + public synchronized void open() throws IOException { + root = new Element(TESTSUITES); + document = new Document(root); + stdout = new Element(SYSTEM_OUT); + stderr = new Element(SYSTEM_OUT); + maybeAddAttribute(root, HOSTNAME, hostname); + maybeAddAttribute(root, ATTR_NAME, suitename); + dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + TimeZone gmt = TimeZone.getTimeZone("GMT"); + dateFormat.setTimeZone(gmt); + dateFormat.setLenient(true); + String timestamp = dateFormat.format(startTime); + maybeAddAttribute(root, TIMESTAMP, timestamp); + log.info("logging to "+destFile); + } + + /** + * close the file. This call must be harmless if the file is already closed + * + * @throws IOException IO trouble + * @throws RemoteException network trouble + */ + public synchronized void close() throws IOException { + if (document == null) { + return; + } + //this is where we actually save the file to disk. + try { + log.info("Creating the XML report file "+destFile); + buildRootAttributes(); + addLogEntries(); + save(); + } finally { + //cleanup + document = null; + stdout = null; + stderr = null; + } + } + + /** + * Add the statistics to the root node; replace any that existed testsuite + * errors="0" failures="0" hostname="k2" name="org.smartfrog.services.filesystem.csvfiles.test.system.CsvReaderTest" + * tests="6" time="20.077" timestamp="2008-04-15T09:05:50"> + */ + private synchronized void buildRootAttributes() { + String fullname = hostname; + if (processname != null) { + hostname += '-' + processname; + } + maybeAddAttribute(root, "hostname", fullname); + maybeAddAttribute(root, "name", suitename); + double duration = 0; + if (finishTime != null) { + duration = (finishTime.getTime() - startTime.getTime()) / 1000.0; + } + maybeAddAttribute(root, "timestamp", dateFormat.format(startTime)); + maybeAddAttribute(root, "time", Double.toString(duration)); + addAttribute(root, "tests", stats.getTestsRun()); + addAttribute(root, "errors", stats.getErrors()); + addAttribute(root, "failures", stats.getFailures()); + addPropertiesToRoot(); + } + + /** + * Add the properties to the root. I'm unsure about this for security reasons...maybe we will present other facts + * under this element, to sneak them in to existing reports. + */ + private void addPropertiesToRoot() { + addElement(root,"properties",""); + } + + /** + * test for the file being open + * + * @return true iff we are building up a document + * + * @throws RemoteException network trouble + */ + public boolean isOpen() throws RemoteException { + return document != null; + } + + /** + * Teased out into a class for overriding if need be + * + * @param out the output stream + * + * @return a configured serializer + */ + protected Serializer createSerializer(OutputStream out) { + Serializer ser = new Serializer(out); + return ser; + } + + /** + * Write the document + * + * @throws IOException for IO trouble + */ + protected void save() throws IOException { + OutputStream out = null; + try { + + //create the parent directories on demand. + destFile.getParentFile().mkdirs(); + //now the workers + out = new BufferedOutputStream(new FileOutputStream(destFile)); + Serializer ser = createSerializer(out); + ser.write(document); + out.flush(); + out.close(); + out = null; + } finally { + FileSystem.close(out); + } + } + + + /** + * end this test suite. After calling this, caller should discard all + * references; they may no longer be valid. <i>No further methods may be + * called</i> + * + * @throws RemoteException network problems + * @throws SmartFrogException other problems + */ + public void endSuite() throws RemoteException, SmartFrogException { + finishTime = new Date(System.currentTimeMillis()); + } + + /** + * A test started. + * + * @param test test that started + * + * @throws RemoteException network problems + * @throws SmartFrogException other problems + */ + public void startTest(TestInfo test) + throws RemoteException, SmartFrogException { + stats.incTestsStarted(); + } + + /** + * An error occurred. + * + * @param test test that errored + * + * @throws RemoteException network problems + * @throws SmartFrogException other problems + */ + public void addError(TestInfo test) + throws RemoteException, SmartFrogException { + stats.incErrors(); + recordResult(ERROR, test); + } + + /** + * A failure occurred. + * + * @param test test that failed + * + * @throws RemoteException network problems + * @throws SmartFrogException other problems + */ + public void addFailure(TestInfo test) + throws RemoteException, SmartFrogException { + stats.incFailures(); + recordResult(FAILURE, test); + } + + /** + * A test ended. + * + * @param test test that ended + * + * @throws RemoteException network problems + * @throws SmartFrogException other problems + */ + public void endTest(TestInfo test) + throws RemoteException, SmartFrogException { + stats.incTestsRun(); + recordResult("end", test); + } + + /** + * Log an event + * + * @param event what happened + * + * @throws RemoteException on network trouble + */ + public void log(LogEntry event) throws RemoteException { + String text = event.logString(); + Element target; + target = (event.getLevel() == LogEntry.LOG_LEVEL_STDERR) ? stderr : stdout; + target.appendChild(text); + stats.incLoggedMessages(); + } + + /** + * Add an element to the root node + * + * @param name element name + * @param text the text + * + * @return the element + */ + private Element addElement(String name, String text) { + return addElement(root, name, text); + } + + /** + * Add an element + * + * @param parent parent element + * @param name element name + * @param text the text + * + * @return the element + */ + private Element addElement(Element parent, String name, String text) { + Element nested = new Element(name); + nested.appendChild(text); + if (text != null) { + parent.appendChild(nested); + } + return nested; + } + + /** + * add an element if the text is not null + * + * @param parent parent element + * @param name element name + * @param text text + * + * @return the element or null + */ + private Element maybeAddElement(Element parent, String name, String text) { + if (text != null) { + return addElement(parent, name, text); + } else { + return null; + } + } + + /** + * Add an attribute if the value is not null. If the attribute exists, it is + * replaced + * + * @param elt element to use + * @param name attribute name + * @param value attribute value (optional) + * + * @return the attribute or null + */ + private Attribute maybeAddAttribute(Element elt, + String name, + String value) { + if (value != null) { + Attribute a = new Attribute(name, value); + elt.addAttribute(a); + return a; + } else { + return null; + } + } + + + /** + * Add an attribute. If the attribute exists, it is replaced + * + * @param elt element to use + * @param name attribute name + * @param value attribute value (optional) + * + * @return the attribute or null + */ + private Attribute addAttribute(Element elt, + String name, + int value) { + Attribute a = new Attribute(name, Integer.toString(value)); + elt.addAttribute(a); + return a; + } + + + /* This is what a single, complex test case looks like. + The fault's message goes in the message attribute, the nested text contains that and the stack + + <testcase classname="org.smartfrog.services.restlet.test.system.testwar.TestwarTest" name="testErrorPage" time="1.594"> + <failure message="Test failed + (unknown) -TestCompletedEvent at Mon Dec 10 15:18:08 GMT 2007 alive: true + status: + Termination Record: HOST morzine:rootProcess:testErrorPage:tests, type: abnormal, description: error in starting next component: exception SmartFrogDeploymentException: unnamed component. SmartFrogLifecycleException:: [sfStart] Failed to create a new child., cause: SmartFrogDeploymentException: unnamed component. SmartFrogLifecycleException:: [sfStart] Failed to create a new child., cause: SmartFrogResolutionException:: Unresolved Reference: HERE connectTimeout, source: HOST morzine:rootProcess:testErrorPage:tests:operations:get, path(60): HOST morzine:rootProcess:testErrorPage:tests:operations:get , depth: 0, Reference not found, SmartFrog 3.12.015dev (2007-12-10 14:32:19 GMT), primSFCompleteName: HOST morzine:rootProcess:testErrorPage:tests:operations, primContext: included, reference: HOST morzine:rootProcess:testErrorPage:tests:operations, primContext: included, cause: SmartFrogLifecycleException:: [sfStart] Failed to create a new child., cause: SmartFrogResolutionException:: Unresolved Reference: HERE connectTimeout, source: HOST morzine:rootProcess:testErrorPage:tests:operations:get, path(60): HOST morzine:rootProcess:testErrorPage:tests:operations:get , depth: 0, Reference not found, SmartFrog 3.12.015dev (2007-12-10 14:32:19 GMT), primSFCompleteName: HOST morzine:rootProcess:testErrorPage:tests:operations, primContext: included, reference: HOST morzine:rootProcess:testErrorPage:tests:operations, primContext: included, SmartFrog 3.12.015dev (2007-12-10 14:32:19 GMT), primSFCompleteName: HOST morzine:rootProcess:testErrorPage:tests, primContext: included, reference: HOST morzine:rootProcess:testErrorPage:tests, primContext: included, cause: SmartFrogLifecycleException:: [sfStart] Failed to create a new child., cause: SmartFrogDeploymentException: unnamed component. SmartFrogLifecycleException:: [sfStart] Failed to create a new child., cause: SmartFrogResolutionException:: Unresolved Reference: HERE connectTimeout, source: HOST morzine:rootProcess:testErrorPage:tests:operations:get, path(60): HOST morzine:rootProcess:testErrorPage:tests:operations:get , depth: 0, Reference not found, SmartFrog 3.12.015dev (2007-12-10 14:32:19 GMT), primSFCompleteName: HOST morzine:rootProcess:testErrorPage:tests:operations, primContext: included, reference: HOST morzine:rootProcess:testErrorPage:tests:operations, primContext: included, cause: SmartFrogLifecycleException:: [sfStart] Failed to create a new child., cause: SmartFrogResolutionException:: Unresolved Reference: HERE connectTimeout, source: HOST morzine:rootProcess:testErrorPage:tests:operations:get, path(60): HOST morzine:rootProcess:testErrorPage:tests:operations:get , depth: 0, Reference not found, SmartFrog 3.12.015dev (2007-12-10 14:32:19 GMT), primSFCompleteName: HOST morzine:rootProcess:testErrorPage:tests:operations, primContext: included, reference: HOST morzine:rootProcess:testErrorPage:tests:operations, primContext: included, SmartFrog 3.12.015dev (2007-12-10 14:32:19 GMT), primSFCompleteName: HOST morzine:rootProcess:testErrorPage:tests, primContext: included, reference: HOST morzine:rootProcess:testErrorPage:tests, primContext: included, cause: SmartFrogDeploymentException: unnamed component. SmartFrogLifecycleException:: [sfStart] Failed to create a new child., cause: SmartFrogDeploymentException: unnamed component. SmartFrogLifecycleException:: [sfStart] Failed to create a new child., cause: SmartFrogResolutionException:: Unresolved Reference: HERE connectTimeout, source: HOST morzine:rootProcess:testErrorPage:tests:operations:get, path(60): HOST morzine:rootProcess:testErrorPage:tests:operations:get , depth: 0, Reference not found, SmartFrog 3.12.015dev (2007-12-10 14:32:19 GMT), primSFCompleteName: HOST morzine:rootProcess:testErrorPage:tests:operations, primContext: included, reference: HOST morzine:rootProcess:testErrorPage:tests:operations, primContext: included, cause: SmartFrogLifecycleException:: [sfStart] Failed to create a new child., cause: SmartFrogResolutionException:: Unresolved Reference: HERE connectTimeout, source: HOST morzine:rootProcess:testErrorPage:tests:operations:get, path(60): HOST morzine:rootProcess:testErrorPage:tests:operations:get , depth: 0, Reference not found, SmartFrog 3.12.015dev (2007-12-10 14:32:19 GMT), primSFCompleteName: HOST morzine:rootProcess:testErrorPage:tests:operations, ... [truncated message content] |