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