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 }