Fix Parsing Of Etsi Catalog Notifications 70/106970/1
authorAndrewLamb <andrew.a.lamb@est.tech>
Fri, 1 May 2020 09:47:45 +0000 (10:47 +0100)
committerAndrewLamb <andrew.a.lamb@est.tech>
Fri, 1 May 2020 10:07:43 +0000 (11:07 +0100)
Change-Id: I230199ae259e5321bed91aea75f3dd6baf780970
Issue-ID: SO-2825
Signed-off-by: AndrewLamb <andrew.a.lamb@est.tech>
adapters/mso-vnfm-adapter/mso-vnfm-adapter-api/pom.xml
adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/AbstractServiceProviderConfiguration.java
adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/OAuthNotificationServiceProvider.java
adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/EtsiSubscriptionNotificationController.java
adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/EtsiSubscriptionNotificationControllerTest.java

index 54f0585..093dab3 100644 (file)
@@ -66,6 +66,7 @@
                 <withXml>true</withXml>
                 <useRxJava2>true</useRxJava2>
                 <serializableModel>true</serializableModel>
+                <dateLibrary>java8-localdatetime</dateLibrary>
               </configOptions>
             </configuration>
           </execution>
@@ -86,6 +87,7 @@
                 <withXml>true</withXml>
                 <useRxJava2>true</useRxJava2>
                 <serializableModel>true</serializableModel>
+                <dateLibrary>java8-localdatetime</dateLibrary>
               </configOptions>
             </configuration>
           </execution>
index 8f6d853..2e99658 100644 (file)
 
 package org.onap.so.adapters.vnfmadapter.extclients;
 
+import java.time.LocalDateTime;
 import com.google.gson.Gson;
 import java.util.Iterator;
-import org.onap.vnfmadapter.v1.JSON;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.JSON;
+import org.onap.so.adapters.vnfmadapter.rest.EtsiSubscriptionNotificationController;
 import org.springframework.http.converter.HttpMessageConverter;
 import org.springframework.http.converter.json.GsonHttpMessageConverter;
 import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 import org.springframework.web.client.RestTemplate;
+import org.threeten.bp.OffsetDateTime;
 
 /**
  * A base class that can be extended by classes for configuring HttpRestServiceProvider classes. Provides common methods
@@ -35,6 +38,7 @@ import org.springframework.web.client.RestTemplate;
  * @author gareth.roper@est.tech
  */
 public abstract class AbstractServiceProviderConfiguration {
+    private final JSON.OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter = new JSON.OffsetDateTimeTypeAdapter();
 
     public void setGsonMessageConverter(final RestTemplate restTemplate) {
         final Iterator<HttpMessageConverter<?>> iterator = restTemplate.getMessageConverters().iterator();
@@ -43,7 +47,10 @@ public abstract class AbstractServiceProviderConfiguration {
                 iterator.remove();
             }
         }
-        final Gson gson = new JSON().getGson();
+        final Gson gson = JSON.createGson().registerTypeAdapter(OffsetDateTime.class, offsetDateTimeTypeAdapter)
+                .registerTypeAdapter(LocalDateTime.class,
+                        new EtsiSubscriptionNotificationController.LocalDateTimeTypeAdapter())
+                .create();
         restTemplate.getMessageConverters().add(new GsonHttpMessageConverter(gson));
     }
 }
index c065203..c30c74d 100644 (file)
@@ -45,6 +45,7 @@ public class OAuthNotificationServiceProvider extends AbstractNotificationServic
     public boolean send(final Object notification, final SubscriptionsAuthentication subscriptionsAuthentication,
             final String callbackUri) {
         logger.info("Sending notification to uri: {}", callbackUri);
+        logger.info("Object: {}", notification);
         final String token = getAccessToken(subscriptionsAuthentication);
 
         if (token == null) {
index a97f04b..9217621 100644 (file)
 
 package org.onap.so.adapters.vnfmadapter.rest;
 
-import static org.onap.so.adapters.vnfmadapter.Constants.ETSI_SUBSCRIPTION_NOTIFICATION_CONTROLLER_BASE_URL;
-import static org.slf4j.LoggerFactory.getLogger;
-import java.util.AbstractMap;
-import java.util.Map.Entry;
-import javax.ws.rs.core.MediaType;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.TypeAdapter;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonWriter;
 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.notification.model.PkgChangeNotification;
 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.notification.model.PkgOnboardingNotification;
 import org.onap.so.adapters.vnfmadapter.packagemanagement.subscriptionmanagement.NotificationManager;
@@ -38,10 +40,14 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
+import javax.ws.rs.core.MediaType;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.AbstractMap;
+import java.util.Map.Entry;
+import static org.onap.so.adapters.vnfmadapter.Constants.ETSI_SUBSCRIPTION_NOTIFICATION_CONTROLLER_BASE_URL;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * This controller handles the ETSI Subscription Notification Endpoints.
@@ -61,7 +67,7 @@ public class EtsiSubscriptionNotificationController {
     @Autowired
     public EtsiSubscriptionNotificationController(final NotificationManager notificationManager) {
         this.notificationManager = notificationManager;
-        this.gson = new GsonBuilder().create();
+        this.gson = new GsonBuilder().registerTypeAdapter(LocalDateTime.class, new LocalDateTimeTypeAdapter()).create();
     }
 
     @GetMapping(value = "/notification")
@@ -77,10 +83,11 @@ public class EtsiSubscriptionNotificationController {
      * @return Response Code: 204 No Content if Successful, ProblemDetails Object if not.
      */
     @PostMapping(value = "/notification", consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON)
-    public ResponseEntity<?> postSubscriptionNotification(@RequestBody final String notification) {
-        logger.info("Posting subscription notification \n{}", notification);
+    public ResponseEntity<?> postSubscriptionNotification(@RequestBody final Object notification) {
+        logger.info("Posting subscription notification class: {} \n{}", notification.getClass(), notification);
+        final String notificationString = gson.toJson(notification);
 
-        final Entry<String, Object> notificationObject = getNotificationObject(notification);
+        final Entry<String, Object> notificationObject = getNotificationObject(notificationString);
         if (notificationManager.processSubscriptionNotification(notificationObject.getValue(),
                 notificationObject.getKey())) {
             logger.info("Notification Delivered Successfully");
@@ -92,6 +99,7 @@ public class EtsiSubscriptionNotificationController {
     }
 
     private Entry<String, Object> getNotificationObject(final String notification) {
+        logger.info("getNotificationObject() notification: {}", notification);
         final String notificationType = getNotificationType(notification);
         if (PkgOnboardingNotification.NotificationTypeEnum.VNFPACKAGEONBOARDINGNOTIFICATION.getValue()
                 .equals(notificationType)) {
@@ -118,6 +126,7 @@ public class EtsiSubscriptionNotificationController {
 
     private String getNotificationType(final String notification) {
         try {
+            logger.info("getNotificationType() notification: {}", notification);
             final JsonParser parser = new JsonParser();
             final JsonObject element = (JsonObject) parser.parse(notification);
             return element.get("notificationType").getAsString();
@@ -128,4 +137,30 @@ public class EtsiSubscriptionNotificationController {
                 "Unable to parse notification type in object \n" + notification);
     }
 
+    public static class LocalDateTimeTypeAdapter extends TypeAdapter<LocalDateTime> {
+
+        private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+        @Override
+        public void write(final JsonWriter out, final LocalDateTime localDateTime) throws IOException {
+            if (localDateTime == null) {
+                out.nullValue();
+            } else {
+                out.value(FORMATTER.format(localDateTime));
+            }
+        }
+
+        @Override
+        public LocalDateTime read(final JsonReader in) throws IOException {
+            switch (in.peek()) {
+                case NULL:
+                    in.nextNull();
+                    return null;
+                default:
+                    final String dateTime = in.nextString();
+                    return LocalDateTime.parse(dateTime, FORMATTER);
+            }
+        }
+    }
+
 }
index 5a330e4..069bfac 100644 (file)
@@ -43,6 +43,7 @@ import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.notification.mode
 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.notification.model.PkgChangeNotification;
 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.notification.model.PkgOnboardingNotification;
 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.notification.model.PkgmLinks;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.JSON;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.PkgmSubscriptionRequest;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthentication;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthenticationParamsBasic;
@@ -54,18 +55,18 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.web.client.TestRestTemplate;
+import org.springframework.boot.web.client.RestTemplateBuilder;
 import org.springframework.boot.web.server.LocalServerPort;
 import org.springframework.cache.Cache;
 import org.springframework.cache.CacheManager;
 import org.springframework.http.*;
+import org.springframework.http.converter.json.GsonHttpMessageConverter;
 import org.springframework.test.annotation.DirtiesContext;
 import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.test.web.client.MockRestServiceServer;
 import org.springframework.web.client.RestTemplate;
-import org.threeten.bp.LocalDateTime;
-import org.threeten.bp.OffsetDateTime;
-import org.threeten.bp.ZoneOffset;
+import java.time.LocalDateTime;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 
@@ -95,8 +96,8 @@ public class EtsiSubscriptionNotificationControllerTest {
     private static final String EXPECTED_OAUTH_AUTHORIZATION = "Bearer " + TOKEN;
     private static final String NOTIFICATION_ID = "NOTIFICATION_ID";
     private static final String SUBSCRIPTION_ID = "SUBSCRIPTION_ID";
-    private static final OffsetDateTime TIMESTAMP =
-            OffsetDateTime.of(LocalDateTime.of(2020, 1, 1, 1, 1, 1, 1), ZoneOffset.ofHours(1));
+    private static final String TIME_STAMP_STRING_EXPECTED_FROM_ETSI_CATALOG = "2020-01-01 01:01:01";
+    private static final java.time.LocalDateTime TIMESTAMP = java.time.LocalDateTime.of(2020, 1, 1, 1, 1, 1, 1);
     private static final String VNFPKG_ID = UUID.randomUUID().toString();
     private static final String VNFD_ID = UUID.randomUUID().toString();
     private static final String EXPECTED_VNF_PACKAGE_HREF =
@@ -105,7 +106,8 @@ public class EtsiSubscriptionNotificationControllerTest {
             "https://so-vnfm-adapter.onap:30406/so/vnfm-adapter/v1/vnfpkgm/v1/subscriptions/" + SUBSCRIPTION_ID;
 
     private BasicHttpHeadersProvider basicHttpHeadersProvider;
-    private final Gson gson = new GsonBuilder().create();;
+    private final Gson gson = new GsonBuilder().registerTypeAdapter(LocalDateTime.class,
+            new EtsiSubscriptionNotificationController.LocalDateTimeTypeAdapter()).create();
 
     @Autowired
     @Qualifier(CONFIGURABLE_REST_TEMPLATE)
@@ -125,6 +127,11 @@ public class EtsiSubscriptionNotificationControllerTest {
         basicHttpHeadersProvider = new BasicHttpHeadersProvider();
         cache = cacheServiceProvider.getCache(Constants.PACKAGE_MANAGEMENT_SUBSCRIPTION_CACHE);
         cache.clear();
+
+        final Gson gson = JSON.createGson().registerTypeAdapter(LocalDateTime.class,
+                new EtsiSubscriptionNotificationController.LocalDateTimeTypeAdapter()).create();
+        testRestTemplate = new TestRestTemplate(
+                new RestTemplateBuilder().additionalMessageConverters(new GsonHttpMessageConverter(gson)));
     }
 
     @After
@@ -144,7 +151,6 @@ public class EtsiSubscriptionNotificationControllerTest {
                 buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
         cache.put(SUBSCRIPTION_ID, subscriptionRequest);
         final PkgOnboardingNotification notification = buildPkgOnboardingNotification();
-        final String notificationString = gson.toJson(notification);
 
         mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
                 .andExpect(jsonPath("$.id").value(NOTIFICATION_ID))
@@ -152,14 +158,13 @@ public class EtsiSubscriptionNotificationControllerTest {
                         .value(VnfPackageOnboardingNotification.NotificationTypeEnum.VNFPACKAGEONBOARDINGNOTIFICATION
                                 .toString()))
                 .andExpect(jsonPath("$.subscriptionId").value(SUBSCRIPTION_ID))
-                .andExpect(jsonPath("$.timeStamp").value(TIMESTAMP.toString()))
-                .andExpect(jsonPath("$.vnfPkgId").value(VNFPKG_ID.toString()))
-                .andExpect(jsonPath("$.vnfdId").value(VNFD_ID.toString()))
+                .andExpect(jsonPath("$.timeStamp").value(TIME_STAMP_STRING_EXPECTED_FROM_ETSI_CATALOG))
+                .andExpect(jsonPath("$.vnfPkgId").value(VNFPKG_ID)).andExpect(jsonPath("$.vnfdId").value(VNFD_ID))
                 .andExpect(jsonPath("$._links")
                         .value(buildPkgmLinks(EXPECTED_VNF_PACKAGE_HREF, EXPECTED_SUBSCRIPTION_HREF)))
                 .andExpect(header("Authorization", EXPECTED_BASIC_AUTHORIZATION)).andRespond(withSuccess());
 
-        final ResponseEntity<?> response = sendHttpPost(notificationString);
+        final ResponseEntity<?> response = sendHttpPost(notification);
 
         assertEquals(HttpStatus.NO_CONTENT, response.getStatusCode());
     }
@@ -167,8 +172,7 @@ public class EtsiSubscriptionNotificationControllerTest {
     @Test
     public void testOnboardingNotificationNotSentOnToVnfmCallbackUri_SubscriptionRequestNotInCache_Fail() {
         final PkgOnboardingNotification notification = buildPkgOnboardingNotification();
-        final String notificationString = gson.toJson(notification);
-        final ResponseEntity<?> response = sendHttpPost(notificationString);
+        final ResponseEntity<?> response = sendHttpPost(notification);
 
         assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
         assertTrue(response.getBody() instanceof ProblemDetails);
@@ -186,12 +190,11 @@ public class EtsiSubscriptionNotificationControllerTest {
                 buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
         cache.put(SUBSCRIPTION_ID, subscriptionRequest);
         final PkgOnboardingNotification notification = buildPkgOnboardingNotification();
-        final String notificationString = gson.toJson(notification);
 
         mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
                 .andRespond(withStatus(HttpStatus.BAD_REQUEST));
 
-        final ResponseEntity<?> response = sendHttpPost(notificationString);
+        final ResponseEntity<?> response = sendHttpPost(notification);
 
         assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
         assertTrue(response.getBody() instanceof ProblemDetails);
@@ -209,12 +212,11 @@ public class EtsiSubscriptionNotificationControllerTest {
                 buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
         cache.put(SUBSCRIPTION_ID, subscriptionRequest);
         final PkgOnboardingNotification notification = buildPkgOnboardingNotification();
-        final String notificationString = gson.toJson(notification);
 
         mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
                 .andRespond(withStatus(HttpStatus.MOVED_PERMANENTLY));
 
-        final ResponseEntity<?> response = sendHttpPost(notificationString);
+        final ResponseEntity<?> response = sendHttpPost(notification);
 
         assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
         assertTrue(response.getBody() instanceof ProblemDetails);
@@ -231,12 +233,11 @@ public class EtsiSubscriptionNotificationControllerTest {
                 buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
         cache.put(SUBSCRIPTION_ID, subscriptionRequest);
         final PkgOnboardingNotification notification = buildPkgOnboardingNotification();
-        final String notificationString = gson.toJson(notification);
 
         mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
                 .andRespond(withStatus(HttpStatus.NOT_FOUND));
 
-        final ResponseEntity<?> response = sendHttpPost(notificationString);
+        final ResponseEntity<?> response = sendHttpPost(notification);
 
         assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
         assertTrue(response.getBody() instanceof ProblemDetails);
@@ -254,12 +255,11 @@ public class EtsiSubscriptionNotificationControllerTest {
                 buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
         cache.put(SUBSCRIPTION_ID, subscriptionRequest);
         final PkgOnboardingNotification notification = buildPkgOnboardingNotification();
-        final String notificationString = gson.toJson(notification);
 
         mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
                 .andRespond(withStatus(HttpStatus.INTERNAL_SERVER_ERROR));
 
-        final ResponseEntity<?> response = sendHttpPost(notificationString);
+        final ResponseEntity<?> response = sendHttpPost(notification);
 
         assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
         assertTrue(response.getBody() instanceof ProblemDetails);
@@ -278,16 +278,14 @@ public class EtsiSubscriptionNotificationControllerTest {
                 buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
         cache.put(SUBSCRIPTION_ID, subscriptionRequest);
         final PkgChangeNotification notification = buildPkgChangeNotification();
-        final String notificationString = gson.toJson(notification);
 
         mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
                 .andExpect(jsonPath("$.id").value(NOTIFICATION_ID))
                 .andExpect(jsonPath("$.notificationType").value(
                         VnfPackageChangeNotification.NotificationTypeEnum.VNFPACKAGECHANGENOTIFICATION.getValue()))
                 .andExpect(jsonPath("$.subscriptionId").value(SUBSCRIPTION_ID))
-                .andExpect(jsonPath("$.timeStamp").value(TIMESTAMP.toString()))
-                .andExpect(jsonPath("$.vnfPkgId").value(VNFPKG_ID.toString()))
-                .andExpect(jsonPath("$.vnfdId").value(VNFD_ID.toString()))
+                .andExpect(jsonPath("$.timeStamp").value(TIME_STAMP_STRING_EXPECTED_FROM_ETSI_CATALOG))
+                .andExpect(jsonPath("$.vnfPkgId").value(VNFPKG_ID)).andExpect(jsonPath("$.vnfdId").value(VNFD_ID))
                 .andExpect(
                         jsonPath("$.changeType").value(PkgChangeNotification.ChangeTypeEnum.OP_STATE_CHANGE.toString()))
                 .andExpect(jsonPath("$.operationalState")
@@ -296,7 +294,7 @@ public class EtsiSubscriptionNotificationControllerTest {
                         .value(buildPkgmLinks(EXPECTED_VNF_PACKAGE_HREF, EXPECTED_SUBSCRIPTION_HREF)))
                 .andExpect(header("Authorization", EXPECTED_BASIC_AUTHORIZATION)).andRespond(withSuccess());
 
-        final ResponseEntity<?> response = sendHttpPost(notificationString);
+        final ResponseEntity<?> response = sendHttpPost(notification);
 
         assertEquals(HttpStatus.NO_CONTENT, response.getStatusCode());
     }
@@ -304,8 +302,7 @@ public class EtsiSubscriptionNotificationControllerTest {
     @Test
     public void testChangeNotificationNotSentOnToVnfmCallbackUri_SubscriptionRequestNotInCache_Fail() {
         final PkgChangeNotification notification = buildPkgChangeNotification();
-        final String notificationString = gson.toJson(notification);
-        final ResponseEntity<?> response = sendHttpPost(notificationString);
+        final ResponseEntity<?> response = sendHttpPost(notification);
 
         assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
         assertTrue(response.getBody() instanceof ProblemDetails);
@@ -323,12 +320,11 @@ public class EtsiSubscriptionNotificationControllerTest {
                 buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
         cache.put(SUBSCRIPTION_ID, subscriptionRequest);
         final PkgChangeNotification notification = buildPkgChangeNotification();
-        final String notificationString = gson.toJson(notification);
 
         mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
                 .andRespond(withStatus(HttpStatus.BAD_REQUEST));
 
-        final ResponseEntity<?> response = sendHttpPost(notificationString);
+        final ResponseEntity<?> response = sendHttpPost(notification);
 
         assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
         assertTrue(response.getBody() instanceof ProblemDetails);
@@ -346,12 +342,11 @@ public class EtsiSubscriptionNotificationControllerTest {
                 buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
         cache.put(SUBSCRIPTION_ID, subscriptionRequest);
         final PkgChangeNotification notification = buildPkgChangeNotification();
-        final String notificationString = gson.toJson(notification);
 
         mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
                 .andRespond(withStatus(HttpStatus.NOT_FOUND));
 
-        final ResponseEntity<?> response = sendHttpPost(notificationString);
+        final ResponseEntity<?> response = sendHttpPost(notification);
 
         assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
         assertTrue(response.getBody() instanceof ProblemDetails);
@@ -369,12 +364,11 @@ public class EtsiSubscriptionNotificationControllerTest {
                 buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
         cache.put(SUBSCRIPTION_ID, subscriptionRequest);
         final PkgChangeNotification notification = buildPkgChangeNotification();
-        final String notificationString = gson.toJson(notification);
 
         mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
                 .andRespond(withStatus(HttpStatus.INTERNAL_SERVER_ERROR));
 
-        final ResponseEntity<?> response = sendHttpPost(notificationString);
+        final ResponseEntity<?> response = sendHttpPost(notification);
 
         assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
         assertTrue(response.getBody() instanceof ProblemDetails);
@@ -393,7 +387,6 @@ public class EtsiSubscriptionNotificationControllerTest {
                 buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
         cache.put(SUBSCRIPTION_ID, subscriptionRequest);
         final PkgOnboardingNotification notification = buildPkgOnboardingNotification();
-        final String notificationString = gson.toJson(notification);
 
         mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
                 .andExpect(jsonPath("$.id").value(NOTIFICATION_ID))
@@ -401,14 +394,13 @@ public class EtsiSubscriptionNotificationControllerTest {
                         .value(VnfPackageOnboardingNotification.NotificationTypeEnum.VNFPACKAGEONBOARDINGNOTIFICATION
                                 .toString()))
                 .andExpect(jsonPath("$.subscriptionId").value(SUBSCRIPTION_ID))
-                .andExpect(jsonPath("$.timeStamp").value(TIMESTAMP.toString()))
-                .andExpect(jsonPath("$.vnfPkgId").value(VNFPKG_ID.toString()))
-                .andExpect(jsonPath("$.vnfdId").value(VNFD_ID.toString()))
+                .andExpect(jsonPath("$.timeStamp").value(TIME_STAMP_STRING_EXPECTED_FROM_ETSI_CATALOG))
+                .andExpect(jsonPath("$.vnfPkgId").value(VNFPKG_ID)).andExpect(jsonPath("$.vnfdId").value(VNFD_ID))
                 .andExpect(jsonPath("$._links")
                         .value(buildPkgmLinks(EXPECTED_VNF_PACKAGE_HREF, EXPECTED_SUBSCRIPTION_HREF)))
                 .andExpect(header("Authorization", EXPECTED_BASIC_AUTHORIZATION)).andRespond(withSuccess());
 
-        final ResponseEntity<?> response = sendHttpPost(notificationString);
+        final ResponseEntity<?> response = sendHttpPost(notification);
 
         assertEquals(HttpStatus.NO_CONTENT, response.getStatusCode());
     }
@@ -419,13 +411,12 @@ public class EtsiSubscriptionNotificationControllerTest {
                 buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
         cache.put(SUBSCRIPTION_ID, subscriptionRequest);
         final PkgChangeNotification notification = buildPkgChangeNotification();
-        final String notificationString = gson.toJson(notification);
 
         mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
                 .andExpect(header("Authorization", EXPECTED_BASIC_AUTHORIZATION))
                 .andRespond(withStatus(HttpStatus.UNAUTHORIZED));
 
-        final ResponseEntity<?> response = sendHttpPost(notificationString);
+        final ResponseEntity<?> response = sendHttpPost(notification);
 
         assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
         assertTrue(response.getBody() instanceof ProblemDetails);
@@ -443,7 +434,6 @@ public class EtsiSubscriptionNotificationControllerTest {
                 buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.OAUTH2_CLIENT_CREDENTIALS);
         cache.put(SUBSCRIPTION_ID, subscriptionRequest);
         final PkgChangeNotification notification = buildPkgChangeNotification();
-        final String notificationString = gson.toJson(notification);
 
         mockRestServer.expect(requestTo(TOKEN_ENDPOINT)).andExpect(method(HttpMethod.POST))
                 .andExpect(header("Authorization", EXPECTED_BASIC_AUTHORIZATION))
@@ -455,9 +445,8 @@ public class EtsiSubscriptionNotificationControllerTest {
                 .andExpect(jsonPath("$.notificationType").value(
                         VnfPackageChangeNotification.NotificationTypeEnum.VNFPACKAGECHANGENOTIFICATION.toString()))
                 .andExpect(jsonPath("$.subscriptionId").value(SUBSCRIPTION_ID))
-                .andExpect(jsonPath("$.timeStamp").value(TIMESTAMP.toString()))
-                .andExpect(jsonPath("$.vnfPkgId").value(VNFPKG_ID.toString()))
-                .andExpect(jsonPath("$.vnfdId").value(VNFD_ID.toString()))
+                .andExpect(jsonPath("$.timeStamp").value(TIME_STAMP_STRING_EXPECTED_FROM_ETSI_CATALOG))
+                .andExpect(jsonPath("$.vnfPkgId").value(VNFPKG_ID)).andExpect(jsonPath("$.vnfdId").value(VNFD_ID))
                 .andExpect(
                         jsonPath("$.changeType").value(PkgChangeNotification.ChangeTypeEnum.OP_STATE_CHANGE.toString()))
                 .andExpect(jsonPath("$.operationalState")
@@ -466,7 +455,7 @@ public class EtsiSubscriptionNotificationControllerTest {
                         .value(buildPkgmLinks(EXPECTED_VNF_PACKAGE_HREF, EXPECTED_SUBSCRIPTION_HREF)))
                 .andRespond(withSuccess());
 
-        final ResponseEntity<?> response = sendHttpPost(notificationString);
+        final ResponseEntity<?> response = sendHttpPost(notification);
 
         assertEquals(HttpStatus.NO_CONTENT, response.getStatusCode());
     }
@@ -477,12 +466,11 @@ public class EtsiSubscriptionNotificationControllerTest {
                 buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.OAUTH2_CLIENT_CREDENTIALS);
         cache.put(SUBSCRIPTION_ID, subscriptionRequest);
         final PkgChangeNotification notification = buildPkgChangeNotification();
-        final String notificationString = gson.toJson(notification);
 
         mockRestServer.expect(requestTo(TOKEN_ENDPOINT)).andExpect(method(HttpMethod.POST))
                 .andExpect(header("Authorization", EXPECTED_BASIC_AUTHORIZATION)).andRespond(withSuccess());
 
-        final ResponseEntity<?> response = sendHttpPost(notificationString);
+        final ResponseEntity<?> response = sendHttpPost(notification);
 
         assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
         assertTrue(response.getBody() instanceof ProblemDetails);
@@ -499,9 +487,8 @@ public class EtsiSubscriptionNotificationControllerTest {
                 buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.TLS_CERT);
         cache.put(SUBSCRIPTION_ID, subscriptionRequest);
         final PkgChangeNotification notification = buildPkgChangeNotification();
-        final String notificationString = gson.toJson(notification);
 
-        final ResponseEntity<?> response = sendHttpPost(notificationString);
+        final ResponseEntity<?> response = sendHttpPost(notification);
 
         assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
         assertTrue(response.getBody() instanceof ProblemDetails);