From 73f14b607460ddae6416b7e0fb8854c2ab4f316e Mon Sep 17 00:00:00 2001 From: Jim Hahn Date: Wed, 13 Jan 2021 10:40:01 -0500 Subject: Add notification tracking classes When PAP is made stateless, a new mechanism will be needed to track and generate notifications. Added some classes to facilitate that. Issue-ID: POLICY-2648 Change-Id: Ib7b707f68a557e7b306dfdd1c6e6e9abd4671ec1 Signed-off-by: Jim Hahn --- .../main/notification/DeploymentTrackerTest.java | 273 +++++++++++++++++++++ .../pap/main/notification/StatusActionTest.java | 55 +++++ .../pap/main/notification/StatusKeyTest.java | 43 ++++ 3 files changed, 371 insertions(+) create mode 100644 main/src/test/java/org/onap/policy/pap/main/notification/DeploymentTrackerTest.java create mode 100644 main/src/test/java/org/onap/policy/pap/main/notification/StatusActionTest.java create mode 100644 main/src/test/java/org/onap/policy/pap/main/notification/StatusKeyTest.java (limited to 'main/src/test') diff --git a/main/src/test/java/org/onap/policy/pap/main/notification/DeploymentTrackerTest.java b/main/src/test/java/org/onap/policy/pap/main/notification/DeploymentTrackerTest.java new file mode 100644 index 00000000..22eb8786 --- /dev/null +++ b/main/src/test/java/org/onap/policy/pap/main/notification/DeploymentTrackerTest.java @@ -0,0 +1,273 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2021 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.policy.pap.main.notification; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import org.junit.Before; +import org.junit.Test; +import org.onap.policy.models.pap.concepts.PolicyNotification; +import org.onap.policy.models.pap.concepts.PolicyStatus; +import org.onap.policy.models.pdp.concepts.PdpPolicyStatus; +import org.onap.policy.models.pdp.concepts.PdpPolicyStatus.PdpPolicyStatusBuilder; +import org.onap.policy.models.pdp.concepts.PdpPolicyStatus.State; +import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; + +public class DeploymentTrackerTest { + private static final String VERSION = "1.2.3"; + private static final String MY_GROUP = "MyGroup"; + private static final String MY_PDP_TYPE = "MyPdpType"; + private static final ToscaConceptIdentifier POLICY_A = new ToscaConceptIdentifier("PolicyA", VERSION); + private static final ToscaConceptIdentifier POLICY_B = new ToscaConceptIdentifier("PolicyB", VERSION); + private static final ToscaConceptIdentifier POLICY_TYPE = new ToscaConceptIdentifier("MyPolicyType", VERSION); + private static final String PDP_A = "pdpA"; + private static final String PDP_B = "pdpB"; + + private DeploymentTracker tracker; + private PdpPolicyStatusBuilder builder; + + /** + * Sets up test objects. + */ + @Before + public void setUp() { + tracker = new DeploymentTracker(); + builder = PdpPolicyStatus.builder().deploy(true).state(State.SUCCESS).pdpGroup(MY_GROUP).pdpType(MY_PDP_TYPE) + .policy(POLICY_A).policyType(POLICY_TYPE).pdpId(PDP_A); + } + + @Test + public void testGetDeploymentStatus() { + assertThat(tracker.getDeploymentStatus()).isEmpty(); + + tracker.add(builder.build()); + tracker.add(builder.policy(POLICY_B).build()); + assertThat(tracker.getDeploymentStatus()).hasSize(2); + + assertThat(tracker.getUndeploymentStatus()).isEmpty(); + } + + @Test + public void testGetUndeploymentStatus() { + builder.deploy(false); + + assertThat(tracker.getUndeploymentStatus()).isEmpty(); + + tracker.add(builder.build()); + tracker.add(builder.policy(POLICY_B).build()); + assertThat(tracker.getUndeploymentStatus()).hasSize(2); + + assertThat(tracker.getDeploymentStatus()).isEmpty(); + } + + @Test + public void testAddNotifications() { + DeploymentTracker newTracker = new DeploymentTracker(); + + newTracker.add(builder.build()); + newTracker.add(builder.policy(POLICY_B).deploy(false).build()); + + PolicyNotification notif = new PolicyNotification(); + tracker.addNotifications(notif, newTracker); + + assertThat(notif.getAdded()).hasSize(1); + assertThat(notif.getAdded().get(0).getPolicy()).isEqualTo(POLICY_A); + + assertThat(notif.getDeleted()).hasSize(1); + assertThat(notif.getDeleted().get(0).getPolicy()).isEqualTo(POLICY_B); + } + + @Test + public void testMerge() { + DeploymentTracker newTracker = new DeploymentTracker(); + + // appears in both + tracker.add(builder.build()); + newTracker.add(builder.build()); + + // only appears in the new tracker + newTracker.add(builder.policy(POLICY_B).build()); + + PolicyNotification notif = new PolicyNotification(); + tracker.addNotifications(notif, newTracker); + + assertThat(notif.getDeleted()).isEmpty(); + + // only policy B should appear + assertThat(notif.getAdded()).hasSize(1); + assertThat(notif.getAdded().get(0).getPolicy()).isEqualTo(POLICY_B); + } + + @Test + public void testNeedNotification() { + final PolicyStatus oldStat = new PolicyStatus(); + final PolicyStatus newStat = new PolicyStatus(); + + // new, complete policy - notify + assertThat(tracker.needNotification(null, newStat)).isTrue(); + + // new, incomplete policy - don't notify + newStat.setIncompleteCount(1); + assertThat(tracker.needNotification(null, newStat)).isFalse(); + newStat.setIncompleteCount(0); + + // unchanged - don't notify + assertThat(tracker.needNotification(oldStat, newStat)).isFalse(); + + // was incomplete, now complete - notify + oldStat.setIncompleteCount(1); + assertThat(tracker.needNotification(oldStat, newStat)).isTrue(); + oldStat.setIncompleteCount(0); + + // was failed, now ok - notify + oldStat.setFailureCount(1); + assertThat(tracker.needNotification(oldStat, newStat)).isTrue(); + oldStat.setFailureCount(0); + + // was failed & incomplete, now complete - notify + oldStat.setIncompleteCount(1); + oldStat.setFailureCount(1); + assertThat(tracker.needNotification(oldStat, newStat)).isTrue(); + oldStat.setIncompleteCount(0); + oldStat.setFailureCount(0); + + // was complete, now incomplete - notify + newStat.setIncompleteCount(1); + assertThat(tracker.needNotification(oldStat, newStat)).isTrue(); + newStat.setIncompleteCount(0); + + // was incomplete, still incomplete - don't notify + newStat.setIncompleteCount(1); + oldStat.setIncompleteCount(1); + assertThat(tracker.needNotification(oldStat, newStat)).isFalse(); + newStat.setIncompleteCount(0); + oldStat.setIncompleteCount(0); + } + + @Test + public void testAddMissing() { + DeploymentTracker newTracker = new DeploymentTracker(); + + // appears in both, not waiting + tracker.add(builder.build()); + newTracker.add(builder.build()); + + // appears only in the tracker, not waiting + tracker.add(builder.policy(POLICY_B).build()); + + // appears in both, waiting + tracker.add(builder.policy(new ToscaConceptIdentifier("PolicyX", VERSION)).state(State.WAITING).build()); + newTracker.add(builder.build()); + + // appears only in the tracker, waiting + tracker.add(builder.policy(new ToscaConceptIdentifier("PolicyY", VERSION)).state(State.WAITING).build()); + + // now extract the notifications + PolicyNotification notif = new PolicyNotification(); + tracker.addNotifications(notif, newTracker); + + assertThat(notif.getDeleted()).isEmpty(); + + // only policy B should appear + assertThat(notif.getAdded()).hasSize(1); + assertThat(notif.getAdded().get(0).getPolicy()).isEqualTo(POLICY_B); + } + + @Test + public void testAddStatusAction() { + tracker.add(new StatusAction(StatusAction.Action.DELETED, builder.build())); + assertThat(tracker.getDeploymentStatus()).isEmpty(); + + tracker.add(new StatusAction(StatusAction.Action.UNCHANGED, builder.build())); + tracker.add(new StatusAction(StatusAction.Action.CREATED, builder.build())); + tracker.add(new StatusAction(StatusAction.Action.UPDATED, builder.build())); + + Collection result = tracker.getDeploymentStatus(); + assertThat(result).hasSize(1); + PolicyStatus status = result.iterator().next(); + assertThat(status.getSuccessCount()).isEqualTo(3); + } + + @Test + public void testAddPdpPolicyStatus() { + tracker.add(builder.build()); + Collection result = tracker.getDeploymentStatus(); + assertThat(result).hasSize(1); + PolicyStatus status = result.iterator().next(); + + assertThat(status.getFailureCount()).isZero(); + assertThat(status.getIncompleteCount()).isZero(); + assertThat(status.getSuccessCount()).isEqualTo(1); + assertThat(status.getPolicy()).isEqualTo(POLICY_A); + assertThat(status.getPolicyType()).isEqualTo(POLICY_TYPE); + + // add another, failed + tracker.add(builder.pdpId(PDP_B).state(State.FAILURE).build()); + result = tracker.getDeploymentStatus(); + assertThat(result).hasSize(1); + status = result.iterator().next(); + + assertThat(status.getFailureCount()).isEqualTo(1); + assertThat(status.getIncompleteCount()).isZero(); + assertThat(status.getSuccessCount()).isEqualTo(1); + + // add another, waiting + tracker.add(builder.pdpId(PDP_A).state(State.WAITING).build()); + result = tracker.getDeploymentStatus(); + assertThat(result).hasSize(1); + status = result.iterator().next(); + + assertThat(status.getFailureCount()).isEqualTo(1); + assertThat(status.getIncompleteCount()).isEqualTo(1); + assertThat(status.getSuccessCount()).isEqualTo(1); + + // different policy + tracker.add(builder.policy(POLICY_B).pdpId(PDP_A).state(State.WAITING).build()); + result = tracker.getDeploymentStatus(); + assertThat(result).hasSize(2); + + List list = new ArrayList<>(result); + Collections.sort(list, (rec1, rec2) -> rec1.getPolicy().compareTo(rec2.getPolicy())); + Iterator iter = list.iterator(); + + status = iter.next(); + assertThat(status.getPolicy()).isEqualTo(POLICY_A); + assertThat(status.getFailureCount()).isEqualTo(1); + assertThat(status.getIncompleteCount()).isEqualTo(1); + assertThat(status.getSuccessCount()).isEqualTo(1); + + status = iter.next(); + assertThat(status.getPolicy()).isEqualTo(POLICY_B); + assertThat(status.getFailureCount()).isZero(); + assertThat(status.getIncompleteCount()).isEqualTo(1); + assertThat(status.getSuccessCount()).isZero(); + + // add undeployment record + tracker.add(builder.deploy(false).build()); + assertThat(tracker.getDeploymentStatus()).hasSize(2); + assertThat(tracker.getUndeploymentStatus()).hasSize(1); + } +} diff --git a/main/src/test/java/org/onap/policy/pap/main/notification/StatusActionTest.java b/main/src/test/java/org/onap/policy/pap/main/notification/StatusActionTest.java new file mode 100644 index 00000000..3303a9b2 --- /dev/null +++ b/main/src/test/java/org/onap/policy/pap/main/notification/StatusActionTest.java @@ -0,0 +1,55 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2021 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.policy.pap.main.notification; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; + +/** + * Only test the methods that are not generated by lombok. + */ +public class StatusActionTest { + + @Test + public void testSetChanged() { + StatusAction status = new StatusAction(StatusAction.Action.UNCHANGED, null); + + // new records should always remain new - action should not change + status.setAction(StatusAction.Action.CREATED); + status.setChanged(); + assertThat(status.getAction()).isEqualTo(StatusAction.Action.CREATED); + + // all other actions should change + + status.setAction(StatusAction.Action.UNCHANGED); + status.setChanged(); + assertThat(status.getAction()).isEqualTo(StatusAction.Action.UPDATED); + + status.setAction(StatusAction.Action.DELETED); + status.setChanged(); + assertThat(status.getAction()).isEqualTo(StatusAction.Action.UPDATED); + + status.setAction(StatusAction.Action.UPDATED); + status.setChanged(); + assertThat(status.getAction()).isEqualTo(StatusAction.Action.UPDATED); + } +} diff --git a/main/src/test/java/org/onap/policy/pap/main/notification/StatusKeyTest.java b/main/src/test/java/org/onap/policy/pap/main/notification/StatusKeyTest.java new file mode 100644 index 00000000..558c6bc2 --- /dev/null +++ b/main/src/test/java/org/onap/policy/pap/main/notification/StatusKeyTest.java @@ -0,0 +1,43 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2021 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.policy.pap.main.notification; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; +import org.onap.policy.models.pdp.concepts.PdpPolicyStatus; +import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; + +/** + * Only test the methods that are not generated by lombok. + */ +public class StatusKeyTest { + + @Test + public void testStatusKeyPdpPolicyStatus() { + ToscaConceptIdentifier myPolicy = new ToscaConceptIdentifier(); + + StatusKey key = new StatusKey(PdpPolicyStatus.builder().pdpId("myPdp").policy(myPolicy).build()); + + assertThat(key.getPdpId()).isEqualTo("myPdp"); + assertThat(key.getPolicy()).isSameAs(myPolicy); + } +} -- cgit 1.2.3-korg