View Javadoc

1   package com.atlassian.johnson.filters;
2   
3   import com.atlassian.johnson.DefaultJohnsonEventContainer;
4   import com.atlassian.johnson.event.Event;
5   import org.junit.Test;
6   
7   import javax.servlet.http.HttpServletResponse;
8   import java.io.ByteArrayOutputStream;
9   import java.io.IOException;
10  import java.io.PrintWriter;
11  import java.util.Collection;
12  import java.util.Collections;
13  import java.util.List;
14  
15  import static org.easymock.EasyMock.*;
16  import static org.junit.Assert.*;
17  
18  /**
19   * Tests both the JohnsonSoapFilter and JohnsonXmlRpcFilter classes.
20   */
21  public class JohnsonXmlRpcAndSoapFilterTest
22  {
23      private static final String ERROR_MSG = "TEST ERROR MESSAGE";
24      private static final String NOT_SETUP_ERROR_MESG = "The application has not yet been setup.";
25  
26      @Test
27      public void testHandleErrorSoapJohnsonFilter() throws IOException
28      {
29          JohnsonSoapFilter johnsonSoapFilter = new JohnsonSoapFilter()
30          {
31              @Override
32              protected String buildSoapFault(String errorMessage)
33              {
34                  return getSoapFaultMessage(ERROR_MSG);
35              }
36  
37              @Override
38              protected String getStringForEvents(Collection events)
39              {
40                  return null;
41              }
42          };
43          testHandleError(johnsonSoapFilter, getSoapFaultMessage(ERROR_MSG));
44      }
45  
46      @Test
47      public void testHandleErrorXmlRpcJohnsonFilter() throws IOException
48      {
49          JohnsonXmlRpcFilter johnsonXmlRpcFilter = new JohnsonXmlRpcFilter()
50          {
51              @Override
52              protected String buildXmlRpcErrorMessage(String error, int faultCode)
53              {
54                  return getXmlRpcFaultMessage(ERROR_MSG);
55              }
56  
57              @Override
58              protected String getStringForEvents(Collection events)
59              {
60                  return null;
61              }
62          };
63          testHandleError(johnsonXmlRpcFilter, getXmlRpcFaultMessage(ERROR_MSG));
64      }
65  
66      @Test
67      public void testBuildXmlRpcErrorMessage()
68      {
69          JohnsonXmlRpcFilter filter = new JohnsonXmlRpcFilter();
70          assertEquals(getXmlRpcFaultMessage(ERROR_MSG),
71                  filter.buildXmlRpcErrorMessage(ERROR_MSG, JohnsonXmlRpcFilter.FAULT_CODE));
72      }
73  
74      @Test
75      public void testHandleNotSetupXmlRpcJohnsonFilter() throws IOException
76      {
77          JohnsonXmlRpcFilter filter = new JohnsonXmlRpcFilter();
78          testHandleNotSetup(filter, getXmlRpcFaultMessage(NOT_SETUP_ERROR_MESG));
79      }
80  
81      @Test
82      public void testHandleNotSetupSoapJohnsonFilter() throws IOException
83      {
84          JohnsonSoapFilter filter = new JohnsonSoapFilter();
85          testHandleNotSetup(filter, getSoapFaultMessage(NOT_SETUP_ERROR_MESG));
86      }
87  
88      private String getSoapFaultMessage(String notSetupErrorMesg)
89      {
90          return "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
91                  "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n" +
92                  "                  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" +
93                  "    <soapenv:Body>\n" +
94                  "        <soapenv:Fault>\n" +
95                  "            <faultcode>soapenv:Server</faultcode>\n" +
96                  "            <faultstring>" +
97                  notSetupErrorMesg +
98                  "            </faultstring>\n" +
99                  "        </soapenv:Fault>\n" +
100                 "    </soapenv:Body>\n" +
101                 "</soapenv:Envelope>";
102     }
103 
104     private String getXmlRpcFaultMessage(String errorMessage)
105     {
106         return "<?xml version=\"1.0\"?>\n" +
107 
108                 "<methodResponse>\n" +
109                 "    <fault>\n" +
110                 "        <value>\n" +
111                 "            <struct>\n" +
112                 "                <member>\n" +
113                 "                    <name>faultString</name>\n" +
114                 "                    <value>" + errorMessage + "</value>\n" +
115                 "                </member>\n" +
116                 "                <member>\n" +
117                 "                    <name>faultCode</name>\n" +
118                 "                    <value>\n" +
119                 "                        <int>" + JohnsonXmlRpcFilter.FAULT_CODE + "</int>\n" +
120                 "                    </value>\n" +
121                 "                </member>\n" +
122                 "            </struct>\n" +
123                 "        </value>\n" +
124                 "    </fault>\n" +
125                 "</methodResponse>";
126     }
127 
128     private void testHandleError(AbstractJohnsonFilter filter, String message) throws IOException
129     {
130         ByteArrayOutputStream stream = new ByteArrayOutputStream(1024);
131         PrintWriter writer = new PrintWriter(stream);
132 
133         HttpServletResponse response = createStrictMock(HttpServletResponse.class);
134         response.setContentType(eq(AbstractJohnsonFilter.TEXT_XML_UTF8_CONTENT_TYPE));
135         response.setStatus(eq(HttpServletResponse.SC_SERVICE_UNAVAILABLE));
136         expect(response.getWriter()).andReturn(writer);
137 
138         replay(response);
139         filter.handleError(new DefaultJohnsonEventContainer()
140         {
141             public List<Event> getEvents()
142             {
143                 return Collections.emptyList();
144             }
145         }, null, response);
146         verify(response);
147 
148         writer.flush();
149         assertEquals(message, stream.toString());
150     }
151 
152     private void testHandleNotSetup(AbstractJohnsonFilter filter, String message) throws IOException
153     {
154         ByteArrayOutputStream stream = new ByteArrayOutputStream(512);
155         PrintWriter writer = new PrintWriter(stream);
156         
157         HttpServletResponse response = createStrictMock(HttpServletResponse.class);
158         response.setContentType(eq(AbstractJohnsonFilter.TEXT_XML_UTF8_CONTENT_TYPE));
159         response.setStatus(eq(HttpServletResponse.SC_SERVICE_UNAVAILABLE));
160         expect(response.getWriter()).andReturn(writer);
161 
162         replay(response);
163         filter.handleNotSetup(null, response);
164         verify(response);
165 
166         writer.flush();
167         assertEquals(message, stream.toString());
168     }
169 }