4098809e4286f15ec068b10d037c987f59cb2af8
[sdc.git] /
1 /*
2  * Copyright © 2016-2018 European Support Limited
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.openecomp.sdc.logging.servlet.jaxrs;
18
19 import static org.easymock.EasyMock.anyObject;
20 import static org.easymock.EasyMock.anyString;
21 import static org.openecomp.sdc.logging.servlet.jaxrs.LoggingRequestFilter.START_TIME_KEY;
22
23 import java.util.UUID;
24 import javax.servlet.http.HttpServletRequest;
25 import javax.ws.rs.container.ContainerRequestContext;
26 import org.easymock.EasyMock;
27 import org.junit.After;
28 import org.junit.Rule;
29 import org.junit.Test;
30 import org.junit.rules.TestName;
31 import org.junit.runner.RunWith;
32 import org.openecomp.sdc.logging.LoggingConstants;
33 import org.openecomp.sdc.logging.api.ContextData;
34 import org.openecomp.sdc.logging.api.LoggingContext;
35 import org.powermock.api.easymock.PowerMock;
36 import org.powermock.core.classloader.annotations.PrepareForTest;
37 import org.powermock.modules.junit4.PowerMockRunner;
38
39
40 /**
41  * Unit testing JAX-RS request filter.
42  *
43  * @author evitaliy
44  * @since 19 Mar 2018
45  */
46 @RunWith(PowerMockRunner.class)
47 @PrepareForTest({LoggingContext.class, ContextData.class})
48 public class LoggingRequestFilterTest {
49
50     private static final String REQUEST_URI = "/test";
51     private static final String REQUEST_METHOD = "GET";
52     private static final String RANDOM_REQUEST_ID = UUID.randomUUID().toString();
53     private static final String RANDOM_PARTNER_NAME = UUID.randomUUID().toString();
54
55     @Rule
56     public TestName testName = new TestName();
57
58     /**
59      * Verify all mocks after each test.
60      */
61     @After
62     public void verifyMocks() {
63
64         try {
65             PowerMock.verifyAll();
66         } catch (AssertionError e) {
67             throw new AssertionError("Expectations failed in " + testName.getMethodName() + "()", e);
68         }
69     }
70
71     @Test
72     public void serviceNamePopulatedWhenThereIsMatchingResource() {
73
74         mockContextDataBuilder(null, null, LoggingRequestFilter.formatServiceName(REQUEST_METHOD, REQUEST_URI));
75         mockLoggingContext();
76
77         LoggingRequestFilter filter = new LoggingRequestFilter();
78         filter.setHttpRequest(mockHttpRequest(true));
79
80         filter.filter(mockContainerRequestContext(
81                 new RequestIdHeader(null),
82                 new PartnerHeader(null)));
83     }
84
85     @Test
86     public void serviceNameDoesNotIncludeHttpMethodWhenHttpMethodDisabled() {
87
88         mockContextDataBuilder(null, null, REQUEST_URI);
89         mockLoggingContext();
90
91         LoggingRequestFilter filter = new LoggingRequestFilter();
92         filter.setHttpMethodInServiceName(false);
93         filter.setHttpRequest(mockHttpRequest(false));
94
95         filter.filter(mockContainerRequestContext(
96                 new RequestIdHeader(null),
97                 new PartnerHeader(null)));
98     }
99
100     @Test
101     public void partnerNamePopulatedWhenPresentInDefaultHeader() {
102
103         mockContextDataBuilder(null, RANDOM_PARTNER_NAME,
104                 LoggingRequestFilter.formatServiceName(REQUEST_METHOD, REQUEST_URI));
105         mockLoggingContext();
106
107         LoggingRequestFilter filter = new LoggingRequestFilter();
108         filter.setHttpRequest(mockHttpRequest(true));
109
110         filter.filter(mockContainerRequestContext(
111                 new RequestIdHeader(null),
112                 new PartnerHeader(RANDOM_PARTNER_NAME)));
113     }
114
115     @Test
116     public void partnerNamePopulatedWhenPresentInCustomHeader() {
117
118         final String partnerHeader = "x-partner-header";
119         mockContextDataBuilder(null, RANDOM_PARTNER_NAME,
120                 LoggingRequestFilter.formatServiceName(REQUEST_METHOD, REQUEST_URI));
121         mockLoggingContext();
122
123         LoggingRequestFilter filter = new LoggingRequestFilter();
124         filter.setHttpRequest(mockHttpRequest(true));
125         filter.setPartnerNameHeaders(partnerHeader);
126
127         filter.filter(mockContainerRequestContext(
128                 new RequestIdHeader(null),
129                 new PartnerHeader(partnerHeader, RANDOM_PARTNER_NAME)));
130     }
131
132     @Test
133     public void requestIdPopulatedWhenPresentInDefaultHeader() {
134
135         mockContextDataBuilder(RANDOM_REQUEST_ID, null,
136                 LoggingRequestFilter.formatServiceName(REQUEST_METHOD, REQUEST_URI));
137         mockLoggingContext();
138
139         LoggingRequestFilter filter = new LoggingRequestFilter();
140         filter.setHttpRequest(mockHttpRequest(true));
141
142         filter.filter(mockContainerRequestContext(
143                 new RequestIdHeader(RANDOM_REQUEST_ID),
144                 new PartnerHeader(null)));
145     }
146
147     @Test
148     public void requestIdPopulatedWhenPresentInCustomHeader() {
149
150         final String requestIdHeader = "x-request-id";
151         mockContextDataBuilder(RANDOM_REQUEST_ID, null,
152                 LoggingRequestFilter.formatServiceName(REQUEST_METHOD, REQUEST_URI));
153         mockLoggingContext();
154
155         LoggingRequestFilter filter = new LoggingRequestFilter();
156         filter.setRequestIdHeaders(requestIdHeader);
157         filter.setHttpRequest(mockHttpRequest(true));
158
159         filter.filter(mockContainerRequestContext(
160                 new RequestIdHeader(requestIdHeader, RANDOM_REQUEST_ID),
161                 new PartnerHeader(null)));
162     }
163
164     private HttpServletRequest mockHttpRequest(boolean includeMethod) {
165
166         HttpServletRequest servletRequest = EasyMock.mock(HttpServletRequest.class);
167         EasyMock.expect(servletRequest.getRequestURI()).andReturn(REQUEST_URI);
168
169         if (includeMethod) {
170             EasyMock.expect(servletRequest.getMethod()).andReturn(REQUEST_METHOD);
171         }
172
173         EasyMock.replay(servletRequest);
174         return servletRequest;
175     }
176
177     private ContainerRequestContext mockContainerRequestContext(Header... headers) {
178
179         ContainerRequestContext requestContext = EasyMock.mock(ContainerRequestContext.class);
180
181         for (Header h : headers) {
182             EasyMock.expect(requestContext.getHeaderString(h.key)).andReturn(h.value);
183         }
184
185         requestContext.setProperty(EasyMock.eq(START_TIME_KEY), EasyMock.anyLong());
186         EasyMock.expectLastCall();
187
188         EasyMock.replay(requestContext);
189         return requestContext;
190     }
191
192     private void mockContextDataBuilder(String requestId, String partnerName, String serviceName) {
193
194         ContextData.ContextDataBuilder mockBuilder = EasyMock.mock(ContextData.ContextDataBuilder.class);
195
196         if (requestId != null) {
197             EasyMock.expect(mockBuilder.requestId(requestId)).andReturn(mockBuilder);
198         } else {
199             EasyMock.expect(mockBuilder.requestId(anyString())).andReturn(mockBuilder);
200         }
201
202         EasyMock.expect(mockBuilder.serviceName(serviceName)).andReturn(mockBuilder);
203
204         if (partnerName != null) {
205             EasyMock.expect(mockBuilder.partnerName(partnerName)).andReturn(mockBuilder);
206         }
207
208         EasyMock.expect(mockBuilder.build()).andReturn(EasyMock.mock(ContextData.class));
209         EasyMock.replay(mockBuilder);
210
211         PowerMock.mockStatic(ContextData.class);
212
213         ContextData.builder();
214         PowerMock.expectLastCall().andReturn(mockBuilder);
215
216         PowerMock.replay(ContextData.class);
217     }
218
219     private void mockLoggingContext() {
220
221         PowerMock.mockStatic(LoggingContext.class);
222
223         LoggingContext.clear();
224         EasyMock.expectLastCall();
225
226         LoggingContext.put(anyObject(ContextData.class));
227         EasyMock.expectLastCall();
228
229         PowerMock.replay(LoggingContext.class);
230     }
231
232     private abstract static class Header {
233
234         private final String key;
235         private final String value;
236
237         private Header(String key, String value) {
238             this.key = key;
239             this.value = value;
240         }
241     }
242
243     private static class PartnerHeader extends Header {
244
245         private PartnerHeader(String value) {
246             super(LoggingConstants.DEFAULT_PARTNER_NAME_HEADER, value);
247         }
248
249         private PartnerHeader(String key, String value) {
250             super(key, value);
251         }
252     }
253
254     private static class RequestIdHeader extends Header {
255
256         private RequestIdHeader(String value) {
257             super(LoggingConstants.DEFAULT_REQUEST_ID_HEADER, value);
258         }
259
260         private RequestIdHeader(String key, String value) {
261             super(key, value);
262         }
263     }
264 }