1 package org.onap.vid.controller;
3 import com.google.common.collect.ImmutableMap;
4 import org.mockito.ArgumentCaptor;
5 import org.mockito.Mockito;
6 import org.mockito.stubbing.Answer;
7 import org.openecomp.portalsdk.core.web.support.UserUtils;
8 import org.onap.vid.controller.filter.PromiseEcompRequestIdFilter;
9 import org.springframework.mock.web.MockHttpServletResponse;
10 import org.testng.annotations.Test;
12 import javax.servlet.FilterChain;
13 import javax.servlet.ServletException;
14 import javax.servlet.ServletRequest;
15 import javax.servlet.ServletResponse;
16 import javax.servlet.http.HttpServletRequest;
17 import javax.servlet.http.HttpServletResponse;
18 import java.io.IOException;
20 import java.util.function.Function;
22 import static org.hamcrest.CoreMatchers.is;
23 import static org.hamcrest.MatcherAssert.assertThat;
24 import static org.hamcrest.Matchers.*;
25 import static org.mockito.Matchers.any;
26 import static org.mockito.Matchers.argThat;
27 import static org.openecomp.portalsdk.core.util.SystemProperties.ECOMP_REQUEST_ID;
30 public class PromiseEcompRequestIdFilterTest {
32 private final String anotherHeader = "ANDREI_RUBLEV";
33 private final String anotherValue = "foo value";
34 private final String mixedCaseHeader = "x-ecomp-REQUESTID";
37 public void givenRequestIdHeader_headerValueNotChanged() throws IOException, ServletException {
39 final String someTxId = "863850e2-8545-4efd-94b8-afba5f52b3d5";
41 final ImmutableMap<String, String> incomingRequestHeaders = ImmutableMap.of(
42 anotherHeader, anotherValue,
43 ECOMP_REQUEST_ID, someTxId
46 buildRequestThenRunThroughFilterAndAssertResultRequestHeaders(incomingRequestHeaders, specificTxId(someTxId));
50 public void givenMixedCaseRequestIdHeader_headerValueNotChanged() throws IOException, ServletException {
52 final String someTxId = "729bbd8d-b0c2-4809-a794-dcccd9cda2c0";
54 final ImmutableMap<String, String> incomingRequestHeaders = ImmutableMap.of(
55 mixedCaseHeader, someTxId,
56 anotherHeader, anotherValue
59 buildRequestThenRunThroughFilterAndAssertResultRequestHeaders(incomingRequestHeaders, specificTxId(someTxId));
63 public void givenNoRequestIdHeader_headerValueWasGenerated() throws IOException, ServletException {
65 final ImmutableMap<String, String> incomingRequestHeaders = ImmutableMap.of(
66 anotherHeader, anotherValue
69 buildRequestThenRunThroughFilterAndAssertResultRequestHeaders(incomingRequestHeaders, UserUtils::getRequestId);
73 private void buildRequestThenRunThroughFilterAndAssertResultRequestHeaders(
74 ImmutableMap<String, String> originalRequestHeaders,
75 Function<HttpServletRequest, String> txIdExtractor
76 ) throws IOException, ServletException {
77 HttpServletRequest servletRequest = createMockedHttpServletRequest(originalRequestHeaders);
78 HttpServletResponse servletResponse = createMockedHttpServletResponse();
80 final FilterChain capturingFilterChain = Mockito.mock(FilterChain.class);
84 // doFilter() is the function under test
86 new PromiseEcompRequestIdFilter().doFilter(servletRequest, servletResponse, capturingFilterChain);
90 final ServletRequest capturedServletRequest = extractCapturedServletRequest(capturingFilterChain);
91 final ServletResponse capturedServletResponse = extractCapturedServletResponse(capturingFilterChain);
92 final String expectedTxId = txIdExtractor.apply((HttpServletRequest) capturedServletRequest);
94 assertRequestObjectHeaders(capturedServletRequest, expectedTxId);
95 assertResponseObjectHeaders(capturedServletResponse, expectedTxId);
99 private void assertRequestObjectHeaders(ServletRequest request, String expectedTxId) {
102 - Two headers are in place
103 - Direct value extraction is as expected
104 - UserUtils.getRequestId() returns correct and valid value
106 final HttpServletRequest httpServletRequest = (HttpServletRequest) request;
108 assertThat(Collections.list(httpServletRequest.getHeaderNames()),
109 containsInAnyOrder(equalToIgnoringCase(ECOMP_REQUEST_ID), equalToIgnoringCase(anotherHeader)));
111 assertThat(httpServletRequest.getHeader(anotherHeader), is(anotherValue));
113 assertThat(httpServletRequest.getHeader(ECOMP_REQUEST_ID), is(expectedTxId));
114 assertThat(httpServletRequest.getHeader(mixedCaseHeader), is(expectedTxId));
116 assertThat(UserUtils.getRequestId(httpServletRequest), is(expectedTxId));
117 assertThat(UserUtils.getRequestId(httpServletRequest), is(not(emptyOrNullString())));
120 private void assertResponseObjectHeaders(ServletResponse response, String txId) {
121 final String REQUEST_ID_HEADER_NAME_IN_RESPONSE = mixedCaseHeader + "-echo";
122 final HttpServletResponse httpServletResponse = (HttpServletResponse) response;
124 assertThat("header " + REQUEST_ID_HEADER_NAME_IN_RESPONSE.toLowerCase() + " in response must be provided",
125 httpServletResponse.getHeader(REQUEST_ID_HEADER_NAME_IN_RESPONSE), is(txId));
130 private HttpServletRequest createMockedHttpServletRequest(Map<String, String> requestHeaders) {
131 HttpServletRequest servletRequest = Mockito.mock(HttpServletRequest.class);
132 requestHeaders.forEach((k, v) -> {
133 Mockito.when(servletRequest.getHeader(argThat(equalToIgnoringCase(k)))).thenReturn(v);
134 Mockito.when(servletRequest.getHeaders(argThat(equalToIgnoringCase(k)))).then(returnEnumerationAnswer(v));
136 Mockito.when(servletRequest.getHeaderNames()).then(returnEnumerationAnswer(requestHeaders.keySet()));
137 return servletRequest;
140 private HttpServletResponse createMockedHttpServletResponse() {
141 return new MockHttpServletResponse();
144 private static Answer<Enumeration<String>> returnEnumerationAnswer(String ... items) {
145 return returnEnumerationAnswer(Arrays.asList(items));
148 private static Answer<Enumeration<String>> returnEnumerationAnswer(Collection<String> items) {
149 return invocation -> Collections.enumeration(items);
152 private Function<HttpServletRequest, String> specificTxId(String someTxId) {
153 return r -> someTxId;
156 private ServletRequest extractCapturedServletRequest(FilterChain capturingFilterChain) throws IOException, ServletException {
157 ArgumentCaptor<ServletRequest> captor = ArgumentCaptor.forClass(ServletRequest.class);
158 Mockito.verify(capturingFilterChain).doFilter(captor.capture(), any());
159 return captor.getValue();
162 private ServletResponse extractCapturedServletResponse(FilterChain capturingFilterChain) throws IOException, ServletException {
163 ArgumentCaptor<ServletResponse> captor = ArgumentCaptor.forClass(ServletResponse.class);
164 Mockito.verify(capturingFilterChain).doFilter(any(), captor.capture());
165 return captor.getValue();