Fix the algorithm for device trust level
[cps.git] / cps-ncmp-service / src / test / groovy / org / onap / cps / ncmp / api / impl / trustlevel / TrustLevelManagerSpec.groovy
index b3559e4..886648a 100644 (file)
 package org.onap.cps.ncmp.api.impl.trustlevel
 
 import org.onap.cps.ncmp.api.impl.events.avc.ncmptoclient.AvcEventPublisher
+import org.onap.cps.ncmp.api.impl.inventory.InventoryPersistence
+import org.onap.cps.ncmp.api.impl.yangmodels.YangModelCmHandle
 import spock.lang.Specification
 
 class TrustLevelManagerSpec extends Specification {
 
     def trustLevelPerCmHandle = [:]
+    def trustLevelPerDmiPlugin = [:]
+
+    def mockInventoryPersistence = Mock(InventoryPersistence)
     def mockAttributeValueChangeEventPublisher = Mock(AvcEventPublisher)
-    def objectUnderTest = new TrustLevelManager(trustLevelPerCmHandle, mockAttributeValueChangeEventPublisher)
+    def objectUnderTest = new TrustLevelManager(trustLevelPerCmHandle, trustLevelPerDmiPlugin, mockInventoryPersistence, mockAttributeValueChangeEventPublisher)
 
     def 'Initial cm handle registration'() {
         given: 'two cm handles: one with no trust level and one trusted'
@@ -50,24 +55,73 @@ class TrustLevelManagerSpec extends Specification {
             1 * mockAttributeValueChangeEventPublisher.publishAvcEvent(*_)
     }
 
-    def 'Trust level updated'() {
-        given: 'a not trusted cm handle'
-            trustLevelPerCmHandle.put('ch-1', TrustLevel.NONE)
+    def 'Dmi trust level updated'() {
+        given: 'a trusted dmi plugin'
+            trustLevelPerDmiPlugin.put('my-dmi', TrustLevel.COMPLETE)
+        and: 'a trusted cm handle'
+            trustLevelPerCmHandle.put('ch-1', TrustLevel.COMPLETE)
         when: 'the update is handled'
-            objectUnderTest.handleUpdateOfTrustLevels('ch-1', 'COMPLETE')
+            objectUnderTest.handleUpdateOfDmiTrustLevel('my-dmi', ['ch-1'], TrustLevel.NONE)
         then: 'notification is sent'
-            1 * mockAttributeValueChangeEventPublisher.publishAvcEvent('ch-1', 'trustLevel', 'NONE', 'COMPLETE')
-        and: 'the cm handle in the cache is trusted'
-            assert trustLevelPerCmHandle.get('ch-1') == TrustLevel.COMPLETE
+            1 * mockAttributeValueChangeEventPublisher.publishAvcEvent('ch-1', 'trustLevel', 'COMPLETE', 'NONE')
+        and: 'the dmi in the cache is not trusted'
+            assert trustLevelPerDmiPlugin.get('my-dmi') == TrustLevel.NONE
     }
 
-    def 'Trust level updated with same value'() {
-        given: 'a trusted cm handle'
+    def 'Dmi trust level updated with same value'() {
+        given: 'a trusted dmi plugin'
+            trustLevelPerDmiPlugin.put('my-dmi', TrustLevel.COMPLETE)
+        and: 'a trusted cm handle'
             trustLevelPerCmHandle.put('ch-1', TrustLevel.COMPLETE)
         when: 'the update is handled'
-            objectUnderTest.handleUpdateOfTrustLevels('ch-1', 'COMPLETE')
+            objectUnderTest.handleUpdateOfDmiTrustLevel('my-dmi', ['ch-1'], TrustLevel.COMPLETE)
         then: 'no notification is sent'
             0 * mockAttributeValueChangeEventPublisher.publishAvcEvent(*_)
+        and: 'the dmi in the cache is trusted'
+            assert trustLevelPerDmiPlugin.get('my-dmi') == TrustLevel.COMPLETE
+    }
+
+    def 'Device trust level updated'() {
+        given: 'a non trusted cm handle'
+            trustLevelPerCmHandle.put('ch-1', TrustLevel.NONE)
+        and: 'a trusted dmi plugin'
+            trustLevelPerDmiPlugin.put('my-dmi', TrustLevel.COMPLETE)
+        and: 'inventory persistence service returns yang model cm handle'
+            mockInventoryPersistence.getYangModelCmHandle('ch-1') >> new YangModelCmHandle(id: 'ch-1', dmiDataServiceName: 'my-dmi')
+        when: 'update of device to COMPLETE trust level handled'
+            objectUnderTest.handleUpdateOfDeviceTrustLevel('ch-1', TrustLevel.COMPLETE)
+        then: 'the cm handle in the cache is trusted'
+            assert trustLevelPerCmHandle.get('ch-1', TrustLevel.COMPLETE)
+        and: 'notification is sent'
+            1 * mockAttributeValueChangeEventPublisher.publishAvcEvent('ch-1', 'trustLevel', 'NONE', 'COMPLETE')
+    }
+
+    def 'Device trust level updated with same value'() {
+        given: 'a non trusted cm handle'
+            trustLevelPerCmHandle.put('ch-1', TrustLevel.NONE)
+        and: 'a trusted dmi plugin'
+            trustLevelPerDmiPlugin.put('my-dmi', TrustLevel.COMPLETE)
+        and: 'inventory persistence service returns yang model cm handle'
+            mockInventoryPersistence.getYangModelCmHandle('ch-1') >> new YangModelCmHandle(id: 'ch-1', dmiDataServiceName: 'my-dmi')
+        when: 'update of device trust to the same level (NONE)'
+            objectUnderTest.handleUpdateOfDeviceTrustLevel('ch-1', TrustLevel.NONE)
+        then: 'the cm handle in the cache is not trusted'
+            assert trustLevelPerCmHandle.get('ch-1', TrustLevel.NONE)
+        and: 'no notification is sent'
+            0 * mockAttributeValueChangeEventPublisher.publishAvcEvent(*_)
+    }
+
+    def 'Dmi trust level restored to complete with non trusted device'() {
+        given: 'a non trusted dmi'
+            trustLevelPerDmiPlugin.put('my-dmi', TrustLevel.NONE)
+        and: 'a non trusted device'
+            trustLevelPerCmHandle.put('ch-1', TrustLevel.NONE)
+        when: 'restore the dmi trust level to COMPLETE'
+            objectUnderTest.handleUpdateOfDmiTrustLevel('my-dmi', ['ch-1'], TrustLevel.COMPLETE)
+        then: 'the cm handle in the cache is still NONE'
+            assert trustLevelPerCmHandle.get('ch-1') == TrustLevel.NONE
+        and: 'no notification is sent'
+            0 * mockAttributeValueChangeEventPublisher.publishAvcEvent(*_)
     }
 
 }