Async MSO error format: handle more cases 29/100329/1
authorIttay Stern <ittay.stern@att.com>
Wed, 15 Jan 2020 17:52:33 +0000 (19:52 +0200)
committerIttay Stern <ittay.stern@att.com>
Wed, 15 Jan 2020 17:52:33 +0000 (19:52 +0200)
Try better not to fallback to "Http Code:400, null"

Notably, handle the case where "serviceException" is inside a "requestError"
container.

Issue-ID: VID-749

Change-Id: I3c7d609aed893bbbeb71ebe4b465289c71e5c32b
Signed-off-by: Ittay Stern <ittay.stern@att.com>
vid-app-common/src/main/java/org/onap/vid/mso/MsoUtil.java
vid-app-common/src/test/java/org/onap/vid/mso/MsoUtilTest.java
vid-app-common/src/test/java/org/onap/vid/services/AsyncInstantiationBusinessLogicTest.java

index 626816f..8de534a 100644 (file)
 
 package org.onap.vid.mso;
 
+import static org.apache.commons.lang3.StringUtils.firstNonBlank;
+import static org.apache.commons.lang3.StringUtils.isEmpty;
 import static org.onap.vid.utils.KotlinUtilsKt.JACKSON_OBJECT_MAPPER;
 
-import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
 import io.joshworks.restclient.http.HttpResponse;
 import java.io.IOException;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.onap.vid.exceptions.GenericUncheckedException;
 
 public class MsoUtil {
 
@@ -76,22 +76,31 @@ public class MsoUtil {
     }
 
     public static String formatExceptionAdditionalInfo(int statusCode, String msoResponse) {
-        String errorMsg = "Http Code:" + statusCode;
-        if (!StringUtils.isEmpty(msoResponse)) {
-            String filteredJson;
-            try {
-                filteredJson = StringUtils.defaultIfEmpty(
-                        JACKSON_OBJECT_MAPPER.readTree(msoResponse).path("serviceException").toString().replaceAll("[\\{\\}]","") ,
-                        msoResponse
-                );
-            } catch (JsonParseException e) {
-                filteredJson = msoResponse;
-            } catch (IOException e) {
-                throw new GenericUncheckedException(e);
-            }
+        final String errorMsg = "Http Code:" + statusCode;
+
+        if (isEmpty(msoResponse)) {
+            return errorMsg;
+        }
+
+        try {
+            JsonNode jsonNode = JACKSON_OBJECT_MAPPER.readTree(msoResponse);
 
-            errorMsg = errorMsg + ", " + filteredJson;
+            return errorMsg + ", " + firstNonBlank(
+                removeBraces(jsonNode.get("serviceException")),
+                removeBraces(jsonNode.path("requestError").get("serviceException")),
+                msoResponse
+            );
+
+        } catch (Exception e) {
+            return errorMsg + ", " + msoResponse;
         }
-        return errorMsg;
+    }
+
+    private static String removeBraces(JsonNode jsonNode) {
+        if (jsonNode == null || jsonNode.isMissingNode()) {
+            return null;
+        }
+
+        return jsonNode.toString().replaceAll("[\\{\\}]", "");
     }
 }
index 10456be..cfde52a 100644 (file)
@@ -26,6 +26,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import io.joshworks.restclient.http.HttpResponse;
 import org.onap.vid.testUtils.TestUtils;
+import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 public class MsoUtilTest {
@@ -67,4 +68,26 @@ public class MsoUtilTest {
         assertThat(result.getStatus()).isEqualTo(SC_OK);
     }
 
+    @DataProvider
+    public static Object[][] formatExceptionAdditionalInfo() {
+        return new Object[][]{
+            {"message", "Http Code:400, message"},
+
+            {null, "Http Code:400"},
+
+            {"{\"requestError\":{\"serviceException\":{\"messageId\":\"SVC0002\",\"text\":\"message\"}}}",
+                "Http Code:400, \"messageId\":\"SVC0002\",\"text\":\"message\""},
+
+            {"{\"validJson\": \"Error: message\"}", "Http Code:400, {\"validJson\": \"Error: message\"}"},
+
+            {"{\"serviceException\":{\"messageId\":\"SVC0002\",\"text\":\"Error: message\"}}",
+                "Http Code:400, \"messageId\":\"SVC0002\",\"text\":\"Error: message\""},
+        };
+    }
+
+    @Test(dataProvider = "formatExceptionAdditionalInfo")
+    public void formatExceptionAdditionalInfo_payloadWithError400_doNotReturnNull(String payload, String expected) {
+        assertThat(MsoUtil.formatExceptionAdditionalInfo(400, payload))
+            .isEqualTo(expected);
+    }
 }
index 0749aaf..a1e4af2 100644 (file)
@@ -1223,7 +1223,8 @@ public class AsyncInstantiationBusinessLogicTest extends AsyncInstantiationBaseT
         String message = "Failed to create service instance";
         return new Object[][]{
                 {500, message},
-                {199, "{\"serviceException\":{\"messageId\":\"SVC2000\",\"text\":\"Error: " + message + "\"}}"}
+                {400, "{\"requestError\":{\"serviceException\":{\"messageId\":\"SVC0002\",\"text\":\"" + message + "\"}}}"},
+                {199, "{\"serviceException\":{\"messageId\":\"SVC2000\",\"text\":\"Error: " + message + "\"}}"},
         };
     }