<html>

<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
<title>Cactus Integration in WTP</title>
<link rel="stylesheet" href="../../../../default_style.css">
</head>

<body LINK="#0000ff" VLINK="#800080">
<div align="right">&nbsp; <font face="Times New Roman, Times, serif" size="2">Copyright
  &copy; BEA Systems, Inc</font>
  <table border=0 cellspacing=0 cellpadding=2 width="100%">
    <tr>
      <td align=LEFT valign=TOP colspan="2" bgcolor="#0080C0"><b><font face="Arial,Helvetica"><font color="#FFFFFF">&nbsp;</font></font></b></td>
    </tr>
  </table>
</div>
<div align="left">
  <h1><img src="../../../../images/Idea.jpg" height=86 width=120 align="middle"></h1>
</div>
<p>&nbsp;</p>

<h1 ALIGN="CENTER">Cactus Integration in the Web Tools Project</h1>

<blockquote>
<b>Summary</b>

<br>
  This article briefly explains Cactus, its common uses and advantages and then provides a step-by-step tutorial on how to use the Cactus integration provided by WTP. The article assumes that you are familiar with <a href="http://www.junit.org/" target="_top">JUnit</a> and the basics of using WTP to build, deploy and run web projects.
  <p><b> Daniel R Somerfield, BEA Systems</b> <br>
    <font size="-1">May 31, 2005</font> </p>
</blockquote>
<hr width="100%">
<h2>What is Cactus?</h2>
<p>
	Cactus is actually very, very simple. It is often valuable to be able to test components (plain Java classes, Servlets, EJBs, etc.) within the container in which they will eventually be deployed. Cactus provides proxies for unit tests so that although you run the vanilla JUnit client (or any other JUnit client) locally, the tests are actually invoked on the target container. A servlet within the container fields requests from your local test case and delegates that actual running of the test to the test case running on the server and reports back the results. The test case can be deployed locally or remotely. Either way, Cactus works the same since it uses HTTP to do the invocation and reporting.
</p>
<p>
	Really, the only trick to using Cactus is setup and deployment. Fortunately, we get help from the Web Tools Project on the deployment. At the present, setup is still a manual process (something that will hopefully change in the future).
</p>
<hr width="100%">
<h2>Using WTP Cactus Integration</h2>
<p>
We start off with an existing web project and a class we want to test on Tomcat or any other WTP-supported servlet container. Let's say we have a <a href="code/components/security/PermissionManager.java">PermissionManager</a> class we want to test to see if it is correctly managing the permissions in the HTTP session. The important part of the PermissionManager is this method:
	<pre>
	public void validate(HttpServletRequest request)
	throws InsufficientPermissionsException
	{
		Permission permission = (Permission) request.getSession().getAttribute(TOKEN_KEY);
		if (!permission.implies(fPermissionRequired))
		{
			throw new InsufficientPermissionsException("You do not have permission for that operation");
		}
	}
	</pre>
<p>	In theory, it should check whether the user has permissions for the operation and if not, it should throw an <a href="code/components/security/InsufficientPermissionsException.java">InsufficientPermissionsException</a>. To check that it is doing it's job, we will want to write a unit test.
</p>
<p>
	But first, we need to get the cactus dependencies available on the class path. You will want to put them in the WebModule under WEB-INF/lib so that they are visible in the web module at runtime. The dependencies are all from the Cactus 1.7 distribution (available at <a href="http://jakarta.apache.org/site/downloads/downloads_cactus.cgi">http://jakarta.apache.org/site/downloads/downloads_cactus.cgi</a>). As of the writing of this document, they are:
	<ul>
		<li>cactus-1.7.jar
		<li>junit-3.8.1.jar
		<li>aspectjrt-1.2.1.jar
		<li>commons-logging-1.0.4.jar
		<li>commons-httpclient-2.0.2.jar
	</ul>
<p>Once you have added the libraries to the WEB-INF/lib (you can simply drag and drop them there), you can either add the libraries to the the build path by editing the build path in the project properties, or by right-clicking them while in the Java Perspective and choosing "Build Path-&gt;Add to Build Path".
</p>
<p>
	Now that we have the dependencies on the classpath, we can write our test. Rather than the usual JUnit TestCase, we need to extend ServletTestCase. As in JUnit, the testXXX() methods are discovered via introspection and run when the test executes. Unless you have any special needs via the beginXXX() and endXXX() client-side methods, the test will really look like any other unit test (see the cactus docs for more details on using beginXXX() and endXXX()).

	First let's write a test method to make sure the PermissionManager class is allowing requests it is supposed to. In the JavaSource folder, create the <a href="code/components/security/test/PermissionManagerTest.java">PermissionManagerTest</a> class and add the following method:
<pre>
	public void testPermissionManagerAllow() throws Exception
	{
		//Make sure that the AllPermission gives us permission to our test permission
		session.setAttribute(PermissionManager.TOKEN_KEY, new AllPermission());
		PermissionManager manager = new PermissionManager(new TestPermission("Test"));
		manager.validate(request);
	}
</pre>

	The test is quite simple. It just calls the validate method. If the validation fails, an InsufficientPermissionException will be thrown and the test will fail.

	Before we can run the test, we need to set up Cactus. In the web module, under WebContent/WEB-INF there should be a web.xml. To this file, add the following mark-up before the final web-app tag:

<pre>

    &lt;filter&gt;
        &lt;filter-name&gt;FilterRedirector&lt;/filter-name&gt;
        &lt;filter-class&gt;org.apache.cactus.server.FilterTestRedirector&lt;/filter-class&gt;
    &lt;/filter&gt;

    &lt;filter-mapping&gt;
        &lt;filter-name&gt;FilterRedirector&lt;/filter-name&gt;
        &lt;url-pattern&gt;/FilterRedirector&lt;/url-pattern&gt;
    &lt;/filter-mapping&gt;

    &lt;servlet&gt;
        &lt;servlet-name&gt;ServletRedirector&lt;/servlet-name&gt;
        &lt;servlet-class&gt;org.apache.cactus.server.ServletTestRedirector&lt;/servlet-class&gt;
    &lt;/servlet&gt;

    &lt;servlet&gt;
        &lt;servlet-name&gt;JspRedirector&lt;/servlet-name&gt;
        &lt;jsp-file&gt;/jspRedirector.jsp&lt;/jsp-file&gt;
    &lt;/servlet&gt;

    &lt;servlet-mapping&gt;
        &lt;servlet-name&gt;ServletRedirector&lt;/servlet-name&gt;
        &lt;url-pattern&gt;/ServletRedirector&lt;/url-pattern&gt;
    &lt;/servlet-mapping&gt;

    &lt;servlet-mapping&gt;
        &lt;servlet-name&gt;JspRedirector&lt;/servlet-name&gt;
        &lt;url-pattern&gt;/JspRedirector&lt;/url-pattern&gt;
    &lt;/servlet-mapping&gt;
</pre>

<p>
	This configures the redirectors that need to field the HTTP requests from Cactus and execute the unit test in the container.

	Once you have saved the web.xml, you might need to restart the HTTP container if you have already started it. Otherwise, you can right-click on the test case and choose "Run-&gt;Run on Server". If you want to debug the component or the test you can choose "Debug-&gt;Debug on Server" instead. Assuming our test passes, we should get that wonderful JUnit "green bar" in the JUnit window.
</p>
<!-- Note: this behavior changed in RC1. Leaving the comment just in case it changes back.
<p>
	Incidentally, by default the JUnit window will only appear on a failure. If you would like the JUnit window to appear all the time, go to the Preferences under Java->JUnit and disable "Show junit results view only when a failure or error occurs".
</p>
-->
<p>
	Now we write a second test method to make sure the PermissionManager is denying requests if you only have the insufficient <a href="code/components/security/ApplicationPermission.java">ApplicationPermission</a>:
<pre>
	public void testPermissionManagerDisallow() throws Exception
	{
		try
		{
			//Make sure that the ApplicationPermission does not give test permission
			session.setAttribute(PermissionManager.TOKEN_KEY, new ApplicationPermission("Login"));
			PermissionManager manager = new PermissionManager(new TestPermission("Test"));
			manager.validate(request);

		} catch (InsufficientPermissionsException e)
		{
		}
		fail("Should not have allowed this request");
	}
</pre>
Ooops--the red bar. It looks like our test failed. Looking at it, it is obvious why. If the InsufficientPermissionsException is being caught and execution is falling through to the fail() call. What we really meant was this:
<pre>
	public void testPermissionManagerDisallow() throws Exception
	{
		try
		{
			//Make sure that the ApplicationPermission does not give test permission
			session.setAttribute(PermissionManager.TOKEN_KEY, new ApplicationPermission("Login"));
			PermissionManager manager = new PermissionManager(new TestPermission("Test"));
			manager.validate(request);
			fail("Should not have allowed this request");
		} catch (InsufficientPermissionsException e)
		{
		}
	}
</pre>
<p>
Much better. Back to the green bar.
</p>
That's really all there is to it. All the normal JUnit best practices apply. You can aggregate tests with Suites and run Cactus tests and vanilla JUnit tests side-by-side. For more sophisticated Cactus test development, such as testing JSPs and Filters and using authentication, consult the <a href="http://jakarta.apache.org/cactus/" target="_top">Cactus website</a>.
<hr width="100%">
<h2>Source Code</h2>
<p>The source code for this article is pretty contrived and you could easily come up with your own, but if you want it, the entire web project is available in this <a href="code/CactusWebProject.zip">zip file</a>.
<hr width="100%">
</body>
</html>
