Merge "Adding JUnits for additional coverage"
diff --git a/BRMSGateway/pom.xml b/BRMSGateway/pom.xml
index b398f37..6bd9557 100644
--- a/BRMSGateway/pom.xml
+++ b/BRMSGateway/pom.xml
@@ -41,6 +41,12 @@
 			</exclusions>
 		</dependency>
 		<dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.11</version>
+            <scope>test</scope>
+        </dependency>
+		<dependency>
 			<groupId>org.apache.maven</groupId>
 			<artifactId>maven-model</artifactId>
 			<version>2.2.1</version>
diff --git a/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/BRMSPush.java b/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/BRMSPush.java
index b09a3d8..c923c3c 100644
--- a/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/BRMSPush.java
+++ b/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/BRMSPush.java
@@ -137,6 +137,9 @@
     private boolean syncFlag = false;
 
     public BRMSPush(String propertiesFile, BackUpHandler handler) throws PolicyException {
+        if(propertiesFile==null || handler==null){
+            throw new PolicyException("Error no propertiesFile or handler");
+        }
         Properties config = new Properties();
         Path file = Paths.get(propertiesFile);
         if (Files.notExists(file)) {
@@ -185,7 +188,9 @@
         } catch (Exception e) {
             LOGGER.error("Error starting BackUpMonitor: " + e);
         }
-        config.setProperty(PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML, "META-INF/persistenceBRMS.xml");
+        if(!config.containsKey(PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML)){
+            config.setProperty(PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML, "META-INF/persistenceBRMS.xml");
+        }
         EntityManagerFactory emf = Persistence.createEntityManagerFactory("BRMSGW", config);
         em = emf.createEntityManager();
         defaultName = config.getProperty("defaultName");
@@ -1014,6 +1019,10 @@
 
     private void readGroups(Properties config) throws PolicyException {
         String[] groupNames = null;
+        if (!config.containsKey("groupNames") || config.getProperty("groupNames")==null){
+            throw new PolicyException(XACMLErrorConstants.ERROR_DATA_ISSUE
+                    + "groupNames property is missing or empty from the property file ");
+        }
         if (config.getProperty("groupNames").contains(",")) {
             groupNames = config.getProperty("groupNames").replaceAll(" ", "").split(",");
         } else {
diff --git a/BRMSGateway/src/test/java/org/onap/brmsgw/test/BRMSPushTest.java b/BRMSGateway/src/test/java/org/onap/brmsgw/test/BRMSPushTest.java
new file mode 100644
index 0000000..aa25744
--- /dev/null
+++ b/BRMSGateway/src/test/java/org/onap/brmsgw/test/BRMSPushTest.java
@@ -0,0 +1,234 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.brmsgw.test;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Properties;
+
+import org.junit.Test;
+import org.onap.policy.api.PolicyException;
+import org.onap.policy.brmsInterface.BRMSHandler;
+
+public class BRMSPushTest {
+    
+    private final String VALIDFILE = "src/test/resources/config.properties";
+    private final String INVALIDFILE = "src/test/resources/failure.properties";
+    
+    @Test (expected = PolicyException.class)
+    public void bRMSHandlerFailTest() throws PolicyException {
+        new BRMSHandler(null);
+    }
+    
+    @Test (expected = PolicyException.class)
+    public void bRMSHandlerFailTest1() throws PolicyException {
+        new BRMSHandler("src/test/resources/filenotexists.txt");
+    }
+    
+    @Test (expected = PolicyException.class)
+    public void bRMSHandlerFailTest2() throws PolicyException {
+        PropertyChange prop = new PropertyChange();
+        prop.key = "defaultName";
+        prop.remove = true;
+        List<PropertyChange> props = new LinkedList<>();
+        props.add(prop);
+        setFailureProperties(props);
+        new BRMSHandler(INVALIDFILE);
+    }
+    
+    @Test (expected = PolicyException.class)
+    public void bRMSHandlerFailTest3() throws PolicyException {
+        PropertyChange prop = new PropertyChange();
+        prop.key = "repositoryID";
+        prop.remove = true;
+        List<PropertyChange> props = new LinkedList<>();
+        props.add(prop);
+        prop = new PropertyChange();
+        prop.key = "RESOURCE_NAME";
+        prop.remove = true;
+        props.add(prop);
+        setFailureProperties(props);
+        new BRMSHandler(INVALIDFILE);
+    }
+    
+    @Test (expected = PolicyException.class)
+    public void bRMSHandlerFailTest4() throws PolicyException {
+        PropertyChange prop = new PropertyChange();
+        prop.key = "repositoryURL";
+        prop.remove = true;
+        List<PropertyChange> props = new LinkedList<>();
+        props.add(prop);
+        setFailureProperties(props);
+        new BRMSHandler(INVALIDFILE);
+    }
+    
+    @Test (expected = PolicyException.class)
+    public void bRMSHandlerFailTest5() throws PolicyException {
+        PropertyChange prop = new PropertyChange();
+        prop.key = "repositoryName";
+        prop.remove = true;
+        List<PropertyChange> props = new LinkedList<>();
+        props.add(prop);
+        setFailureProperties(props);
+        new BRMSHandler(INVALIDFILE);
+    }
+    
+    @Test (expected = PolicyException.class)
+    public void bRMSHandlerFailTest6() throws PolicyException {
+        PropertyChange prop = new PropertyChange();
+        prop.key = "repositoryURL";
+        prop.value = "http://nexus:8081/nexus/content/repositories/releases, http://nexus:8081/nexus/content/repositories/releases";
+        prop.remove = false;
+        List<PropertyChange> props = new LinkedList<>();
+        props.add(prop);
+        prop = new PropertyChange();
+        prop.key = "repositoryUsername";
+        prop.remove = true;
+        props.add(prop);
+        setFailureProperties(props);
+        new BRMSHandler(INVALIDFILE);
+    }
+    
+    @Test (expected = PolicyException.class)
+    public void bRMSHandlerFailTest7() throws PolicyException {
+        PropertyChange prop = new PropertyChange();
+        prop.key = "repositoryPassword";
+        prop.remove = true;
+        List<PropertyChange> props = new LinkedList<>();
+        props.add(prop);
+        setFailureProperties(props);
+        new BRMSHandler(INVALIDFILE);
+    }
+    
+    @Test (expected = PolicyException.class)
+    public void bRMSHandlerFailTest8() throws PolicyException {
+        PropertyChange prop = new PropertyChange();
+        prop.key = "policyKeyID";
+        prop.remove = true;
+        List<PropertyChange> props = new LinkedList<>();
+        props.add(prop);
+        setFailureProperties(props);
+        new BRMSHandler(INVALIDFILE);
+    }
+    
+    @Test (expected = PolicyException.class)
+    public void bRMSHandlerFailTest9() throws PolicyException {
+        PropertyChange prop = new PropertyChange();
+        prop.key = "sync";
+        prop.value = "true";
+        prop.remove = false;
+        List<PropertyChange> props = new LinkedList<>();
+        props.add(prop);
+        prop = new PropertyChange();
+        prop.key = "brms.dependency.version";
+        prop.remove = true;
+        props.add(prop);
+        prop = new PropertyChange();
+        prop.key = "groupNames";
+        prop.remove = true;
+        props.add(prop);
+        setFailureProperties(props);
+        new BRMSHandler(INVALIDFILE);
+    }
+    
+    @Test (expected = PolicyException.class)
+    public void bRMSHandlerFailTest10() throws PolicyException {
+        PropertyChange prop = new PropertyChange();
+        prop.key = "groupNames";
+        prop.value = "";
+        prop.remove = false;
+        List<PropertyChange> props = new LinkedList<>();
+        props.add(prop);
+        setFailureProperties(props);
+        new BRMSHandler(INVALIDFILE);
+    }
+    
+    @Test (expected = PolicyException.class)
+    public void bRMSHandlerFailTest11() throws PolicyException {
+        PropertyChange prop = new PropertyChange();
+        prop.key = "default.groupID";
+        prop.remove = true;
+        List<PropertyChange> props = new LinkedList<>();
+        props.add(prop);
+        setFailureProperties(props);
+        new BRMSHandler(INVALIDFILE);
+    }
+    
+    @Test (expected = PolicyException.class)
+    public void bRMSHandlerFailTest12() throws PolicyException {
+        PropertyChange prop = new PropertyChange();
+        prop.key = "default.artifactID";
+        prop.remove = true;
+        List<PropertyChange> props = new LinkedList<>();
+        props.add(prop);
+        setFailureProperties(props);
+        new BRMSHandler(INVALIDFILE);
+    }
+    
+    @Test (expected = PolicyException.class)
+    public void bRMSHandlerFailTest13() throws PolicyException {
+        PropertyChange prop = new PropertyChange();
+        prop.key = "NOTIFICATION_TYPE";
+        prop.value = "dmaap";
+        prop.remove = false;
+        List<PropertyChange> props = new LinkedList<>();
+        props.add(prop);
+        prop = new PropertyChange();
+        prop.key = "NOTIFICATION_SERVERS";
+        prop.remove = true;
+        props.add(prop);
+        setFailureProperties(props);
+        new BRMSHandler(INVALIDFILE);
+    }
+    
+    @Test
+    public void BRMSHandlerTest() throws PolicyException {
+        assertNotNull(new BRMSHandler(VALIDFILE));
+    }
+    
+    private void setFailureProperties(List<PropertyChange> properties) throws PolicyException {
+        Properties validProp = new Properties();
+        try {
+            validProp.load(new FileInputStream(VALIDFILE));
+            for (PropertyChange prop: properties) {
+                if(prop.remove) {
+                    validProp.remove(prop.key);
+                }else {
+                    validProp.setProperty(prop.key, prop.value);
+                }
+            }
+            validProp.store(new FileOutputStream(INVALIDFILE), null);
+        } catch (IOException e) {
+            throw new PolicyException(e);
+        }
+    }
+    
+    class PropertyChange {
+        public String key = null;
+        public String value = null;
+        public Boolean remove = false;
+    }
+}
diff --git a/BRMSGateway/src/test/resources/META-INF/drop.ddl b/BRMSGateway/src/test/resources/META-INF/drop.ddl
new file mode 100644
index 0000000..a46848d
--- /dev/null
+++ b/BRMSGateway/src/test/resources/META-INF/drop.ddl
@@ -0,0 +1,2 @@
+DROP TABLE IF EXISTS brmsgroup_info
+DROP TABLE IF EXISTS brmsgroup_policy
\ No newline at end of file
diff --git a/BRMSGateway/src/test/resources/META-INF/persistenceBRMStest.xml b/BRMSGateway/src/test/resources/META-INF/persistenceBRMStest.xml
new file mode 100644
index 0000000..f757aca
--- /dev/null
+++ b/BRMSGateway/src/test/resources/META-INF/persistenceBRMStest.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  PolicyEngineUtils
+  ================================================================================
+  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+  ================================================================================
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  ============LICENSE_END=========================================================
+  -->
+
+<persistence version="2.1"
+    xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
+    <persistence-unit name="BRMSGW" transaction-type="RESOURCE_LOCAL">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+        <class>org.onap.policy.brmsInterface.jpa.BRMSGroupInfo</class>
+        <class>org.onap.policy.brmsInterface.jpa.BRMSPolicyInfo</class>
+        <property name="javax.persistence.schema-generation.scripts.action"
+            value="drop-and-create" />
+        <property name="javax.persistence.schema-generation.scripts.create-target"
+            value="./src/test/resources/META-INF/generatedCreate.ddl" />
+        <property name="javax.persistence.schema-generation.scripts.drop-target"
+            value="./src/test/resources/META-INF/generatedDrop.ddl" />
+        <property name="javax.persistence.schema-generation.database.action"
+            value="drop-and-create" />
+        <property name="javax.persistence.schema-generation.create-source"
+            value="metadata-then-script" />
+        <property name="javax.persistence.schema-generation.drop-source"
+            value="script" />
+        <property name="javax.persistence.schema-generation.drop-script-source"
+            value="META-INF/drop.ddl" />
+    </persistence-unit>
+</persistence>
\ No newline at end of file
diff --git a/BRMSGateway/src/test/resources/config.properties b/BRMSGateway/src/test/resources/config.properties
new file mode 100644
index 0000000..4f9e013
--- /dev/null
+++ b/BRMSGateway/src/test/resources/config.properties
@@ -0,0 +1,86 @@
+###
+# ============LICENSE_START=======================================================
+# ONAP Policy Engine
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+# 
+#      http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+###
+
+PDP_URL2 =  https://localhost:8082/pdp/ , testpdp, alpha456
+PAP_URL = http://localhost:8070/pap/ , testpap, alpha123
+
+#Notification Properties... type can be either websocket, ueb, or dmaap
+NOTIFICATION_TYPE=websocket
+NOTIFICATION_SERVERS=
+NOTIFICATION_TOPIC=PDPD-CONFIGURATION
+NOTIFICATION_DELAY=
+UEB_API_KEY=
+UEB_API_SECRET=
+CLIENT_ID=
+CLIENT_KEY=
+
+# BRMS Properties. 
+## defaultName is the default group name to which the rule gets pushed if no artifactID is specified. 
+defaultName = default
+## repositoryID 
+repositoryID = releases
+## reposiroryName
+repositoryName = Releases
+## repositoryURL
+repositoryURL = http://nexus:8081/nexus/content/repositories/releases
+## repositoryUsername & Password
+repositoryUsername=admin
+repositoryPassword=admin123
+## policyKeyID the value of Policy Key whose value will be the group Name. 
+policyKeyID = controller
+
+## GroupNames can be comma separated values. 
+groupNames = default, vFW , vDNS
+default.groupID = org.onap.policy-engine
+default.artifactID = drlPDPGroup
+vFW.groupID= org.onap.policy-engine.drools.vFW
+vFW.artifactID= policy-vFW-rules
+vDNS.groupID= org.onap.policy-engine.drools.vDNS
+vDNS.artifactID= policy-vDNS-rules
+
+#Integrity Monitor values
+#database driver for Integrity Monitor
+javax.persistence.jdbc.driver=org.h2.Driver
+#database URL for Integrity Monitor
+javax.persistence.jdbc.url=jdbc:h2:file:./sql/xacmlTest
+#database username for Integrity Monitor
+javax.persistence.jdbc.user=sa
+#database password for Integrity Monitor
+javax.persistence.jdbc.password=
+#persistence xml
+eclipselink.persistencexml=META-INF/persistenceBRMStest.xml
+#resource name
+RESOURCE_NAME=site_1.brmsgw_1
+#***Properties for IntegrityMonitor integration defined in IntegrityMonitorProperties.java***
+site_name=site_1
+node_type=brms_gateway
+fp_monitor_interval=30
+failed_counter_threshold=3
+test_trans_interval=20
+write_fpc_interval=5
+max_fpc_update_interval=60
+test_via_jmx=false
+ping_interval=30000
+#
+#
+#
+brms.dependency.version=1.1.0-SNAPSHOT
+
+ENVIRONMENT = DEVL
diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/std/NotificationStore.java b/PolicyEngineUtils/src/main/java/org/onap/policy/std/NotificationStore.java
index 8a401c4..259a70d 100644
--- a/PolicyEngineUtils/src/main/java/org/onap/policy/std/NotificationStore.java
+++ b/PolicyEngineUtils/src/main/java/org/onap/policy/std/NotificationStore.java
@@ -181,6 +181,7 @@
 						sUPolicy.setMatches(uPolicy.getMatches());
 						sUPolicy.setPolicyName(uPolicy.getPolicyName());
 						sUPolicy.setVersionNo(uPolicy.getVersionNo());
+						sUPolicy.setUpdateType(uPolicy.getUpdateType());
 						updatedPolicies.add(sUPolicy);
 					}
 					
@@ -211,6 +212,7 @@
 							sUPolicy.setMatches(newUpdatedPolicy.getMatches());
 							sUPolicy.setPolicyName(newUpdatedPolicy.getPolicyName());
 							sUPolicy.setVersionNo(newUpdatedPolicy.getVersionNo());
+							sUPolicy.setUpdateType(newUpdatedPolicy.getUpdateType());
 							updatedPolicies.add(sUPolicy);
 						}
 					}
diff --git a/PolicyEngineUtils/src/test/java/org/onap/policy/utils/test/NotificationStoreTest.java b/PolicyEngineUtils/src/test/java/org/onap/policy/utils/test/NotificationStoreTest.java
index 8ec646a..7bae423 100644
--- a/PolicyEngineUtils/src/test/java/org/onap/policy/utils/test/NotificationStoreTest.java
+++ b/PolicyEngineUtils/src/test/java/org/onap/policy/utils/test/NotificationStoreTest.java
@@ -21,8 +21,8 @@
 package org.onap.policy.utils.test;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -35,34 +35,24 @@
 import org.onap.policy.std.StdLoadedPolicy;
 import org.onap.policy.std.StdPDPNotification;
 import org.onap.policy.std.StdRemovedPolicy;
+import org.onap.policy.utils.PolicyUtils;
 
 public class NotificationStoreTest {
     
     @Test
-    public void notificationTest(){
+    public void notificationTest() throws IOException{
+        // Notification Delta test first. 
+        NotificationStore.recordNotification(new StdPDPNotification());
+        assertEquals("{\"removedPolicies\":null,\"loadedPolicies\":null,\"notificationType\":null}", PolicyUtils.objectToJsonString(NotificationStore.getDeltaNotification(new StdPDPNotification())));
+        // Initialize test 
         StdPDPNotification notification = new StdPDPNotification();
-        notification.setNotificationType(NotificationType.UPDATE);
+        notification.setNotificationType(NotificationType.BOTH);
         List<StdLoadedPolicy> loadedPolicies = new ArrayList<>();
         StdLoadedPolicy loadedPolicy = new StdLoadedPolicy();
         loadedPolicy.setPolicyName("com.testing");
-        loadedPolicy.setUpdateType(UpdateType.NEW);
-        loadedPolicy.setVersionNo("1");
-        Map<String, String> matches = new HashMap<>();
-        matches.put("test", "test");
-        loadedPolicy.setMatches(matches);
-        loadedPolicies.add(loadedPolicy);
-        notification.setLoadedPolicies(loadedPolicies);
-        NotificationStore.recordNotification(notification);
-        assertEquals(notification, NotificationStore.getNotificationRecord());
-        // Add new Notifications. 
-        notification = new StdPDPNotification();
-        notification.setNotificationType(NotificationType.BOTH);
-        loadedPolicies = new ArrayList<>();
-        loadedPolicy = new StdLoadedPolicy();
-        loadedPolicy.setPolicyName("com.testing");
         loadedPolicy.setUpdateType(UpdateType.UPDATE);
         loadedPolicy.setVersionNo("2");
-        matches = new HashMap<>();
+        Map<String, String> matches = new HashMap<>();
         matches.put("test", "test");
         loadedPolicy.setMatches(matches);
         loadedPolicies.add(loadedPolicy);
@@ -71,17 +61,18 @@
         StdRemovedPolicy removedPolicy = new StdRemovedPolicy();
         removedPolicy.setPolicyName("com.testing");
         removedPolicy.setVersionNo("1");
+        removedPolicies.add(removedPolicy);
         notification.setRemovedPolicies(removedPolicies);
         NotificationStore.recordNotification(notification);
-        assertNotNull(NotificationStore.getNotificationRecord());
+        assertEquals("{\"removedPolicies\":[{\"policyName\":\"com.testing\",\"versionNo\":\"1\"}],\"loadedPolicies\":[{\"policyName\":\"com.testing\",\"versionNo\":\"2\",\"matches\":{\"test\":\"test\"},\"updateType\":\"UPDATE\"}],\"notificationType\":\"BOTH\"}", PolicyUtils.objectToJsonString(NotificationStore.getNotificationRecord()));
         // Add new Notifications. 
         notification = new StdPDPNotification();
         notification.setNotificationType(NotificationType.BOTH);
         loadedPolicies = new ArrayList<>();
         loadedPolicy = new StdLoadedPolicy();
-        loadedPolicy.setPolicyName("com.test.xml");
+        loadedPolicy.setPolicyName("com.test.3.xml");
         loadedPolicy.setUpdateType(UpdateType.NEW);
-        loadedPolicy.setVersionNo("2");
+        loadedPolicy.setVersionNo("3");
         matches = new HashMap<>();
         matches.put("test", "test");
         loadedPolicy.setMatches(matches);
@@ -89,11 +80,92 @@
         notification.setLoadedPolicies(loadedPolicies);
         removedPolicies = new ArrayList<>();
         removedPolicy = new StdRemovedPolicy();
-        removedPolicy.setPolicyName("com.testing.xml");
+        removedPolicy.setPolicyName("com.testing.2.xml");
         removedPolicy.setVersionNo("2");
+        removedPolicies.add(removedPolicy);
         notification.setRemovedPolicies(removedPolicies);
         NotificationStore.recordNotification(notification);
-        assertNotNull(NotificationStore.getNotificationRecord());
+        StdPDPNotification check = NotificationStore.getDeltaNotification(PolicyUtils.jsonStringToObject("{\"removedPolicies\":[{\"policyName\":\"com.testing\",\"versionNo\":\"1\"},{\"policyName\":\"com.testing\",\"versionNo\":\"2\"}],\"loadedPolicies\":[{\"policyName\":\"com.test\",\"versionNo\":\"3\",\"matches\":{\"test\":\"test\"},\"updateType\":\"NEW\"}],\"notificationType\":\"BOTH\"}", StdPDPNotification.class));
+        assertEquals("{\"removedPolicies\":[],\"loadedPolicies\":[],\"notificationType\":null}", PolicyUtils.objectToJsonString(check));
+        // Remove Notifications. 
+        notification = new StdPDPNotification();
+        notification.setNotificationType(NotificationType.REMOVE);
+        removedPolicies = new ArrayList<>();
+        removedPolicy = new StdRemovedPolicy();
+        removedPolicy.setPolicyName("com.test.3.xml");
+        removedPolicy.setVersionNo("3");
+        removedPolicies.add(removedPolicy);
+        notification.setRemovedPolicies(removedPolicies);
+        NotificationStore.recordNotification(notification);
+        check = NotificationStore.getDeltaNotification(PolicyUtils.jsonStringToObject("{\"removedPolicies\":[{\"policyName\":\"com.test\",\"versionNo\":\"3\"},{\"policyName\":\"com.testing\",\"versionNo\":\"1\"},{\"policyName\":\"com.testing\",\"versionNo\":\"2\"}],\"loadedPolicies\":[],\"notificationType\":\"REMOVE\"}", StdPDPNotification.class));
+        assertEquals("{\"removedPolicies\":[],\"loadedPolicies\":[],\"notificationType\":null}", PolicyUtils.objectToJsonString(check));
+        // Remove on remove duplicate  Notifications. 
+        notification = new StdPDPNotification();
+        notification.setNotificationType(NotificationType.REMOVE);
+        removedPolicies = new ArrayList<>();
+        removedPolicy = new StdRemovedPolicy();
+        removedPolicy.setPolicyName("com.test.3.xml");
+        removedPolicy.setVersionNo("3");
+        removedPolicies.add(removedPolicy);
+        notification.setRemovedPolicies(removedPolicies);
+        NotificationStore.recordNotification(notification);
+        check = NotificationStore.getDeltaNotification(PolicyUtils.jsonStringToObject("{\"removedPolicies\":[{\"policyName\":\"com.test\",\"versionNo\":\"3\"},{\"policyName\":\"com.testing\",\"versionNo\":\"1\"},{\"policyName\":\"com.testing\",\"versionNo\":\"2\"}],\"loadedPolicies\":[],\"notificationType\":\"REMOVE\"}", StdPDPNotification.class));
+        assertEquals("{\"removedPolicies\":[],\"loadedPolicies\":[],\"notificationType\":null}", PolicyUtils.objectToJsonString(check));
+        // Update  Notification 
+        notification = new StdPDPNotification();
+        notification.setNotificationType(NotificationType.UPDATE);
+        loadedPolicies = new ArrayList<>();
+        loadedPolicy = new StdLoadedPolicy();
+        loadedPolicy.setPolicyName("com.test.3.xml");
+        loadedPolicy.setUpdateType(UpdateType.NEW);
+        loadedPolicy.setVersionNo("3");
+        matches = new HashMap<>();
+        matches.put("test", "test");
+        loadedPolicy.setMatches(matches);
+        loadedPolicies.add(loadedPolicy);
+        notification.setLoadedPolicies(loadedPolicies);
+        NotificationStore.recordNotification(notification);
+        check = NotificationStore.getDeltaNotification(PolicyUtils.jsonStringToObject("{\"removedPolicies\":[{\"policyName\":\"com.testing\",\"versionNo\":\"1\"},{\"policyName\":\"com.testing\",\"versionNo\":\"2\"}],\"loadedPolicies\":[{\"policyName\":\"com.test\",\"versionNo\":\"3\",\"matches\":{\"test\":\"test\"},\"updateType\":\"NEW\"}],\"notificationType\":\"BOTH\"}", StdPDPNotification.class));
+        assertEquals("{\"removedPolicies\":[],\"loadedPolicies\":[],\"notificationType\":null}", PolicyUtils.objectToJsonString(check));
+        // Update  on update duplicate Notification 
+        notification = new StdPDPNotification();
+        notification.setNotificationType(NotificationType.UPDATE);
+        loadedPolicies = new ArrayList<>();
+        loadedPolicy = new StdLoadedPolicy();
+        loadedPolicy.setPolicyName("com.test.3.xml");
+        loadedPolicy.setUpdateType(UpdateType.NEW);
+        loadedPolicy.setVersionNo("3");
+        matches = new HashMap<>();
+        matches.put("test", "test");
+        loadedPolicy.setMatches(matches);
+        loadedPolicies.add(loadedPolicy);
+        notification.setLoadedPolicies(loadedPolicies);
+        NotificationStore.recordNotification(notification);
+        check = NotificationStore.getDeltaNotification(PolicyUtils.jsonStringToObject("{\"removedPolicies\":[{\"policyName\":\"com.testing\",\"versionNo\":\"1\"},{\"policyName\":\"com.testing\",\"versionNo\":\"2\"}],\"loadedPolicies\":[{\"policyName\":\"com.test\",\"versionNo\":\"3\",\"matches\":{\"test\":\"test\"},\"updateType\":\"NEW\"}],\"notificationType\":\"BOTH\"}", StdPDPNotification.class));
+        assertEquals("{\"removedPolicies\":[],\"loadedPolicies\":[],\"notificationType\":null}", PolicyUtils.objectToJsonString(check));
+        // 
+        // Notification Delta Tests
+        //
+        notification = new StdPDPNotification();
+        notification.setNotificationType(NotificationType.BOTH);
+        loadedPolicies = new ArrayList<>();
+        loadedPolicy = new StdLoadedPolicy();
+        loadedPolicy.setPolicyName("com.testing");
+        loadedPolicy.setUpdateType(UpdateType.NEW);
+        loadedPolicy.setVersionNo("3");
+        matches = new HashMap<>();
+        matches.put("test", "test");
+        loadedPolicy.setMatches(matches);
+        loadedPolicies.add(loadedPolicy);
+        notification.setLoadedPolicies(loadedPolicies);
+        removedPolicies = new ArrayList<>();
+        removedPolicy = new StdRemovedPolicy();
+        removedPolicy.setPolicyName("com.test.3.xml");
+        removedPolicy.setVersionNo("3");
+        removedPolicies.add(removedPolicy);
+        notification.setRemovedPolicies(removedPolicies);
+        check = NotificationStore.getDeltaNotification(notification);
+        assertEquals("{\"removedPolicies\":[{\"policyName\":\"com.test\",\"versionNo\":\"3\"}],\"loadedPolicies\":[{\"policyName\":\"com.testing\",\"versionNo\":\"3\",\"matches\":{\"test\":\"test\"},\"updateType\":\"NEW\"}],\"notificationType\":\"BOTH\"}", PolicyUtils.objectToJsonString(check));
     }
 
 }