craigmcc 01/06/01 09:58:25 Modified: catalina/src/test/org/apache/naming/resources BaseDirContextTestCase.java FileDirContextTestCase.java WARDirContextTestCase.java Log: Some initial JUnit tests for FileDirContext and WARDirContext. These tests verify that the DirContext implementations faithfully represent several important aspects of a "well known" web application directory (i.e. the "examples" app). To execute the unit tests, run "ant test" from either the top-level directory or the "catalina" directory. (You must have a "junit.jar" property in your build.properties file pointing at your JUnit JAR file). Revision Changes Path 1.2 +447 -7 jakarta-tomcat-4.0/catalina/src/test/org/apache/naming/resources/BaseDirContextTestCase.java Index: BaseDirContextTestCase.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/test/org/apache/naming/resources/BaseDirContextTestCase.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- BaseDirContextTestCase.java 2001/06/01 00:30:27 1.1 +++ BaseDirContextTestCase.java 2001/06/01 16:58:21 1.2 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/test/org/apache/naming/resources/BaseDirContextTestCase.java,v 1.1 2001/06/01 00:30:27 craigmcc Exp $ - * $Revision: 1.1 $ - * $Date: 2001/06/01 00:30:27 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/test/org/apache/naming/resources/BaseDirContextTestCase.java,v 1.2 2001/06/01 16:58:21 craigmcc Exp $ + * $Revision: 1.2 $ + * $Date: 2001/06/01 16:58:21 $ * * ==================================================================== * @@ -64,19 +64,48 @@ package org.apache.naming.resources; +import java.util.Date; + +import javax.naming.Binding; +import javax.naming.NameClassPair; +import javax.naming.NamingEnumeration; +import javax.naming.NamingException; + +import javax.naming.directory.Attribute; +import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; + import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** - * Basic unit tests for the <code>javax.naming.directory.DirContext</code> + * <p>Basic unit tests for the <code>javax.naming.directory.DirContext</code> * implementations. This class must be subclassed for each individual - * <code>DirContext</code> implementation. + * <code>DirContext</code> implementation.</p> * + * <p><strong>WARNING</strong>: These tests make certain assumptions that + * can generate "false negative" results if they are violated:</p> + * <ul> + * <li>The pathname of a directory (or WAR file) containing the static + * resources of the <code>/examples</code> web application shipped + * with Tomcat is passed to our test class as a system property + * named <code>doc.base</code>.</li> + * <li>The entry names that can be found in the top-level DirContext of + * the static resources are enumerated in the <code>topLevelNames</code> + * variable.</li> + * <li>The entry names that can be found in the WEB-INF DirContext of + * the static resources are enumerated in the <code>webInfNames</code> + * variable.</li> + * <li>The entry names in either the top-level or WEB-INF DirContext contexts + * that should themselves be <code>DirContext</code> implementations (i.e. + * "subdirectories" in the static resources for this web application) + * are enumerated in the <code>dirContextNames</code> variable.</li> + * </ul> + * * @author Craig R. McClanahan - * @version $Revision: 1.1 $ $Date: 2001/06/01 00:30:27 $ + * @version $Revision: 1.2 $ $Date: 2001/06/01 16:58:21 $ */ public abstract class BaseDirContextTestCase extends TestCase { @@ -97,6 +126,45 @@ protected String docBase = System.getProperty("doc.base"); + /** + * Entry names that must be DirContexts. Names not on this list are + * assumed to be Resources. + */ + protected static final String dirContextNames[] = + { "classes", "images", "jsp", "lib", "META-INF", "WEB-INF" }; + + + /** + * The set of names that should be present in the top-level + * directory context. + */ + protected static final String topLevelNames[] = + { "images", "jsp", "servlets", "META-INF", "WEB-INF" }; + + + /** + * The set of names that should be present in the WEB-INF + * directory context. + */ + protected static final String webInfNames[] = + { "classes", "jsp", "lib", "web.xml" }; + + + /** + * The set of names that should be attributes of WEB-INF. + */ + protected static final String webInfAttrs[] = + { "creationdate", "displayname", "getcontentlength", "getlastmodified" }; + + + /** + * The set of names that should be attributes of WEB-INF/web.xml. + */ + protected static final String webXmlAttrs[] = + { "creationdate", "displayname", "getcontentlength", "getlastmodified", + "resourcetype" }; + + // ----------------------------------------------------------- Constructors @@ -139,10 +207,382 @@ // ------------------------------------------------ Individual Test Methods - public void testDummy() { ; } + /** + * Test the attributes returned for the <code>WEB-INF</code> entry. + */ + public abstract void testGetAttributesWebInf(); -} + /** + * Test the attributes returned for the <code>WEB-INF/web.xml</code> + * entry. + */ + public abstract void testGetAttributesWebXml(); + + + /** + * We should be able to list the contents of the top-level context itself, + * and locate some entries we know are there. + */ + public void testListTopLevel() { + + try { + checkList(context.list(""), topLevelNames); + } catch (NamingException e) { + fail("NamingException: " + e); + } + + } + + + /** + * We should be able to list the contents of the WEB-INF entry, + * and locate some entries we know are there. + */ + public void testListWebInfDirect() { + + try { + + // Look up the WEB-INF entry + Object webInfEntry = context.lookup("WEB-INF"); + assertNotNull("Found WEB-INF entry", webInfEntry); + assert("WEB-INF entry is a DirContext", + webInfEntry instanceof DirContext); + DirContext webInfContext = (DirContext) webInfEntry; + + // Check the contents of the WEB-INF context directly + checkList(webInfContext.list(""), webInfNames); + + } catch (NamingException e) { + fail("NamingException: " + e); + } + + + } + + + /** + * We should be able to list the contents of the WEB-INF entry, + * and locate some entries we know are there. + */ + public void testListWebInfIndirect() { + + try { + checkList(context.list("WEB-INF"), webInfNames); + } catch (NamingException e) { + fail("NamingException: " + e); + } + + } + + + /** + * We should be able to list the bindings of the top-level context itself, + * and locate some entries we know are there. + */ + public void testListBindingsTopLevel() { + + try { + checkListBindings(context.listBindings(""), topLevelNames); + } catch (NamingException e) { + fail("NamingException: " + e); + } + + } + + + /** + * We should be able to list the bindings of the WEB-INF entry, + * and locate some entries we know are there. + */ + public void testListBindingsWebInfDirect() { + + try { + + // Look up the WEB-INF entry + Object webInfEntry = context.lookup("WEB-INF"); + assertNotNull("Found WEB-INF entry", webInfEntry); + assert("WEB-INF entry is a DirContext", + webInfEntry instanceof DirContext); + DirContext webInfContext = (DirContext) webInfEntry; + + // Check the bindings of the WEB-INF context directly + checkListBindings(webInfContext.listBindings(""), webInfNames); + + } catch (NamingException e) { + fail("NamingException: " + e); + } + + + } + + + /** + * We should be able to list the bindings of the WEB-INF entry, + * and locate some entries we know are there. + */ + public void testListBindingsWebInfIndirect() { + try { + checkListBindings(context.listBindings("WEB-INF"), webInfNames); + } catch (NamingException e) { + fail("NamingException: " + e); + } + } + + + // -------------------------------------------------------- Support Methods + + + /** + * Check the results of a list() call against the specified entry list. + * + * @param enum The naming enumeration we are checking + * @param list The list of entry names we are expecting + * + * @exception NamingException if a naming exception occurs + */ + protected void checkList(NamingEnumeration ne, String list[]) + throws NamingException { + + String contextClassName = context.getClass().getName(); + + assertNotNull("NamingEnumeration is not null", ne); + while (ne.hasMore()) { + + Object next = ne.next(); + assert("list() returns NameClassPair instances", + next instanceof NameClassPair); + NameClassPair ncp = (NameClassPair) next; + + assert("Name '" + ncp.getName() + "' is expected", + isListed(ncp.getName(), list)); + + if (isDirContext(ncp.getName())) { + assert("Class '" + ncp.getClassName() + "' is '" + + contextClassName + "'", + contextClassName.equals(ncp.getClassName())); + } + + assert("Relative is 'true'", ncp.isRelative()); + + } + + } + + + /** + * Check the results of a listBindings() call against the + * specified entry list. + * + * @param enum The naming enumeration we are checking + * @param list The list of entry names we are expecting + * + * @exception NamingException if a naming exception occurs + */ + protected void checkListBindings(NamingEnumeration ne, String list[]) + throws NamingException { + + String contextClassName = context.getClass().getName(); + + assertNotNull("NamingEnumeration is not null", ne); + while (ne.hasMore()) { + + Object next = ne.next(); + assert("listBindings() returns Binding instances", + next instanceof Binding); + Binding b = (Binding) next; + + assert("Name '" + b.getName() + "' is expected", + isListed(b.getName(), list)); + + if (isDirContext(b.getName())) { + assert("Class '" + b.getClassName() + "' is '" + + contextClassName + "'", + contextClassName.equals(b.getClassName())); + } + + assert("Relative is 'true'", b.isRelative()); + + Object object = b.getObject(); + assertNotNull("Name '" + b.getName() + "' has a non-null object", + object); + if (b.getName().equals("web.xml")) { + assert("Entry '" + b.getName() + "' is a Resource", + object instanceof Resource); + } else { + assert("Entry '" + b.getName() + "' is a DirContext", + object instanceof DirContext); + } + + } + + } + + + /** + * Check the attributes associated with a WEB-INF entry. + * + * @param attrs The attributes for this entry + * @param creationDate The creation date for this entry + * @param contentLength The content length for this entry + * @param displayName The display name for this entry + * @param lastModifiedDate The last modified date for this entry + */ + protected void checkWebInfAttributes(Attributes attrs, + Date creationDate, + long contentLength, + String displayName, + Date lastModifiedDate) + throws NamingException { + + assertNotNull("getAttributes() returned non-null", attrs); + + NamingEnumeration ne = attrs.getAll(); + assertNotNull("getAll() returned non-null", ne); + while (ne.hasMore()) { + + Object next = ne.next(); + assert("getAll() returns Attribute instances", + next instanceof Attribute); + Attribute attr = (Attribute) next; + String name = attr.getID(); + int index = getIndex(name, webInfAttrs); + assert("WEB-INF attribute '" + name + "' is expected", + index >= 0); + Object value = attr.get(); + assertNotNull("get() returned non-null", value); + + if (name.equals("creationdate")) { + assert("Creation date is a date", + value instanceof Date); + assert("Creation date equals " + creationDate, + creationDate.equals((Date) value)); + } else if (name.equals("displayname")) { + assert("Display name is a string", + value instanceof String); + assert("Display name equals " + displayName, + displayName.equals((String) value)); + } else if (name.equals("getcontentlength")) { + assert("Content length is a long", + value instanceof Long); + assert("Content length equals " + contentLength, + contentLength == ((Long) value).longValue()); + } else if (name.equals("getlastmodified")) { + assert("Last modified date is a date", + value instanceof Date); + assert("Last modified date is " + lastModifiedDate, + lastModifiedDate.equals((Date) value)); + } + + } + } + + + /** + * Check the attributes associated with a WEB-INF/web.xml entry. + * + * @param attrs The attributes for this entry + * @param creationDate The creation date for this entry + * @param contentLength The content length for this entry + * @param displayName The display name for this entry + * @param lastModifiedDate The last modified date for this entry + */ + protected void checkWebXmlAttributes(Attributes attrs, + Date creationDate, + long contentLength, + String displayName, + Date lastModifiedDate) + throws NamingException { + + assertNotNull("getAttributes() returned non-null", attrs); + + NamingEnumeration ne = attrs.getAll(); + assertNotNull("getAll() returned non-null", ne); + while (ne.hasMore()) { + + Object next = ne.next(); + assert("getAll() returns Attribute instances", + next instanceof Attribute); + Attribute attr = (Attribute) next; + String name = attr.getID(); + int index = getIndex(name, webXmlAttrs); + assert("WEB-INF/web.xml attribute '" + name + "' is expected", + index >= 0); + Object value = attr.get(); + assertNotNull("get() returned non-null", value); + + if (name.equals("creationdate")) { + assert("Creation date is a date", + value instanceof Date); + assert("Creation date equals " + creationDate, + creationDate.equals((Date) value)); + } else if (name.equals("displayname")) { + assert("Display name is a string", + value instanceof String); + assert("Display name equals " + displayName, + displayName.equals((String) value)); + } else if (name.equals("getcontentlength")) { + assert("Content length is a long", + value instanceof Long); + assert("Content length equals " + contentLength, + contentLength == ((Long) value).longValue()); + } else if (name.equals("getlastmodified")) { + assert("Last modified date is a date", + value instanceof Date); + assert("Last modified date is " + lastModifiedDate, + lastModifiedDate.equals((Date) value)); + } + + } + + } + + + /** + * Return the index of the specified name in the specified list, or + * -1 if the name is not present. + * + * @param name Name to be looked up + * @param list List of names to be checked + */ + protected int getIndex(String name, String list[]) { + + for (int i = 0; i < list.length; i++) { + if (name.equals(list[i])) + return (i); + } + return (-1); + + } + + + /** + * Is an entry of the specified name supposed to be a DirContext? + * + * @param name Name to be checked + */ + protected boolean isDirContext(String name) { + + return (isListed(name, dirContextNames)); + + } + + + /** + * Returns <code>true</code> if the specified name is found in the + * specified list. + * + * @param name Name to be looked up + * @param list List to be looked up into + */ + protected boolean isListed(String name, String list[]) { + + return (getIndex(name, list) >= 0); + + } + + +} 1.2 +74 -3 jakarta-tomcat-4.0/catalina/src/test/org/apache/naming/resources/FileDirContextTestCase.java Index: FileDirContextTestCase.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/test/org/apache/naming/resources/FileDirContextTestCase.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- FileDirContextTestCase.java 2001/06/01 00:30:27 1.1 +++ FileDirContextTestCase.java 2001/06/01 16:58:22 1.2 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/test/org/apache/naming/resources/FileDirContextTestCase.java,v 1.1 2001/06/01 00:30:27 craigmcc Exp $ - * $Revision: 1.1 $ - * $Date: 2001/06/01 00:30:27 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/test/org/apache/naming/resources/FileDirContextTestCase.java,v 1.2 2001/06/01 16:58:22 craigmcc Exp $ + * $Revision: 1.2 $ + * $Date: 2001/06/01 16:58:22 $ * * ==================================================================== * @@ -64,7 +64,16 @@ package org.apache.naming.resources; +import java.io.File; + +import java.util.Date; + +import javax.naming.NamingException; + +import javax.naming.directory.Attribute; +import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; + import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; @@ -74,7 +83,7 @@ * Unit tests for <code>org.apache.naming.resources.FileDirContext</code>. * * @author Craig R. McClanahan - * @version $Revision: 1.1 $ $Date: 2001/06/01 00:30:27 $ + * @version $Revision: 1.2 $ $Date: 2001/06/01 16:58:22 $ */ public class FileDirContextTestCase extends BaseDirContextTestCase { @@ -133,6 +142,68 @@ // ------------------------------------------------ Individual Test Methods + + + /** + * Test the attributes returned for the <code>WEB-INF</code> entry. + */ + public void testGetAttributesWebInf() { + + try { + + // Identify a local file object for WEB-INF + File docBaseFile = new File(docBase); + File webInfFile = new File(docBaseFile, "WEB-INF"); + + // Look up the attributes for the WEB-INF entry + Attributes attributes = context.getAttributes("WEB-INF"); + + // Enumerate and check the attributes for this entry + checkWebInfAttributes(attributes, + new Date(webInfFile.lastModified()), + webInfFile.length(), + "WEB-INF", + new Date(webInfFile.lastModified())); + + } catch (NamingException e) { + + fail("NamingException: " + e); + + } + + } + + + /** + * Test the attributes returned for the <code>WEB-INF/web.xml</code> + * entry. + */ + public void testGetAttributesWebXml() { + + try { + + // Identify a local file object for WEB-INF/web.xml + File docBaseFile = new File(docBase); + File webInfFile = new File(docBaseFile, "WEB-INF"); + File webXmlFile = new File(webInfFile, "web.xml"); + + // Look up the attributes for the WEB-INF entry + Attributes attributes = context.getAttributes("WEB-INF/web.xml"); + + // Enumerate and check the attributes for this entry + checkWebXmlAttributes(attributes, + new Date(webXmlFile.lastModified()), + webXmlFile.length(), + "web.xml", + new Date(webXmlFile.lastModified())); + + } catch (NamingException e) { + + fail("NamingException: " + e); + + } + + } } 1.2 +87 -4 jakarta-tomcat-4.0/catalina/src/test/org/apache/naming/resources/WARDirContextTestCase.java Index: WARDirContextTestCase.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/test/org/apache/naming/resources/WARDirContextTestCase.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- WARDirContextTestCase.java 2001/06/01 00:30:27 1.1 +++ WARDirContextTestCase.java 2001/06/01 16:58:22 1.2 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/test/org/apache/naming/resources/WARDirContextTestCase.java,v 1.1 2001/06/01 00:30:27 craigmcc Exp $ - * $Revision: 1.1 $ - * $Date: 2001/06/01 00:30:27 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/test/org/apache/naming/resources/WARDirContextTestCase.java,v 1.2 2001/06/01 16:58:22 craigmcc Exp $ + * $Revision: 1.2 $ + * $Date: 2001/06/01 16:58:22 $ * * ==================================================================== * @@ -66,7 +66,18 @@ import java.io.File; import java.io.IOException; + +import java.util.Date; + +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +import javax.naming.NamingException; + +import javax.naming.directory.Attribute; +import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; + import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; @@ -76,7 +87,7 @@ * Unit tests for <code>org.apache.naming.resources.WARDirContext</code>. * * @author Craig R. McClanahan - * @version $Revision: 1.1 $ $Date: 2001/06/01 00:30:27 $ + * @version $Revision: 1.2 $ $Date: 2001/06/01 16:58:22 $ */ public class WARDirContextTestCase extends BaseDirContextTestCase { @@ -137,7 +148,79 @@ // ------------------------------------------------ Individual Test Methods -} + /** + * Test the attributes returned for the <code>WEB-INF</code> entry. + */ + public void testGetAttributesWebInf() { + + try { + + // Look up the attributes of this WAR file entry + JarFile jarFile = new JarFile(docBase); + assertNotNull("Created JarFile for " + docBase, jarFile); + JarEntry jarEntry = + (JarEntry) jarFile.getEntry("WEB-INF"); + assertNotNull("Created JarEntry for WEB-INF", jarEntry); + + // Look up the attributes for the WEB-INF entry + Attributes attributes = context.getAttributes("WEB-INF"); + + // Enumerate and check the attributes for this entry + checkWebInfAttributes(attributes, + new Date(jarEntry.getTime()), + jarEntry.getSize(), + "WEB-INF", + new Date(jarEntry.getTime())); + + } catch (IOException e) { + + fail("IOException: " + e); + + } catch (NamingException e) { + + fail("NamingException: " + e); + + } + } + + + /** + * Test the attributes returned for the <code>WEB-INF/web.xml</code> + * entry. + */ + public void testGetAttributesWebXml() { + + try { + + // Look up the attributes of this WAR file entry + JarFile jarFile = new JarFile(docBase); + assertNotNull("Created JarFile for " + docBase, jarFile); + JarEntry jarEntry = + (JarEntry) jarFile.getEntry("WEB-INF/web.xml"); + assertNotNull("Created JarEntry for WEB-INF/web.xml", jarEntry); + + // Look up the attributes for the WEB-INF/web.xml entry + Attributes attributes = context.getAttributes("WEB-INF/web.xml"); + + // Enumerate and check the attributes for this entry + checkWebXmlAttributes(attributes, + new Date(jarEntry.getTime()), + jarEntry.getSize(), + "web.xml", + new Date(jarEntry.getTime())); + } catch (IOException e) { + fail("IOException: " + e); + + } catch (NamingException e) { + + fail("NamingException: " + e); + + } + + } + + +}