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;
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";
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());
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());
--- /dev/null
+/*
+ * ============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<PdpGroup, PdpSubGroup, Boolean> 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<Status, PdpGroupDeleteResponse> 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<Status, PdpGroupDeleteResponse> 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<Status, PdpGroupDeleteResponse> pair = new PdpGroupDeleteProvider().undeploy(optIdent);
+ assertEquals(Status.OK, pair.getLeft());
+ assertNull(pair.getRight().getErrorDetails());
+
+ // should have updated the old group
+ List<PdpGroup> updates = getGroupUpdates();
+ assertEquals(1, updates.size());
+ assertSame(group, updates.get(0));
+ assertEquals(PdpState.PASSIVE, group.getPdpGroupState());
+
+ // should have created a new group
+ List<PdpGroup> 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<PdpUpdate> 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 <T> Pair<Status, PdpGroupDeleteResponse> process(T request, BiConsumer<SessionData, T> processor) {
+ processor.accept(session, request);
+
+ return Pair.of(Status.OK, new PdpGroupDeleteResponse());
+ }
+
+ @Override
+ protected void processPolicy(SessionData data, ToscaPolicyIdentifierOptVersion desiredPolicy)
+ throws PfModelException {
+ // do nothing
+ }
+ }
+}