001    package org.hd.d.pg2k.test.dev;
002    
003    import java.io.IOException;
004    import java.net.MalformedURLException;
005    
006    import javax.servlet.http.HttpServlet;
007    
008    import junit.framework.TestCase;
009    
010    import org.hd.d.pg2k.svrCore.CoreConsts;
011    import org.hd.d.pg2k.webSvr.exhibit.DataSourceBean;
012    
013    import com.meterware.httpunit.GetMethodWebRequest;
014    import com.meterware.httpunit.WebRequest;
015    import com.meterware.servletunit.InvocationContext;
016    import com.meterware.servletunit.ServletRunner;
017    import com.meterware.servletunit.ServletUnitClient;
018    
019    /**Base class to support servlet-dependent tests. */
020    public abstract class ServletTestsBase extends TestCase
021        {
022        /**Servlet runner; not null after setUp(). */
023        private ServletRunner _sr;
024    
025        /**Dummy servlet used by getDataSourceBean() and other utility methods. */
026        public static final class DummyServlet extends HttpServlet
027            { private static final long serialVersionUID = -3108217776198161903L; }
028    
029        /**Set up the servlet runner and associated state. */
030        @Override protected void setUp()
031            {
032            _sr = new ServletRunner();
033            // Use DummyServlet for getting at application context, etc.
034            _sr.registerServlet("DummyServlet", DummyServlet.class.getName());
035            }
036    
037        /**Tear down the servlet environment. */
038        @Override protected void tearDown()
039            {
040            // cleanup code
041            _sr.shutDown();
042            }
043    
044        /**URL used to invoke DummyServlet (by that name), nominally under gallery.hd.org; not null. */
045        protected static final String DUMMY_SERVLET_URL_STRING = "http://"+CoreConsts.MAIN_DATA_HOST+"/DummyServlet";
046    
047        /**Get ServletRunner; never null after setUp(). */
048        protected ServletRunner getServletRunner()
049            { return(_sr); }
050    
051        /**Gets a new InvocationContext based on a request to the DummyServlet on the main host; never null. */
052        protected InvocationContext getNewInvocationContext() throws IOException,
053                MalformedURLException
054            {
055            final ServletUnitClient sc = getServletRunner().newClient();
056            final WebRequest wRequest = new GetMethodWebRequest(DUMMY_SERVLET_URL_STRING);
057            final InvocationContext ic = sc.newInvocation(wRequest);
058            return(ic);
059            }
060    
061        /**Get (application-wide/shared) Data Source Bean instance linked to servlet runner; never null.
062         * This instance is created on demand for one servlet run.
063         * <p>
064         * Should be correctly destroyed by tearDown().
065         */
066        protected DataSourceBean getDataSourceBean()
067            {
068            try
069                {
070                final InvocationContext ic = getNewInvocationContext();
071                final DummyServlet ds = (DummyServlet) ic.getServlet();
072                assertNotNull(ds);
073                final DataSourceBean dsb = DataSourceBean.getApplicationInstance(ds.getServletContext());
074                assertNotNull(dsb);
075                return(dsb);
076                }
077            catch(final Exception e)
078                {
079                throw new AssertionError("unexpected exception");
080                }
081            }
082        }