/*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
- *  Modifications Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ *  Modifications Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
  *  Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
 package org.onap.policy.distribution.main.parameters;
 
 import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
 import java.util.HashMap;
 import java.util.Map;
 import org.onap.policy.common.endpoints.parameters.RestServerParameters;
 import org.onap.policy.common.utils.coder.Coder;
 import org.onap.policy.common.utils.coder.CoderException;
 import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.network.NetworkUtil;
 import org.onap.policy.distribution.forwarding.parameters.PolicyForwarderParameters;
 import org.onap.policy.distribution.main.testclasses.DummyPolicyDecoderParameterGroup;
 import org.onap.policy.distribution.main.testclasses.DummyPolicyForwarderParameterGroup;
     public static final String POLICY_NAME = "SamplePolicy";
     public static final String DECODER_CONFIGURATION_PARAMETERS = "dummyDecoderConfiguration";
 
+    public static final String CONFIG_FILE = "src/test/resources/parameters/TestConfigParams.json";
+
     private Coder coder = new StandardCoder();
 
+    /**
+     * Makes a parameter configuration file by substituting an available port number within a
+     * source file.
+     *
+     * @param sourceName original configuration file containing 6969
+     * @return the port that was substituted into the config file
+     * @throws IOException if the config file cannot be created
+     */
+    public static int makeConfigFile(String sourceName) throws IOException {
+        int port = NetworkUtil.allocPort();
+
+        String json = Files.readString(new File("src/test/resources/" + sourceName).toPath());
+        json = json.replace("6969", String.valueOf(port));
+
+        File file = new File(CONFIG_FILE);
+        file.deleteOnExit();
+
+        try (FileOutputStream output = new FileOutputStream(file)) {
+            output.write(json.getBytes(StandardCharsets.UTF_8));
+        }
+
+        return port;
+    }
+
+    /**
+     * Waits for the server to connect to a port.
+     * @param port server's port
+     * @throws InterruptedException if interrupted
+     */
+    public static void awaitServer(int port) throws InterruptedException {
+        if (!NetworkUtil.isTcpPortOpen("localhost", port, 50, 200L)) {
+            throw new IllegalStateException("cannot connect to port " + port);
+        }
+    }
+
     /**
      * Returns an instance of ReceptionHandlerParameters for test cases.
      *
 
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
- *  Modifications Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ *  Modifications Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
  *  Modifications Copyright (C) 2020 Nordix Foundation
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-import java.io.IOException;
 import java.util.Map;
 import org.junit.Test;
 import org.onap.policy.common.endpoints.parameters.RestServerParameters;
 
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
  *  Copyright (C) 2019 Nordix Foundation.
- *  Modifications Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ *  Modifications Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
  *  Modifications Copyright (C) 2019-2020 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
 import org.junit.Test;
+import org.mockito.internal.util.reflection.Whitebox;
 import org.onap.policy.common.endpoints.http.server.RestServer;
 import org.onap.policy.common.endpoints.parameters.RestServerParameters;
 import org.onap.policy.common.endpoints.report.HealthCheckReport;
     private static final String SELF = NetworkUtil.getHostname();
     private static final String NAME = "Policy SSD";
 
+    private int port;
+
     @Test
     public void testHealthCheckSuccess() {
         final String reportString = "Report [name=Policy SSD, url=" + SELF + ", healthy=true, code=200, message=alive]";
     }
 
     @Test
-    public void testHealthCheckFailure() {
+    public void testHealthCheckFailure() throws IOException {
+        port = NetworkUtil.allocPort();
         final String reportString =
                 "Report [name=Policy SSD, url=" + SELF + ", healthy=false, code=500, message=not alive]";
         final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false);
+        Whitebox.setInternalState(restServerParams, "port", port);
         restServerParams.setName(CommonTestData.DISTRIBUTION_GROUP_NAME);
         final RestServer restServer = new RestServer(restServerParams, null, DistributionRestController.class);
         assertThatCode(() -> {
         }).doesNotThrowAnyException();
     }
 
-    private Main startDistributionService() {
-        final String[] distributionConfigParameters = { "-c", "parameters/DistributionConfigParameters.json" };
+    private Main startDistributionService() throws IOException {
+        port = CommonTestData.makeConfigFile("parameters/DistributionConfigParameters.json");
+        final String[] distributionConfigParameters = { "-c", CommonTestData.CONFIG_FILE };
         return new Main(distributionConfigParameters);
     }
 
         clientConfig.register(feature);
 
         final Client client = ClientBuilder.newClient(clientConfig);
-        final WebTarget webTarget = client.target("http://localhost:6969/healthcheck");
+        final WebTarget webTarget = client.target("http://localhost:" + port + "/healthcheck");
 
         final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
 
-        if (!NetworkUtil.isTcpPortOpen("localhost", 6969, 6, 10000L)) {
-            throw new IllegalStateException("cannot connect to port 6969");
-        }
+        CommonTestData.awaitServer(port);
         return invocationBuilder.get(HealthCheckReport.class);
     }
 
 
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
  *  Copyright (C) 2019 Nordix Foundation.
- *  Modifications Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ *  Modifications Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
  *  Modifications Copyright (C) 2020 Nordix Foundation
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
 import org.junit.Test;
+import org.mockito.internal.util.reflection.Whitebox;
 import org.onap.policy.common.endpoints.http.server.RestServer;
 import org.onap.policy.common.endpoints.parameters.RestServerParameters;
 import org.onap.policy.common.utils.network.NetworkUtil;
  */
 public class TestDistributionStatistics {
 
+    private int port;
+
     @Test
     public void testDistributionStatistics_200() {
         assertThatCode(() -> {
     }
 
     @Test
-    public void testDistributionStatistics_500() throws InterruptedException {
+    public void testDistributionStatistics_500() throws InterruptedException, IOException {
+        port = NetworkUtil.allocPort();
         final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false);
+        Whitebox.setInternalState(restServerParams, "port", port);
         restServerParams.setName(CommonTestData.DISTRIBUTION_GROUP_NAME);
         final RestServer restServer = new RestServer(restServerParams, null, DistributionRestController.class);
         assertThatCode(() -> {
         }).doesNotThrowAnyException();
     }
 
-    private Main startDistributionService() {
-        final String[] distributionConfigParameters = { "-c", "parameters/DistributionConfigParameters.json" };
+    private Main startDistributionService() throws IOException {
+        port = CommonTestData.makeConfigFile("parameters/DistributionConfigParameters.json");
+        final String[] distributionConfigParameters = { "-c", CommonTestData.CONFIG_FILE };
         return new Main(distributionConfigParameters);
     }
 
         clientConfig.register(feature);
 
         final Client client = ClientBuilder.newClient(clientConfig);
-        final WebTarget webTarget = client.target("http://localhost:6969/statistics");
+        final WebTarget webTarget = client.target("http://localhost:" + port + "/statistics");
 
         final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
 
-        if (!NetworkUtil.isTcpPortOpen("localhost", 6969, 6, 10000L)) {
-            throw new IllegalStateException("cannot connect to port 6969");
-        }
+        CommonTestData.awaitServer(port);
         return invocationBuilder.get(StatisticsReport.class);
     }
 
 
 import static org.assertj.core.api.Assertions.assertThatCode;
 import static org.junit.Assert.assertEquals;
 
+import java.io.IOException;
 import java.security.SecureRandom;
-import java.security.cert.X509Certificate;
 import java.util.Properties;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509TrustManager;
 import javax.ws.rs.client.Client;
 import javax.ws.rs.client.ClientBuilder;
 import javax.ws.rs.client.Invocation;
 import org.onap.policy.common.endpoints.report.HealthCheckReport;
 import org.onap.policy.common.utils.network.NetworkUtil;
 import org.onap.policy.distribution.main.PolicyDistributionException;
+import org.onap.policy.distribution.main.parameters.CommonTestData;
 import org.onap.policy.distribution.main.startstop.Main;
 
 /**
     private static final String NAME = "Policy SSD";
     private static String KEYSTORE = System.getProperty("user.dir") + "/src/test/resources/ssl/policy-keystore";
 
+    private int port;
+
     @Test
     public void testHttpsHealthCheckSuccess() {
         final String reportString = "Report [name=Policy SSD, url=" + SELF + ", healthy=true, code=200, message=alive]";
         }).doesNotThrowAnyException();
     }
 
-    private Main startDistributionService() {
+    private Main startDistributionService() throws IOException {
         final Properties systemProps = System.getProperties();
         systemProps.put("javax.net.ssl.keyStore", KEYSTORE);
         systemProps.put("javax.net.ssl.keyStorePassword", "Pol1cy_0nap");
         System.setProperties(systemProps);
 
-        final String[] distributionConfigParameters = { "-c", "parameters/DistributionConfigParameters_Https.json" };
+        port = CommonTestData.makeConfigFile("parameters/DistributionConfigParameters_Https.json");
+        final String[] distributionConfigParameters = { "-c", CommonTestData.CONFIG_FILE };
         return new Main(distributionConfigParameters);
     }
 
 
     private HealthCheckReport performHealthCheck() throws Exception {
 
-        final TrustManager[] noopTrustManager = new TrustManager[] { new X509TrustManager() {
-
-            @Override
-            public X509Certificate[] getAcceptedIssuers() {
-                return new X509Certificate[0];
-            }
-
-            @Override
-            public void checkClientTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {
-            }
-
-            @Override
-            public void checkServerTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {
-            }
-        } };
+        final TrustManager[] noopTrustManager = NetworkUtil.getAlwaysTrustingManager();
 
         final SSLContext sc = SSLContext.getInstance("TLSv1.2");
         sc.init(null, noopTrustManager, new SecureRandom());
         final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
         client.register(feature);
 
-        final WebTarget webTarget = client.target("https://localhost:6969/healthcheck");
+        final WebTarget webTarget = client.target("https://localhost:" + port + "/healthcheck");
 
         final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
 
-        if (!NetworkUtil.isTcpPortOpen("localhost", 6969, 6, 10000L)) {
-            throw new IllegalStateException("cannot connect to port 6969");
-        }
+        CommonTestData.awaitServer(port);
         return invocationBuilder.get(HealthCheckReport.class);
     }
 
 
 import static org.assertj.core.api.Assertions.assertThatCode;
 import static org.junit.Assert.assertEquals;
 
+import java.io.IOException;
 import java.security.SecureRandom;
-import java.security.cert.X509Certificate;
 import java.util.Properties;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509TrustManager;
 import javax.ws.rs.client.Client;
 import javax.ws.rs.client.ClientBuilder;
 import javax.ws.rs.client.Invocation;
 import org.junit.Test;
 import org.onap.policy.common.utils.network.NetworkUtil;
 import org.onap.policy.distribution.main.PolicyDistributionException;
+import org.onap.policy.distribution.main.parameters.CommonTestData;
 import org.onap.policy.distribution.main.startstop.Main;
 
 /**
 
     private static String KEYSTORE = System.getProperty("user.dir") + "/src/test/resources/ssl/policy-keystore";
 
+    private int port;
+
     @Test
     public void testHttpsDistributionStatistic() {
         assertThatCode(() -> {
         }).doesNotThrowAnyException();
     }
 
-    private Main startDistributionService() {
+    private Main startDistributionService() throws IOException {
         final Properties systemProps = System.getProperties();
         systemProps.put("javax.net.ssl.keyStore", KEYSTORE);
         systemProps.put("javax.net.ssl.keyStorePassword", "Pol1cy_0nap");
         System.setProperties(systemProps);
 
-        final String[] distributionConfigParameters = { "-c", "parameters/DistributionConfigParameters_Https.json" };
+        port = CommonTestData.makeConfigFile("parameters/DistributionConfigParameters_Https.json");
+        final String[] distributionConfigParameters = { "-c", CommonTestData.CONFIG_FILE };
         return new Main(distributionConfigParameters);
     }
 
     }
 
     private StatisticsReport performStatisticCheck() throws Exception {
-
-        final TrustManager[] noopTrustManager = new TrustManager[] { new X509TrustManager() {
-
-            @Override
-            public X509Certificate[] getAcceptedIssuers() {
-                return new X509Certificate[0];
-            }
-
-            @Override
-            public void checkClientTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {
-            }
-
-            @Override
-            public void checkServerTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {
-            }
-        } };
+        final TrustManager[] noopTrustManager = NetworkUtil.getAlwaysTrustingManager();
 
         final SSLContext sc = SSLContext.getInstance("TLSv1.2");
         sc.init(null, noopTrustManager, new SecureRandom());
         final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
         client.register(feature);
 
-        final WebTarget webTarget = client.target("https://localhost:6969/statistics");
+        final WebTarget webTarget = client.target("https://localhost:" + port + "/statistics");
 
         final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
 
-        if (!NetworkUtil.isTcpPortOpen("localhost", 6969, 6, 10000L)) {
-            throw new IllegalStateException("cannot connect to port 6969");
-        }
+        CommonTestData.awaitServer(port);
         return invocationBuilder.get(StatisticsReport.class);
     }
 
 
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
+ *  Modifications Copyright (C) 2020 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.
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import java.io.IOException;
 import org.junit.Test;
 import org.onap.policy.distribution.main.PolicyDistributionException;
 import org.onap.policy.distribution.main.parameters.CommonTestData;
 public class TestDistributionActivator {
 
     @Test
-    public void testDistributionActivator() throws PolicyDistributionException {
-        final String[] distributionConfigParameters = {"-c", "parameters/DistributionConfigParameters.json"};
+    public void testDistributionActivator() throws PolicyDistributionException, IOException {
+        CommonTestData.makeConfigFile("parameters/DistributionConfigParameters.json");
+        final String[] distributionConfigParameters = { "-c", CommonTestData.CONFIG_FILE };
 
         final DistributionCommandLineArguments arguments =
                 new DistributionCommandLineArguments(distributionConfigParameters);
 
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import java.io.IOException;
 import org.junit.Test;
 import org.onap.policy.distribution.main.PolicyDistributionException;
 import org.onap.policy.distribution.main.parameters.CommonTestData;
 public class TestMain {
 
     @Test
-    public void testMain() throws PolicyDistributionException {
-        final String[] distributionConfigParameters =
-        { "-c", "parameters/DistributionConfigParameters.json" };
+    public void testMain() throws PolicyDistributionException, IOException {
+        CommonTestData.makeConfigFile("parameters/DistributionConfigParameters.json");
+        final String[] distributionConfigParameters = { "-c", CommonTestData.CONFIG_FILE };
         final Main main = new Main(distributionConfigParameters);
         assertTrue(main.getParameters().isValid());
         assertEquals(CommonTestData.DISTRIBUTION_GROUP_NAME, main.getParameters().getName());
 
                 LifecycleApiForwarderParameters.class);
         ParameterService.register(parameterGroup);
         simulator.startLifecycycleApiSimulator();
-        if (!NetworkUtil.isTcpPortOpen("0.0.0.0", 6969, 6, 10000L)) {
+        if (!NetworkUtil.isTcpPortOpen("0.0.0.0", 6969, 50, 200L)) {
             throw new IllegalStateException("cannot connect to port 6969");
         }
     }