Running the examples in Hudson would be ideal; however, the examples need to be reorganized to trigger a Maven build failure when they fail and they need to be executed during the build. Most of the examples are written as a standalone Java class with a main method. The client and server profiles are used to start the client and server applications. Running a Maven build (clean install for example) will never trigger the actual execution of the example code for most, if not all of the examples. Additionally, with the way the samples are currently written, they do not report failure in a way that integrates with the Maven build.
The following is a description of how I have provided examples that are also executed as part of the build process to ensure that the examples are always working. I have released example code to a client before where we created the example clients as JUnit tests and the example server as a standalone Java class that can be launched with the JVM or programmatically. We then configured the Maven build to run the JUnit test as part of the build. The JUnit test uses a system property to determine if it should start its own server programmatically or assume that the user launched one in a separate process. This flag allows the same JUnit test to run during the build and to also be run from the client profile after the user has run the server profile. So what you get is the sample running as part of the build using JUnit to cause a build failure if anything doesn't work right and the ability for the end user to still launch the client and server separately. This approach integrates well with Spring-test so pulling in Spring configuration is super simple on the client side (if we want to add that layer of indirection into the samples is another question entirely). Finally, this approach can also work with the server running in a container by using Cargo or PAX Exam/Runner. The Maven POM profiles: <profile> <id>client</id> <build> <defaultGoal>test</defaultGoal> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <systemPropertyVariables> <startServer>false</startServer> </systemPropertyVariables> </configuration> </plugin> </plugins> </build> </profile> <profile> <id>server</id> <build> <defaultGoal>process-test-classes</defaultGoal> <plugins> <!-- Note that this plug-in is used due to MEXEC-24 in the Maven 2 Exec Plug-in and the need to start the server in an external JVM. --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <phase>process-test-classes</phase> <configuration> <tasks> <java classname="examples.common.impl.StandAloneRunner" fork="true" classpathref="maven.test.classpath"> <arg value="classpath:/server-context.xml"/> </java> </tasks> </configuration> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </profile> -------------------------------------------------------------------------- Standalone server runner: package examples.common.impl; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * A utility class for running a server based on configuration in a Spring * context file. This class is intended to serve as the bootstrap code in a * separate JVM or as a utility for starting and stopping the server in the same * JVM. */ public class StandAloneRunner { /** * The Spring context. */ private ClassPathXmlApplicationContext ctx = null; /** * Starts a new instance and configures a shutdownhook to stop the instance * on JVM shutdown. * <p/> * Takes a single argument, the location of the Spring context file to load * in init-param style, i.e. with distinct locations separated by commas, * semicolons or whitespace. * * @param args * the arguments */ public static void main(String[] args) { System.out.println("Loading Service..."); if (args.length != 1) { throw new IllegalArgumentException( "The first argument must be the location of a Spring context file."); } final StandAloneRunner runner = new StandAloneRunner(args[0]); Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { runner.stop(); } }); runner.start(); System.out.println("Loaded Service."); System.out.println("Press Ctrl-c to terminate the service."); } /** * Creates a new instance. * * @param configLocation * the config locations for the application context in init-param * style, i.e. with distinct locations separated by commas, * semicolons or whitespace. */ public StandAloneRunner(String configLocation) { this.ctx = new ClassPathXmlApplicationContext(); this.ctx.setConfigLocation(configLocation); } /** * Starts/restarts the instance. */ public void start() { this.ctx.refresh(); } /** * Stops the instance. */ public void stop() { if (this.ctx != null) { this.ctx.close(); } } } -------------------------------------------------------------------------- JUnit test example: public class MyTest { ... /** * The runner used to run the server for this test. */ private static StandAloneRunner runner = null; /** * Starts the server described by the /server-context.xml file located on * the classpath if and only if the system property {...@code startServer} is * not {...@code false}. This flag allows this test to be executed against a * server that it manages using {...@link #runner} or against an externally * managed service. */ @BeforeClass public static void startServer() { if (Boolean.valueOf(System.getProperty("startServer", "true"))) { MyTest.runner = new StandAloneRunner( "classpath:server-context.xml"); MyTest.runner.start(); } } /** * Stops the server optionally started by {...@link #startServer()}. */ @AfterClass public static void stopServer() { try { if (MyTest.runner != null) { MyTest.runner.stop(); } } finally { MyTest.runner = null; } } } David Valeri --------------------------- http://davidvaleri.wordpress.com/ http://twitter.com/DavidValeri -----Original Message----- From: Daniel Kulp [mailto:dk...@apache.org] Sent: Monday, August 23, 2010 9:59 AM To: dev@cxf.apache.org Cc: Sergey Beryozkin Subject: Re: How to run interopfest? On Monday 23 August 2010 9:53:58 am Sergey Beryozkin wrote: > Hi > > On Mon, Aug 23, 2010 at 12:51 PM, Glen Mazza <glen.ma...@gmail.com> wrote: > > How does one run the interopfest tests? If I make a change to the > > stsclient > > I would want to make sure it doesn't break anything. > > > > I do 'mvn install -Pfastinstall' from the trunk, followed by 'mvn > > install' > > in /api, and then doing 'install' in /distribution. > Once the distribution is built, I go to target/..../samples/ and do the > 'mvn install' in whatever demo project I need to run. > Ex, I'd go ws_security/interopfest/wstrust10 and do 'mvn install'. > Apparently in CXF 2.3, one needs to do 'mvn install' directly from > 'samples' or alternatively you can modify the poms of individual demos by > adding <relativePath> to the parent properties. Ah.. The interopfest are down an extra directory. They would need the relativePath added. Good catch. Most of the demos that are just in the subdir directly under samples wouldn't as maven automatically looks in ".." > Finally, I run the demo according to README or pom.xml, > > mvn -Pclient > > in the case of WS-Trust demos. > > I'm wondering, should we resume the discussion about running demos in > Hudson ? Well, they are already building as part of the deploy builds: https://hudson.apache.org/hudson/view/CXF/job/CXF-trunk-deploy/378/ although the Interopfest ones are not as they require the MS servers to be up and running and such and I didn't want the builds failing due to that. Dan > cheers, Sergey > > > Glen > > -- > > View this message in context: > > http://cxf.547215.n5.nabble.com/How-to-run-interopfest-tp2644543p2644543. > > html Sent from the cxf-dev mailing list archive at Nabble.com. -- Daniel Kulp dk...@apache.org http://dankulp.com/blog