535a50ca42d1c45204d53488d4ed36ec78049bfd
[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;
18
19 import static org.easymock.EasyMock.anyObject;
20 import static org.openecomp.sdc.logging.LoggingConstants.DEFAULT_PARTNER_NAME_HEADER;
21 import static org.openecomp.sdc.logging.LoggingConstants.DEFAULT_REQUEST_ID_HEADER;
22 import static org.openecomp.sdc.logging.servlet.LoggingFilter.PARTNER_NAME_HEADERS_PARAM;
23 import static org.openecomp.sdc.logging.servlet.LoggingFilter.REQUEST_ID_HEADERS_PARAM;
24
25 import java.io.IOException;
26 import java.util.UUID;
27 import javax.servlet.FilterChain;
28 import javax.servlet.FilterConfig;
29 import javax.servlet.ServletException;
30 import javax.servlet.ServletRequest;
31 import javax.servlet.ServletResponse;
32 import javax.servlet.http.HttpServletRequest;
33 import javax.servlet.http.HttpServletResponse;
34 import org.easymock.EasyMock;
35 import org.openecomp.sdc.logging.api.ContextData;
36 import org.openecomp.sdc.logging.api.LoggingContext;
37 import org.powermock.api.easymock.PowerMock;
38 import org.powermock.core.classloader.annotations.PrepareForTest;
39 import org.powermock.modules.testng.PowerMockTestCase;
40 import org.testng.ITestResult;
41 import org.testng.annotations.AfterMethod;
42 import org.testng.annotations.Test;
43
44 /**
45  * Unit-tests logging filter for initialization and data retrieval.
46  *
47  * @author evitaliy
48  * @since 17 Aug 2016
49  */
50 @PrepareForTest(LoggingContext.class)
51 public class LoggingFilterTest extends PowerMockTestCase {
52
53     private static final String RANDOM_REQUEST_URI = UUID.randomUUID().toString();
54     private static final String RANDOM_REQUEST_ID = UUID.randomUUID().toString();
55     private static final String RANDOM_PARTNER_NAME = UUID.randomUUID().toString();
56
57     /**
58      * Verify all mocks after each test.
59      */
60     @AfterMethod
61     public void verifyMocks(ITestResult result) {
62
63         try {
64             PowerMock.verifyAll();
65         } catch (AssertionError e) {
66             throw new AssertionError("Expectations failed in: " + result.getMethod().getMethodName(), e);
67         }
68     }
69
70
71     @Test
72     public void filterPopulatesValuesWhenNoInitParamsAndNoHeaders() throws Exception {
73
74         mockLoggingContext();
75         LoggingFilter loggingFilter = new LoggingFilter();
76         loggingFilter.init(mockFilterConfig(null, null));
77         loggingFilter.doFilter(new MockRequestBuilder().build(), mockResponse(), mockChain());
78     }
79
80     @Test
81     public void filterPopulatesValuesWhenNoInitParamsAndExistingHeaders() throws Exception {
82
83         mockLoggingContext();
84
85         LoggingFilter loggingFilter = new LoggingFilter();
86         loggingFilter.init(mockFilterConfig(null, null));
87
88         HttpServletRequest mockRequest = new MockRequestBuilder().partnerName(RANDOM_PARTNER_NAME)
89                                                                  .requestId(RANDOM_REQUEST_ID).build();
90         loggingFilter.doFilter(mockRequest, mockResponse(), mockChain());
91     }
92
93     @Test
94     public void filterPopulatesValuesWhenCustomInitParamsAndNoHeaders() throws Exception {
95
96         mockLoggingContext();
97
98         final String requestIdHeader = "x-request";
99         final String partnerNameHeader = "x-partner";
100
101         LoggingFilter loggingFilter = new LoggingFilter();
102         FilterConfig mockConfig = mockFilterConfig(requestIdHeader, partnerNameHeader);
103         loggingFilter.init(mockConfig);
104
105         HttpServletRequest mockRequest = new MockRequestBuilder().requestIdHeader(requestIdHeader)
106                                                                  .partnerNameHeader(partnerNameHeader).build();
107         loggingFilter.doFilter(mockRequest, mockResponse(), mockChain());
108     }
109
110     @Test
111     public void filterPopulatesValuesWhenCustomInitParamsAndExistingHeaders() throws Exception {
112
113         mockLoggingContext();
114
115         final String requestIdHeader = "x-request-id";
116         final String partnerNameHeader = "x-partner-name";
117
118         LoggingFilter loggingFilter = new LoggingFilter();
119         FilterConfig mockConfig = mockFilterConfig(requestIdHeader, partnerNameHeader);
120         loggingFilter.init(mockConfig);
121
122         HttpServletRequest mockRequest = new MockRequestBuilder()
123                 .partnerNameHeader(partnerNameHeader).partnerName(RANDOM_PARTNER_NAME)
124                 .requestIdHeader(requestIdHeader).requestId(RANDOM_REQUEST_ID).build();
125         loggingFilter.doFilter(mockRequest, mockResponse(), mockChain());
126     }
127
128     private FilterConfig mockFilterConfig(String requestIdHeader, String partnerNameHeader) {
129         FilterConfig config = EasyMock.mock(FilterConfig.class);
130         EasyMock.expect(config.getInitParameter(REQUEST_ID_HEADERS_PARAM)).andReturn(requestIdHeader);
131         EasyMock.expect(config.getInitParameter(PARTNER_NAME_HEADERS_PARAM)).andReturn(partnerNameHeader);
132         EasyMock.replay(config);
133         return config;
134     }
135
136     private FilterChain mockChain() throws IOException, ServletException {
137         FilterChain chain = EasyMock.mock(FilterChain.class);
138         chain.doFilter(anyObject(ServletRequest.class), anyObject(ServletResponse.class));
139         EasyMock.expectLastCall().once();
140         EasyMock.replay(chain);
141         return chain;
142     }
143
144     private ServletResponse mockResponse() {
145         HttpServletResponse servletResponse = EasyMock.mock(HttpServletResponse.class);
146         EasyMock.replay(servletResponse);
147         return servletResponse;
148     }
149
150     private void mockLoggingContext() {
151
152         PowerMock.mockStatic(LoggingContext.class);
153
154         LoggingContext.clear();
155         EasyMock.expectLastCall().times(2);
156
157         LoggingContext.put(anyObject(ContextData.class));
158         EasyMock.expectLastCall().once();
159
160         PowerMock.replay(LoggingContext.class);
161     }
162
163     private static class MockRequestBuilder {
164
165         private String requestIdHeader = DEFAULT_REQUEST_ID_HEADER;
166         private String partnerNameHeader = DEFAULT_PARTNER_NAME_HEADER;
167         private String requestId = null;
168         private String partnerName = null;
169
170         MockRequestBuilder requestIdHeader(String h) {
171             this.requestIdHeader = h;
172             return this;
173         }
174
175         MockRequestBuilder requestId(String id) {
176             this.requestId = id;
177             return this;
178         }
179
180         MockRequestBuilder partnerNameHeader(String h) {
181             this.partnerNameHeader = h;
182             return this;
183         }
184
185         MockRequestBuilder partnerName(String name) {
186             this.partnerName = name;
187             return this;
188         }
189
190         HttpServletRequest build() {
191             HttpServletRequest mockRequest = EasyMock.mock(HttpServletRequest.class);
192             EasyMock.expect(mockRequest.getRequestURI()).andReturn(RANDOM_REQUEST_URI);
193             EasyMock.expect(mockRequest.getHeader(requestIdHeader)).andReturn(requestId);
194             EasyMock.expect(mockRequest.getHeader(partnerNameHeader)).andReturn(partnerName);
195             EasyMock.replay(mockRequest);
196             return mockRequest;
197         }
198     }
199 }