/*- * ============LICENSE_START======================================================= * 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. * * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ package org.onap.policy.pdp.xacml.application.common; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.io.IOException; import java.util.Properties; import java.util.UUID; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.HeaderParam; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.onap.policy.common.endpoints.event.comm.bus.internal.BusTopicParams; import org.onap.policy.common.endpoints.http.client.HttpClient; import org.onap.policy.common.endpoints.http.client.HttpClientConfigException; import org.onap.policy.common.endpoints.http.server.HttpServletServer; import org.onap.policy.common.endpoints.http.server.HttpServletServerFactoryInstance; import org.onap.policy.common.endpoints.parameters.RestServerParameters; import org.onap.policy.common.endpoints.properties.PolicyEndPointProperties; import org.onap.policy.common.gson.GsonMessageBodyHandler; import org.onap.policy.common.utils.network.NetworkUtil; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class PolicyApiCallerTest { private static final String MY_TYPE = "my-type"; private static final String MY_VERSION = "1.0.0"; private static final Logger logger = LoggerFactory.getLogger(PolicyApiCallerTest.class); private static final String CLIENT_NAME = "policy-api"; private static final String NOT_A_TYPE = "other-type"; private static final String INVALID_TYPE = "invalid"; private static final String UNKNOWN_TYPE = "unknown"; private static int port; private static RestServerParameters clientParams; private PolicyApiCaller api; /** * Initializes {@link #clientParams} and starts a simple REST server to handle the * test requests. * * @throws IOException if an error occurs */ @BeforeClass public static void setUpBeforeClass() throws Exception { port = NetworkUtil.allocPort(); clientParams = mock(RestServerParameters.class); when(clientParams.getHost()).thenReturn("localhost"); when(clientParams.getPort()).thenReturn(port); Properties props = new Properties(); props.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES, CLIENT_NAME); final String svcpfx = PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + CLIENT_NAME; props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_HTTP_HOST_SUFFIX, clientParams.getHost()); props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_HTTP_PORT_SUFFIX, Integer.toString(clientParams.getPort())); props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_HTTP_REST_CLASSES_SUFFIX, ApiRestController.class.getName()); props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_MANAGED_SUFFIX, "true"); props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_HTTP_HTTPS_SUFFIX, "false"); props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_AAF_SUFFIX, "false"); props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_HTTP_SERIALIZATION_PROVIDER, GsonMessageBodyHandler.class.getName()); HttpServletServerFactoryInstance.getServerFactory().build(props).forEach(HttpServletServer::start); assertTrue(NetworkUtil.isTcpPortOpen(clientParams.getHost(), clientParams.getPort(), 100, 100)); } @AfterClass public static void tearDownAfterClass() { HttpServletServerFactoryInstance.getServerFactory().destroy(); } /** * Resets {@link #clientParams} and populates {@link #api}. * * @throws PolicyApiException if an error occurs */ @Before public void setUp() throws PolicyApiException { when(clientParams.getPort()).thenReturn(port); api = new PolicyApiCaller(clientParams); } @Test public void testPolicyApi() { assertThatThrownBy(() -> new PolicyApiCaller(clientParams) { @Override protected HttpClient makeClient(BusTopicParams busParams) throws HttpClientConfigException { throw new HttpClientConfigException("expected exception"); } }).isInstanceOf(PolicyApiException.class); } @Test public void testGetPolicyType() throws Exception { assertNotNull(api.getPolicyType(new ToscaPolicyTypeIdentifier(MY_TYPE, MY_VERSION))); assertThatThrownBy(() -> api.getPolicyType(new ToscaPolicyTypeIdentifier(INVALID_TYPE, MY_VERSION))) .isInstanceOf(PolicyApiException.class); assertThatThrownBy(() -> api.getPolicyType(new ToscaPolicyTypeIdentifier(UNKNOWN_TYPE, MY_VERSION))) .isInstanceOf(NotFoundException.class); assertThatThrownBy(() -> api.getPolicyType(new ToscaPolicyTypeIdentifier(NOT_A_TYPE, MY_VERSION))) .isInstanceOf(PolicyApiException.class); // connect to a port that has no server when(clientParams.getPort()).thenReturn(NetworkUtil.allocPort()); api = new PolicyApiCaller(clientParams); assertThatThrownBy(() -> api.getPolicyType(new ToscaPolicyTypeIdentifier(MY_TYPE, MY_VERSION))) .isInstanceOf(PolicyApiException.class); } /** * Simple REST server to handle test requests. */ @Path("/policy/api/v1") @Produces({"application/json", "application/yaml"}) @Consumes({"application/json", "application/yaml"}) public static class ApiRestController { /** * Retrieves the specified version of a particular policy type. * * @param policyTypeId ID of desired policy type * @param versionId version of desired policy type * @param requestId optional request ID * * @return the Response object containing the results of the API operation */ @GET @Path("/policytypes/{policyTypeId}/versions/{versionId}") public Response getSpecificVersionOfPolicyType(@PathParam("policyTypeId") String policyTypeId, @PathParam("versionId") String versionId, @HeaderParam("X-ONAP-RequestID") UUID requestId) { assertEquals(MY_VERSION, versionId); switch (policyTypeId) { case UNKNOWN_TYPE: logger.info("request for unknown policy type"); return Response.status(Response.Status.NOT_FOUND).build(); case INVALID_TYPE: logger.info("invalid request for policy type"); return Response.status(Response.Status.BAD_REQUEST).build(); case NOT_A_TYPE: logger.info("invalid request for policy type"); return Response.status(Response.Status.OK).entity("string-type").build(); default: logger.info("request for policy type={} version={}", policyTypeId, versionId); return Response.status(Response.Status.OK).entity(new ToscaPolicyType()).build(); } } } }