Remove topic.properties and incorporate into overall config file for xacml
[policy/xacml-pdp.git] / main / src / test / java / org / onap / policy / pdpx / main / rest / TestDecision.java
index c93ba6f..b173204 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,33 +24,40 @@ package org.onap.policy.pdpx.main.rest;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import java.io.File;
 import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
 import java.security.KeyManagementException;
 import java.security.NoSuchAlgorithmException;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
 import javax.ws.rs.client.Entity;
-import javax.ws.rs.client.Invocation;
-import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
+import org.junit.ClassRule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
 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.parameters.RestServerParameters;
+import org.onap.policy.common.endpoints.parameters.TopicParameterGroup;
 import org.onap.policy.common.gson.GsonMessageBodyHandler;
 import org.onap.policy.common.utils.network.NetworkUtil;
 import org.onap.policy.models.decisions.concepts.DecisionRequest;
 import org.onap.policy.models.decisions.concepts.DecisionResponse;
 import org.onap.policy.models.errors.concepts.ErrorResponse;
 import org.onap.policy.pdpx.main.PolicyXacmlPdpException;
+import org.onap.policy.pdpx.main.parameters.CommonTestData;
+import org.onap.policy.pdpx.main.parameters.XacmlPdpParameterGroup;
 import org.onap.policy.pdpx.main.startstop.Main;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -58,16 +66,62 @@ public class TestDecision {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(TestDecision.class);
 
+    private static int port;
     private static Main main;
+    private static HttpClient client;
+    private static CommonTestData testData = new CommonTestData();
+
+    @ClassRule
+    public static final TemporaryFolder appsFolder = new TemporaryFolder();
 
     /**
      * BeforeClass setup environment.
+     * @throws IOException Cannot create temp apps folder
+     * @throws Exception exception if service does not start
      */
     @BeforeClass
-    public static void beforeClass() {
+    public static void beforeClass() throws Exception {
         System.setProperty("org.eclipse.jetty.util.log.class", "org.eclipse.jetty.util.log.StdErrLog");
         System.setProperty("org.eclipse.jetty.LEVEL", "OFF");
-        main = startXacmlPdpService();
+
+        port = NetworkUtil.allocPort();
+
+        //
+        // Copy test directory over of the application directories
+        //
+        Path src = Paths.get("src/test/resources/apps");
+        File apps = appsFolder.newFolder("apps");
+        Files.walk(src).forEach(source -> {
+            copy(source, apps.toPath().resolve(src.relativize(source)));
+        });
+        //
+        // Get the parameters file correct.
+        //
+        RestServerParameters rest =
+            testData.toObject(testData.getRestServerParametersMap(port), RestServerParameters.class);
+        TopicParameterGroup topicParameterGroup =
+            testData.toObject(testData.getTopicParametersMap(false), TopicParameterGroup.class);
+        XacmlPdpParameterGroup params =
+            new XacmlPdpParameterGroup("XacmlPdpGroup", rest, topicParameterGroup, apps.getAbsolutePath());
+        final Gson gson = new GsonBuilder().create();
+        File fileParams = appsFolder.newFile("params.json");
+        String jsonParams = gson.toJson(params);
+        LOGGER.info("Creating new params: {}", jsonParams);
+        Files.write(fileParams.toPath(), jsonParams.getBytes());
+        //
+        // Start the service
+        //
+        main = startXacmlPdpService(fileParams);
+        //
+        // Make sure it is running
+        //
+        if (!NetworkUtil.isTcpPortOpen("localhost", port, 20, 1000L)) {
+            throw new IllegalStateException("Cannot connect to port " + port);
+        }
+        //
+        // Create a client
+        //
+        client = getNoAuthHttpClient();
     }
 
     @AfterClass
@@ -76,8 +130,7 @@ public class TestDecision {
     }
 
     @Test
-    public void testDecision_UnsupportedAction() throws KeyManagementException, NoSuchAlgorithmException,
-        ClassNotFoundException {
+    public void testDecision_UnsupportedAction() throws Exception {
 
         LOGGER.info("Running test testDecision_UnsupportedAction");
 
@@ -98,7 +151,9 @@ public class TestDecision {
     }
 
     @Test
-    public void testDecision_Guard() throws InterruptedException, IOException {
+    public void testDecision_Guard() throws KeyManagementException, NoSuchAlgorithmException,
+        ClassNotFoundException {
+
         LOGGER.info("Running test testDecision_Guard");
 
         DecisionRequest request = new DecisionRequest();
@@ -113,12 +168,11 @@ public class TestDecision {
 
         DecisionResponse response = getDecision(request);
         LOGGER.info("Response {}", response);
-        //assertThat(response.getErrorMessage()).isEqualToIgnoringCase("No application for action foo");
+        assertThat(response.getStatus()).isEqualTo("Permit");
     }
 
-    private static Main startXacmlPdpService() {
-        final String[] XacmlPdpConfigParameters = {"-c", "parameters/XacmlPdpConfigParameters.json", "-p",
-            "parameters/topic.properties"};
+    private static Main startXacmlPdpService(File params) throws PolicyXacmlPdpException {
+        final String[] XacmlPdpConfigParameters = {"-c", params.getAbsolutePath()};
         return new Main(XacmlPdpConfigParameters);
     }
 
@@ -126,28 +180,17 @@ public class TestDecision {
         main.shutdown();
     }
 
-    private DecisionResponse getDecision(DecisionRequest request) throws InterruptedException, IOException {
-        final ClientConfig clientConfig = new ClientConfig();
-
-        final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
-        clientConfig.register(feature);
+    private DecisionResponse getDecision(DecisionRequest request) {
 
-        final Client client = ClientBuilder.newClient(clientConfig);
-        final WebTarget webTarget = client.target("http://localhost:6969/policy/pdpx/v1/decision");
-
-        final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
+        Entity<DecisionRequest> entityRequest = Entity.entity(request, MediaType.APPLICATION_JSON);
+        Response response = client.post("", entityRequest, Collections.emptyMap());
 
-        if (!NetworkUtil.isTcpPortOpen("localhost", 6969, 6, 10000L)) {
-            throw new IllegalStateException("Cannot connect to port 6969");
-        }
+        assertEquals(200, response.getStatus());
 
-        return invocationBuilder.post(Entity.json(request), DecisionResponse.class);
+        return HttpClient.getBody(response, DecisionResponse.class);
     }
 
-    private ErrorResponse getErrorDecision(DecisionRequest request) throws KeyManagementException,
-        NoSuchAlgorithmException, ClassNotFoundException {
-
-        HttpClient client = getNoAuthHttpClient();
+    private ErrorResponse getErrorDecision(DecisionRequest request) {
 
         Entity<DecisionRequest> entityRequest = Entity.entity(request, MediaType.APPLICATION_JSON);
         Response response = client.post("", entityRequest, Collections.emptyMap());
@@ -157,15 +200,23 @@ public class TestDecision {
         return HttpClient.getBody(response, ErrorResponse.class);
     }
 
-    private HttpClient getNoAuthHttpClient()
+    private static HttpClient getNoAuthHttpClient()
             throws KeyManagementException, NoSuchAlgorithmException, ClassNotFoundException {
         return HttpClient.factory.build(BusTopicParams.builder()
                 .clientName("testDecisionClient")
                 .serializationProvider(GsonMessageBodyHandler.class.getName())
-                .useHttps(false).allowSelfSignedCerts(false).hostname("localhost").port(6969)
+                .useHttps(false).allowSelfSignedCerts(false).hostname("localhost").port(port)
                 .basePath("policy/pdpx/v1/decision")
                 .userName("healthcheck").password("zb!XztG34").managed(true).build());
     }
 
+    private static void copy(Path source, Path dest) {
+        try {
+            LOGGER.info("Copying {} to {}", source, dest);
+            Files.copy(source, dest, StandardCopyOption.REPLACE_EXISTING);
+        } catch (IOException e) {
+            LOGGER.error("Failed to copy {} to {}", source, dest);
+        }
+    }
 
 }
\ No newline at end of file