|
16 | 16 |
|
17 | 17 | package org.springframework.boot.actuate.autoconfigure;
|
18 | 18 |
|
| 19 | +import static org.hamcrest.Matchers.equalTo; |
| 20 | +import static org.junit.Assert.assertThat; |
| 21 | +import static org.mockito.BDDMockito.willAnswer; |
| 22 | +import static org.mockito.BDDMockito.willThrow; |
| 23 | +import static org.mockito.Matchers.anyDouble; |
| 24 | +import static org.mockito.Matchers.anyString; |
| 25 | +import static org.mockito.Matchers.eq; |
| 26 | +import static org.mockito.Mockito.mock; |
| 27 | +import static org.mockito.Mockito.times; |
| 28 | +import static org.mockito.Mockito.verify; |
| 29 | +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; |
| 30 | +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; |
| 31 | + |
| 32 | +import java.io.IOException; |
| 33 | + |
19 | 34 | import javax.servlet.Filter;
|
20 | 35 | import javax.servlet.FilterChain;
|
| 36 | +import javax.servlet.ServletException; |
| 37 | +import javax.servlet.http.HttpServletRequest; |
| 38 | +import javax.servlet.http.HttpServletResponse; |
21 | 39 |
|
22 | 40 | import org.junit.Test;
|
23 | 41 | import org.mockito.invocation.InvocationOnMock;
|
|
27 | 45 | import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
28 | 46 | import org.springframework.context.annotation.Bean;
|
29 | 47 | import org.springframework.context.annotation.Configuration;
|
| 48 | +import org.springframework.core.annotation.Order; |
30 | 49 | import org.springframework.http.HttpStatus;
|
31 | 50 | import org.springframework.mock.web.MockHttpServletRequest;
|
32 | 51 | import org.springframework.mock.web.MockHttpServletResponse;
|
| 52 | +import org.springframework.stereotype.Component; |
33 | 53 | import org.springframework.test.web.servlet.MockMvc;
|
34 | 54 | import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
35 | 55 | import org.springframework.web.bind.annotation.PathVariable;
|
36 | 56 | import org.springframework.web.bind.annotation.RequestMapping;
|
37 | 57 | import org.springframework.web.bind.annotation.ResponseBody;
|
38 | 58 | import org.springframework.web.bind.annotation.ResponseStatus;
|
39 | 59 | import org.springframework.web.bind.annotation.RestController;
|
| 60 | +import org.springframework.web.filter.OncePerRequestFilter; |
40 | 61 | import org.springframework.web.util.NestedServletException;
|
41 | 62 |
|
42 |
| -import static org.hamcrest.Matchers.equalTo; |
43 |
| -import static org.junit.Assert.assertThat; |
44 |
| -import static org.mockito.BDDMockito.willAnswer; |
45 |
| -import static org.mockito.BDDMockito.willThrow; |
46 |
| -import static org.mockito.Matchers.anyDouble; |
47 |
| -import static org.mockito.Matchers.anyString; |
48 |
| -import static org.mockito.Matchers.eq; |
49 |
| -import static org.mockito.Mockito.mock; |
50 |
| -import static org.mockito.Mockito.times; |
51 |
| -import static org.mockito.Mockito.verify; |
52 |
| -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; |
53 |
| -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; |
54 |
| - |
55 | 63 | /**
|
56 | 64 | * Tests for {@link MetricFilterAutoConfiguration}.
|
57 | 65 | *
|
@@ -130,6 +138,23 @@ public void records404HttpInteractionsAsSingleMetric() throws Exception {
|
130 | 138 | context.close();
|
131 | 139 | }
|
132 | 140 |
|
| 141 | + @Test |
| 142 | + public void records302HttpInteractionsAsSingleMetric() throws Exception { |
| 143 | + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( |
| 144 | + Config.class, MetricFilterAutoConfiguration.class, RedirectFilter.class); |
| 145 | + MetricsFilter filter = context.getBean(MetricsFilter.class); |
| 146 | + MockMvc mvc = MockMvcBuilders.standaloneSetup(new MetricFilterTestController()) |
| 147 | + .addFilter(filter).addFilter(context.getBean(RedirectFilter.class)) |
| 148 | + .build(); |
| 149 | + mvc.perform(get("/unknownPath/1")).andExpect(status().is3xxRedirection()); |
| 150 | + mvc.perform(get("/unknownPath/2")).andExpect(status().is3xxRedirection()); |
| 151 | + verify(context.getBean(CounterService.class), times(2)).increment( |
| 152 | + "status.302.unmapped"); |
| 153 | + verify(context.getBean(GaugeService.class), times(2)).submit( |
| 154 | + eq("response.unmapped"), anyDouble()); |
| 155 | + context.close(); |
| 156 | + } |
| 157 | + |
133 | 158 | @Test
|
134 | 159 | public void skipsFilterIfMissingServices() throws Exception {
|
135 | 160 | AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
|
@@ -214,4 +239,19 @@ public String testException() {
|
214 | 239 | }
|
215 | 240 | }
|
216 | 241 |
|
| 242 | + @Component |
| 243 | + @Order(0) |
| 244 | + public static class RedirectFilter extends OncePerRequestFilter { |
| 245 | + |
| 246 | + @Override |
| 247 | + protected void doFilterInternal(HttpServletRequest request, |
| 248 | + HttpServletResponse response, FilterChain chain) throws ServletException, |
| 249 | + IOException { |
| 250 | + // send redirect before filter chain is executed, like Spring Security sending |
| 251 | + // us back to a login page |
| 252 | + response.sendRedirect("http://example.com"); |
| 253 | + } |
| 254 | + |
| 255 | + } |
| 256 | + |
217 | 257 | }
|
0 commit comments