From 1da30647745a9d3dfa744cacef56400c2aaeab03 Mon Sep 17 00:00:00 2001 From: Jim Hahn Date: Wed, 10 Apr 2019 12:08:53 -0400 Subject: Add junit tests for PdpGroupDeleteProvider Change-Id: Id744a7d49b9fb608ba3379dd43bcbd6a0297891f Issue-ID: POLICY-1541 Signed-off-by: Jim Hahn --- .../main/rest/depundep/PdpGroupDeleteProvider.java | 13 +- .../pap/main/rest/depundep/ProviderSuper.java | 25 ++- .../depundep/TestPdpGroupDeleteControllerV1.java | 18 +- .../rest/depundep/TestPdpGroupDeleteProvider.java | 237 +++++++++++++++++++++ main/src/test/resources/simpleDeploy/undeploy.json | 35 +++ .../undeployMakeUpdaterGroupNotFound.json | 30 +++ 6 files changed, 339 insertions(+), 19 deletions(-) create mode 100644 main/src/test/java/org/onap/policy/pap/main/rest/depundep/TestPdpGroupDeleteProvider.java create mode 100644 main/src/test/resources/simpleDeploy/undeploy.json create mode 100644 main/src/test/resources/simpleDeploy/undeployMakeUpdaterGroupNotFound.json diff --git a/main/src/main/java/org/onap/policy/pap/main/rest/depundep/PdpGroupDeleteProvider.java b/main/src/main/java/org/onap/policy/pap/main/rest/depundep/PdpGroupDeleteProvider.java index d5acc624..6457efae 100644 --- a/main/src/main/java/org/onap/policy/pap/main/rest/depundep/PdpGroupDeleteProvider.java +++ b/main/src/main/java/org/onap/policy/pap/main/rest/depundep/PdpGroupDeleteProvider.java @@ -58,7 +58,10 @@ public class PdpGroupDeleteProvider extends ProviderBase */ public Pair deleteGroup(String groupName, String version) { - return Pair.of(Response.Status.OK, new PdpGroupDeleteResponse()); + PdpGroupDeleteResponse resp = new PdpGroupDeleteResponse(); + resp.setErrorDetails("not implemented yet"); + + return Pair.of(Response.Status.INTERNAL_SERVER_ERROR, resp); } /** @@ -107,14 +110,8 @@ public class PdpGroupDeleteProvider extends ProviderBase return (group, subgroup) -> { - if (!subgroup.getPolicies().contains(desiredIdent)) { - // doesn't have the policy - return false; - } - // remove the policy from the subgroup - subgroup.getPolicies().remove(desiredIdent); - return true; + return subgroup.getPolicies().remove(desiredIdent); }; } } diff --git a/main/src/test/java/org/onap/policy/pap/main/rest/depundep/ProviderSuper.java b/main/src/test/java/org/onap/policy/pap/main/rest/depundep/ProviderSuper.java index a1e69565..4cc69176 100644 --- a/main/src/test/java/org/onap/policy/pap/main/rest/depundep/ProviderSuper.java +++ b/main/src/test/java/org/onap/policy/pap/main/rest/depundep/ProviderSuper.java @@ -42,6 +42,7 @@ import org.onap.policy.common.utils.coder.StandardCoder; import org.onap.policy.common.utils.resources.ResourceUtils; import org.onap.policy.common.utils.services.Registry; import org.onap.policy.models.pdp.concepts.PdpGroup; +import org.onap.policy.models.pdp.concepts.PdpGroups; import org.onap.policy.models.pdp.concepts.PdpUpdate; import org.onap.policy.models.provider.PolicyModelsProvider; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; @@ -91,7 +92,7 @@ public class ProviderSuper { lockit = new Object(); daofact = mock(PolicyModelsProviderFactoryWrapper.class); - policy1 = loadFile("policy.json", ToscaPolicy.class); + policy1 = loadPolicy("policy.json"); when(daofact.create()).thenReturn(dao); @@ -180,7 +181,17 @@ public class ProviderSuper { * @return a list of groups */ protected List loadGroups(String fileName) { - return loadFile(fileName, org.onap.policy.models.pdp.concepts.PdpGroups.class).getGroups(); + return loadFile(fileName, PdpGroups.class).getGroups(); + } + + /** + * Loads a group. + * + * @param fileName name of the file from which to load + * @return a group + */ + protected PdpGroup loadGroup(String fileName) { + return loadFile(fileName, PdpGroup.class); } /** @@ -193,6 +204,16 @@ public class ProviderSuper { return loadFile(fileName, PolicyList.class).policies; } + /** + * Loads a policy. + * + * @param fileName name of the file from which to load + * @return a policy + */ + protected ToscaPolicy loadPolicy(String fileName) { + return loadFile(fileName, ToscaPolicy.class); + } + /** * Loads an object from a JSON file. * diff --git a/main/src/test/java/org/onap/policy/pap/main/rest/depundep/TestPdpGroupDeleteControllerV1.java b/main/src/test/java/org/onap/policy/pap/main/rest/depundep/TestPdpGroupDeleteControllerV1.java index e1c8c519..c3928789 100644 --- a/main/src/test/java/org/onap/policy/pap/main/rest/depundep/TestPdpGroupDeleteControllerV1.java +++ b/main/src/test/java/org/onap/policy/pap/main/rest/depundep/TestPdpGroupDeleteControllerV1.java @@ -22,7 +22,6 @@ package org.onap.policy.pap.main.rest.depundep; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; import javax.ws.rs.client.Invocation; import javax.ws.rs.core.Response; @@ -32,6 +31,7 @@ import org.onap.policy.pap.main.rest.CommonPapRestServer; public class TestPdpGroupDeleteControllerV1 extends CommonPapRestServer { + private static final String NOT_IMPLEMENTED_YET = "not implemented yet"; private static final String DELETE_GROUP_ENDPOINT = "pdps/groups"; private static final String DELETE_POLICIES_ENDPOINT = "pdps/policies"; @@ -51,13 +51,13 @@ public class TestPdpGroupDeleteControllerV1 extends CommonPapRestServer { Invocation.Builder invocationBuilder = sendRequest(uri); Response rawresp = invocationBuilder.delete(); PdpGroupDeleteResponse resp = rawresp.readEntity(PdpGroupDeleteResponse.class); - assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus()); - assertNull(resp.getErrorDetails()); + assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), rawresp.getStatus()); + assertEquals(NOT_IMPLEMENTED_YET, resp.getErrorDetails()); rawresp = invocationBuilder.delete(); resp = rawresp.readEntity(PdpGroupDeleteResponse.class); - assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus()); - assertNull(resp.getErrorDetails()); + assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), rawresp.getStatus()); + assertEquals(NOT_IMPLEMENTED_YET, resp.getErrorDetails()); // verify it fails when no authorization info is included checkUnauthRequest(uri, req -> req.delete()); @@ -70,13 +70,13 @@ public class TestPdpGroupDeleteControllerV1 extends CommonPapRestServer { Invocation.Builder invocationBuilder = sendRequest(uri); Response rawresp = invocationBuilder.delete(); PdpGroupDeleteResponse resp = rawresp.readEntity(PdpGroupDeleteResponse.class); - assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus()); - assertNull(resp.getErrorDetails()); + assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), rawresp.getStatus()); + assertEquals(NOT_IMPLEMENTED_YET, resp.getErrorDetails()); rawresp = invocationBuilder.delete(); resp = rawresp.readEntity(PdpGroupDeleteResponse.class); - assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus()); - assertNull(resp.getErrorDetails()); + assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), rawresp.getStatus()); + assertEquals(NOT_IMPLEMENTED_YET, resp.getErrorDetails()); // verify it fails when no authorization info is included checkUnauthRequest(uri, req -> req.delete()); diff --git a/main/src/test/java/org/onap/policy/pap/main/rest/depundep/TestPdpGroupDeleteProvider.java b/main/src/test/java/org/onap/policy/pap/main/rest/depundep/TestPdpGroupDeleteProvider.java new file mode 100644 index 00000000..31dfb398 --- /dev/null +++ b/main/src/test/java/org/onap/policy/pap/main/rest/depundep/TestPdpGroupDeleteProvider.java @@ -0,0 +1,237 @@ +/* + * ============LICENSE_START======================================================= + * ONAP PAP + * ================================================================================ + * Copyright (C) 2019 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.rest.depundep; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import java.util.Arrays; +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.BiFunction; +import javax.ws.rs.core.Response.Status; +import org.apache.commons.lang3.tuple.Pair; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.Test; +import org.onap.policy.common.utils.services.Registry; +import org.onap.policy.models.base.PfModelException; +import org.onap.policy.models.pap.concepts.PdpGroupDeleteResponse; +import org.onap.policy.models.pdp.concepts.PdpGroup; +import org.onap.policy.models.pdp.concepts.PdpSubGroup; +import org.onap.policy.models.pdp.concepts.PdpUpdate; +import org.onap.policy.models.pdp.enums.PdpState; +import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier; +import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifierOptVersion; +import org.onap.policy.pap.main.PolicyPapRuntimeException; + +public class TestPdpGroupDeleteProvider extends ProviderSuper { + private static final String EXPECTED_EXCEPTION = "expected exception"; + private static final String POLICY1_NAME = "policyA"; + private static final String POLICY1_VERSION = "1.2.3"; + private static final String GROUP1_NAME = "groupA"; + private static final String GROUP1_VERSION = "200.2.3"; + + private MyProvider prov; + private SessionData session; + private ToscaPolicyIdentifierOptVersion optIdent; + private ToscaPolicyIdentifier ident; + private BiFunction updater; + + + @AfterClass + public static void tearDownAfterClass() { + Registry.newRegistry(); + } + + /** + * Configures mocks and objects. + * + * @throws Exception if an error occurs + */ + @Before + public void setUp() throws Exception { + + super.setUp(); + + session = mock(SessionData.class); + ident = policy1.getIdentifier(); + optIdent = new ToscaPolicyIdentifierOptVersion(ident.getName(), null); + + prov = new MyProvider(); + + updater = prov.makeUpdater(policy1); + } + + @Test + public void testDeleteGroup() { + Pair pair = prov.deleteGroup(GROUP1_NAME, GROUP1_VERSION); + assertEquals(Status.INTERNAL_SERVER_ERROR, pair.getLeft()); + assertEquals("not implemented yet", pair.getRight().getErrorDetails()); + } + + @Test + public void testUndeploy_testDeletePolicy() { + Pair pair = prov.undeploy(optIdent); + assertEquals(Status.OK, pair.getLeft()); + assertNull(pair.getRight().getErrorDetails()); + } + + /** + * Tests using a real provider, just to verify end-to-end functionality. + * + * @throws Exception if an error occurs + */ + @Test + public void testUndeploy_Full() throws Exception { + when(dao.getFilteredPolicyList(any())).thenReturn(Arrays.asList(policy1)); + + PdpGroup group = loadGroup("undeploy.json"); + + when(dao.getFilteredPdpGroups(any())).thenReturn(Arrays.asList(group)); + + when(dao.getPolicyList(POLICY1_NAME, "1.2.300")).thenReturn(Arrays.asList(policy1)); + when(dao.getPolicyList("policyB", POLICY1_VERSION)).thenReturn(Arrays.asList(policy1)); + + Pair pair = new PdpGroupDeleteProvider().undeploy(optIdent); + assertEquals(Status.OK, pair.getLeft()); + assertNull(pair.getRight().getErrorDetails()); + + // should have updated the old group + List updates = getGroupUpdates(); + assertEquals(1, updates.size()); + assertSame(group, updates.get(0)); + assertEquals(PdpState.PASSIVE, group.getPdpGroupState()); + + // should have created a new group + List creates = getGroupCreates(); + assertEquals(1, creates.size()); + PdpGroup group2 = creates.get(0); + assertEquals(group.getName(), group2.getName()); + assertEquals(PdpState.ACTIVE, group2.getPdpGroupState()); + + // should be one less item in the new group + assertEquals(group.getPdpSubgroups().get(0).getPolicies().size() - 1, + group2.getPdpSubgroups().get(0).getPolicies().size()); + + // should have updated the PDPs + List requests = getUpdateRequests(1); + assertEquals(1, requests.size()); + PdpUpdate req = requests.get(0); + assertEquals("pdpA", req.getName()); + assertEquals(GROUP1_NAME, req.getPdpGroup()); + assertEquals("pdpTypeA", req.getPdpSubgroup()); + assertEquals(Arrays.asList(policy1, policy1), req.getPolicies()); + } + + @Test + public void testDeletePolicy_DaoEx() throws Exception { + PfModelException exc = new PfModelException(Status.BAD_REQUEST, EXPECTED_EXCEPTION); + + prov = spy(prov); + doThrow(exc).when(prov).processPolicy(any(), any()); + + assertThatThrownBy(() -> prov.undeploy(optIdent)).isInstanceOf(PolicyPapRuntimeException.class) + .hasMessage(PdpGroupDeleteProvider.DB_ERROR_MSG); + } + + @Test + public void testDeletePolicy_RtEx() throws Exception { + RuntimeException exc = new RuntimeException(EXPECTED_EXCEPTION); + + prov = spy(prov); + doThrow(exc).when(prov).processPolicy(any(), any()); + + assertThatThrownBy(() -> prov.undeploy(optIdent)).isSameAs(exc); + } + + @Test + public void testMakeResponse() { + PdpGroupDeleteResponse resp = prov.makeResponse(null); + assertNull(resp.getErrorDetails()); + + resp = prov.makeResponse(EXPECTED_EXCEPTION); + assertEquals(EXPECTED_EXCEPTION, resp.getErrorDetails()); + } + + @Test + public void testMakeUpdater() { + /* + * this group has one policy with a different name, one matching policy, and one + * with a different version. + */ + PdpGroup group = loadGroup("undeploy.json"); + + PdpSubGroup subgroup = group.getPdpSubgroups().get(0); + int origSize = subgroup.getPolicies().size(); + + // invoke updater + assertTrue(updater.apply(group, subgroup)); + + // identified policy should have been removed + assertEquals(origSize - 1, subgroup.getPolicies().size()); + assertFalse(subgroup.getPolicies().contains(ident)); + } + + @Test + public void testMakeUpdater_NotFound() { + /* + * this group has one policy with a different name and one with a different + * version, but not the policy of interest. + */ + PdpGroup group = loadGroup("undeployMakeUpdaterGroupNotFound.json"); + + PdpSubGroup subgroup = group.getPdpSubgroups().get(0); + int origSize = subgroup.getPolicies().size(); + + // invoke updater + assertFalse(updater.apply(group, subgroup)); + + // should be unchanged + assertEquals(origSize, subgroup.getPolicies().size()); + } + + + private class MyProvider extends PdpGroupDeleteProvider { + + @Override + protected Pair process(T request, BiConsumer processor) { + processor.accept(session, request); + + return Pair.of(Status.OK, new PdpGroupDeleteResponse()); + } + + @Override + protected void processPolicy(SessionData data, ToscaPolicyIdentifierOptVersion desiredPolicy) + throws PfModelException { + // do nothing + } + } +} diff --git a/main/src/test/resources/simpleDeploy/undeploy.json b/main/src/test/resources/simpleDeploy/undeploy.json new file mode 100644 index 00000000..8f89cafc --- /dev/null +++ b/main/src/test/resources/simpleDeploy/undeploy.json @@ -0,0 +1,35 @@ +{ + "name": "groupA", + "version": "200.2.3", + "pdpGroupState": "ACTIVE", + "pdpSubgroups": [ + { + "pdpType": "pdpTypeA", + "supportedPolicyTypes": [ + { + "name": "typeA", + "version": "100.2.3" + } + ], + "pdpInstances": [ + { + "instanceId": "pdpA" + } + ], + "policies": [ + { + "name": "policyA", + "version": "1.2.300" + }, + { + "name": "policyA", + "version": "1.2.3" + }, + { + "name": "policyB", + "version": "1.2.3" + } + ] + } + ] +} diff --git a/main/src/test/resources/simpleDeploy/undeployMakeUpdaterGroupNotFound.json b/main/src/test/resources/simpleDeploy/undeployMakeUpdaterGroupNotFound.json new file mode 100644 index 00000000..b7d8d777 --- /dev/null +++ b/main/src/test/resources/simpleDeploy/undeployMakeUpdaterGroupNotFound.json @@ -0,0 +1,30 @@ +{ + "name": "groupA", + "version": "200.2.3", + "pdpSubgroups": [ + { + "pdpType": "pdpTypeA", + "supportedPolicyTypes": [ + { + "name": "typeA", + "version": "100.2.3" + } + ], + "pdpInstances": [ + { + "instanceId": "pdpA" + } + ], + "policies": [ + { + "name": "policyA", + "version": "1.2.300" + }, + { + "name": "policyB", + "version": "1.2.3" + } + ] + } + ] +} -- cgit 1.2.3-korg