You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ServletFilterTest.java 9.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2018 SonarSource SA
  4. * mailto:info AT sonarsource DOT com
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 3 of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public License
  17. * along with this program; if not, write to the Free Software Foundation,
  18. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. package org.sonar.api.web;
  21. import javax.servlet.FilterChain;
  22. import javax.servlet.FilterConfig;
  23. import javax.servlet.ServletRequest;
  24. import javax.servlet.ServletResponse;
  25. import org.junit.Rule;
  26. import org.junit.Test;
  27. import org.junit.rules.ExpectedException;
  28. import static org.assertj.core.api.Assertions.assertThat;
  29. public class ServletFilterTest {
  30. @Rule
  31. public ExpectedException thrown = ExpectedException.none();
  32. @Test
  33. public void include_all() {
  34. ServletFilter.UrlPattern pattern = ServletFilter.UrlPattern.create("/*");
  35. assertThat(pattern.matches("/")).isTrue();
  36. assertThat(pattern.matches("/foo/ooo")).isTrue();
  37. assertThat(pattern.getInclusions()).containsOnly("/*");
  38. assertThat(pattern.getExclusions()).isEmpty();
  39. }
  40. @Test
  41. public void include_end_of_url() {
  42. ServletFilter.UrlPattern pattern = ServletFilter.UrlPattern.create("*foo");
  43. assertThat(pattern.matches("/")).isFalse();
  44. assertThat(pattern.matches("/hello/foo")).isTrue();
  45. assertThat(pattern.matches("/hello/bar")).isFalse();
  46. assertThat(pattern.matches("/foo")).isTrue();
  47. assertThat(pattern.matches("/foo2")).isFalse();
  48. }
  49. @Test
  50. public void include_beginning_of_url() {
  51. ServletFilter.UrlPattern pattern = ServletFilter.UrlPattern.create("/foo/*");
  52. assertThat(pattern.matches("/")).isFalse();
  53. assertThat(pattern.matches("/foo")).isTrue();
  54. assertThat(pattern.matches("/foo/bar")).isTrue();
  55. assertThat(pattern.matches("/bar")).isFalse();
  56. }
  57. @Test
  58. public void include_exact_url() {
  59. ServletFilter.UrlPattern pattern = ServletFilter.UrlPattern.create("/foo");
  60. assertThat(pattern.matches("/")).isFalse();
  61. assertThat(pattern.matches("/foo")).isTrue();
  62. assertThat(pattern.matches("/foo/")).isFalse();
  63. assertThat(pattern.matches("/bar")).isFalse();
  64. }
  65. @Test
  66. public void exclude_all() {
  67. ServletFilter.UrlPattern pattern = ServletFilter.UrlPattern.builder()
  68. .excludes("/*")
  69. .build();
  70. assertThat(pattern.matches("/")).isFalse();
  71. assertThat(pattern.matches("/foo/ooo")).isFalse();
  72. }
  73. @Test
  74. public void exclude_end_of_url() {
  75. ServletFilter.UrlPattern pattern = ServletFilter.UrlPattern.builder()
  76. .excludes("*foo")
  77. .build();
  78. assertThat(pattern.matches("/")).isTrue();
  79. assertThat(pattern.matches("/hello/foo")).isFalse();
  80. assertThat(pattern.matches("/hello/bar")).isTrue();
  81. assertThat(pattern.matches("/foo")).isFalse();
  82. assertThat(pattern.matches("/foo2")).isTrue();
  83. }
  84. @Test
  85. public void exclude_beginning_of_url() {
  86. ServletFilter.UrlPattern pattern = ServletFilter.UrlPattern.builder()
  87. .excludes("/foo/*")
  88. .build();
  89. assertThat(pattern.matches("/")).isTrue();
  90. assertThat(pattern.matches("/foo")).isFalse();
  91. assertThat(pattern.matches("/foo/bar")).isFalse();
  92. assertThat(pattern.matches("/bar")).isTrue();
  93. }
  94. @Test
  95. public void exclude_exact_url() {
  96. ServletFilter.UrlPattern pattern = ServletFilter.UrlPattern.builder()
  97. .excludes("/foo")
  98. .build();
  99. assertThat(pattern.matches("/")).isTrue();
  100. assertThat(pattern.matches("/foo")).isFalse();
  101. assertThat(pattern.matches("/foo/")).isTrue();
  102. assertThat(pattern.matches("/bar")).isTrue();
  103. }
  104. @Test
  105. public void use_multiple_include_patterns() {
  106. ServletFilter.UrlPattern pattern = ServletFilter.UrlPattern.builder()
  107. .includes("/foo", "/foo2")
  108. .build();
  109. assertThat(pattern.matches("/")).isFalse();
  110. assertThat(pattern.matches("/foo")).isTrue();
  111. assertThat(pattern.matches("/foo2")).isTrue();
  112. assertThat(pattern.matches("/foo/")).isFalse();
  113. assertThat(pattern.matches("/bar")).isFalse();
  114. }
  115. @Test
  116. public void use_multiple_exclude_patterns() {
  117. ServletFilter.UrlPattern pattern = ServletFilter.UrlPattern.builder()
  118. .excludes("/foo", "/foo2")
  119. .build();
  120. assertThat(pattern.matches("/")).isTrue();
  121. assertThat(pattern.matches("/foo")).isFalse();
  122. assertThat(pattern.matches("/foo2")).isFalse();
  123. assertThat(pattern.matches("/foo/")).isTrue();
  124. assertThat(pattern.matches("/bar")).isTrue();
  125. }
  126. @Test
  127. public void use_include_and_exclude_patterns() {
  128. ServletFilter.UrlPattern pattern = ServletFilter.UrlPattern.builder()
  129. .includes("/foo/*", "/foo/lo*")
  130. .excludes("/foo/login", "/foo/logout", "/foo/list")
  131. .build();
  132. assertThat(pattern.matches("/")).isFalse();
  133. assertThat(pattern.matches("/foo")).isTrue();
  134. assertThat(pattern.matches("/foo/login")).isFalse();
  135. assertThat(pattern.matches("/foo/logout")).isFalse();
  136. assertThat(pattern.matches("/foo/list")).isFalse();
  137. assertThat(pattern.matches("/foo/locale")).isTrue();
  138. assertThat(pattern.matches("/foo/index")).isTrue();
  139. }
  140. @Test
  141. public void use_include_and_exclude_prefix() {
  142. ServletFilter.UrlPattern pattern = ServletFilter.UrlPattern.builder()
  143. .includes("/foo_2")
  144. .excludes("/foo")
  145. .build();
  146. assertThat(pattern.matches("/")).isFalse();
  147. assertThat(pattern.matches("/foo_2")).isTrue();
  148. assertThat(pattern.matches("/foo")).isFalse();
  149. }
  150. @Test
  151. public void exclude_pattern_has_higher_priority_than_include_pattern() {
  152. ServletFilter.UrlPattern pattern = ServletFilter.UrlPattern.builder()
  153. .includes("/foo")
  154. .excludes("/foo")
  155. .build();
  156. assertThat(pattern.matches("/foo")).isFalse();
  157. }
  158. @Test
  159. public void accept_empty_patterns() {
  160. ServletFilter.UrlPattern pattern = ServletFilter.UrlPattern.builder()
  161. .excludes()
  162. .includes()
  163. .build();
  164. assertThat(pattern.matches("/")).isTrue();
  165. assertThat(pattern.matches("/foo/bar")).isTrue();
  166. }
  167. @Test
  168. public void create_throws_IAE_if_empty_url() {
  169. thrown.expect(IllegalArgumentException.class);
  170. thrown.expectMessage("URL pattern must start with slash '/': ");
  171. ServletFilter.UrlPattern.create("");
  172. }
  173. @Test
  174. public void filter_should_return_url_pattern() {
  175. ServletFilter filter = new FakeFilter();
  176. assertThat(filter.doGetPattern()).isNotNull();
  177. }
  178. @Test
  179. public void filter_should_apply_to_all_urls_by_default() {
  180. ServletFilter filter = new DefaultFilter();
  181. assertThat(filter.doGetPattern().matches("/")).isTrue();
  182. assertThat(filter.doGetPattern().matches("/foo/bar")).isTrue();
  183. }
  184. @Test
  185. public void getUrl_returns_single_inclusion() {
  186. assertThat(ServletFilter.UrlPattern.create("/*").getUrl()).isEqualTo("/*");
  187. assertThat(ServletFilter.UrlPattern.create("/foo/bar").getUrl()).isEqualTo("/foo/bar");
  188. }
  189. @Test
  190. public void getUrl_throws_ISE_if_many_urls() {
  191. thrown.expect(IllegalStateException.class);
  192. thrown.expectMessage("this method is deprecated and should not be used anymore");
  193. ServletFilter.UrlPattern.builder()
  194. .includes("/foo/*", "/foo/lo*")
  195. .excludes("/foo/login", "/foo/logout", "/foo/list")
  196. .build().getUrl();
  197. }
  198. @Test
  199. public void test_staticResourcePatterns() {
  200. assertThat(ServletFilter.UrlPattern.Builder.staticResourcePatterns()).containsOnly(
  201. "*.css",
  202. "*.css.map",
  203. "*.ico",
  204. "*.png",
  205. "*.jpg",
  206. "*.jpeg",
  207. "*.gif",
  208. "*.svg",
  209. "*.js",
  210. "*.js.map",
  211. "*.pdf",
  212. "/json/*",
  213. "/static/*",
  214. "/robots.txt",
  215. "/favicon.ico",
  216. "/apple-touch-icon*",
  217. "/mstile*");
  218. }
  219. @Test
  220. public void test_label() {
  221. assertThat(ServletFilter.UrlPattern.builder().build().label()).isEqualTo("UrlPattern{inclusions=[], exclusions=[]}");
  222. assertThat(ServletFilter.UrlPattern.builder()
  223. .includes("/foo/*")
  224. .excludes("/foo/login")
  225. .build().label()).isEqualTo("UrlPattern{inclusions=[/foo/*], exclusions=[/foo/login]}");
  226. assertThat(ServletFilter.UrlPattern.builder()
  227. .includes("/foo/*", "/foo/lo*")
  228. .excludes("/foo/login", "/foo/logout", "/foo/list")
  229. .build().label()).isEqualTo("UrlPattern{inclusions=[/foo/*, ...], exclusions=[/foo/login, ...]}");
  230. }
  231. private static class FakeFilter extends ServletFilter {
  232. @Override
  233. public UrlPattern doGetPattern() {
  234. return UrlPattern.create("/fake");
  235. }
  236. public void init(FilterConfig filterConfig) {
  237. }
  238. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) {
  239. }
  240. public void destroy() {
  241. }
  242. }
  243. private static class DefaultFilter extends ServletFilter {
  244. public void init(FilterConfig filterConfig) {
  245. }
  246. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) {
  247. }
  248. public void destroy() {
  249. }
  250. }
  251. }