1   /*
2    * $Id: HttpRequestMessageAdapterTestCase.java 12291 2008-07-11 00:46:23Z dandiep $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
9    */
10  
11  package org.mule.transport.servlet;
12  
13  import org.mule.api.MessagingException;
14  import org.mule.api.transport.MessageAdapter;
15  import org.mule.transport.AbstractMessageAdapterTestCase;
16  
17  import java.io.BufferedReader;
18  import java.io.ByteArrayInputStream;
19  import java.io.IOException;
20  import java.io.InputStream;
21  import java.io.StringReader;
22  import java.lang.reflect.InvocationHandler;
23  import java.lang.reflect.Method;
24  import java.lang.reflect.Proxy;
25  import java.util.HashMap;
26  import java.util.Hashtable;
27  import java.util.Map;
28  
29  import javax.servlet.ServletInputStream;
30  import javax.servlet.http.HttpServletRequest;
31  
32  public class HttpRequestMessageAdapterTestCase extends AbstractMessageAdapterTestCase
33  {
34      public Object getValidMessage() throws Exception
35      {
36          return getMockRequest("test message");
37      }
38      
39      protected void doTestMessageEqualsPayload(Object message, Object payload) throws Exception
40      {
41          assertTrue(payload instanceof InputStream);
42      }
43      
44      public MessageAdapter createAdapter(Object payload) throws MessagingException
45      {
46          return new HttpRequestMessageAdapter(payload);
47      }
48  
49      public static HttpServletRequest getMockRequest(final String message)
50      {
51          Object proxy = Proxy.newProxyInstance(ServletConnectorTestCase.class.getClassLoader(),
52              new Class[]{HttpServletRequest.class}, new InvocationHandler()
53              {
54                  private String payload = message;
55                  private Map props = new HashMap();
56  
57                  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
58                  {
59                      if ("getInputStream".equals(method.getName()))
60                      {
61  
62                          ServletInputStream s = new ServletInputStream()
63                          {
64                              ByteArrayInputStream is = new ByteArrayInputStream(payload.getBytes());
65  
66                              public int read() throws IOException
67                              {
68                                  return is.read();
69                              }
70                          };
71                          return s;
72  
73                      }
74                      else if ("getAttribute".equals(method.getName()))
75                      {
76                          return props.get(args[0]);
77                      }
78                      else if ("setAttribute".equals(method.getName()))
79                      {
80                          props.put(args[0], args[1]);
81                      }
82                      else if ("equals".equals(method.getName()))
83                      {
84                          return Boolean.valueOf(payload.equals(args[0].toString()));
85                      }
86                      else if ("toString".equals(method.getName()))
87                      {
88                          return payload;
89                      }
90                      else if ("getReader".equals(method.getName()))
91                      {
92                          return new BufferedReader(new StringReader(payload.toString()));
93                      }
94                      else if ("getAttributeNames".equals(method.getName()))
95                      {
96                          return new Hashtable().elements();
97                      }
98                      else if ("getHeaderNames".equals(method.getName()))
99                      {
100                         return new Hashtable().elements();
101                     }
102                     return null;
103                 }
104             });
105         return (HttpServletRequest)proxy;
106     }
107 }