[jboss-cvs] JBossAS SVN: r87665 - projects/jboss-osgi/trunk/build/docbook/en/modules.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Wed Apr 22 05:58:15 EDT 2009
Author: thomas.diesler at jboss.com
Date: 2009-04-22 05:58:15 -0400 (Wed, 22 Apr 2009)
New Revision: 87665
Modified:
projects/jboss-osgi/trunk/build/docbook/en/modules/ch04-developer-guide.xml
Log:
Add section on testing
Modified: projects/jboss-osgi/trunk/build/docbook/en/modules/ch04-developer-guide.xml
===================================================================
--- projects/jboss-osgi/trunk/build/docbook/en/modules/ch04-developer-guide.xml 2009-04-22 09:31:55 UTC (rev 87664)
+++ projects/jboss-osgi/trunk/build/docbook/en/modules/ch04-developer-guide.xml 2009-04-22 09:58:15 UTC (rev 87665)
@@ -273,4 +273,128 @@
</note>
</sect1>
+ <sect1 xml:id="SecWritingTests">
+ <title>Writing Testcases</title>
+
+ <para>JBossOSGi comes with <ulink url="http://www.junit.org">JUnit</ulink> test support as part of the SPI provided
+ <ulink url="http://jbmuc.dyndns.org:8280/hudson/job/jbossosgi-jdk16/javadoc/org/jboss/osgi/spi/junit/package-summary.html">org.jboss.osgi.spi.junit</ulink>
+ package. There are two distinct test scenarios that we support</para>
+
+ <itemizedlist>
+ <listitem>Embedded OSGi Framework</listitem>
+ <listitem>Remote OSGi Framework</listitem>
+ </itemizedlist>
+
+ <emphasis role="bold">Testing an embedded OSGi Framework</emphasis>
+
+ <para>In the embedded scenario the testcase bootstraps the OSGi Framework and installes and tests the bundles locally. The base class for
+ embedded OSGi testing is <ulink url="http://jbmuc.dyndns.org:8280/hudson/job/jbossosgi-jdk16/javadoc/org/jboss/osgi/spi/junit/OSGiTest.html">org.jboss.osgi.spi.junit.OSGiTest</ulink>.
+ </para>
+
+ <programlisting role="JAVA">
+ public class EmbeddedTestCase extends OSGiTest
+ {
+ public void testSomeBundle() throws Exception
+ {
+ // Bootstrap the Framework and get the system bundle
+ OSGiFramework framework = getBootstrapProvider().getFramework();
+ BundleContext sysContext = framework.getSystemBundleContext();
+
+ // Install and start the test bundle
+ Bundle bundleA = installBundle(sysContext, "some-bundle.jar", true);
+
+ // Verify that the bundle is active
+ assertEquals("Test bundle ACTIVE", Bundle.ACTIVE, bundleA.getState());
+ }
+ }
+ </programlisting>
+
+ <para>Due to classloading restrictions it is not possible to interact with the services that get registered in the OSGi Framework
+ directly. Instead, there must be some means for the bundle under test to communicate with the test case that lives outside the
+ Framework. We use an approach where the test case registeres a <ulink url="http://www.osgi.org/javadoc/r4v41/org/osgi/service/log/LogListener.html">LogListener</ulink>
+ with the <ulink url="http://www.osgi.org/javadoc/r4v41/org/osgi/service/log/LogReaderService.html">LogReaderService</ulink>. Log messages are filtered and
+ can be verified by the test case. For this to work certain conditions must be true:</para>
+
+ <itemizedlist>
+ <listitem>The Framework must have a LogService installed</listitem>
+ <listitem>The bundle under test must write log messages to LogService</listitem>
+ <listitem>The LogListener must be seen by the classloader that loads the test case</listitem>
+ </itemizedlist>
+
+ <programlisting role="JAVA">
+ // Setup log entry tracking
+ LogEntryCache logEntryCache = new LogEntryCache();
+ logEntryCache.addFilter(new LogEntryFilter("example-log(.*)", LogService.LOG_INFO, "\\[ServiceA\\](.*)"));
+
+ // Start log entry tracking
+ startLogEntryTracking(logEntryCache);
+
+ // do stuff
+
+ // Verify the received log entries
+ List entries = logEntryCache.getLog();
+ assertEquals("Number of entries", 1, entries.size());
+ assertEquals("[ServiceA] new Service", entries.get(0).getMessage());
+
+ // Stop log entry tracking
+ stopLogEntryTracking();
+ </programlisting>
+
+ <emphasis role="bold">Testing a remote OSGi Framework</emphasis>
+
+ <para>In the remote scenario the testcase deploys the test bundle on the remote OSGi Framework. The base class for embedded OSGi testing
+ is <ulink url="http://jbmuc.dyndns.org:8280/hudson/job/jbossosgi-jdk16/javadoc/org/jboss/osgi/spi/junit/IntegrationTest.html">org.jboss.osgi.spi.junit.IntegrationTest</ulink>.
+ </para>
+
+ <programlisting role="JAVA">
+ public class RemoteTestCase extends IntegrationTest
+ {
+ public void testSomeBundle() throws Exception
+ {
+ // Deploy the test bundle
+ RemoteBundle bundleA = deployBundle("some-bundle.jar");
+
+ // Verify that the bundle is active
+ assertEquals("Test bundle ACTIVE", Bundle.ACTIVE, bundleA.getState());
+
+ // Undeploy the test bundle
+ undeployBundle("some-bundle.jar");
+ }
+ }
+ </programlisting>
+
+ <para>The test approach is simmilar to the embedded scenario. The test bundle writes log messages to the LogService. A RemoteLogListener transmits
+ the log messages to the RemoteLogReaderService that is installed locally. The test case registeres a LogListener with the RemoteLogReaderService.
+ Log messages are filtered and can be verified by the test case. Again, certain conditions must be true:</para>
+
+ <itemizedlist>
+ <listitem>The remote Framework must have a LogService installed</listitem>
+ <listitem>The jboss-osgi-remotelog.jar bundle must be installed in both the remote and local Framework</listitem>
+ <listitem>The bundle under test must write log messages to LogService</listitem>
+ <listitem>The LogListener must be seen by the classloader that loads the test case</listitem>
+ </itemizedlist>
+
+ <programlisting role="JAVA">
+ // Setup log entry tracking
+ LogEntryCache logEntryCache = new LogEntryCache();
+ logEntryCache.addFilter(new LogEntryFilter("example-log(.*)", LogService.LOG_INFO, "\\[ServiceA\\](.*)"));
+
+ // Start log entry tracking
+ startRemoteLogEntryTracking(logEntryCache);
+
+ // do stuff
+
+ // Verify the received log entries
+ List entries = logEntryCache.getLog();
+ assertEquals("Number of entries", 1, entries.size());
+ assertEquals("[ServiceA] new Service", entries.get(0).getMessage());
+
+ // Stop log entry tracking
+ stopRemoteLogEntryTracking();
+ </programlisting>
+
+ <para>For details on how to setup remote log message tracking, have a look at <xref linkend="SecRemoteLogService"/>.</para>
+
+ </sect1>
+
</chapter>
More information about the jboss-cvs-commits
mailing list