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.MediaType;
15 import org.springframework.http.ResponseEntity;
16 import org.springframework.http.converter.HttpMessageNotReadableException;
17 import org.springframework.http.converter.HttpMessageNotWritableException;
18 import org.springframework.validation.BindException;
19 import org.springframework.web.HttpMediaTypeNotAcceptableException;
20 import org.springframework.web.HttpMediaTypeNotSupportedException;
21 import org.springframework.web.HttpRequestMethodNotSupportedException;
22 import org.springframework.web.bind.MethodArgumentNotValidException;
23 import org.springframework.web.bind.MissingPathVariableException;
24 import org.springframework.web.bind.MissingServletRequestParameterException;
25 import org.springframework.web.bind.ServletRequestBindingException;
26 import org.springframework.web.context.request.WebRequest;
27 import org.springframework.web.context.request.async.AsyncRequestTimeoutException;
28 import org.springframework.web.multipart.support.MissingServletRequestPartException;
29 import org.springframework.web.servlet.NoHandlerFoundException;
31 import java.util.Arrays;
33 import static org.junit.Assert.assertEquals;
34 import static org.junit.Assert.assertTrue;
38 public class RestExceptionHandlerTest {
39 private static final Logger log = LoggerFactory.getLogger("RestExceptionHandler");
40 private class RestExceptionHandlerWrapper extends RestExceptionHandler {
42 public ResponseEntity<Object> handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
43 return super.handleHttpRequestMethodNotSupported(ex, headers, status, request);
47 public ResponseEntity<Object> handleHttpMediaTypeNotSupported(HttpMediaTypeNotSupportedException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
48 return super.handleHttpMediaTypeNotSupported(ex, headers, status, request);
52 public ResponseEntity<Object> handleHttpMediaTypeNotAcceptable(HttpMediaTypeNotAcceptableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
53 return super.handleHttpMediaTypeNotAcceptable(ex, headers, status, request);
57 protected ResponseEntity<Object> handleMissingPathVariable(MissingPathVariableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
58 return super.handleMissingPathVariable(ex, headers, status, request);
62 public ResponseEntity<Object> handleMissingServletRequestParameter(MissingServletRequestParameterException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
63 return super.handleMissingServletRequestParameter(ex, headers, status, request);
67 public ResponseEntity<Object> handleServletRequestBindingException(ServletRequestBindingException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
68 return super.handleServletRequestBindingException(ex, headers, status, request);
72 public ResponseEntity<Object> handleConversionNotSupported(ConversionNotSupportedException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
73 return super.handleConversionNotSupported(ex, headers, status, request);
77 public ResponseEntity<Object> handleTypeMismatch(TypeMismatchException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
78 return super.handleTypeMismatch(ex, headers, status, request);
82 public ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
83 return super.handleHttpMessageNotReadable(ex, headers, status, request);
87 public ResponseEntity<Object> handleHttpMessageNotWritable(HttpMessageNotWritableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
88 return super.handleHttpMessageNotWritable(ex, headers, status, request);
92 public ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
93 return super.handleMethodArgumentNotValid(ex, headers, status, request);
97 public ResponseEntity<Object> handleMissingServletRequestPart(MissingServletRequestPartException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
98 return super.handleMissingServletRequestPart(ex, headers, status, request);
102 public ResponseEntity<Object> handleBindException(BindException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
103 return super.handleBindException(ex, headers, status, request);
107 public ResponseEntity<Object> handleNoHandlerFoundException(NoHandlerFoundException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
108 return super.handleNoHandlerFoundException(ex, headers, status, request);
112 public ResponseEntity<Object> handleAsyncRequestTimeoutException(AsyncRequestTimeoutException ex, HttpHeaders headers, HttpStatus status, WebRequest webRequest) {
113 return super.handleAsyncRequestTimeoutException(ex, headers, status, webRequest);
117 public ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
118 return super.handleExceptionInternal(ex, body, headers, status, request);
122 RestExceptionHandler handler;
125 public void setUp() {
126 handler = new RestExceptionHandlerWrapper();
130 public void handleHttpRequestMethodNotSupported() throws JsonProcessingException {
131 String[] supportedMethods = {"GET", "POST", "PUT", "DELETE"};
134 ResponseEntity<Object> respEntity = handler.handleHttpRequestMethodNotSupported(new HttpRequestMethodNotSupportedException("PATCH", supportedMethods),
135 null, HttpStatus.METHOD_NOT_ALLOWED, null);
137 assertTrue(respEntity.hasBody());
138 assertTrue(respEntity.getBody() instanceof RestErrors);
140 RestErrors restErrors = (RestErrors) respEntity.getBody();
142 ObjectMapper objectMapper = new ObjectMapper();
143 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
149 public void handleHttpMediaTypeNotSupported() throws JsonProcessingException {
150 MediaType[] supportedMediaTypeArray = { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML};
152 ResponseEntity<Object> respEntity = handler.handleHttpMediaTypeNotSupported(new HttpMediaTypeNotSupportedException(MediaType.MULTIPART_MIXED, Arrays.asList(supportedMediaTypeArray)),
153 null, HttpStatus.UNSUPPORTED_MEDIA_TYPE, null);
155 assertTrue(respEntity.hasBody());
156 assertTrue(respEntity.getBody() instanceof RestErrors);
158 RestErrors restErrors = (RestErrors) respEntity.getBody();
159 ObjectMapper objectMapper = new ObjectMapper();
160 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
164 public void handleHttpMediaTypeNotAcceptable() throws JsonProcessingException {
165 MediaType[] supportedMediaTypeArray = { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML};
167 ResponseEntity<Object> respEntity = handler.handleHttpMediaTypeNotAcceptable(new HttpMediaTypeNotAcceptableException(Arrays.asList(supportedMediaTypeArray)),
168 null, HttpStatus.UNSUPPORTED_MEDIA_TYPE, null);
170 assertTrue(respEntity.hasBody());
171 assertTrue(respEntity.getBody() instanceof RestErrors);
173 RestErrors restErrors = (RestErrors) respEntity.getBody();
175 ObjectMapper objectMapper = new ObjectMapper();
176 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
181 public void handleMissingPathVariable() throws JsonProcessingException {
182 ResponseEntity<Object> respEntity = handler.handleMissingPathVariable(new MissingPathVariableException("test", new MethodParameter(RestApplicationError.class.getDeclaredConstructors()[0],-1)),
183 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
185 assertTrue(respEntity.hasBody());
186 assertTrue(respEntity.getBody() instanceof RestErrors);
188 RestErrors restErrors = (RestErrors) respEntity.getBody();
189 ObjectMapper objectMapper = new ObjectMapper();
190 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
194 public void handleMissingServletRequestParameter() throws JsonProcessingException {
195 ResponseEntity<Object> respEntity = handler.handleMissingServletRequestParameter(new MissingServletRequestParameterException("test", "string"),
196 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
198 assertTrue(respEntity.hasBody());
199 assertTrue(respEntity.getBody() instanceof RestErrors);
201 RestErrors restErrors = (RestErrors) respEntity.getBody();
202 ObjectMapper objectMapper = new ObjectMapper();
203 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
207 public void handleServletRequestBindingException() throws JsonProcessingException {
208 ResponseEntity<Object> respEntity = handler.handleServletRequestBindingException(new ServletRequestBindingException("servlet request binding error"),
209 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
211 assertTrue(respEntity.hasBody());
212 assertTrue(respEntity.getBody() instanceof RestErrors);
214 RestErrors restErrors = (RestErrors) respEntity.getBody();
215 ObjectMapper objectMapper = new ObjectMapper();
216 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
220 public void handleConversionNotSupported() throws JsonProcessingException {
221 ResponseEntity<Object> respEntity = handler.handleConversionNotSupported(new ConversionNotSupportedException("hello", Integer.class, new NumberFormatException()),
222 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
224 assertTrue(respEntity.hasBody());
225 assertTrue(respEntity.getBody() instanceof RestErrors);
227 RestErrors restErrors = (RestErrors) respEntity.getBody();
228 ObjectMapper objectMapper = new ObjectMapper();
229 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
233 public void handleTypeMismatch() throws JsonProcessingException {
234 ResponseEntity<Object> respEntity = handler.handleTypeMismatch(new TypeMismatchException("hello", Integer.class, new NumberFormatException()),
235 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
237 assertTrue(respEntity.hasBody());
238 assertTrue(respEntity.getBody() instanceof RestErrors);
240 RestErrors restErrors = (RestErrors) respEntity.getBody();
241 ObjectMapper objectMapper = new ObjectMapper();
242 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
246 public void handleHttpMessageNotReadable() throws JsonProcessingException {
247 ResponseEntity<Object> respEntity = handler.handleHttpMessageNotReadable(new HttpMessageNotReadableException("Message not readable"),
248 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
250 assertTrue(respEntity.hasBody());
251 assertTrue(respEntity.getBody() instanceof RestErrors);
253 RestErrors restErrors = (RestErrors) respEntity.getBody();
254 ObjectMapper objectMapper = new ObjectMapper();
255 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
259 public void handleHttpMessageNotWritable() throws JsonProcessingException {
260 ResponseEntity<Object> respEntity = handler.handleHttpMessageNotWritable(new HttpMessageNotWritableException("Message not writable"),
261 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
263 assertTrue(respEntity.hasBody());
264 assertTrue(respEntity.getBody() instanceof RestErrors);
266 RestErrors restErrors = (RestErrors) respEntity.getBody();
267 ObjectMapper objectMapper = new ObjectMapper();
268 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
272 public void handleMethodArgumentNotValid() throws JsonProcessingException {
273 ResponseEntity<Object> respEntity = handler.handleMethodArgumentNotValid(new MethodArgumentNotValidException(new MethodParameter(RestApplicationError.class.getDeclaredConstructors()[0],-1),
274 new BindException("target", "objectName")),
275 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
277 assertTrue(respEntity.hasBody());
278 assertTrue(respEntity.getBody() instanceof RestErrors);
280 RestErrors restErrors = (RestErrors) respEntity.getBody();
281 ObjectMapper objectMapper = new ObjectMapper();
282 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
286 public void handleMissingServletRequestPart() throws JsonProcessingException {
287 ResponseEntity<Object> respEntity = handler.handleMissingServletRequestPart(new MissingServletRequestPartException("test"),
288 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
290 assertTrue(respEntity.hasBody());
291 assertTrue(respEntity.getBody() instanceof RestErrors);
293 RestErrors restErrors = (RestErrors) respEntity.getBody();
294 ObjectMapper objectMapper = new ObjectMapper();
295 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
299 public void handleBindException() throws JsonProcessingException {
300 ResponseEntity<Object> respEntity = handler.handleBindException(new BindException("target", "objectName"),
301 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
303 assertTrue(respEntity.hasBody());
304 assertTrue(respEntity.getBody() instanceof RestErrors);
306 RestErrors restErrors = (RestErrors) respEntity.getBody();
307 ObjectMapper objectMapper = new ObjectMapper();
308 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
312 public void handleNoHandlerFoundException() throws JsonProcessingException {
313 ResponseEntity<Object> respEntity = handler.handleNoHandlerFoundException(new NoHandlerFoundException("GET", "restconf/bogus", null),
314 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
316 assertTrue(respEntity.hasBody());
317 assertTrue(respEntity.getBody() instanceof RestErrors);
319 RestErrors restErrors = (RestErrors) respEntity.getBody();
320 ObjectMapper objectMapper = new ObjectMapper();
321 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
325 public void handleAsyncRequestTimeoutException() throws JsonProcessingException {
326 ResponseEntity<Object> respEntity = handler.handleAsyncRequestTimeoutException(new AsyncRequestTimeoutException(),
327 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
329 assertTrue(respEntity.hasBody());
330 assertTrue(respEntity.getBody() instanceof RestErrors);
332 RestErrors restErrors = (RestErrors) respEntity.getBody();
333 ObjectMapper objectMapper = new ObjectMapper();
334 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
338 public void handleExceptionInternal() throws JsonProcessingException {
339 ResponseEntity<Object> respEntity = handler.handleExceptionInternal(new NullPointerException(), null,
340 null, HttpStatus.INTERNAL_SERVER_ERROR, null);
342 assertTrue(respEntity.hasBody());
343 assertTrue(respEntity.getBody() instanceof RestErrors);
345 RestErrors restErrors = (RestErrors) respEntity.getBody();
346 ObjectMapper objectMapper = new ObjectMapper();
347 log.info("response : {}", objectMapper.writeValueAsString(restErrors));
351 public void handleRestException() throws JsonProcessingException {
353 ResponseEntity<Object> respEntity = handler.handleRestException(new RestApplicationException("no-data-found", "No data found", HttpStatus.NOT_FOUND.value()), null);
354 assertTrue(respEntity.hasBody());
355 assertTrue(respEntity.getBody() instanceof RestErrors);
357 RestErrors restErrors = (RestErrors) respEntity.getBody();
358 ObjectMapper objectMapper = new ObjectMapper();
359 log.info("response : {}", objectMapper.writeValueAsString(restErrors));