2 * Copyright © 2016-2018 European Support Limited
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package org.openecomp.sdc.logging.servlet.jaxrs;
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;
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;
41 * Unit testing JAX-RS request filter.
46 @RunWith(PowerMockRunner.class)
47 @PrepareForTest({LoggingContext.class, ContextData.class})
48 public class LoggingRequestFilterTest {
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();
56 public TestName testName = new TestName();
59 * Verify all mocks after each test.
62 public void verifyMocks() {
65 PowerMock.verifyAll();
66 } catch (AssertionError e) {
67 throw new AssertionError("Expectations failed in " + testName.getMethodName() + "()", e);
72 public void serviceNamePopulatedWhenThereIsMatchingResource() {
74 mockContextDataBuilder(null, null, LoggingRequestFilter.formatServiceName(REQUEST_METHOD, REQUEST_URI));
77 LoggingRequestFilter filter = new LoggingRequestFilter();
78 filter.setHttpRequest(mockHttpRequest(true));
80 filter.filter(mockContainerRequestContext(
81 new RequestIdHeader(null),
82 new PartnerHeader(null)));
86 public void serviceNameDoesNotIncludeHttpMethodWhenHttpMethodDisabled() {
88 mockContextDataBuilder(null, null, REQUEST_URI);
91 LoggingRequestFilter filter = new LoggingRequestFilter();
92 filter.setHttpMethodInServiceName(false);
93 filter.setHttpRequest(mockHttpRequest(false));
95 filter.filter(mockContainerRequestContext(
96 new RequestIdHeader(null),
97 new PartnerHeader(null)));
101 public void partnerNamePopulatedWhenPresentInDefaultHeader() {
103 mockContextDataBuilder(null, RANDOM_PARTNER_NAME,
104 LoggingRequestFilter.formatServiceName(REQUEST_METHOD, REQUEST_URI));
105 mockLoggingContext();
107 LoggingRequestFilter filter = new LoggingRequestFilter();
108 filter.setHttpRequest(mockHttpRequest(true));
110 filter.filter(mockContainerRequestContext(
111 new RequestIdHeader(null),
112 new PartnerHeader(RANDOM_PARTNER_NAME)));
116 public void partnerNamePopulatedWhenPresentInCustomHeader() {
118 final String partnerHeader = "x-partner-header";
119 mockContextDataBuilder(null, RANDOM_PARTNER_NAME,
120 LoggingRequestFilter.formatServiceName(REQUEST_METHOD, REQUEST_URI));
121 mockLoggingContext();
123 LoggingRequestFilter filter = new LoggingRequestFilter();
124 filter.setHttpRequest(mockHttpRequest(true));
125 filter.setPartnerNameHeaders(partnerHeader);
127 filter.filter(mockContainerRequestContext(
128 new RequestIdHeader(null),
129 new PartnerHeader(partnerHeader, RANDOM_PARTNER_NAME)));
133 public void requestIdPopulatedWhenPresentInDefaultHeader() {
135 mockContextDataBuilder(RANDOM_REQUEST_ID, null,
136 LoggingRequestFilter.formatServiceName(REQUEST_METHOD, REQUEST_URI));
137 mockLoggingContext();
139 LoggingRequestFilter filter = new LoggingRequestFilter();
140 filter.setHttpRequest(mockHttpRequest(true));
142 filter.filter(mockContainerRequestContext(
143 new RequestIdHeader(RANDOM_REQUEST_ID),
144 new PartnerHeader(null)));
148 public void requestIdPopulatedWhenPresentInCustomHeader() {
150 final String requestIdHeader = "x-request-id";
151 mockContextDataBuilder(RANDOM_REQUEST_ID, null,
152 LoggingRequestFilter.formatServiceName(REQUEST_METHOD, REQUEST_URI));
153 mockLoggingContext();
155 LoggingRequestFilter filter = new LoggingRequestFilter();
156 filter.setRequestIdHeaders(requestIdHeader);
157 filter.setHttpRequest(mockHttpRequest(true));
159 filter.filter(mockContainerRequestContext(
160 new RequestIdHeader(requestIdHeader, RANDOM_REQUEST_ID),
161 new PartnerHeader(null)));
164 private HttpServletRequest mockHttpRequest(boolean includeMethod) {
166 HttpServletRequest servletRequest = EasyMock.mock(HttpServletRequest.class);
167 EasyMock.expect(servletRequest.getRequestURI()).andReturn(REQUEST_URI);
170 EasyMock.expect(servletRequest.getMethod()).andReturn(REQUEST_METHOD);
173 EasyMock.replay(servletRequest);
174 return servletRequest;
177 private ContainerRequestContext mockContainerRequestContext(Header... headers) {
179 ContainerRequestContext requestContext = EasyMock.mock(ContainerRequestContext.class);
181 for (Header h : headers) {
182 EasyMock.expect(requestContext.getHeaderString(h.key)).andReturn(h.value);
185 requestContext.setProperty(EasyMock.eq(START_TIME_KEY), EasyMock.anyLong());
186 EasyMock.expectLastCall();
188 EasyMock.replay(requestContext);
189 return requestContext;
192 private void mockContextDataBuilder(String requestId, String partnerName, String serviceName) {
194 ContextData.ContextDataBuilder mockBuilder = EasyMock.mock(ContextData.ContextDataBuilder.class);
196 if (requestId != null) {
197 EasyMock.expect(mockBuilder.requestId(requestId)).andReturn(mockBuilder);
199 EasyMock.expect(mockBuilder.requestId(anyString())).andReturn(mockBuilder);
202 EasyMock.expect(mockBuilder.serviceName(serviceName)).andReturn(mockBuilder);
204 if (partnerName != null) {
205 EasyMock.expect(mockBuilder.partnerName(partnerName)).andReturn(mockBuilder);
208 EasyMock.expect(mockBuilder.build()).andReturn(EasyMock.mock(ContextData.class));
209 EasyMock.replay(mockBuilder);
211 PowerMock.mockStatic(ContextData.class);
213 ContextData.builder();
214 PowerMock.expectLastCall().andReturn(mockBuilder);
216 PowerMock.replay(ContextData.class);
219 private void mockLoggingContext() {
221 PowerMock.mockStatic(LoggingContext.class);
223 LoggingContext.clear();
224 EasyMock.expectLastCall();
226 LoggingContext.put(anyObject(ContextData.class));
227 EasyMock.expectLastCall();
229 PowerMock.replay(LoggingContext.class);
232 private abstract static class Header {
234 private final String key;
235 private final String value;
237 private Header(String key, String value) {
243 private static class PartnerHeader extends Header {
245 private PartnerHeader(String value) {
246 super(LoggingConstants.DEFAULT_PARTNER_NAME_HEADER, value);
249 private PartnerHeader(String key, String value) {
254 private static class RequestIdHeader extends Header {
256 private RequestIdHeader(String value) {
257 super(LoggingConstants.DEFAULT_REQUEST_ID_HEADER, value);
260 private RequestIdHeader(String key, String value) {