View Javadoc
1   package com.atlassian.plugin.servlet.descriptors;
2   
3   import com.atlassian.plugin.Permissions;
4   import com.atlassian.plugin.Plugin;
5   import com.atlassian.plugin.PluginParseException;
6   import com.atlassian.plugin.impl.StaticPlugin;
7   import com.atlassian.plugin.module.PrefixDelegatingModuleFactory;
8   import com.atlassian.plugin.servlet.ServletModuleManager;
9   import com.atlassian.plugin.servlet.filter.FilterLocation;
10  import com.atlassian.plugin.servlet.filter.FilterTestUtils.FilterAdapter;
11  import org.dom4j.Element;
12  import org.dom4j.dom.DOMElement;
13  import org.junit.After;
14  import org.junit.Before;
15  import org.junit.Rule;
16  import org.junit.Test;
17  import org.junit.contrib.java.lang.system.RestoreSystemProperties;
18  import org.junit.rules.ExpectedException;
19  import org.mockito.Mock;
20  import org.mockito.junit.MockitoJUnit;
21  import org.mockito.junit.MockitoRule;
22  
23  import javax.servlet.DispatcherType;
24  import java.util.Collections;
25  
26  import static com.atlassian.plugin.Permissions.addPermission;
27  import static org.hamcrest.MatcherAssert.assertThat;
28  import static org.hamcrest.Matchers.containsInAnyOrder;
29  import static org.hamcrest.Matchers.is;
30  
31  public class TestServletFilterModuleDescriptor {
32      public static final String PLUGIN_KEY = "somekey";
33      @Rule
34      public final MockitoRule mockitoRule = MockitoJUnit.rule();
35      @Rule
36      public final ExpectedException expectedException = ExpectedException.none();
37      @Rule
38      public final RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties();
39  
40      @Mock
41      private ServletModuleManager servletModuleManager;
42  
43      ServletFilterModuleDescriptor descriptor;
44  
45      @Before
46      public void setUp() {
47          ServletFilterModuleDescriptor.FORCE_ASYNC.reset();
48          descriptor = new ServletFilterModuleDescriptor
49                  (new PrefixDelegatingModuleFactory(Collections.emptySet()), servletModuleManager);
50      }
51      @After
52      public void resetForceAsyncFlag() {
53          ServletFilterModuleDescriptor.FORCE_ASYNC.reset();
54      }
55  
56      @Test
57      public void testInit() {
58          final Plugin plugin = newPlugin(PLUGIN_KEY);
59          Element e = getValidConfig();
60          descriptor.init(plugin, e);
61          assertThat(descriptor.getLocation(), is(FilterLocation.BEFORE_DISPATCH));
62          assertThat(descriptor.getWeight(), is(100));
63      }
64  
65      private Plugin newPlugin(String key) {
66          Plugin plugin = new StaticPlugin();
67          plugin.setKey(key);
68          return addPermission(plugin, Permissions.EXECUTE_JAVA, null);
69      }
70  
71      private Element getValidConfig() {
72          Element e = new DOMElement("servlet-filter");
73          e.addAttribute("key", "key2");
74          e.addAttribute("class", FilterAdapter.class.getName());
75          Element url = new DOMElement("url-pattern");
76          url.setText("/foo");
77          e.add(url);
78          Element dispatcher1 = new DOMElement("dispatcher");
79          dispatcher1.setText("REQUEST");
80          e.add(dispatcher1);
81          Element dispatcher2 = new DOMElement("dispatcher");
82          dispatcher2.setText("FORWARD");
83          e.add(dispatcher2);
84          return e;
85      }
86  
87      @Test
88      public void testInitWithNoUrlPattern() {
89          Plugin plugin = newPlugin(PLUGIN_KEY);
90          Element e = new DOMElement("servlet-filter");
91          e.addAttribute("key", "key2");
92          e.addAttribute("class", FilterAdapter.class.getName());
93          expectedException.expect(PluginParseException.class);
94          descriptor.init(plugin, e);
95      }
96  
97      @Test
98      public void testInitWithDetails() {
99          Plugin plugin = newPlugin(PLUGIN_KEY);
100         Element e = getValidConfig();
101         e.addAttribute("location", "after-encoding");
102         e.addAttribute("weight", "122");
103         descriptor.init(plugin, e);
104         assertThat(descriptor.getLocation(), is(FilterLocation.AFTER_ENCODING));
105         assertThat(descriptor.getWeight(), is(122));
106         assertThat(descriptor.getDispatcherTypes(), containsInAnyOrder(DispatcherType.REQUEST, DispatcherType.FORWARD));
107     }
108 
109     @Test
110     public void testInitWithBadLocation() {
111         Plugin plugin = newPlugin(PLUGIN_KEY);
112         Element e = getValidConfig();
113         e.addAttribute("location", "t23op");
114         expectedException.expect(PluginParseException.class);
115         descriptor.init(plugin, e);
116     }
117 
118     @Test
119     public void testInitWithBadWeight() {
120         Plugin plugin = newPlugin(PLUGIN_KEY);
121         Element e = getValidConfig();
122         e.addAttribute("weight", "t23op");
123         expectedException.expect(PluginParseException.class);
124         descriptor.init(plugin, e);
125     }
126 
127     @Test
128     public void testInitWithBadDispatcher() {
129         Plugin plugin = newPlugin(PLUGIN_KEY);
130         Element e = getValidConfig();
131         Element badDispatcher = new DOMElement("dispatcher");
132         badDispatcher.setText("badValue");
133         e.add(badDispatcher);
134         expectedException.expect(PluginParseException.class);
135         descriptor.init(plugin, e);
136     }
137 
138     @Test
139     public void testWithNoDispatcher() {
140         Plugin plugin = newPlugin(PLUGIN_KEY);
141 
142         Element e = new DOMElement("servlet-filter");
143         e.addAttribute("key", "key2");
144         e.addAttribute("class", FilterAdapter.class.getName());
145         Element url = new DOMElement("url-pattern");
146         url.setText("/foo");
147         e.add(url);
148 
149         descriptor.init(plugin, e);
150         assertThat(descriptor.getDispatcherTypes(), containsInAnyOrder(DispatcherType.REQUEST));
151     }
152 
153     @Test
154     public void testWithNoDispatcherForcedAsync() {
155         System.setProperty(ServletFilterModuleDescriptor.FORCE_ASYNC_DISPATCHER_SYSPROP, "true");
156         Plugin plugin = newPlugin(PLUGIN_KEY);
157 
158         Element e = new DOMElement("servlet-filter");
159         e.addAttribute("key", "key2");
160         e.addAttribute("class", FilterAdapter.class.getName());
161         Element url = new DOMElement("url-pattern");
162         url.setText("/foo");
163         e.add(url);
164 
165         descriptor.init(plugin, e);
166         assertThat(descriptor.getDispatcherTypes(), containsInAnyOrder(DispatcherType.REQUEST, DispatcherType.ASYNC));
167     }
168 
169     @Test
170     public void testInitWithDetailsForceAsync() {
171         System.setProperty(ServletFilterModuleDescriptor.FORCE_ASYNC_DISPATCHER_SYSPROP, "true");
172         Plugin plugin = newPlugin(PLUGIN_KEY);
173         Element e = getValidConfig();
174         e.addAttribute("location", "after-encoding");
175         e.addAttribute("weight", "122");
176         descriptor.init(plugin, e);
177         assertThat(descriptor.getLocation(), is(FilterLocation.AFTER_ENCODING));
178         assertThat(descriptor.getWeight(), is(122));
179         assertThat(descriptor.getDispatcherTypes(), containsInAnyOrder(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.ASYNC));
180     }
181 }