From f76d2083c9440bac3ac866b30b52a3abedb9292c Mon Sep 17 00:00:00 2001 From: Jim Hahn Date: Wed, 23 Jun 2021 16:27:20 -0400 Subject: Send pdp-update if PDP response doesn't match DB Because multiple PAPs can be updating the DB, it's possible that a pdp-update sent by a PAP does not reflect the latest deployment data in the DB. To solve that problem, modified code to compare any response received from a PDP with what's in the DB, potentially generating a new pdp-update (and/or pdp-state-change). Issue-ID: POLICY-3426 Change-Id: I241994330d7645c0fffe66abc33de67d71d77250 Signed-off-by: Jim Hahn --- .../pap/main/comm/PdpModifyRequestMapTest.java | 22 ++++- .../pap/main/comm/PdpStatusMessageHandlerTest.java | 101 +++++++++++++++++++++ .../pap/main/comm/msgdata/RequestImplTest.java | 16 ++-- 3 files changed, 127 insertions(+), 12 deletions(-) create mode 100644 main/src/test/java/org/onap/policy/pap/main/comm/PdpStatusMessageHandlerTest.java (limited to 'main/src/test/java') diff --git a/main/src/test/java/org/onap/policy/pap/main/comm/PdpModifyRequestMapTest.java b/main/src/test/java/org/onap/policy/pap/main/comm/PdpModifyRequestMapTest.java index 0e9be09f..fd5ff86e 100644 --- a/main/src/test/java/org/onap/policy/pap/main/comm/PdpModifyRequestMapTest.java +++ b/main/src/test/java/org/onap/policy/pap/main/comm/PdpModifyRequestMapTest.java @@ -101,6 +101,9 @@ public class PdpModifyRequestMapTest extends CommonRequestBase { @Mock private PolicyUndeployer undeployer; + @Mock + private PdpStatusMessageHandler responseHandler; + private MyMap map; private PdpUpdate update; private PdpStateChange change; @@ -149,9 +152,10 @@ public class PdpModifyRequestMapTest extends CommonRequestBase { assertFalse(map.isEmpty()); // indicate success - getListener(getSingletons(1).get(0)).success(PDP1); + getListener(getSingletons(1).get(0)).success(PDP1, response); assertTrue(map.isEmpty()); + verify(responseHandler, never()).handlePdpStatus(response); } @Test @@ -325,7 +329,9 @@ public class PdpModifyRequestMapTest extends CommonRequestBase { map.addRequest(change); // indicate success - getListener(getSingletons(1).get(0)).success(PDP1); + getListener(getSingletons(1).get(0)).success(PDP1, response); + + verify(responseHandler, never()).handlePdpStatus(response); /* * the above should have removed the requests so next time should allocate a new @@ -344,7 +350,10 @@ public class PdpModifyRequestMapTest extends CommonRequestBase { // indicate success with the update when(requests.startNextRequest(updateReq)).thenReturn(true); - getListener(updateReq).success(PDP1); + getListener(updateReq).success(PDP1, response); + + // should be called for the update + verify(responseHandler).handlePdpStatus(response); // should have started the next request verify(requests).startNextRequest(updateReq); @@ -654,7 +663,7 @@ public class PdpModifyRequestMapTest extends CommonRequestBase { * @param count expected number of requests */ private void invokeSuccessHandler(int count) { - getListener(getSingletons(count).get(0)).success(PDP1); + getListener(getSingletons(count).get(0)).success(PDP1, response); } /** @@ -764,5 +773,10 @@ public class PdpModifyRequestMapTest extends CommonRequestBase { ++nalloc; return requests; } + + @Override + protected PdpStatusMessageHandler makePdpResponseHandler() { + return responseHandler; + } } } diff --git a/main/src/test/java/org/onap/policy/pap/main/comm/PdpStatusMessageHandlerTest.java b/main/src/test/java/org/onap/policy/pap/main/comm/PdpStatusMessageHandlerTest.java new file mode 100644 index 00000000..5129bf5f --- /dev/null +++ b/main/src/test/java/org/onap/policy/pap/main/comm/PdpStatusMessageHandlerTest.java @@ -0,0 +1,101 @@ +/*- + * ============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.comm; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.sql.SQLIntegrityConstraintViolationException; +import org.eclipse.persistence.exceptions.EclipseLinkException; +import org.junit.Test; + +public class PdpStatusMessageHandlerTest { + + @Test + public void testIsDuplicateKeyException() { + + // @formatter:off + + // null exception + assertThat(PdpStatusMessageHandler.isDuplicateKeyException(null)).isFalse(); + + // plain exception + assertThat(PdpStatusMessageHandler.isDuplicateKeyException( + new Exception())) + .isFalse(); + + // cause is also plain + assertThat(PdpStatusMessageHandler.isDuplicateKeyException( + new Exception( + new Exception()))) + .isFalse(); + + // dup key + assertThat(PdpStatusMessageHandler.isDuplicateKeyException( + new SQLIntegrityConstraintViolationException())) + .isTrue(); + + // cause is dup key + assertThat(PdpStatusMessageHandler.isDuplicateKeyException( + new Exception( + new SQLIntegrityConstraintViolationException()))) + .isTrue(); + + // eclipselink exception, no internal exception + assertThat(PdpStatusMessageHandler.isDuplicateKeyException( + new MyEclipseLinkException())) + .isFalse(); + + // eclipselink exception, cause is plain + assertThat(PdpStatusMessageHandler.isDuplicateKeyException( + new MyEclipseLinkException( + new Exception()))) + .isFalse(); + + // eclipselink exception, cause is dup + assertThat(PdpStatusMessageHandler.isDuplicateKeyException( + new MyEclipseLinkException( + new SQLIntegrityConstraintViolationException()))) + .isTrue(); + + // multiple cause both inside and outside of the eclipselink exception + assertThat(PdpStatusMessageHandler.isDuplicateKeyException( + new Exception( + new Exception( + new MyEclipseLinkException( + new Exception( + new SQLIntegrityConstraintViolationException())))))) + .isTrue(); + + // @formatter:on + } + + public static class MyEclipseLinkException extends EclipseLinkException { + private static final long serialVersionUID = 1L; + + public MyEclipseLinkException() { + // do nothing + } + + public MyEclipseLinkException(Exception exception) { + setInternalException(exception); + } + } +} diff --git a/main/src/test/java/org/onap/policy/pap/main/comm/msgdata/RequestImplTest.java b/main/src/test/java/org/onap/policy/pap/main/comm/msgdata/RequestImplTest.java index abce7eb3..dd635627 100644 --- a/main/src/test/java/org/onap/policy/pap/main/comm/msgdata/RequestImplTest.java +++ b/main/src/test/java/org/onap/policy/pap/main/comm/msgdata/RequestImplTest.java @@ -292,7 +292,7 @@ public class RequestImplTest extends CommonRequestBase { invokeProcessResponse(response); - verify(listener).success(PDP1); + verify(listener).success(PDP1, response); verify(listener, never()).failure(any(), any()); verify(timer).cancel(); } @@ -305,7 +305,7 @@ public class RequestImplTest extends CommonRequestBase { invokeProcessResponse(response); - verify(listener, never()).success(any()); + verify(listener, never()).success(any(), any()); verify(listener, never()).failure(any(), any()); } @@ -317,7 +317,7 @@ public class RequestImplTest extends CommonRequestBase { invokeProcessResponse(response); - verify(listener, never()).success(any()); + verify(listener, never()).success(any(), any()); verify(listener, never()).failure(any(), any()); verify(timer, never()).cancel(); } @@ -330,7 +330,7 @@ public class RequestImplTest extends CommonRequestBase { invokeProcessResponse(response); - verify(listener, never()).success(any()); + verify(listener, never()).success(any(), any()); verify(listener).failure(DIFFERENT, "PDP name does not match"); verify(timer).cancel(); } @@ -390,7 +390,7 @@ public class RequestImplTest extends CommonRequestBase { invokeProcessResponse(response); - verify(listener).success(PDP1); + verify(listener).success(PDP1, response); verify(listener, never()).failure(any(), any()); } @@ -402,7 +402,7 @@ public class RequestImplTest extends CommonRequestBase { invokeProcessResponse(response); - verify(listener, never()).success(any()); + verify(listener, never()).success(any(), any()); verify(listener).failure(null, "null PDP name"); } @@ -414,7 +414,7 @@ public class RequestImplTest extends CommonRequestBase { invokeProcessResponse(response); - verify(listener, never()).success(any()); + verify(listener, never()).success(any(), any()); verify(listener).failure(DIFFERENT, "PDP name does not match"); } @@ -427,7 +427,7 @@ public class RequestImplTest extends CommonRequestBase { invokeProcessResponse(response); - verify(listener).success(DIFFERENT); + verify(listener).success(DIFFERENT, response); verify(listener, never()).failure(any(), any()); } -- cgit 1.2.3-korg