1 package org.onap.ccsdk.apps.services;
3 import com.fasterxml.jackson.core.JsonProcessingException;
4 import com.fasterxml.jackson.databind.ObjectMapper;
5 import org.junit.Before;
7 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory;
9 import org.springframework.beans.ConversionNotSupportedException;
10 import org.springframework.beans.TypeMismatchException;
11 import org.springframework.core.MethodParameter;
12 import org.springframework.http.HttpHeaders;
13 import org.springframework.http.HttpStatus;
14 import org.springframework.http.HttpStatusCode;
15 import org.springframework.http.MediaType;
16 import org.springframework.http.ResponseEntity;
17 import org.springframework.http.converter.HttpMessageNotReadableException;
18 import org.springframework.http.converter.HttpMessageNotWritableException;
19 import org.springframework.validation.BindException;
20 import org.springframework.web.HttpMediaTypeNotAcceptableException;
21 import org.springframework.web.HttpMediaTypeNotSupportedException;
22 import org.springframework.web.HttpRequestMethodNotSupportedException;
23 import org.springframework.web.bind.MethodArgumentNotValidException;
24 import org.springframework.web.bind.MissingPathVariableException;
25 import org.springframework.web.bind.MissingServletRequestParameterException;
26 import org.springframework.web.bind.ServletRequestBindingException;
27 import org.springframework.web.context.request.WebRequest;
28 import org.springframework.web.context.request.async.AsyncRequestTimeoutException;
29 import org.springframework.web.multipart.support.MissingServletRequestPartException;
30 import org.springframework.web.servlet.NoHandlerFoundException;
32 import java.util.Arrays;
34 import static org.junit.Assert.assertEquals;
35 import static org.junit.Assert.assertTrue;
39 public class RestExceptionHandlerTest {
40 private static final Logger log = LoggerFactory.getLogger("RestExceptionHandler");
41 private class RestExceptionHandlerWrapper extends RestExceptionHandler {
43 public ResponseEntity<Object> handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
44 return super.handleHttpRequestMethodNotSupported(ex, headers, status, request);
48 public ResponseEntity<Object> handleHttpMediaTypeNotSupported(HttpMediaTypeNotSupportedException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
49 return super.handleHttpMediaTypeNotSupported(ex, headers, status, request);
53 public ResponseEntity<Object> handleHttpMediaTypeNotAcceptable(HttpMediaTypeNotAcceptableException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
54 return super.handleHttpMediaTypeNotAcceptable(ex, headers, status, request);
58 protected ResponseEntity<Object> handleMissingPathVariable(MissingPathVariableException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
59 return super.handleMissingPathVariable(ex, headers, status, request);
63 public ResponseEntity<Object> handleMissingServletRequestParameter(MissingServletRequestParameterException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
64 return super.handleMissingServletRequestParameter(ex, headers, status, request);
68 public ResponseEntity<Object> handleServletRequestBindingException(ServletRequestBindingException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
69 return super.handleServletRequestBindingException(ex, headers, status, request);
73 public ResponseEntity<Object> handleConversionNotSupported(ConversionNotSupportedException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
74 return super.handleConversionNotSupported(ex, headers, status, request);
78 public ResponseEntity<Object> handleTypeMismatch(TypeMismatchException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
79 return super.handleTypeMismatch(ex, headers, status, request);
83 public ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
84 return super.handleHttpMessageNotReadable(ex, headers, status, request);
88 public ResponseEntity<Object> handleHttpMessageNotWritable(HttpMessageNotWritableException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
89 return super.handleHttpMessageNotWritable(ex, headers, status, request);
93 public ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
94 return super.handleMethodArgumentNotValid(ex, headers, status, request);
98 public ResponseEntity<Object> handleMissingServletRequestPart(MissingServletRequestPartException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
99 return super.handleMissingServletRequestPart(ex, headers, status, request);
103 public ResponseEntity<Object> handleBindException(BindException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
104 return super.handleBindException(ex, headers, status, request);
108 public ResponseEntity<Object> handleNoHandlerFoundException(NoHandlerFoundException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
109 return super.handleNoHandlerFoundException(ex, headers, status, request);
113 public ResponseEntity<Object> handleAsyncRequestTimeoutException(AsyncRequestTimeoutException ex, HttpHeaders headers, HttpStatusCode status, WebRequest webRequest) {
114 return super.handleAsyncRequestTimeoutException(ex, headers, status, webRequest);
118 public ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
119 return super.handleExceptionInternal(ex, body, headers, status, request);
123 RestExceptionHandler handler;
126 public void setUp() {
127 handler = new RestExceptionHandlerWrapper();
131 public void handleHttpRequestMethodNotSupported() throws JsonProcessingException {
132 String[] supportedMethods = {"GET", "POST", "PUT", "DELETE"};
135 ResponseEntity<Object> respEntity = handler.handleHttpRequestMethodNotSupported(new HttpRequestMethodNotSupportedException("PATCH", supportedMethods),
136 null, HttpStatus.METHOD_NOT_ALLOWED, null);
138 assertTrue(respEntity.hasBody());
139 assertTrue(respEntity.getBody() instanceof RestErrors);
141 RestErrors restErrors = (RestErrors) respEntity.getBody();
143 ObjectMapper objectMapper = new ObjectMapper();
144 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
150 public void handleHttpMediaTypeNotSupported() throws JsonProcessingException {
151 MediaType[] supportedMediaTypeArray = { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML};
153 ResponseEntity<Object> respEntity = handler.handleHttpMediaTypeNotSupported(new HttpMediaTypeNotSupportedException(MediaType.MULTIPART_MIXED, Arrays.asList(supportedMediaTypeArray)),
154 null, HttpStatus.UNSUPPORTED_MEDIA_TYPE, null);
156 assertTrue(respEntity.hasBody());
157 assertTrue(respEntity.getBody() instanceof RestErrors);
159 RestErrors restErrors = (RestErrors) respEntity.getBody();
160 ObjectMapper objectMapper = new ObjectMapper();
161 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
165 public void handleHttpMediaTypeNotAcceptable() throws JsonProcessingException {
166 MediaType[] supportedMediaTypeArray = { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML};
168 ResponseEntity<Object> respEntity = handler.handleHttpMediaTypeNotAcceptable(new HttpMediaTypeNotAcceptableException(Arrays.asList(supportedMediaTypeArray)),
169 null, HttpStatus.UNSUPPORTED_MEDIA_TYPE, null);
171 assertTrue(respEntity.hasBody());
172 assertTrue(respEntity.getBody() instanceof RestErrors);
174 RestErrors restErrors = (RestErrors) respEntity.getBody();
176 ObjectMapper objectMapper = new ObjectMapper();
177 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
182 public void handleMissingPathVariable() throws JsonProcessingException {
183 ResponseEntity<Object> respEntity = handler.handleMissingPathVariable(new MissingPathVariableException("test", new MethodParameter(RestApplicationError.class.getDeclaredConstructors()[0],-1)),
184 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
186 assertTrue(respEntity.hasBody());
187 assertTrue(respEntity.getBody() instanceof RestErrors);
189 RestErrors restErrors = (RestErrors) respEntity.getBody();
190 ObjectMapper objectMapper = new ObjectMapper();
191 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
195 public void handleMissingServletRequestParameter() throws JsonProcessingException {
196 ResponseEntity<Object> respEntity = handler.handleMissingServletRequestParameter(new MissingServletRequestParameterException("test", "string"),
197 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
199 assertTrue(respEntity.hasBody());
200 assertTrue(respEntity.getBody() instanceof RestErrors);
202 RestErrors restErrors = (RestErrors) respEntity.getBody();
203 ObjectMapper objectMapper = new ObjectMapper();
204 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
208 public void handleServletRequestBindingException() throws JsonProcessingException {
209 ResponseEntity<Object> respEntity = handler.handleServletRequestBindingException(new ServletRequestBindingException("servlet request binding error"),
210 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
212 assertTrue(respEntity.hasBody());
213 assertTrue(respEntity.getBody() instanceof RestErrors);
215 RestErrors restErrors = (RestErrors) respEntity.getBody();
216 ObjectMapper objectMapper = new ObjectMapper();
217 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
221 public void handleConversionNotSupported() throws JsonProcessingException {
222 ResponseEntity<Object> respEntity = handler.handleConversionNotSupported(new ConversionNotSupportedException("hello", Integer.class, new NumberFormatException()),
223 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
225 assertTrue(respEntity.hasBody());
226 assertTrue(respEntity.getBody() instanceof RestErrors);
228 RestErrors restErrors = (RestErrors) respEntity.getBody();
229 ObjectMapper objectMapper = new ObjectMapper();
230 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
234 public void handleTypeMismatch() throws JsonProcessingException {
235 ResponseEntity<Object> respEntity = handler.handleTypeMismatch(new TypeMismatchException("hello", Integer.class, new NumberFormatException()),
236 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
238 assertTrue(respEntity.hasBody());
239 assertTrue(respEntity.getBody() instanceof RestErrors);
241 RestErrors restErrors = (RestErrors) respEntity.getBody();
242 ObjectMapper objectMapper = new ObjectMapper();
243 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
247 public void handleHttpMessageNotReadable() throws JsonProcessingException {
248 ResponseEntity<Object> respEntity = handler.handleHttpMessageNotReadable(new HttpMessageNotReadableException("Message not readable"),
249 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
251 assertTrue(respEntity.hasBody());
252 assertTrue(respEntity.getBody() instanceof RestErrors);
254 RestErrors restErrors = (RestErrors) respEntity.getBody();
255 ObjectMapper objectMapper = new ObjectMapper();
256 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
260 public void handleHttpMessageNotWritable() throws JsonProcessingException {
261 ResponseEntity<Object> respEntity = handler.handleHttpMessageNotWritable(new HttpMessageNotWritableException("Message not writable"),
262 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
264 assertTrue(respEntity.hasBody());
265 assertTrue(respEntity.getBody() instanceof RestErrors);
267 RestErrors restErrors = (RestErrors) respEntity.getBody();
268 ObjectMapper objectMapper = new ObjectMapper();
269 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
273 public void handleMethodArgumentNotValid() throws JsonProcessingException {
274 ResponseEntity<Object> respEntity = handler.handleMethodArgumentNotValid(new MethodArgumentNotValidException(new MethodParameter(RestApplicationError.class.getDeclaredConstructors()[0],-1),
275 new BindException("target", "objectName")),
276 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
278 assertTrue(respEntity.hasBody());
279 assertTrue(respEntity.getBody() instanceof RestErrors);
281 RestErrors restErrors = (RestErrors) respEntity.getBody();
282 ObjectMapper objectMapper = new ObjectMapper();
283 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
287 public void handleMissingServletRequestPart() throws JsonProcessingException {
288 ResponseEntity<Object> respEntity = handler.handleMissingServletRequestPart(new MissingServletRequestPartException("test"),
289 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
291 assertTrue(respEntity.hasBody());
292 assertTrue(respEntity.getBody() instanceof RestErrors);
294 RestErrors restErrors = (RestErrors) respEntity.getBody();
295 ObjectMapper objectMapper = new ObjectMapper();
296 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
300 public void handleBindException() throws JsonProcessingException {
301 ResponseEntity<Object> respEntity = handler.handleBindException(new BindException("target", "objectName"),
302 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
304 assertTrue(respEntity.hasBody());
305 assertTrue(respEntity.getBody() instanceof RestErrors);
307 RestErrors restErrors = (RestErrors) respEntity.getBody();
308 ObjectMapper objectMapper = new ObjectMapper();
309 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
313 public void handleNoHandlerFoundException() throws JsonProcessingException {
314 ResponseEntity<Object> respEntity = handler.handleNoHandlerFoundException(new NoHandlerFoundException("GET", "restconf/bogus", null),
315 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
317 assertTrue(respEntity.hasBody());
318 assertTrue(respEntity.getBody() instanceof RestErrors);
320 RestErrors restErrors = (RestErrors) respEntity.getBody();
321 ObjectMapper objectMapper = new ObjectMapper();
322 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
326 public void handleAsyncRequestTimeoutException() throws JsonProcessingException {
327 ResponseEntity<Object> respEntity = handler.handleAsyncRequestTimeoutException(new AsyncRequestTimeoutException(),
328 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
330 assertTrue(respEntity.hasBody());
331 assertTrue(respEntity.getBody() instanceof RestErrors);
333 RestErrors restErrors = (RestErrors) respEntity.getBody();
334 ObjectMapper objectMapper = new ObjectMapper();
335 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
339 public void handleExceptionInternal() throws JsonProcessingException {
340 ResponseEntity<Object> respEntity = handler.handleExceptionInternal(new NullPointerException(), null,
341 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
343 assertTrue(respEntity.hasBody());
344 assertTrue(respEntity.getBody() instanceof RestErrors);
346 RestErrors restErrors = (RestErrors) respEntity.getBody();
347 ObjectMapper objectMapper = new ObjectMapper();
348 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
352 public void handleRestException() throws JsonProcessingException {
354 ResponseEntity<Object> respEntity = handler.handleRestException(new RestApplicationException("no-data-found", "No data found", HttpStatus.NOT_FOUND.value()), null);
355 assertTrue(respEntity.hasBody());
356 assertTrue(respEntity.getBody() instanceof RestErrors);
358 RestErrors restErrors = (RestErrors) respEntity.getBody();
359 ObjectMapper objectMapper = new ObjectMapper();
360 log.info("response : {}", objectMapper.writeValueAsString(restErrors));