package org.ocpsoft.rewrite.servlet.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import org.junit.Test;
import org.ocpsoft.rewrite.servlet.ServletRegistration;
public class WebXmlServletRegistrationParserTest
{
@Test(expected = IOException.class)
public void testShouldThrowIOExceptionForNonXmlInput() throws IOException
{
final String webXmlContent = "something_that_is_not_XML";
WebXmlServletRegistrationParser parser = new WebXmlServletRegistrationParser();
parser.parse(new ByteArrayInputStream(webXmlContent.getBytes(Charset.forName("UTF8"))));
}
@Test(expected = IOException.class)
public void testShouldThrowIOExceptionForBrokenXml() throws IOException
{
final String webXmlContent = "<?xml version=\"1.0\"?>\n" +
"<web-app>some stuff and a missing end tag\n";
WebXmlServletRegistrationParser parser = new WebXmlServletRegistrationParser();
parser.parse(new ByteArrayInputStream(webXmlContent.getBytes(Charset.forName("UTF8"))));
}
@Test
public void testShouldParseValidXmlDocumentsWithoutServlets() throws IOException
{
// GIVEN an XML file that is not a web.xml
final String webXmlContent = "<?xml version=\"1.0\"?>\n" +
"<start>That is not a web.xml</start>\n";
// WHEN the parser processes the input
WebXmlServletRegistrationParser parser = new WebXmlServletRegistrationParser();
parser.parse(new ByteArrayInputStream(webXmlContent.getBytes(Charset.forName("UTF8"))));
// THEN it should return no registrations
assertNotNull(parser.getRegistrations());
assertEquals(0, parser.getRegistrations().size());
}
@Test
public void testShouldParseEmptyWebXmlWithoutServlets() throws IOException
{
// GIVEN an empty web.xml
final String webXmlContent = "<?xml version=\"1.0\"?>\n" +
"<web-app xmlns=\"http://java.sun.com/xml/ns/javaee\" version=\"3.0\">\n" +
"\n" +
"</web-app>\n";
// WHEN the parser processes the input
WebXmlServletRegistrationParser parser = new WebXmlServletRegistrationParser();
parser.parse(new ByteArrayInputStream(webXmlContent.getBytes(Charset.forName("UTF8"))));
// THEN it should return no registrations
assertNotNull(parser.getRegistrations());
assertEquals(0, parser.getRegistrations().size());
}
@Test
public void testShouldParseWebXmlWithServletWithoutMapping() throws IOException
{
// GIVEN a Servlet without any mappings
final String webXmlContent = "<?xml version=\"1.0\"?>\n" +
"<web-app xmlns=\"http://java.sun.com/xml/ns/javaee\" version=\"3.0\">\n" +
"\n" +
" <servlet>\n" +
" <servlet-name>Faces Servlet</servlet-name>\n" +
" <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>\n" +
" <load-on-startup>1</load-on-startup>\n" +
" </servlet>\n" +
"\n" +
"</web-app>\n";
// WHEN the parser processes the input
WebXmlServletRegistrationParser parser = new WebXmlServletRegistrationParser();
parser.parse(new ByteArrayInputStream(webXmlContent.getBytes(Charset.forName("UTF8"))));
// THEN it should return one registration without any mappings
assertNotNull(parser.getRegistrations());
assertEquals(1, parser.getRegistrations().size());
ServletRegistration registation = parser.getRegistrations().get(0);
assertEquals("javax.faces.webapp.FacesServlet", registation.getClassName());
assertEquals(0, registation.getMappings().size());
}
@Test
public void testShouldParseWebXmlWithServletWithMapping() throws IOException
{
// GIVEN a Servlet with one mapping
final String webXmlContent = "<?xml version=\"1.0\"?>\n" +
"<web-app xmlns=\"http://java.sun.com/xml/ns/javaee\" version=\"3.0\">\n" +
"\n" +
" <servlet>\n" +
" <servlet-name>Faces Servlet</servlet-name>\n" +
" <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>\n" +
" <load-on-startup>1</load-on-startup>\n" +
" </servlet>\n" +
"\n" +
" <servlet-mapping>\n" +
" <servlet-name>Faces Servlet</servlet-name>\n" +
" <url-pattern>/faces/*</url-pattern>\n" +
" </servlet-mapping>\n" +
"\n" +
"</web-app>\n";
// WHEN the parser processes the input
WebXmlServletRegistrationParser parser = new WebXmlServletRegistrationParser();
parser.parse(new ByteArrayInputStream(webXmlContent.getBytes(Charset.forName("UTF8"))));
// THEN it should return one registration
assertNotNull(parser.getRegistrations());
assertEquals(1, parser.getRegistrations().size());
// AND there should be one mapping
ServletRegistration registation = parser.getRegistrations().get(0);
assertEquals("javax.faces.webapp.FacesServlet", registation.getClassName());
assertEquals(1, registation.getMappings().size());
assertEquals("/faces/*", registation.getMappings().get(0));
}
@Test
public void testShouldParseWebXmlWithMultipleServletMappings() throws IOException
{
// GIVEN a Servlet with two mappings
final String webXmlContent = "<?xml version=\"1.0\"?>\n" +
"<web-app xmlns=\"http://java.sun.com/xml/ns/javaee\" version=\"3.0\">\n" +
"\n" +
" <servlet>\n" +
" <servlet-name>Faces Servlet</servlet-name>\n" +
" <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>\n" +
" <load-on-startup>1</load-on-startup>\n" +
" </servlet>\n" +
"\n" +
" <servlet-mapping>\n" +
" <servlet-name>Faces Servlet</servlet-name>\n" +
" <url-pattern>/faces/*</url-pattern>\n" +
" </servlet-mapping>\n" +
"\n" +
" <servlet-mapping>\n" +
" <servlet-name>Faces Servlet</servlet-name>\n" +
" <url-pattern>*.jsf</url-pattern>\n" +
" </servlet-mapping>\n" +
"\n" +
"</web-app>\n";
// WHEN the parser processes the input
WebXmlServletRegistrationParser parser = new WebXmlServletRegistrationParser();
parser.parse(new ByteArrayInputStream(webXmlContent.getBytes(Charset.forName("UTF8"))));
// THEN it should return one registration
assertNotNull(parser.getRegistrations());
assertEquals(1, parser.getRegistrations().size());
// AND there should be both mappings in the registation
ServletRegistration registation = parser.getRegistrations().get(0);
assertEquals("javax.faces.webapp.FacesServlet", registation.getClassName());
assertEquals(2, registation.getMappings().size());
assertEquals("/faces/*", registation.getMappings().get(0));
assertEquals("*.jsf", registation.getMappings().get(1));
}
@Test
public void testShouldParseWebXmlMappingButMissingServlet() throws IOException
{
// GIVEN a Servlet with one mapping but without a matching servlet
final String webXmlContent = "<?xml version=\"1.0\"?>\n" +
"<web-app xmlns=\"http://java.sun.com/xml/ns/javaee\" version=\"3.0\">\n" +
"\n" +
" <servlet-mapping>\n" +
" <servlet-name>Faces Servlet</servlet-name>\n" +
" <url-pattern>/faces/*</url-pattern>\n" +
" </servlet-mapping>\n" +
"\n" +
"</web-app>\n";
// WHEN the parser processes the input
WebXmlServletRegistrationParser parser = new WebXmlServletRegistrationParser();
parser.parse(new ByteArrayInputStream(webXmlContent.getBytes(Charset.forName("UTF8"))));
// THEN it should return no registation
assertNotNull(parser.getRegistrations());
assertEquals(0, parser.getRegistrations().size());
}
@Test
public void testShouldParseWebXmlWithMultipleServletsAndMappings() throws IOException
{
// GIVEN multiple Servlets with mappings
final String webXmlContent = "<?xml version=\"1.0\"?>\n" +
"<web-app xmlns=\"http://java.sun.com/xml/ns/javaee\" version=\"3.0\">\n" +
"\n" +
" <servlet>\n" +
" <servlet-name>Faces Servlet</servlet-name>\n" +
" <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>\n" +
" <load-on-startup>1</load-on-startup>\n" +
" </servlet>\n" +
"\n" +
" <servlet>\n" +
" <servlet-name>Other Servlet</servlet-name>\n" +
" <servlet-class>com.example.MyServlet</servlet-class>\n" +
" </servlet>\n" +
"\n" +
" <servlet-mapping>\n" +
" <servlet-name>Faces Servlet</servlet-name>\n" +
" <url-pattern>/faces/*</url-pattern>\n" +
" </servlet-mapping>\n" +
"\n" +
" <servlet-mapping>\n" +
" <servlet-name>Other Servlet</servlet-name>\n" +
" <url-pattern>/*</url-pattern>\n" +
" </servlet-mapping>\n" +
"\n" +
"</web-app>\n";
// WHEN the parser processes the input
WebXmlServletRegistrationParser parser = new WebXmlServletRegistrationParser();
parser.parse(new ByteArrayInputStream(webXmlContent.getBytes(Charset.forName("UTF8"))));
// THEN it should return two registration
assertNotNull(parser.getRegistrations());
assertEquals(2, parser.getRegistrations().size());
// AND the first one should be the first Servlet occuring
ServletRegistration registation1 = parser.getRegistrations().get(0);
assertEquals("javax.faces.webapp.FacesServlet", registation1.getClassName());
assertEquals(1, registation1.getMappings().size());
assertEquals("/faces/*", registation1.getMappings().get(0));
// AND the second one should be the second Servlet occuring
ServletRegistration registation2 = parser.getRegistrations().get(1);
assertEquals("com.example.MyServlet", registation2.getClassName());
assertEquals(1, registation2.getMappings().size());
assertEquals("/*", registation2.getMappings().get(0));
}
}